123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <script lang="ts" setup>
- import { StudyTour } from '../../../../core/libs/models'
- import dayjs from 'dayjs'
- import { useRouter } from '../../../../core/utils/router'
- import { map } from '@designer-hub/assets/src/assets/svgs'
- import { NetImages } from '../../../../core/libs/net-images'
- import ActivityCountDown from '../../components/activity-count-down.vue'
- import { useActivity } from '../../../../composables/activity'
- import ButtonEvo from '@/components/button-evo.vue'
- import { omit } from 'radash'
- import TooltipEvo from '@/components/tooltip-evo.vue'
- const props = defineProps<{
- customClass?: string
- options?: StudyTour & { levelsByMemberLevel; index }
- }>()
- const router = useRouter()
- const activityOptions = ref(omit(props.options, ['levelsByMemberLevel', 'index']))
- const { listItemButtonText, statusText, status, difference, startAt, endAt, refresh } =
- useActivity(activityOptions)
- const toDetail = () => {
- router.push(`/pages/home/activity/detail/index?id=${props.options?.id}&type=studyTour`)
- }
- </script>
- <template>
- <div
- class="relative box-border aspect-[1.15/1] bg-[length:100%] flex flex-col"
- :class="customClass"
- :style="{ backgroundImage: `url(${NetImages.StudyTourItemBg})` }"
- @click="toDetail"
- >
- <div class="flex flex-col pt-2.25 px-6 gap-6">
- <div class="flex gap-1">
- <wd-img width="23" height="23" :src="map"></wd-img>
- <div class="text-white text-base font-normal font-['PingFang_SC'] leading-relaxed">
- 第{{ options?.sort }}站
- </div>
- <div class="flex-1"></div>
- <div
- class="rounded-[20px] backdrop-blur-[15px] px-4 py-1.5"
- :class="`${['running', 'registering'].includes(status) ? 'bg-[#fff4f4] text-[#a60707]' : 'bg-[#f3f3f3] text-black/40'}`"
- >
- <div class="text-sm font-normal font-['PingFang_SC']">
- {{ statusText }}
- </div>
- </div>
- </div>
- <div class="flex gap-4 pt-2">
- <wd-img
- width="110"
- height="88"
- custom-class="rounded-[10px] overflow-hidden vertical-bottom"
- :src="options?.thumbnailUrl"
- mode="scaleToFill"
- />
- <div class="flex flex-col justify-around">
- <div class="text-black text-base font-normal font-['PingFang_SC'] leading-relaxed">
- {{ options?.name }}
- </div>
- <div class="flex items-center">
- <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
- 游学时间:
- </div>
- <div
- class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px] flex items-center"
- >
- {{ dayjs(startAt).format('MM.DD') }}
- <wd-icon name="play" size="22px"></wd-icon>
- {{ dayjs(endAt).format('MM.DD') }}
- </div>
- </div>
- <div class="flex">
- <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[34px]">
- 兑换积分:
- </div>
- <div class="text-[#ef4343] text-xl font-normal font-['D-DIN_Exp'] leading-[34px]">
- {{ options?.needPointsCount }}
- </div>
- </div>
- </div>
- <div></div>
- </div>
- <div class="flex items-center justify-between">
- <ActivityCountDown
- :start-at="options?.applyStartTime || options?.planApplyStartTime"
- :end-at="options?.applyEndTime || options?.planApplyEndTime"
- @end="refresh"
- ></ActivityCountDown>
- <TooltipEvo
- placement="top"
- :content="`还差${difference}积分`"
- :model-value="status === 'runing' && difference > 0"
- >
- <!-- {{ difference }} -->
- <ButtonEvo size="md">
- {{ options?.ifSingnUp ? '已报名' : listItemButtonText }}
- </ButtonEvo>
- <div @tap.stop="toDetail()"></div>
- </TooltipEvo>
- </div>
- <div class="flex justify-between border-t-solid border-t-[#f2f2f2] border-t-1 py-4">
- <div></div>
- <div
- class="text-justify text-black/40 text-xs font-normal font-['PingFang_SC'] leading-relaxed"
- >
- <!-- 黄金会员以上等级 -->
- {{
- options?.memberLevel
- ?.map((it) => options?.levelsByMemberLevel[String(it)]?.memberLevelName)
- ?.join('、')
- }}
- 可报名
- </div>
- </div>
- </div>
- </div>
- </template>
|