Topic.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <template>
  2. <div>
  3. <SldHomeTopSearch />
  4. <NavCatHeader />
  5. <div class="bottom_line"></div>
  6. <div class="index">
  7. <template v-if="firstLoading">
  8. <div class="skeleton_banner"></div>
  9. <div class="w_sld_react_1210 adv_04_wrap skeleton">
  10. <div class="floor_title">
  11. <h2>
  12. <font>&nbsp;</font>
  13. <span></span>
  14. <font>&nbsp;</font>
  15. </h2>
  16. </div>
  17. <div class="floor_goods">
  18. <div
  19. class="item"
  20. v-for="(item_main, index_main) in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
  21. v-bind:key="index_main"
  22. >
  23. <div class="wrap">
  24. <a href="javascript:void(0)" class="example_text"> </a>
  25. <p class="title">
  26. <a href="javascript:void(0)">{{ item_main }}</a>
  27. </p>
  28. <p class="price"><span></span></p>
  29. </div>
  30. </div>
  31. </div>
  32. </div>
  33. </template>
  34. <SldDiy
  35. v-if="decorateData.data.length"
  36. :decorateData="decorateData"
  37. @adv19="handleAdv19"
  38. />
  39. <!-- 空页面 start-->
  40. <SldCommonEmpty
  41. v-if="!firstLoading && !decorateData.data.length"
  42. totalHeight="900"
  43. paddingTop="250"
  44. :tip="L['我们正在努力装修中,敬请期待~']"
  45. />
  46. <!-- 空页面 end-->
  47. </div>
  48. </div>
  49. </template>
  50. <script setup>
  51. import { useRoute } from "vue-router";
  52. const route = useRoute();
  53. const decorateData = reactive({ data: [] }); //装修数据
  54. const firstLoading = ref(true); //是否第一次加载
  55. const getInitData = async () => {
  56. let params = {};
  57. params.decoType = "topic";
  58. params.decoId = route.query.topicId;
  59. const { data: value, pending: pending, error, refresh } = await useFetchRaw(
  60. apiUrl + "v3/system/front/pcDeco/index",
  61. { params }
  62. );
  63. if (!pending._rawValue) {
  64. firstLoading.value = false;
  65. }
  66. const res = value._rawValue;
  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.type == "adv_19") {
  72. item.json_data.data.map((child) => {
  73. child.cur_tab = 0;
  74. });
  75. }
  76. });
  77. }
  78. };
  79. getInitData();
  80. </script>
  81. <style lang="scss" scoped>
  82. @use "@/assets/style/decorate.scss" as *;
  83. @use "@/assets/style/theme.scss" as *;
  84. .index {
  85. background: #f8f8f8;
  86. padding-bottom: 10px;
  87. }
  88. .skeleton_banner {
  89. width: 100%;
  90. height: 470px;
  91. background: $colorSkeleton;
  92. margin-bottom: 10px;
  93. }
  94. .skeleton {
  95. &.adv_04_wrap .floor_title h2 span {
  96. background: $colorSkeleton;
  97. display: inline-block;
  98. width: 200px;
  99. }
  100. &.adv_04_wrap .floor_goods .item .wrap .title {
  101. background: $colorSkeleton;
  102. width: 100%;
  103. a {
  104. color: transparent;
  105. }
  106. }
  107. &.adv_04_wrap .floor_goods .item .wrap .price {
  108. width: 100%;
  109. height: 25px;
  110. }
  111. &.adv_04_wrap .floor_goods .item .wrap .price span {
  112. display: inline-block;
  113. width: 70px;
  114. height: 100%;
  115. background: $colorSkeleton;
  116. }
  117. }
  118. </style>