register-card.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <script lang="ts" setup>
  2. import Card from '@/components/card.vue'
  3. import { Activity, StudyTour } from '../../../../core/libs/models'
  4. import dayjs from 'dayjs'
  5. import TiltedButton from '@/components/tilted-button.vue'
  6. import { getActivitySignups, getStudyTourSignups } from '../../../../core/libs/requests'
  7. import { NetImages } from '../../../../core/libs/net-images'
  8. import { useRouter } from '../../../../core/utils/router'
  9. import AvatarGroupCasual from '@/components/avatar-group-casual/avatar-group-casual.vue'
  10. import { omit } from 'radash'
  11. import { useActivity } from '@/composables/activity'
  12. const props = defineProps<{
  13. customClass?: string
  14. options?: StudyTour & { levelsByMemberLevel }
  15. }>()
  16. const router = useRouter()
  17. const { data: signups, run: setSignups } = useRequest(
  18. () => getStudyTourSignups({ studyId: props.options!.id.toString(), pageSize: -1 }),
  19. { initialData: { list: [], total: 0 } },
  20. )
  21. const activityOptions = computed(() => omit(props.options, ['levelsByMemberLevel']))
  22. const { statusText, listItemButtonText } = useActivity(activityOptions)
  23. onMounted(async () => {
  24. await setSignups()
  25. })
  26. </script>
  27. <template>
  28. <div @click="router.push(`/pages/home/activity/detail/index?id=${options?.id}&type=studyTour`)">
  29. <Card custom-class="w-full p-0! relative aspect-[0.75/1]">
  30. <div class="absolute left-0 top-0 right-0 bottom-0">
  31. <wd-img
  32. custom-class="vertical-bottom"
  33. width="100%"
  34. height="100%"
  35. :src="options?.bannerUrl"
  36. ></wd-img>
  37. </div>
  38. <div
  39. class="px-2.5 h-[29px] bg-black/60 rounded-[20px] backdrop-blur-[15px] absolute top-5 right-3.5 flex items-center justify-center"
  40. >
  41. <div class="text-white text-sm font-normal font-['PingFang_SC'] leading-relaxed">
  42. {{ statusText }}
  43. </div>
  44. </div>
  45. <view class="absolute bottom-0 left-0 right-0">
  46. <view class="flex items-center mx-4 my-2.5 gap-1">
  47. <avatar-group-casual
  48. :show-number="3"
  49. :urls="
  50. signups.list
  51. .filter((it) => it.userId)
  52. .map((it) => it.headImgUrl || NetImages.DefaultAvatar)
  53. "
  54. ></avatar-group-casual>
  55. <div
  56. class="ml-1 text-white/60 text-sm font-normal font-['PingFang_SC'] leading-[10.18px]"
  57. >
  58. {{ signups.total }}人已报名
  59. </div>
  60. </view>
  61. <div class="w-full h-[46px] absolute top-0 bg-gradient-to-t from-black to-black/00"></div>
  62. <div class="bg-[#010102]/50 rounded-bl-2xl rounded-br-2xl backdrop-blur-[20px] p-3.5">
  63. <div
  64. class="w-[293px] text-white text-xl font-normal font-['PingFang_SC'] leading-relaxed"
  65. >
  66. {{ options?.name }}
  67. </div>
  68. <view class="flex items-center">
  69. <div class="text-white/60 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
  70. 游学时间:
  71. </div>
  72. <div
  73. class="text-white/60 text-base font-normal font-['PingFang_SC'] leading-[34px] flex items-center gap-1"
  74. >
  75. <div class="text-center">
  76. {{ dayjs(options?.studyStartTime || options?.planStudyStartTime).format('MM.DD') }}
  77. </div>
  78. <wd-icon name="play" size="22px"></wd-icon>
  79. <div class="text-center">
  80. {{ dayjs(options?.studyEndTime || options?.planStudyEndTime).format('MM.DD') }}
  81. </div>
  82. </div>
  83. </view>
  84. <div
  85. class="text-justify text-white/60 text-sm font-normal font-['PingFang_SC'] leading-relaxed"
  86. >
  87. 等级限制:{{
  88. options?.memberLevel
  89. ?.map((it) => options?.levelsByMemberLevel[String(it)]?.memberLevelName)
  90. ?.join('、')
  91. }}
  92. </div>
  93. <view class="flex items-center justify-between">
  94. <view class="flex items-end">
  95. <div class="text-white text-3xl font-bold font-['D-DIN_Exp']">
  96. {{ options?.needPointsCount }}
  97. </div>
  98. <div class="ml-1 text-white/60 text-sm font-normal font-['PingFang_SC']">积分</div>
  99. </view>
  100. <tilted-button custom-class="" size="large" color="white">
  101. {{ options?.ifSingnUp ? '已报名' : listItemButtonText }}
  102. </tilted-button>
  103. </view>
  104. </div>
  105. </view>
  106. </Card>
  107. </div>
  108. </template>