study-tour-card.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <script lang="ts" setup>
  2. import { StudyTour } from '../../../../core/libs/models'
  3. import dayjs from 'dayjs'
  4. import { useRouter } from '../../../../core/utils/router'
  5. import { map } from '@designer-hub/assets/src/assets/svgs'
  6. import { NetImages } from '../../../../core/libs/net-images'
  7. import ActivityCountDown from '../../components/activity-count-down.vue'
  8. import { useActivity } from '../../../../composables/activity'
  9. import ButtonEvo from '@/components/button-evo.vue'
  10. import { omit } from 'radash'
  11. import TooltipEvo from '@/components/tooltip-evo.vue'
  12. const props = defineProps<{
  13. customClass?: string
  14. options?: StudyTour & { levelsByMemberLevel; index }
  15. }>()
  16. const router = useRouter()
  17. const activityOptions = ref(omit(props.options, ['levelsByMemberLevel', 'index']))
  18. const { listItemButtonText, statusText, status, difference, startAt, endAt, refresh } =
  19. useActivity(activityOptions)
  20. const toDetail = () => {
  21. router.push(`/pages/home/activity/detail/index?id=${props.options?.id}&type=studyTour`)
  22. }
  23. </script>
  24. <template>
  25. <div
  26. class="relative box-border aspect-[1.15/1] bg-[length:100%] flex flex-col"
  27. :class="customClass"
  28. :style="{ backgroundImage: `url(${NetImages.StudyTourItemBg})` }"
  29. @click="toDetail"
  30. >
  31. <div class="flex flex-col pt-2.25 px-6 gap-6">
  32. <div class="flex gap-1">
  33. <wd-img width="23" height="23" :src="map"></wd-img>
  34. <div class="text-white text-base font-normal font-['PingFang_SC'] leading-relaxed">
  35. 第{{ options?.sort }}站
  36. </div>
  37. <div class="flex-1"></div>
  38. <div
  39. class="rounded-[20px] backdrop-blur-[15px] px-4 py-1.5"
  40. :class="`${['running', 'registering'].includes(status) ? 'bg-[#fff4f4] text-[#a60707]' : 'bg-[#f3f3f3] text-black/40'}`"
  41. >
  42. <div class="text-sm font-normal font-['PingFang_SC']">
  43. {{ statusText }}
  44. </div>
  45. </div>
  46. </div>
  47. <div class="flex gap-4 pt-2">
  48. <wd-img
  49. width="110"
  50. height="88"
  51. custom-class="rounded-[10px] overflow-hidden vertical-bottom"
  52. :src="options?.thumbnailUrl"
  53. mode="scaleToFill"
  54. />
  55. <div class="flex flex-col justify-around">
  56. <div class="text-black text-base font-normal font-['PingFang_SC'] leading-relaxed">
  57. {{ options?.name }}
  58. </div>
  59. <div class="flex items-center">
  60. <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
  61. 游学时间:
  62. </div>
  63. <div
  64. class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px] flex items-center"
  65. >
  66. {{ dayjs(startAt).format('MM.DD') }}
  67. <wd-icon name="play" size="22px"></wd-icon>
  68. {{ dayjs(endAt).format('MM.DD') }}
  69. </div>
  70. </div>
  71. <div class="flex">
  72. <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
  73. 兑换积分:
  74. </div>
  75. <div class="text-[#ef4343] text-xl font-normal font-['D-DIN_Exp'] leading-[34px]">
  76. {{ options?.needPointsCount }}
  77. </div>
  78. </div>
  79. </div>
  80. <div></div>
  81. </div>
  82. <div class="flex items-center justify-between">
  83. <ActivityCountDown
  84. :start-at="options?.applyStartTime || options?.planApplyStartTime"
  85. :end-at="options?.applyEndTime || options?.planApplyEndTime"
  86. @end="refresh"
  87. ></ActivityCountDown>
  88. <TooltipEvo
  89. placement="top"
  90. :content="`还差${difference}积分`"
  91. :model-value="status === 'runing' && difference > 0"
  92. >
  93. <!-- {{ difference }} -->
  94. <ButtonEvo size="md">
  95. {{ options?.ifSingnUp ? '已报名' : listItemButtonText }}
  96. </ButtonEvo>
  97. <div @tap.stop="toDetail()"></div>
  98. </TooltipEvo>
  99. </div>
  100. <div class="flex justify-between border-t-solid border-t-[#f2f2f2] border-t-1 py-4">
  101. <div></div>
  102. <div
  103. class="text-justify text-black/40 text-xs font-normal font-['PingFang_SC'] leading-relaxed"
  104. >
  105. <!-- 黄金会员以上等级 -->
  106. {{
  107. options?.memberLevel
  108. ?.map((it) => options?.levelsByMemberLevel[String(it)]?.memberLevelName)
  109. ?.join('、')
  110. }}
  111. 可报名
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. </template>