GuideIntroPage.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <q-page>
  3. <div class="q-pa-md">
  4. <q-carousel
  5. animated
  6. v-model="slide"
  7. navigation
  8. infinite
  9. height="380px"
  10. :autoplay="2000"
  11. arrows
  12. transition-prev="slide-right"
  13. transition-next="slide-left"
  14. @mouseenter="autoplay = false"
  15. @mouseleave="autoplay = true"
  16. >
  17. <q-carousel-slide
  18. v-for="(item, index) in sliders"
  19. :key="index"
  20. :name="index"
  21. :img-src="item.imageUrl"
  22. class="cursor-pointer"
  23. @click="goToBlog(item.linkTo)"
  24. >
  25. </q-carousel-slide>
  26. </q-carousel>
  27. </div>
  28. <div class="row q-pa-md">
  29. <div class="q-gutter-y-md col-12 col-md-6">
  30. <q-tabs v-model="tab" dense align="justify" class="text-primary">
  31. <q-tab :ripple="false" name="lg" label="Latest Guidebooks" />
  32. <q-tab
  33. :ripple="false"
  34. name="mdg"
  35. label="Most Downloaded Guidebooks"
  36. />
  37. </q-tabs>
  38. </div>
  39. </div>
  40. <div class="row justify-left">
  41. <div
  42. class="col-12 col-sm-4 col-md-2"
  43. v-for="item in guidebooks"
  44. :key="item.guideId"
  45. >
  46. <div class="q-pa-md">
  47. <q-card
  48. @click="gotoUrl(item.downloadUrl)"
  49. class="guidebook-card cursor-pointer rounded-borders"
  50. @mouseenter="hoverFlag = true"
  51. @mouseleave="hoverFlag = false"
  52. >
  53. <q-img
  54. class="rounded-borders"
  55. style="height: 100%"
  56. :src="item.coverImageUrl"
  57. >
  58. <div class="absolute-bottom">
  59. <div class="text-h6">{{ item.destinationName }}</div>
  60. <div class="text-subtitle2">
  61. {{ item.parentDestinationName }}
  62. </div>
  63. </div>
  64. </q-img>
  65. </q-card>
  66. </div>
  67. </div>
  68. </div>
  69. </q-page>
  70. </template>
  71. <script>
  72. import { ref, onMounted } from "vue";
  73. import { api } from "boot/axios";
  74. export default {
  75. name: "GuideIntroPage",
  76. setup() {
  77. const sliders = ref([]);
  78. const pageSize = ref(1000);
  79. const currentPage = ref(1);
  80. const guidebooks = ref([]);
  81. function loadSliders() {
  82. api
  83. .get("/api/public/pagecontent/guidebookintrosliders")
  84. .then(function (response) {
  85. console.log("guidebookintrosliders:");
  86. console.log(response.data.data);
  87. sliders.value = response.data.data;
  88. })
  89. .catch(function (error) {
  90. console.log(error);
  91. });
  92. }
  93. function loadGuideBooks() {
  94. console.log("loading latest guidebooks...");
  95. var params = {};
  96. params.pageSize = pageSize.value;
  97. params.page = currentPage.value;
  98. (params.query = ""),
  99. api
  100. .get("/api/public/guidebook", {
  101. params: params,
  102. })
  103. .then(function (response) {
  104. console.log("all guidebook list:");
  105. guidebooks.value = response.data.data.data;
  106. console.log(guidebooks.value);
  107. })
  108. .catch(function (error) {
  109. console.log(error);
  110. });
  111. }
  112. function logPv() {
  113. api
  114. .post("/api/public/pagestats/pv/guideintro")
  115. .then((res) => {
  116. console.log("log pv:");
  117. console.log(res.data);
  118. })
  119. .catch((err) => {
  120. console.error("Error:", err);
  121. });
  122. }
  123. onMounted(() => {
  124. logPv();
  125. loadSliders();
  126. loadGuideBooks();
  127. });
  128. return {
  129. hoverFlag: ref(true),
  130. slide: ref(1),
  131. sliders,
  132. tab: ref("lg"),
  133. guidebooks,
  134. };
  135. },
  136. };
  137. </script>
  138. <style lang="sass" scoped>
  139. .guidebook-card
  140. width: 100%
  141. max-width: 550px
  142. height: 300px
  143. </style>