register-card.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <script lang="ts" setup>
  2. import Card from '@/components/card.vue'
  3. import { Activity, DictType, StudyTour } from '../../../core/libs/models'
  4. import dayjs from 'dayjs'
  5. import TiltedButton from '@/components/tilted-button.vue'
  6. import { getActivitySignups } 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?: (Activity | StudyTour) & { levelsByMemberLevel }
  15. }>()
  16. const router = useRouter()
  17. const { data: signups, run: setSignups } = useRequest(
  18. () => getActivitySignups({ activityId: 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-sub/home/activity/detail/index?id=${options?.id}&type=activity`)">
  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[0]"
  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. <!-- {{ getActivityStatusText(options?.applyStartTime, options?.applyEndTime) }}-->
  43. {{ statusText }}
  44. </div>
  45. </div>
  46. <view class="absolute bottom-0 left-0 right-0">
  47. <view class="flex items-center mx-4 my-2.5 gap-1">
  48. <avatar-group-casual
  49. :show-number="3"
  50. :urls="
  51. signups.list
  52. .filter((it) => it.userId)
  53. .map((it) => it.headImgUrl || NetImages.DefaultAvatar)
  54. "
  55. ></avatar-group-casual>
  56. <div
  57. class="ml-1 text-white/60 text-sm font-normal font-['PingFang_SC'] leading-[10.18px]"
  58. >
  59. {{ signups.total }}人已报名
  60. </div>
  61. </view>
  62. <div class="w-full h-[46px] absolute top-0 bg-gradient-to-t from-black to-black/00"></div>
  63. <div class="bg-[#010102]/50 rounded-bl-2xl rounded-br-2xl backdrop-blur-[20px] p-3.5">
  64. <div
  65. class="w-[293px] text-white text-xl font-normal font-['PingFang_SC'] leading-relaxed"
  66. >
  67. {{ options?.name }}
  68. </div>
  69. <view class="flex items-center">
  70. <div class="text-white/60 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
  71. 活动时间:
  72. </div>
  73. <div
  74. class="text-white/60 text-base font-normal font-['PingFang_SC'] leading-[34px] flex items-center gap-1"
  75. >
  76. <div class="text-center">
  77. {{ dayjs(options?.activityStartTime).format('MM.DD') }}
  78. </div>
  79. <wd-icon name="play" size="22px"></wd-icon>
  80. <div class="text-center">
  81. {{ dayjs(options?.activityStartTime).format('MM.DD') }}
  82. </div>
  83. </div>
  84. </view>
  85. <div
  86. class="text-justify text-white/60 text-sm font-normal font-['PingFang_SC'] leading-relaxed"
  87. >
  88. 等级限制:{{
  89. options?.memberLevel
  90. ?.map((it) => options?.levelsByMemberLevel[String(it)]?.memberLevelName)
  91. ?.join('、')
  92. }}
  93. </div>
  94. <view class="flex items-center justify-between">
  95. <view class="flex items-end">
  96. <div class="text-white text-3xl font-bold font-['D-DIN_Exp']">
  97. {{ options?.needPointsCount }}
  98. </div>
  99. <div class="ml-1 text-white/60 text-sm font-normal font-['PingFang_SC']">积分</div>
  100. </view>
  101. <tilted-button custom-class="" size="large" color="white">
  102. {{ options?.ifSingnUp ? '已报名' : listItemButtonText }}
  103. </tilted-button>
  104. </view>
  105. </div>
  106. </view>
  107. </Card>
  108. </div>
  109. </template>