index.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <route lang="json">
  2. {
  3. "style": {
  4. "navigationBarTitleText": "设计游学",
  5. "navigationBarBackgroundColor": "#fff"
  6. }
  7. }
  8. </route>
  9. <script lang="ts" setup>
  10. import Card from '@/components/card.vue'
  11. import MomentItem from '@/components/moment-item.vue'
  12. import SectionHeading from '@/components/section-heading.vue'
  13. import ClassItem from '../components/class-item.vue'
  14. import {
  15. getAppMemberLevelConfigs,
  16. getBanners,
  17. getCircles,
  18. getContents,
  19. getStudyTours,
  20. } from '../../../core/libs/requests'
  21. import { NetImages } from '../../../core/libs/net-images'
  22. import { BannerMode } from '../../../core/libs/models'
  23. import { useRouter } from '../../../core/utils/router'
  24. import PageHelper from '@/components/page-helper.vue'
  25. import RegisterCard from './components/register-card.vue'
  26. const router = useRouter()
  27. const { data: studyTours, run: setStudyTours } = useRequest(() =>
  28. getStudyTours({ headRecommend: 1 }),
  29. )
  30. const { data: classmates, run: setClassmates } = useRequest(
  31. () => getContents({ contentCategory: '101', pageSize: '2' }),
  32. { initialData: { list: [] } },
  33. )
  34. const { data: banners, run: setBanners } = useRequest(
  35. () => getBanners({ mode: BannerMode.StudyTour }),
  36. { initialData: [] },
  37. )
  38. const { data: levels, run: setLevels } = useRequest(() => getAppMemberLevelConfigs(), {
  39. initialData: [],
  40. })
  41. const levelsByMemberLevel = computed(() =>
  42. levels.value.reduce((acc, item) => {
  43. acc[item.memberLevel] = item
  44. return acc
  45. }, {}),
  46. )
  47. onMounted(async () => {
  48. await Promise.all([setLevels(), setStudyTours(), setClassmates(), setBanners()])
  49. })
  50. </script>
  51. <template>
  52. <view class="flex-grow flex flex-col gap-6 p-3.5">
  53. <div class="">
  54. <!-- <TimeLine></TimeLine> -->
  55. <template v-if="banners.length">
  56. <div class="aspect-[1.73/1]">
  57. <wd-img
  58. width="100%"
  59. height="100%"
  60. custom-class="aspect-[1.73/1]"
  61. :src="banners[0].bannerImgUrl"
  62. @click="router.push(`/pages/home/study-tour/list`)"
  63. ></wd-img>
  64. </div>
  65. </template>
  66. </div>
  67. <template v-if="studyTours?.list.length">
  68. <swiper class="aspect-[0.75/1] rounded-[20px] overflow-hidden">
  69. <template v-for="(it, i) in studyTours?.list" :key="i">
  70. <swiper-item>
  71. <RegisterCard :options="{ ...it, levelsByMemberLevel }"></RegisterCard>
  72. </swiper-item>
  73. </template>
  74. </swiper>
  75. </template>
  76. <!-- </template>
  77. </PageHelper> -->
  78. <!-- <card custom-class="p-0!">
  79. <view class="relative">
  80. <wd-img
  81. custom-class="vertical-bottom"
  82. width="100%"
  83. height="275"
  84. src="https://via.placeholder.com/347x464"
  85. ></wd-img>
  86. <div
  87. class="w-[63px] h-[29px] bg-black/60 rounded-[20px] backdrop-blur-[15px] absolute top-5 right-3.5 flex items-center justify-center"
  88. >
  89. <div class="text-white text-sm font-normal font-['PingFang_SC'] leading-relaxed">
  90. 报名中
  91. </div>
  92. </div>
  93. <view class="absolute left-3.5 bottom-2.5 flex items-center">
  94. <avatar-group-casual
  95. :show-number="3"
  96. :urls="[
  97. 'https://via.placeholder.com/20x20',
  98. 'https://via.placeholder.com/20x20',
  99. 'https://via.placeholder.com/20x20',
  100. ]"
  101. ></avatar-group-casual>
  102. <div
  103. class="ml-1 text-white/60 text-sm font-normal font-['PingFang_SC'] leading-[10.18px]"
  104. >
  105. 40人已报名
  106. </div>
  107. </view>
  108. </view>
  109. <div class="bg-[#27130d]/50 rounded-bl-2xl rounded-br-2xl backdrop-blur-[20px] p-3.5">
  110. <div class="w-[293px] text-white text-xl font-normal font-['PingFang_SC'] leading-relaxed">
  111. 日本研学·东京艺术大学设计游学
  112. </div>
  113. <view class="flex items-center">
  114. <div class="text-white/60 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
  115. 游学时间:
  116. </div>
  117. <div class="text-white/60 text-base font-normal font-['PingFang_SC'] leading-[34px]">
  118. 07.15 08.10
  119. </div>
  120. </view>
  121. <div
  122. class="text-justify text-white/60 text-sm font-normal font-['PingFang_SC'] leading-relaxed"
  123. >
  124. 等级限制:黄金会员以上
  125. </div>
  126. <view class="flex items-center justify-between">
  127. <view class="flex items-end">
  128. <div class="text-white text-3xl font-bold font-['D-DIN_Exp'] leading-normal">16000</div>
  129. <div class="ml-1 text-white/60 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
  130. 积分
  131. </div>
  132. </view>
  133. <tilted-button custom-class="" size="large" color="white">立即报名</tilted-button>
  134. </view>
  135. </div>
  136. </card> -->
  137. <card custom-class="">
  138. <div class="my-7.5 text-black text-xl font-normal font-['PingFang_SC'] leading-[10.18px]">
  139. 筑巢荟-设计游学
  140. </div>
  141. <div
  142. class="text-justify text-black/40 text-base font-normal font-['PingFang_SC'] leading-relaxed"
  143. >
  144. 我们为您精心打造了一个独特且极具价值的游学项目。这个项目的核心旨在全方位提升您作为设计师的能力。
  145. 在这里,您将拥有无比优质的游学资源。我们与全球知名的设计学府、顶尖设计工作室以及具有代表性的经典建筑和室内空间建立了紧密合作。您将有机会深入这些卓越的场所,亲身体验最前沿的设计理念和实践。
  146. 参与专业的研讨会和工作坊,与同行们分享见解、碰撞思维火花,进一步深化对设计的理解。
  147. </div>
  148. </card>
  149. <section-heading
  150. custom-class=""
  151. title="同学荟"
  152. path="/pages/home/classmates/index"
  153. ></section-heading>
  154. <template v-for="(it, i) in classmates.list" :key="i">
  155. <ClassItem :options="it"></ClassItem>
  156. </template>
  157. <wd-status-tip
  158. v-if="!classmates.list?.length"
  159. :image="NetImages.NotContent"
  160. tip="暂无内容"
  161. ></wd-status-tip>
  162. <section-heading custom-class="" title="设计圈"></section-heading>
  163. <PageHelper :request="getCircles" :query="{}" class="flex-grow flex flex-col">
  164. <template #default="{ source }">
  165. <div class="flex-grow flex flex-col gap-6">
  166. <template v-for="(it, i) in source.list" :key="i">
  167. <MomentItem :options="it"></MomentItem>
  168. </template>
  169. </div>
  170. </template>
  171. </PageHelper>
  172. </view>
  173. </template>