index.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <route lang="yaml">
  2. style:
  3. navigationStyle: custom
  4. navigationBarTitleText: 游学日程
  5. </route>
  6. <script setup lang="ts">
  7. import { getMyStudyTours } from '../../../core/libs/requests'
  8. import { camera, map } from '../../../core/libs/svgs'
  9. import { useUserStore } from '../../../store'
  10. import { storeToRefs } from 'pinia'
  11. import { group } from 'radash'
  12. import dayjs from 'dayjs'
  13. import NavbarEvo from '@/components/navbar-evo.vue'
  14. import BottomAppBar from '@/components/bottom-app-bar.vue'
  15. import ButtonEvo from '@/components/button-evo.vue'
  16. import { useRouter } from '../../../core/utils/router'
  17. import ImageEvo from '@/components/image-evo.vue'
  18. const router = useRouter()
  19. const userStore = useUserStore()
  20. const { userInfo } = storeToRefs(userStore)
  21. const { data: studyTours, run: setStudyTours } = useRequest(() => getMyStudyTours(), {
  22. initialData: [],
  23. })
  24. const currentStudyTour = computed(() =>
  25. studyTours.value.find(
  26. (it) => dayjs(it.studyStartTime).isBefore(dayjs()) && dayjs(it.studyEndTime).isAfter(dayjs()),
  27. ),
  28. )
  29. const schedules = computed(
  30. () =>
  31. group(currentStudyTour.value?.studyTravelDOList || [], (it) =>
  32. dayjs(it?.travelTime).format('YYYY-MM-DD'),
  33. ) || { [dayjs().format('YYYY-MM-DD')]: [] },
  34. )
  35. onMounted(async () => {
  36. await setStudyTours()
  37. })
  38. </script>
  39. <template>
  40. <view class="flex-grow flex flex-col">
  41. <NavbarEvo transparent dark></NavbarEvo>
  42. <view class="bg-black w-full aspect-[1.26/1]">
  43. <ImageEvo :src="currentStudyTour?.backgroundUrl"></ImageEvo>
  44. <div
  45. class="aspect-[4.17/1] bg-gradient-to-t from-black to-black/0 absolute left-0 bottom-0 w-full flex items-center"
  46. ></div>
  47. </view>
  48. <div class="flex-grow bg-white">
  49. <view class="flex-grow bg-white relative bottom-4 rounded-t-2xl p-6.5">
  50. <view class="border-b border-black/10 border-b-solid pb-5">
  51. <div class="text-black/90 text-2xl font-normal font-['PingFang_SC'] leading-normal">
  52. {{ currentStudyTour?.name }}
  53. </div>
  54. <view class="flex mt-5">
  55. <wd-img
  56. custom-class="rounded-full overflow-hidden mr-1"
  57. width="22"
  58. height="22"
  59. :src="userInfo?.avatar"
  60. />
  61. <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-normal">
  62. {{ userInfo?.nickname }}
  63. </div>
  64. <div
  65. class="flex text-black/40 text-base font-normal font-['PingFang_SC'] leading-normal"
  66. >
  67. <view class="mx-3.5">|</view>
  68. {{ dayjs().format('M月D日') }}
  69. 第{{
  70. Object.keys(schedules || []).findIndex(
  71. (it) => it === dayjs().format('YYYY-MM-DD'),
  72. ) + 1
  73. }}天
  74. </div>
  75. </view>
  76. </view>
  77. <template
  78. v-for="(item, itemIndex) in schedules?.[dayjs().format('YYYY-MM-DD')]"
  79. :key="itemIndex"
  80. >
  81. <view class="grid grid-gap-2 mt-8">
  82. <view class="col-start-1 row-start-1 flex items-center justify-center">
  83. <view
  84. class="w-[27px] h-[27px] bg-[#f6f6f6] rounded-full flex justify-center items-center"
  85. >
  86. <wd-img width="16" height="16" :src="map"></wd-img>
  87. </view>
  88. </view>
  89. <view class="col-start-2 row-start-1 flex">
  90. <div
  91. class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-normal mr-5"
  92. >
  93. {{ dayjs(item?.travelTime).format('HH:mm') }}
  94. </div>
  95. <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-normal">
  96. {{ item.title }}
  97. </div>
  98. </view>
  99. <view
  100. class="col-start-2 row-start-2 border-b border-black/10 pb-5"
  101. :class="`${itemIndex < (schedules?.[dayjs().format('YYYY-MM-DD')] || []).length - 1 ? 'border-b-solid' : ''}`"
  102. >
  103. <div class="">
  104. <span class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-[23px]">
  105. 行程介绍:
  106. </span>
  107. <span class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[23px]">
  108. {{ item.travelDesc }}
  109. </span>
  110. </div>
  111. <template v-if="item.clockExplainUrl">
  112. <view class="flex items-center my-4">
  113. <wd-img width="16" height="16" :src="camera"></wd-img>
  114. <div
  115. class="ml-1 text-black/90 text-xs font-normal font-['PingFang_SC'] leading-normal"
  116. >
  117. 打卡示例
  118. </div>
  119. </view>
  120. <div class="w-[285px]">
  121. <img
  122. v-if="item.clockExplainUrl"
  123. class="w-[285px] h-[157px] rounded-lg"
  124. :src="item.clockExplainUrl"
  125. />
  126. </div>
  127. <div
  128. class="mt-2.5 text-black/40 text-xs font-normal font-['PingFang_SC'] leading-normal"
  129. >
  130. {{ item.clockExplainDesc }}
  131. </div>
  132. </template>
  133. </view>
  134. </view>
  135. </template>
  136. </view>
  137. </div>
  138. <BottomAppBar fixed placeholder>
  139. <div
  140. class="p-3.5 bg-white/90 rounded-2xl backdrop-blur-[20px] bottom-4 left-0 right-0 flex items-center justify-between gap-1"
  141. >
  142. <!-- <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
  143. 发布圈子可得
  144. </div>
  145. <div class="text-[#ef4343] text-[22px] font-normal font-['D-DIN_Exp'] leading-normal">
  146. 16000
  147. </div>
  148. <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
  149. 积分
  150. </div> -->
  151. <view class="flex-1"></view>
  152. <view>
  153. <ButtonEvo size="lg" @click="router.push('/pages/publish/moment/index')">
  154. 发圈子
  155. </ButtonEvo>
  156. </view>
  157. </div>
  158. </BottomAppBar>
  159. </view>
  160. </template>