index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. <route lang="json">
  2. {
  3. "style": {
  4. "navigationStyle": "custom"
  5. }
  6. }
  7. </route>
  8. <script setup lang="ts">
  9. import NavbarEvo from '@/components/navbar-evo.vue'
  10. import {
  11. activitySignup,
  12. getActivity,
  13. getActivitySignups,
  14. getAppMemberLevelConfigs,
  15. getPhotoList,
  16. getStudyTour,
  17. getStudyTourSignups,
  18. studyTourSignup,
  19. } from '../../../../core/libs/requests'
  20. import dayjs from 'dayjs'
  21. import BottomAppBar from '@/components/bottom-app-bar.vue'
  22. import { useRouter } from '../../../../core/utils/router'
  23. import PageHelper from '@/components/page-helper.vue'
  24. import { ConfigProviderThemeVars } from 'wot-design-uni'
  25. import SectionHeading from '@/components/section-heading.vue'
  26. import AvatarGroupCasual from '@/components/avatar-group-casual/avatar-group-casual.vue'
  27. import { calendar, clock, funnel, location, user } from '@designer-hub/assets/src/icons'
  28. import { signupSuccessDialogBg } from '@designer-hub/assets/src/bgs'
  29. import { NetImages } from '../../../../core/libs/net-images'
  30. import signupListDialogBg from '@designer-hub/assets/src/libs/assets/signupListDialogBg'
  31. import { getActivityStatusText, getCountsArr } from '../../../../core/utils/common'
  32. import { extractColorsFromImageData } from 'extract-colors/lib/extract-colors.mjs'
  33. import { group, mapEntries, sort } from 'radash'
  34. import { Activity, ActivitySignUp, ResPageData, StudyTour } from '../../../../core/libs/models'
  35. import mapLocation from '@designer-hub/assets/src/libs/assets/mapLocation'
  36. import cameraWhite from '@designer-hub/assets/src/libs/assets/cameraWhite'
  37. import ButtonEvo from '@/components/button-evo.vue'
  38. import mpHtml from 'mp-html/dist/uni-app/components/mp-html/mp-html.vue'
  39. import { useActivity } from '../../../../composables/activity'
  40. import ImageEvo from '@/components/image-evo.vue'
  41. import TooltipEvo from '@/components/tooltip-evo.vue'
  42. import ActivityAsOf from '../../components/activity-as-of.vue'
  43. import images from '@designer-hub/assets/src/libs/assets/images'
  44. import { usePermissions } from '../../../../composables/permissions'
  45. import { useAnalysis } from '@/composables/analysis'
  46. import mapGray from '@designer-hub/assets/src/libs/assets/mapGray'
  47. const themeVars = ref<ConfigProviderThemeVars>({
  48. tableBorderColor: 'white',
  49. tabsNavLineBgColor: 'white',
  50. tabsNavColor: 'white',
  51. })
  52. const router = useRouter()
  53. const { clickByPermission } = usePermissions()
  54. const { option } = useAnalysis(true, false)
  55. const id = ref()
  56. const type = ref<'activity' | 'studyTour'>()
  57. const activityTypes = ref({ activity: '活动', studyTour: '游学' })
  58. const tab = ref(0)
  59. const request = ref<() => Promise<IResData<Partial<StudyTour> | Partial<Activity>>>>()
  60. const { data, run: setData } = useRequest(() => request.value(), { initialData: {} })
  61. const signUpsReq = ref<() => Promise<IResData<ResPageData<ActivitySignUp>>>>()
  62. const { data: signups, run: setSignups } = useRequest(() => signUpsReq.value(), {
  63. initialData: { list: [], total: 0 },
  64. })
  65. const { data: levels, run: setLevels } = useRequest(() => getAppMemberLevelConfigs(), {
  66. initialData: [],
  67. })
  68. const { data: photos, run: setPhotos } = useRequest(
  69. () =>
  70. getPhotoList({
  71. bizId: id.value,
  72. bizType: { studyTour: '2', activity: '1' }[type.value] as '1' | '2',
  73. pageSize: -1,
  74. }),
  75. { initialData: { list: [], total: 0 } },
  76. )
  77. const show = ref(false)
  78. const successShow = ref(false)
  79. const listShow = ref(false)
  80. const dominantColor = ref()
  81. const isActivity = computed(() => type.value === 'activity')
  82. const isStudyTour = computed(() => type.value === 'studyTour')
  83. const levelsByMemberLevel = computed(() =>
  84. levels.value.reduce((acc, item) => {
  85. acc[item.memberLevel] = item
  86. return acc
  87. }, {}),
  88. )
  89. const places = computed(() => {
  90. if (isActivity.value && data.value?.activityAllowType === '1') {
  91. return data.value?.activityAllowCount
  92. }
  93. if (isStudyTour.value && data.value?.studyAllowType === '1') {
  94. return data.value?.studyAllowCount
  95. }
  96. return '不限制'
  97. })
  98. const infos = computed(() => [
  99. {
  100. icon: clock,
  101. title: '报名时间',
  102. content: [
  103. dayjs(data.value.applyStartTime).format('YYYY.MM.DD'),
  104. dayjs(data.value.applyEndTime).format('YYYY.MM.DD'),
  105. ],
  106. visable: true,
  107. },
  108. {
  109. icon: calendar,
  110. title: `${activityTypes.value[type.value]}时间`,
  111. content: [
  112. dayjs(
  113. data.value.activityStartTime || data.value.studyStartTime || data.value.planStudyStartTime,
  114. ).format('YYYY.MM.DD'),
  115. // '111',
  116. dayjs(
  117. data.value.activityEndTime || data.value.studyEndTime || data.value.planStudyEndTime,
  118. ).format('YYYY.MM.DD'),
  119. ],
  120. visable: true,
  121. },
  122. {
  123. icon: location,
  124. title: `${activityTypes.value[type.value]}地点`,
  125. content: [data.value.activityAddr || ''],
  126. visable: isActivity.value,
  127. },
  128. {
  129. icon: user,
  130. title: `${activityTypes.value[type.value]}名额`,
  131. content: [
  132. places.value === '不限制' ? `不限制` : `${places.value}人/剩余${data.value.surplus}人`,
  133. ],
  134. visable: true,
  135. },
  136. {
  137. icon: funnel,
  138. title: `等级限制`,
  139. content: [
  140. data.value.memberLevel
  141. ?.map((it) => levelsByMemberLevel.value[String(it)]?.memberLevelName)
  142. .join('、') || '',
  143. ],
  144. visable: true,
  145. },
  146. ])
  147. const schedules = computed(() =>
  148. group(data.value?.studyTravelList, (it) => dayjs(it?.travelTime).format('YYYY-MM-DD')),
  149. )
  150. const activity = useActivity(data)
  151. const { status, statusText, difference, refresh } = activity
  152. const handleConfirm = async () => {
  153. const { data, code, msg } = await (isActivity.value ? activitySignup : studyTourSignup)({
  154. id: id.value,
  155. })
  156. console.log(msg)
  157. if (code === 0) {
  158. // todo: 报名成功弹框
  159. show.value = false
  160. successShow.value = true
  161. }
  162. await setData()
  163. }
  164. onLoad(async (query: { id: string; type: 'activity' | 'studyTour' }) => {
  165. id.value = query.id
  166. type.value = query.type
  167. if (type.value === 'activity') {
  168. request.value = () => getActivity(id.value)
  169. signUpsReq.value = () => getActivitySignups({ activityId: id.value, pageSize: -1 })
  170. }
  171. if (type.value === 'studyTour') {
  172. request.value = () => getStudyTour(id.value)
  173. signUpsReq.value = () => getStudyTourSignups({ studyId: id.value, pageSize: -1 })
  174. }
  175. await setData()
  176. option.value = {
  177. remark: `最近浏览${{ activity: '活动', studyTour: '游学' }[type.value]}: ${data.value.name}`,
  178. }
  179. const { path } = await uni.getImageInfo({ src: data.value.backgroundUrl })
  180. const ctx = uni.createCanvasContext('firstCanvas')
  181. uni
  182. .createSelectorQuery()
  183. .select('#firstCanvas')
  184. .fields({ size: true }, async ({ width, height }: any) => {
  185. // ctx.setFillStyle('#ffffff')
  186. ctx.drawImage(path, 0, 0, width, height)
  187. ctx.draw(true, async () => {
  188. const res1 = await uni.canvasGetImageData({
  189. canvasId: 'firstCanvas',
  190. x: 0,
  191. y: 0,
  192. width: width.toFixed(0),
  193. height: height.toFixed(0),
  194. })
  195. const { data: imageData } = res1
  196. dominantColor.value = `rgb(${getCountsArr(imageData, width, height)})`
  197. console.log(res1)
  198. const a = await extractColorsFromImageData(res1, {
  199. pixels: 1000000,
  200. distance: 0.22,
  201. colorValidator: (red, green, blue, alpha = 255) => alpha > 250,
  202. saturationDistance: 0.2,
  203. lightnessDistance: 0.2,
  204. hueDistance: 0.083333333,
  205. })
  206. console.log(a)
  207. const colors = sort(a, (it: any) => it.intensity, true)
  208. dominantColor.value = a[0].hex
  209. })
  210. })
  211. .exec()
  212. await Promise.all([setSignups(), setLevels(), setPhotos()])
  213. })
  214. onShareAppMessage(() => ({ title: data.value.name, imageUrl: data.value.thumbnailUrl }))
  215. onShareTimeline(() => ({ title: data.value.name, imageUrl: data.value.thumbnailUrl }))
  216. </script>
  217. <template>
  218. <div
  219. class="flex-grow bg-white px-3.5 bg-[length:100%_100%]"
  220. :style="{
  221. backgroundColor: `${dominantColor}`,
  222. }"
  223. >
  224. <NavbarEvo transparent dark></NavbarEvo>
  225. <div class="aspect-[1.26/1] relative mx--3.5 relative">
  226. <!-- <wd-img width="100%" height="100%" :src="data.bannerUrl?.at(0)"></wd-img> -->
  227. <canvas
  228. class="w-full h-full absolute top--1000"
  229. canvas-id="firstCanvas"
  230. id="firstCanvas"
  231. ></canvas>
  232. <!-- <ImageEvo :src="data?.bannerUrl" mode="aspectFill"></ImageEvo>-->
  233. <div
  234. class="w-full h-full bg-[length:100%_auto]"
  235. :style="{ backgroundImage: `url(${data?.bannerUrl})` }"
  236. ></div>
  237. <!-- <wd-img width="100%" height="100%" :src="data?.backgroundUrl"></wd-img> -->
  238. <div class="absolute left-3.5 bottom-3" @click="isActivity && (listShow = true)">
  239. <!-- <div-->
  240. <!-- v-if="isStudyTour"-->
  241. <!-- class="bg-white/20 rounded-[20px] backdrop-blur-[6px] px-3.5 py-1 flex gap-2.5"-->
  242. <!-- >-->
  243. <!-- <wd-img width="20" height="20" :src="bell"></wd-img>-->
  244. <!-- <div class="text-[#c1c1c1] text-base font-normal font-['PingFang_SC'] leading-normal">-->
  245. <!-- 白金会员王凯峰已报名-->
  246. <!-- </div>-->
  247. <!-- <div class="w-6 bg-black aspect-square rounded-full flex items-center justify-center">-->
  248. <!-- <wd-img width="18" height="18" :src="rightFill"></wd-img>-->
  249. <!-- </div>-->
  250. <!-- </div>-->
  251. <div class="flex items-center gap-1.25">
  252. <AvatarGroupCasual
  253. :urls="
  254. signups.list
  255. .filter((it) => it.userId)
  256. .map((it) => it.headImgUrl || NetImages.DefaultAvatar)
  257. "
  258. :width="40"
  259. :height="40"
  260. ></AvatarGroupCasual>
  261. <div class="text-white/60 text-sm font-normal font-['PingFang_SC'] leading-[10.18px]">
  262. {{ signups.total }}人已报名
  263. </div>
  264. </div>
  265. </div>
  266. </div>
  267. <div class="h-9">
  268. <div v-if="type === 'studyTour'" class="flex items-center h-full mt-9 gap-1.5">
  269. <wd-img width="18" height="18" :src="mapGray"></wd-img>
  270. <div class="text-[#c1c1c1] text-base font-normal font-['PingFang_SC'] leading-normal">
  271. 第{{ data?.sort }}站
  272. </div>
  273. </div>
  274. </div>
  275. <p class="text-white text-[26px] font-normal font-['PingFang_SC'] vertical-mid">
  276. <span class="leading-[44px] vertical-mid">{{ data?.name }}</span>
  277. <span
  278. class="ml-4 px-4 bg-white rounded-full backdrop-blur-[15px]! text-[#a60707] text-sm font-normal font-['PingFang_SC'] leading-[28px] vertical-mid inline-flex"
  279. >
  280. {{ statusText }}
  281. </span>
  282. </p>
  283. <div
  284. class="px-4 py-6 bg-[#010102]/30 backdrop-blur-[20px] rounded-2xl my-8 flex flex-col gap-3"
  285. >
  286. <!-- {{ levelsById }} -->
  287. <template v-for="(it, i) in infos" :key="i">
  288. <div v-if="it.visable" class="flex items-center gap-1.5">
  289. <wd-img width="16" height="16" :src="it.icon"></wd-img>
  290. <div
  291. class="w-17.5 whitespace-nowrap text-[#c1c1c1] text-base font-normal font-['PingFang_SC'] leading-normal"
  292. >
  293. {{ it.title }}
  294. </div>
  295. <div class="w-3"></div>
  296. <div
  297. class="flex-1 flex break-all items-center text-white text-base font-normal font-['PingFang_SC'] leading-[34px]"
  298. >
  299. <template v-if="it.content.length === 2">
  300. <div class="w-22 text-start">{{ it.content[0] }}</div>
  301. <wd-icon name="play" size="22px"></wd-icon>
  302. <div class="w-22 text-center">{{ it.content[1] }}</div>
  303. </template>
  304. <template v-else>{{ it.content[0] }}</template>
  305. </div>
  306. </div>
  307. </template>
  308. </div>
  309. <div v-if="isStudyTour" class="w-50%">
  310. <wd-config-provider :themeVars="themeVars">
  311. <wd-tabs v-model="tab" class="bg-transparent!" custom-class="bg-transparent!">
  312. <wd-tab title="活动介绍"></wd-tab>
  313. <wd-tab title="行程安排"></wd-tab>
  314. </wd-tabs>
  315. </wd-config-provider>
  316. </div>
  317. <SectionHeading v-if="isActivity" size="lg" title="活动介绍"></SectionHeading>
  318. <div class="mt-5 mx-3.5">
  319. <!-- v-html="data['activityDesc'] || data['studyDesc']" -->
  320. <div
  321. v-if="tab === 0"
  322. class="text-justify text-[#c1c1c1] text-base font-normal font-['PingFang_SC'] leading-relaxed"
  323. >
  324. <!-- <u-parse :content="data['activityDesc'] || data['studyDesc']"></u-parse> -->
  325. <mpHtml :content="data['activityDesc'] || data['studyDesc']"></mpHtml>
  326. </div>
  327. <div v-if="tab === 1 && 'studyTravelList' in data" class="flex flex-col gap-6">
  328. <!-- {{ mapEntries(schedules, (key, value) => [key, value]) }} -->
  329. <template v-for="([key, items], i) in Object.entries(schedules)" :key="key">
  330. <div class="flex flex-col gap-6">
  331. <div class="text-white text-base font-normal font-['PingFang_SC'] leading-normal">
  332. <!-- 6月26日 第一天 -->
  333. {{ dayjs(key).format('MM月DD日') }}
  334. <span class="ml-1">{{ `第${i + 1}天` }}</span>
  335. </div>
  336. <template v-for="(item, index) in items" :key="index">
  337. <div class="flex gap-2">
  338. <div class="w-7 h-7 bg-white/10 rounded-full flex items-center justify-center">
  339. <wd-img width="82%" height="82%" :src="mapLocation"></wd-img>
  340. </div>
  341. <div class="flex-1 flex flex-col gap-4">
  342. <div class="h-7 flex items-center gap-2.5">
  343. <div class="text-white text-sm font-normal font-['PingFang_SC'] leading-normal">
  344. {{ dayjs(item?.travelTime).format('HH:mm') }}
  345. </div>
  346. <div class="text-white text-sm font-normal font-['PingFang_SC'] leading-normal">
  347. <!-- 早稻田大学课程 -->
  348. {{ item.title }}
  349. </div>
  350. </div>
  351. <div class="">
  352. <span
  353. class="text-[#c1c1c1] text-sm font-normal font-['PingFang_SC'] leading-[23px]"
  354. >
  355. 行程介绍:
  356. </span>
  357. <span
  358. class="text-[#ababab] text-sm font-normal font-['PingFang_SC'] leading-[23px]"
  359. >
  360. <!-- 是位于日本东京都新宿区的一所著名的私立大学。它由早稻田大学的创始人大隈重信于1882年创立,是日本超级国际化大学计划(Top
  361. Global University Project)选定的大学之一,也是日本顶尖的高等教育机构之一。 -->
  362. {{ item.travelDesc }}
  363. </span>
  364. </div>
  365. <div v-if="(item.clockExplainUrl ?? '') !== ''" class="flex items-center gap-1">
  366. <wd-img width="16" height="16" :src="cameraWhite"></wd-img>
  367. <div class="text-white text-xs font-normal font-['PingFang_SC'] leading-normal">
  368. 打卡示例
  369. </div>
  370. </div>
  371. <!-- <img class="w-full rounded-2xl border" :src="it.clockExplainUrl" /> -->
  372. <wd-img
  373. v-if="(item.clockExplainUrl ?? '') !== ''"
  374. width="100%"
  375. custom-class="rounded-2xl overflow-hidden"
  376. :src="item.clockExplainUrl"
  377. mode="widthFix"
  378. enable-preview
  379. ></wd-img>
  380. <div
  381. v-if="(item.clockExplainUrl ?? '') !== ''"
  382. class="text-white/40 text-xs font-normal font-['PingFang_SC'] leading-normal"
  383. >
  384. {{ item.clockExplainDesc }}
  385. </div>
  386. </div>
  387. </div>
  388. </template>
  389. </div>
  390. </template>
  391. </div>
  392. </div>
  393. <BottomAppBar fixed placeholder transparent>
  394. <div
  395. class="h-[63px] bg-white/90 rounded-2xl backdrop-blur-[20px] flex items-center gap-1 px-4 box-border"
  396. >
  397. <div class="text-[#ef4343] text-2xl font-normal font-['D-DIN_Exp'] leading-normal">
  398. {{ data.needPointsCount || 0 }}
  399. </div>
  400. <div class="text-black/40 text-base font-normal font-['PingFang_SC'] leading-[34px]">
  401. 积分
  402. </div>
  403. <div class="flex-1"></div>
  404. <div>
  405. <div class="relative">
  406. <div class="absolute bottom-3 left-0 right-0 flex flex-col justify-center items-center">
  407. <div
  408. v-if="['waiting', 'registering'].includes(status)"
  409. class="bg-[#3b3c46] rounded-[60px] flex items-center py-1.5 px-4"
  410. >
  411. <ActivityAsOf
  412. :start-at="data?.applyStartTime || data?.planApplyStartTime"
  413. :end-at="data?.applyEndTime || data?.planApplyEndTime"
  414. @end="refresh"
  415. ></ActivityAsOf>
  416. </div>
  417. </div>
  418. </div>
  419. <TooltipEvo
  420. placement="top"
  421. :content="`还差${difference}积分`"
  422. :model-value="status === 'runing' && difference > 0"
  423. >
  424. <div @click="clickByPermission('exchange', () => (show = true))">
  425. <ButtonEvo>{{ data?.ifSingnUp ? '已报名' : '立即报名' }}</ButtonEvo>
  426. </div>
  427. </TooltipEvo>
  428. </div>
  429. </div>
  430. </BottomAppBar>
  431. <!-- <wd-fab
  432. custom-class="bg-red"
  433. :draggable="true"
  434. :expandable="false"
  435. :gap="{ bottom: 120 }"
  436. ></wd-fab> -->
  437. <!-- <wd-fab :expandable="false" :gap="{ bottom: 0, top: 0 }"></wd-fab> -->
  438. <div
  439. v-if="photos.total"
  440. class="fixed bottom-30 right-8 bg-[#0cbe7c] w-15 h-15 rounded-full flex flex-col items-center justify-center"
  441. @click="
  442. router.push(
  443. `/pages-sub/home/activity/images/index?id=${id}&type=${type}&title=${data.name}`,
  444. )
  445. "
  446. >
  447. <div>
  448. <wd-img width="29" height="29" :src="images"></wd-img>
  449. </div>
  450. <div class="text-white text-[10px] font-normal font-['PingFang_SC'] leading-tight">
  451. 查看照片
  452. </div>
  453. </div>
  454. <wd-action-sheet v-model="show">
  455. <view class="px-3.5 py-10">
  456. <div class="flex gap-5 mb-13.5">
  457. <div class="w-[110px] h-[94px] bg-[#f6f6f6] rounded-2xl">
  458. <wd-img width="100%" height="100%" :src="data.thumbnailUrl"></wd-img>
  459. </div>
  460. <div class="flex flex-col justify-between flex-1">
  461. <div class="text-black text-base font-normal font-['PingFang_SC'] leading-normal">
  462. {{ data.name }}
  463. </div>
  464. <div class="flex items-end gap-1">
  465. <div class="text-[#ef4343] text-[22px] font-normal leading-[22px]">
  466. {{ data.needPointsCount || 0 }}
  467. </div>
  468. <div class="text-black/40 text-sm font-normal font-['PingFang_SC']">积分</div>
  469. <!-- <div class="ml-1 text-black/40 text-xs font-normal font-['PingFang_SC']">-->
  470. <!-- 剩余:{{ remainedCount || 0 }}-->
  471. <!-- </div>-->
  472. <div class="flex-1"></div>
  473. </div>
  474. </div>
  475. </div>
  476. <wd-button block :round="false" @click="handleConfirm">确认报名</wd-button>
  477. </view>
  478. </wd-action-sheet>
  479. <wd-overlay :show="listShow" @click="listShow = false">
  480. <view class="flex px-10 h-full items-center justify-center">
  481. <div class="w-full flex flex-col gap-5 aspect-[0.71/1] relative">
  482. <div class="absolute top-0 left-0 right-0 bottom-0 z--1">
  483. <wd-img width="100%" height="100%" :src="signupListDialogBg"></wd-img>
  484. </div>
  485. <div class="h-full box-border py-5 px-7.25 flex flex-col justify-between">
  486. <div class="flex justify-between">
  487. <div class="text-justify text-white text-2xl font-bold font-['Alimama_ShuHeiTi']">
  488. 报名详情
  489. </div>
  490. <div @click="listShow = true">
  491. <wd-icon name="close" size="22px" color="#ffff"></wd-icon>
  492. </div>
  493. </div>
  494. <div class="flex flex-col justify-center aspect-[0.7/1] gap-5 p-6.5">
  495. <PageHelper
  496. :request="isActivity ? getActivitySignups : getStudyTourSignups"
  497. :query="isActivity ? { activityId: id } : { studyId: id }"
  498. class="flex-grow flex flex-col"
  499. >
  500. <template #default="{ source }">
  501. <div class="flex flex-col gap-5">
  502. <template v-for="(it, i) in source.list" :key="i">
  503. <div
  504. class="text-black text-sm font-normal font-['PingFang_SC'] leading-normal"
  505. >
  506. {{ dayjs(it.createTime).format('YYYY-MM-DD') }} {{ it.name }}已报名
  507. </div>
  508. </template>
  509. </div>
  510. </template>
  511. </PageHelper>
  512. </div>
  513. </div>
  514. </div>
  515. </view>
  516. </wd-overlay>
  517. <wd-overlay :show="successShow" @click="successShow = false">
  518. <view class="flex mx-10 h-full items-center justify-center">
  519. <div class="w-full flex flex-col gap-5 aspect-[1.12/1] relative">
  520. <div class="absolute top-0 left-0 right-0 bottom-0 z--1">
  521. <wd-img width="100%" height="100%" :src="signupSuccessDialogBg"></wd-img>
  522. </div>
  523. <div class="h-full box-border py-5 px-7.25 flex flex-col justify-between">
  524. <div class="flex justify-between">
  525. <div class="text-justify text-white text-2xl font-bold font-['Alimama_ShuHeiTi']">
  526. 报名成功
  527. </div>
  528. <wd-icon name="close" color="white" size="22px"></wd-icon>
  529. </div>
  530. <div class="flex flex-col justify-center aspect-[1.46/1] gap-5">
  531. <div class="flex gap-1.5">
  532. <wd-icon name="error-circle" size="22px"></wd-icon>
  533. <div
  534. class="w-[151px] h-[21px] text-justify text-black text-base font-normal font-['PingFang_SC'] leading-[21px]"
  535. >
  536. 请准时参加活动!
  537. </div>
  538. </div>
  539. <div
  540. class="w-[237px] h-[60px] text-justify text-black/60 text-base font-normal font-['PingFang_SC'] leading-normal"
  541. >
  542. 如有问题可咨询官方客服或您的专属经纪人!
  543. </div>
  544. </div>
  545. </div>
  546. </div>
  547. </view>
  548. </wd-overlay>
  549. </div>
  550. </template>
  551. <style lang="scss"></style>