home.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <div class="index">
  3. <!--初次加载后面的虚拟mask-->
  4. <template v-if="firstLoading">
  5. <div class="skeleton_banner"></div>
  6. <div class="w_sld_react_1210 adv_04_wrap skeleton">
  7. <div class="floor_title">
  8. <h2>
  9. <span></span>
  10. </h2>
  11. </div>
  12. <div class="floor_goods">
  13. <div
  14. class="item"
  15. v-for="(item_main, index_main) in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
  16. v-bind:key="index_main"
  17. >
  18. <div class="wrap">
  19. <a href="javascript:void(0)" class="example_text"></a>
  20. <p class="title">
  21. <a href="javascript:void(0)">{{ item_main }}</a>
  22. </p>
  23. <p class="price">
  24. <span></span>
  25. </p>
  26. </div>
  27. </div>
  28. </div>
  29. </div>
  30. </template>
  31. <SldDiy
  32. v-if="decorateData.data.length"
  33. :decorateData="decorateData"
  34. @adv19="handleAdv19"
  35. />
  36. <SldCommonEmpty
  37. v-if="!firstLoading && !decorateData.data.length"
  38. totalHeight="900"
  39. paddingTop="250"
  40. :tip="L['我们正在努力装修中,敬请期待~']"
  41. />
  42. </div>
  43. </template>
  44. <script setup>
  45. import { getCurLanguage } from "@/composables/common.js";
  46. const L = getCurLanguage();
  47. const router = useRouter();
  48. const route = useRoute();
  49. const decorateData = reactive({ data: [] }); //装修数据
  50. const firstLoading = ref(true); //是否第一次加载
  51. const { proxy } = getCurrentInstance();
  52. const latestProducts = reactive({ data: [] });
  53. const getInitData = async () => {
  54. let param = {};
  55. if (route.query.type == "view" && route.query.id)
  56. param.decoId = route.query.id;
  57. const {
  58. data: value,
  59. pending,
  60. error,
  61. refresh,
  62. } = await useFetchRaw(apiUrl + "v3/system/front/pcDeco/index");
  63. const res = value._rawValue;
  64. if (!pending._rawValue) {
  65. firstLoading.value = false;
  66. }
  67. if (res.state == 200) {
  68. decorateData.data = JSON.parse(res.data.data.replace(/&quot;/g, '"'));
  69. decorateData.data.map((item) => {
  70. item.json_data = item.json;
  71. if (item.json_data && item.json_data.type == "adv_19") {
  72. item.json_data.data.map((child) => {
  73. child.cur_tab = 0;
  74. });
  75. }
  76. if (item.json_data && item.json_data.type == "main_banner_pc") {
  77. item.json_data.data = item.json_data.info.carousel_info.data.filter((i) => i.imgUrl);
  78. }
  79. });
  80. }
  81. };
  82. getInitData();
  83. router.beforeEach((to, from, next) => {
  84. document.body.style.overflow = "";
  85. next();
  86. });
  87. const handleAdv19 = (data) => {
  88. let tmp_data = decorateData.data.filter(
  89. (item) => item.dataId == data.dataId
  90. )[0];
  91. tmp_data.json_data.data[data.left_or_right_index]["cur_tab"] = data.tab_index;
  92. };
  93. //获取最新商品
  94. // const getLatestProducts = async () => {
  95. // const {data:value } = await useFetchRaw(apiUrl+ "v3/goods/front/goods/new/list");
  96. // const res = value._rawValue
  97. // console.log(res.data)
  98. // if(res.state == 200){
  99. // latestProducts.data = res.data.list
  100. // }
  101. // }
  102. // getLatestProducts()
  103. onMounted(() => {});
  104. </script>
  105. <style lang="scss" scoped>
  106. @import "@/assets/style/decorate.scss";
  107. @import "@/assets/style/theme.scss";
  108. @import "@/assets/style/homeImgLayout.scss";
  109. .index {
  110. min-height: 456px;
  111. background: #f8f8f8;
  112. padding-bottom: 10px;
  113. }
  114. .skeleton_banner {
  115. width: 100%;
  116. height: 470px;
  117. background: $colorSkeleton;
  118. margin-bottom: 10px;
  119. }
  120. .skeleton {
  121. &.adv_04_wrap .floor_title h2 span {
  122. background: $colorSkeleton;
  123. display: inline-block;
  124. width: 200px;
  125. }
  126. &.adv_04_wrap .floor_goods .item .wrap .title {
  127. background: $colorSkeleton;
  128. width: 100%;
  129. a {
  130. color: transparent;
  131. }
  132. }
  133. &.adv_04_wrap .floor_goods .item .wrap .price {
  134. width: 100%;
  135. height: 25px;
  136. }
  137. &.adv_04_wrap .floor_goods .item .wrap .price span {
  138. display: inline-block;
  139. width: 70px;
  140. height: 100%;
  141. background: $colorSkeleton;
  142. }
  143. }
  144. </style>