register-card.vue 4.0 KB

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