index.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <route lang="json5">
  2. {
  3. style: {
  4. navigationBarTitleText: '线下活动',
  5. navigationBarBackgroundColor: '#fff',
  6. },
  7. }
  8. </route>
  9. <script setup lang="ts">
  10. import SectionHeading from '@/components/section-heading.vue'
  11. import Card from '@/components/card.vue'
  12. import OfflineActivityItem from '../components/offline-activity-item.vue'
  13. import {
  14. getAllCategories,
  15. getContents,
  16. getActivities,
  17. getAppMemberLevelConfigs,
  18. } from '../../../core/libs/requests'
  19. import { strip, leaderboardText } from '@designer-hub/assets/src/assets/svgs'
  20. import { NetImages } from '../../../core/libs/net-images'
  21. import RegisterCard from '../components/register-card.vue'
  22. import PageHelper from '@/components/page-helper.vue'
  23. const { data: categories, run: setCategories } = useRequest(() => getAllCategories(), {
  24. initialData: [],
  25. })
  26. const tab = ref<number>(0)
  27. const contentCategory = ref()
  28. const { data, run: setData } = useRequest(
  29. () =>
  30. getContents({
  31. // contentType: '2',
  32. contentCategory: contentCategory.value,
  33. }),
  34. {
  35. initialData: { list: [] },
  36. },
  37. )
  38. const { data: activities, run: setActivities } = useRequest(
  39. () => getActivities({ headRecommend: 1 }),
  40. {
  41. initialData: { list: [] },
  42. },
  43. )
  44. const { data: levels, run: setLevels } = useRequest(() => getAppMemberLevelConfigs(), {
  45. initialData: [],
  46. })
  47. const levelsByMemberLevel = computed(() =>
  48. levels.value.reduce((acc, item) => {
  49. acc[item.memberLevel] = item
  50. return acc
  51. }, {}),
  52. )
  53. const setContentCategory = (index) => {
  54. contentCategory.value = categories.value.find(({ id }) => id === 2)?.children[index].id.toString()
  55. }
  56. const handleTabChange = ({ index }) => {
  57. setContentCategory(index)
  58. setData()
  59. }
  60. onMounted(async () => {
  61. await setCategories()
  62. setContentCategory(tab.value)
  63. await Promise.all([setActivities(), setData(), setLevels()])
  64. })
  65. </script>
  66. <template>
  67. <view class="flex-grow px-3.5 flex flex-col gap-6 py-7">
  68. <section-heading
  69. custom-class=""
  70. title="线下活动"
  71. path="/pages/home/offline-activity/list/index"
  72. end-text="查看全部"
  73. ></section-heading>
  74. <template v-if="activities.list?.length">
  75. <swiper class="aspect-[0.75/1] rounded-[20px] overflow-hidden">
  76. <template v-for="(it, i) in activities.list" :key="i">
  77. <swiper-item>
  78. <RegisterCard :options="{ ...it, levelsByMemberLevel }"></RegisterCard>
  79. </swiper-item>
  80. </template>
  81. </swiper>
  82. </template>
  83. <card custom-class="">
  84. <div class="my-7.5 text-black text-xl font-normal font-['PingFang_SC'] leading-[10.18px]">
  85. 筑巢荟-活动营
  86. </div>
  87. <div
  88. class="text-justify text-black/40 text-base font-normal font-['PingFang_SC'] leading-relaxed"
  89. >
  90. 我们为您精心打造了一个独特且极具价值的活动营。这个项目的核心旨在全方位提升您作为设计师的能力。
  91. 在这里,您将拥有无比优质的游学资源。我们与全球知名的设计学府、顶尖设计工作室以及具有代表性的经典建筑和室内空间建立了紧密合作。您将有机会深入这些卓越的场所,亲身体验最前沿的设计理念和实践。
  92. 参与专业的研讨会和工作坊,与同行们分享见解、碰撞思维火花,进一步深化对设计的理解。
  93. </div>
  94. </card>
  95. <wd-tabs
  96. v-model="tab"
  97. custom-class="bg-transparent!"
  98. :slidable-num="4"
  99. @change="handleTabChange"
  100. >
  101. <block v-for="(it, item) in categories.find(({ id }) => id === 2)?.children" :key="item">
  102. <wd-tab :title="it.name"></wd-tab>
  103. </block>
  104. </wd-tabs>
  105. <Card custom-class="py-2 rounded-lg" v-if="tab === 0">
  106. <div class="flex items-center">
  107. <wd-img width="22" height="22" :src="strip"></wd-img>
  108. <wd-img width="80" :src="leaderboardText" mode="widthFix"></wd-img>
  109. <div class="flex-1">
  110. <section-heading
  111. title="筑巢荟骑行俱乐部"
  112. size="sm"
  113. path="/pages/home/offline-activity/cycling-rankings/index"
  114. ></section-heading>
  115. </div>
  116. </div>
  117. </Card>
  118. <template v-for="(it, index) in data.list" :key="index">
  119. <offline-activity-item class="" :options="it"></offline-activity-item>
  120. </template>
  121. <wd-status-tip
  122. v-if="!data.list?.length"
  123. :image="NetImages.NotContent"
  124. tip="暂无内容"
  125. ></wd-status-tip>
  126. </view>
  127. </template>
  128. <style scoped lang="scss"></style>