index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. <template>
  2. <div class="learn-report-container" >
  3. <div class="learn-report" id="learn-report" :ref="learnReportRef" >
  4. <div class="learn-report-bg">
  5. <img class="bg" :src="staticImg.learnReportBg" alt="">
  6. <img class="title-img" :src="staticImg.titleImg" alt="">
  7. <div class="user-name" >{{state.report?.userNickName || '逻辑狗'}}</div>
  8. </div>
  9. <div class="learn-report-content" >
  10. <!-- 学习天数 -->
  11. <div class="learn-day" v-if="posterShowState" >
  12. <div class="user-ava" >
  13. <img :src="staticImg.learnReportBg" alt="">
  14. </div>
  15. <div class="user-name" >{{state.report?.userNickName}}</div>
  16. <div class="learn-day-desc" >
  17. <div>我家宝贝已经连续学习<span>{{state.report?.totalStudyDays}}</span>天了</div>
  18. <div>快来一起学习吧</div>
  19. </div>
  20. </div>
  21. <!-- 学习展示 -->
  22. <div class="learn-preview" :style="{marginTop: posterShowState ? '16px' : '-16px'}" >
  23. <div class="learn-preview-data" >
  24. <div class="data-item" >
  25. <div class="staticsc" >
  26. <span>{{state.report?.totalDuration ? Math.floor( state.report?.totalDuration! / 60) : 0 }}</span>
  27. <div class="unit" >分钟</div>
  28. </div>
  29. <div class="data-item-desc" >
  30. 累计时长
  31. </div>
  32. </div>
  33. <div class="data-item" >
  34. <div class="staticsc" >
  35. <span>{{state.report?.totalStars}}</span>
  36. <div class="unit" >颗</div>
  37. </div>
  38. <div class="data-item-desc" >
  39. 获得星数
  40. </div>
  41. </div>
  42. <div class="data-item" >
  43. <div class="staticsc" >
  44. <span>{{state.report?.accuracy}}</span>
  45. <div class="unit" >%</div>
  46. </div>
  47. <div class="data-item-desc" >
  48. 正确率
  49. </div>
  50. </div>
  51. </div>
  52. <div class="decator" >
  53. <img :src="staticImg.decator" alt="">
  54. </div>
  55. <div class="audio-play-container"
  56. :style="{backgroundImage: `url(${state.report?.task3Image}`}"
  57. >
  58. <div v-if="!fco.playing" class="audio-time-total" >
  59. {{fco.duration}}
  60. </div>
  61. <div class="play-button" @click="playAudio" v-if="!fco.playing">
  62. <img :src="staticImg.playButton" alt="">
  63. </div>
  64. <div class="play-process" ref="playProcessRef" v-show="fco.playing" >
  65. <van-progress
  66. @click="updatePercentage"
  67. class="van-progress"
  68. :percentage="Number(fco.percentage.toFixed(2)) * 100"
  69. pivot-color="#FF8024"
  70. color="#FF8024"
  71. pivot-text=" "
  72. track-color="#EDEDED"
  73. />
  74. <div class="play-time-process" >
  75. {{fco.updateTime}}/{{fco.duration}}
  76. </div>
  77. </div>
  78. </div>
  79. <div class="learn-preview-desc" v-if="posterShowState" >
  80. 长按扫描二维码,一起查看~
  81. </div>
  82. </div>
  83. <!-- v-if="state.report?.exerciseCardResultList" -->
  84. <!-- 练习分析 -->
  85. <div class="learn-any learn-modle" >
  86. <div class="learn-modle-title" >
  87. <img :src="staticImg.learnAny" alt="">
  88. <div class="learn-title" >今日练习分析</div>
  89. </div>
  90. <div class="able-any" >
  91. <able-chart
  92. style="margin-bottom: 12px;"
  93. :title="item.capability"
  94. :index="index"
  95. :count="item.correctQuantity"
  96. v-for="(item, index) in state.report?.exerciseCardResultList"
  97. :key="item.capability"
  98. />
  99. </div>
  100. </div>
  101. <!-- 家园共育策略 -->
  102. <div class="home-strategy learn-modle" >
  103. <div class="learn-modle-title" >
  104. <img :src="staticImg.strategy" alt="">
  105. <div class="learn-title" >亲子游戏策略</div>
  106. </div>
  107. <div class="strategy" >
  108. <div class="strategy-item"
  109. v-for="item in state.report?.teachDescription.split('\n').splice(0, state.report?.teachDescription.split('\n').length)"
  110. :key="item"
  111. >
  112. <div class="dot" ></div>
  113. <div class="text-content" >
  114. {{item}}
  115. </div>
  116. </div>
  117. </div>
  118. <div class="qrcode" v-show="posterShowState">
  119. <div class="qrcode-img" >
  120. <img :src="qrcode" alt="">
  121. </div>
  122. <div class="qrcode-info" >
  123. <div class="qrcode-title"> 逻辑狗·一起成长 </div>
  124. <div class="qrcode-desc">识别二维码,让你家宝贝也来体验吧 </div>
  125. </div>
  126. </div>
  127. </div>
  128. <!-- 生成报告 -->
  129. <div class="create-poster" v-if="!posterShowState" >
  130. <open-app v-if="queryParams.share == 1" />
  131. <div v-else class="create-button" @click="openModal">
  132. <div class="text" >晒报告 <span v-if="!state.shared" >+5</span> </div>
  133. <img v-if="!state.shared" :src="staticImg.dogCoin" alt="">
  134. </div>
  135. </div>
  136. <!-- 底部图片 -->
  137. <div class="learn-report-decator" v-if="posterShowState" >
  138. <img :src="staticImg.learnReportDecator" alt="">
  139. </div>
  140. </div>
  141. </div>
  142. <Overlay :show="posterShowState" class="van-overlay" :lock-scroll="false" :z-index="10" @click="posterShowState = false">
  143. <div class="wrapper">
  144. <div class="poster-container" id="learnReportRef"></div>
  145. </div>
  146. </Overlay>
  147. <ActionSheet :overlay="false" :show="posterShowState" :closeable="false" :z-index="11" title="晒报告">
  148. <div class="share-dialog" >
  149. <div class="share-content" >
  150. <div class="share-item" @click.stop="savePoster">
  151. <img :src="staticImg.photo" alt="">
  152. <span>保存海报</span>
  153. </div>
  154. <div class="share-item" @click.stop="shareWx">
  155. <img :src="staticImg.wechat" alt="">
  156. <span>微信好友</span>
  157. </div>
  158. </div>
  159. <div class="cancel-butuon" @click="closeModal" >
  160. 取消
  161. </div>
  162. </div>
  163. </ActionSheet>
  164. </div>
  165. </template>
  166. <script setup lang="ts">
  167. import { ref, nextTick, onMounted, reactive } from 'vue'
  168. import { useAudioManager } from '@/hook/index'
  169. import AbleChart from '../../components/AbleChart.vue'
  170. import { screenShot, createQrcode } from '@/utils/utils'
  171. import { getReportByUser, shareUserReport } from "@/api/learnPlan"
  172. import { useRoute } from 'vue-router'
  173. import { useAppRouter, useAppFunc } from '@/hook/appHook'
  174. import { Overlay, ActionSheet } from 'vant'
  175. import OpenApp from '@/components/OpenApp/index.vue'
  176. import { registerWxopenButton } from '@/utils/utils'
  177. export interface QueryParams {
  178. i: string,
  179. u?: string,
  180. share?: number
  181. }
  182. const staticImg = {
  183. learnReportBg: require('@LP/assets/learn-report-bg.png'),
  184. titleImg: require('@LP/assets/title-img.png'),
  185. decator: require('@LP/assets/decator.png'),
  186. playButton: require('@LP/assets/play-button.png'),
  187. learnAny: require('@LP/assets/learn-any.png'),
  188. strategy: require('@LP/assets/strategy.png'),
  189. learnReportDecator: require('@LP/assets/learn-report-decator.png'),
  190. dogCoin: require('@LP/assets/dog-coin.png'),
  191. photo: require('@/assets/component/common/photo.png'),
  192. wechat: require('@/assets/component/common/wechat.png')
  193. }
  194. const [fco, atx] = useAudioManager({
  195. url: '',
  196. format: 'mm:ss'
  197. })
  198. const queryParams = useRoute().query as unknown as QueryParams
  199. console.log('timeStamp');
  200. console.log('queryParams:', queryParams);
  201. // queryParams.i = "1630466274125459458"
  202. // queryParams.u = "1430026961974345730"
  203. const posterScaleRate = ref(window.screen.width / window.screen.height > 0.7 ? 0.22 : 0.3)
  204. const userId = ref(queryParams.u)
  205. const appRouter = useAppRouter()
  206. const appFunc = useAppFunc()
  207. const qrcode = ref('')
  208. const posterShowState = ref(false)
  209. const shareShowState = ref(false)
  210. const playProcessRef = ref('')
  211. const learnReportRef = ref('')
  212. const posterblob = ref('')
  213. const playAudio = () => {
  214. fco.play()
  215. }
  216. const state = reactive<Partial<API.LearnPlan.Task>>({})
  217. const closeModal = () => {
  218. posterShowState.value = false
  219. }
  220. const initAudioDragEvent = () => {
  221. let element = Array.from(document.getElementsByClassName('van-progress__pivot'))[0]
  222. let start = 0;
  223. let distance = 0;
  224. element.addEventListener("touchstart", function(event) {
  225. start = event.touches[0].clientX;
  226. fco.pause()
  227. });
  228. element.addEventListener("touchmove", function(event) {
  229. distance = event.touches[0].clientX - start + 11;
  230. console.log(distance);
  231. if (distance < 0) {
  232. fco.setPercentage(0)
  233. } else if (distance > playProcessRef.value.clientWidth) {
  234. fco.setPercentage( 1)
  235. } else {
  236. fco.setPercentage( distance / playProcessRef.value.clientWidth)
  237. }
  238. });
  239. element.addEventListener('touchend', function(e) {
  240. fco.play()
  241. }, false);
  242. }
  243. const openModal = () => {
  244. posterShowState.value = true
  245. createPoster()
  246. }
  247. const savePoster = () => {
  248. appFunc.savePoster(posterblob.value)
  249. }
  250. const _shareUserReport = async () => {
  251. await shareUserReport({ "itemId": queryParams.i, "userId": queryParams.u! })
  252. }
  253. const updatePercentage = (e) => {
  254. const percentage = (e.layerX / playProcessRef.value.clientWidth)
  255. fco.setPercentage(percentage)
  256. }
  257. // 分享海报到微信
  258. const shareWx = () => {
  259. appFunc.shareWx(posterblob.value)
  260. _shareUserReport()
  261. }
  262. // 获取用户报告信息
  263. const _getReportByUser = async () => {
  264. const { data } = await getReportByUser({ "itemId": queryParams.i, "userId": queryParams.u! })
  265. fco.src = data.report.userLearnShareAudio
  266. state.report = data.report
  267. userId.value = data.userId
  268. getQrcodeUrl()
  269. }
  270. const createPoster = async () => {
  271. nextTick(async () => {
  272. const target = document.getElementById('learnReportRef')!
  273. if (Array.from(target!.children).length === 0) {
  274. const posterEl = await screenShot('learn-report')
  275. posterblob.value = posterEl.src
  276. posterEl.style.width = window.screen.width * posterScaleRate.value + 'px'
  277. target.append(posterEl)
  278. state.shared = 1
  279. }
  280. })
  281. }
  282. const getQrcodeUrl = async () => {
  283. qrcode.value = await createQrcode(queryParams.u ? window.location.href + `&share=1` : `${window.location.href}&u=${userId.value}&share=1`)
  284. }
  285. onMounted(async () => {
  286. if (queryParams.u) {
  287. _getReportByUser()
  288. } else {
  289. await appRouter.getToken()
  290. _getReportByUser()
  291. }
  292. registerWxopenButton()
  293. initAudioDragEvent()
  294. })
  295. </script>
  296. <style scoped lang="scss">
  297. .learn-report-container {
  298. padding-bottom: 120px;
  299. background-color: #F5F5F5;
  300. }
  301. .learn-report {
  302. width: 100vw;
  303. background-color: #F5F5F5;
  304. .learn-report-bg {
  305. position: relative;
  306. z-index: 2;
  307. .bg {
  308. width: 100vw;
  309. height: 248px;
  310. display: block;
  311. position: relative;
  312. top: -20px;
  313. object-fit: cover;
  314. }
  315. .title-img {
  316. width: 146px;
  317. height: 39px;
  318. display: block;
  319. position: absolute;
  320. top: 98px;
  321. left: 17px;
  322. }
  323. .user-name {
  324. font-size: 14px;
  325. font-family: PingFangSC-Regular, PingFang SC;
  326. font-weight: 400;
  327. color: #FFFFFF;
  328. position: absolute;
  329. top: 146px;
  330. left: 20px;
  331. }
  332. }
  333. .learn-report-content {
  334. margin-top: -70px;
  335. }
  336. .learn-day {
  337. width: 343px;
  338. height: 125px;
  339. background: #FEFEFE;
  340. position: relative;
  341. z-index: 2;
  342. margin: 0 auto;
  343. border-radius: 20px;
  344. .user-ava {
  345. width: 62px;
  346. height: 62px;
  347. border-radius: 50%;
  348. background-color: #FFFFFF;
  349. position: absolute;
  350. top: -31px;
  351. left: 50%;
  352. transform: translateX(-50%);
  353. display: flex;
  354. justify-content: center;
  355. align-items: center;
  356. img {
  357. width: 52px;
  358. height: 52px;
  359. border-radius: 50%;
  360. margin: 0 auto;
  361. object-fit: cover;
  362. }
  363. }
  364. .user-name {
  365. font-size: 13px;
  366. font-family: PingFangSC-Medium, PingFang SC;
  367. font-weight: 500;
  368. color: #333333;
  369. position: absolute;
  370. top: 39px;
  371. left: 50%;
  372. transform: translateX(-50%);
  373. }
  374. .learn-day-desc {
  375. width: 100%;
  376. position: absolute;
  377. top: 66px;
  378. left: 50%;
  379. transform: translateX(-50%);
  380. font-size: 13px;
  381. font-family: PingFangSC-Medium, PingFang SC;
  382. font-weight: 500;
  383. color: #333333;
  384. display: flex;
  385. flex-direction: column;
  386. align-items: center;
  387. span {
  388. color: #FF8024;
  389. font-size: 20px;
  390. }
  391. }
  392. }
  393. .learn-preview {
  394. width: 343px;
  395. height: 488px;
  396. background: #FEFEFE;
  397. margin: 16px auto;
  398. border-radius: 20px;
  399. overflow: hidden;
  400. padding: 0 40px;
  401. box-sizing: border-box;
  402. position: relative;
  403. z-index: 2;
  404. .learn-preview-data {
  405. width: 100%;
  406. display: flex;
  407. justify-content: space-between;
  408. margin-top: 30px;
  409. .data-item {
  410. .staticsc {
  411. display: flex;
  412. align-items: flex-end;
  413. span {
  414. font-size: 36px;
  415. font-family: DINAlternate-Bold, DINAlternate;
  416. font-weight: bold;
  417. color: #FF8024;
  418. margin-bottom: -5px;
  419. }
  420. .unit {
  421. font-size: 12px;
  422. font-family: PingFangSC-Regular, PingFang SC;
  423. font-weight: 400;
  424. color: #999999;
  425. height: 41px;
  426. display: flex;
  427. align-items: flex-end;
  428. }
  429. }
  430. .data-item-desc {
  431. margin-top: 6px;
  432. font-size: 12px;
  433. font-family: PingFangSC-Regular, PingFang SC;
  434. font-weight: 400;
  435. color: #4C4C4C;
  436. }
  437. }
  438. }
  439. .decator {
  440. width: 219px;
  441. height: 16px;
  442. margin: 0 auto;
  443. margin-top: 40px;
  444. img {
  445. width: 100%;
  446. height: 100%;
  447. display: block;
  448. }
  449. }
  450. .audio-play-container {
  451. width: 262px;
  452. height: 277px;
  453. // background-color: #F5F5F5;
  454. border-radius: 20px;
  455. margin-top: 30px;
  456. position: relative;
  457. background-size: cover;
  458. .audio-time-total {
  459. width: 56px;
  460. height: 24px;
  461. background: rgba(0,0,0,0.4);
  462. border-radius: 12px;
  463. position: absolute;
  464. left: 15px;
  465. bottom: 13px;
  466. font-size: 12px;
  467. font-family: PingFangSC-Regular, PingFang SC;
  468. font-weight: 400;
  469. color: #FFFFFF;
  470. display: flex;
  471. justify-content: center;
  472. align-items: center;
  473. }
  474. .play-button {
  475. position: absolute;
  476. top: 50%;
  477. left: 50%;
  478. transform: translate(-50%, -50%);
  479. img {
  480. width: 60px;
  481. height: 60px;
  482. display: block;
  483. }
  484. }
  485. .play-process {
  486. width: 238px;
  487. position: absolute;
  488. left: 12px;
  489. bottom: 9px;
  490. display: flex;
  491. flex-direction: column;
  492. align-items: end;
  493. .van-progress {
  494. width: 238px;
  495. }
  496. /deep/ .van-progress__pivot {
  497. width: 12px !important;
  498. height: 12px;
  499. border-radius: 50%;
  500. min-width: 12px;
  501. }
  502. .play-time-process {
  503. font-size: 12px;
  504. font-family: PingFangSC-Regular, PingFang SC;
  505. font-weight: 400;
  506. color: #FFFFFF;
  507. margin-top: 4px;
  508. // position: absolute;
  509. // bottom: 0px;
  510. // right: 0px;
  511. }
  512. }
  513. }
  514. .learn-preview-desc {
  515. font-size: 13px;
  516. font-family: PingFangSC-Regular, PingFang SC;
  517. font-weight: 400;
  518. color: #666666;
  519. margin: 0 auto;
  520. margin-top: 8px;
  521. display: flex;
  522. justify-content: center;
  523. align-items: center;
  524. }
  525. }
  526. .learn-modle {
  527. box-sizing: border-box;
  528. padding: 30px 20px;
  529. .learn-modle-title {
  530. display: flex;
  531. align-items: center;
  532. img {
  533. width: 24px;
  534. height: 24px;
  535. display: block;
  536. margin-right: 5px;
  537. }
  538. .learn-title {
  539. font-size: 16px;
  540. font-family: PingFangSC-Semibold, PingFang SC;
  541. font-weight: 600;
  542. color: #333333;
  543. }
  544. }
  545. }
  546. .learn-any {
  547. width: 343px;
  548. border-radius: 20px;
  549. background: #FEFEFE;
  550. margin: 0 auto;
  551. margin-top: 16px;
  552. box-sizing: border-box;
  553. padding-bottom: 18px;
  554. .able-any {
  555. margin-top: 20px;
  556. }
  557. }
  558. .home-strategy {
  559. width: 343px;
  560. border-radius: 20px;
  561. background: #FEFEFE;
  562. margin: 0 auto;
  563. margin-top: 16px;
  564. box-sizing: border-box;
  565. position: relative;
  566. z-index: 3;
  567. .strategy {
  568. width: 303px;
  569. background: #FDF8F5;
  570. border-radius: 10px;
  571. padding: 16px;
  572. box-sizing: border-box;
  573. margin-top: 20px;
  574. .strategy-item {
  575. display: flex;
  576. align-items: flex-start;
  577. .dot {
  578. width: 4px;
  579. height: 4px;
  580. background: #FE6E2C;
  581. margin-right: 8px;
  582. margin-top: 8px;
  583. border-radius: 50%;
  584. }
  585. .text-content {
  586. width: 261px;
  587. font-size: 14px;
  588. font-family: PingFangSC-Regular, PingFang SC;
  589. font-weight: 400;
  590. color: #333333;
  591. line-height: 22px;
  592. margin-bottom: 8px;
  593. }
  594. }
  595. }
  596. .qrcode {
  597. display: flex;
  598. align-items: center;
  599. margin-top: 20px;
  600. .qrcode-img {
  601. width: 73px;
  602. height: 73px;
  603. background: #0043BD;
  604. border-radius: 8px;
  605. margin-right: 14px;
  606. img {
  607. width: 100%;
  608. height: 100%;
  609. display: block;
  610. }
  611. }
  612. .qrcode-info {
  613. display: flex;
  614. flex-direction: column;
  615. .qrcode-title {
  616. font-size: 15px;
  617. font-family: PingFangSC-Semibold, PingFang SC;
  618. font-weight: 600;
  619. color: #333333;
  620. line-height: 24px;
  621. }
  622. .qrcode-desc {
  623. font-size: 13px;
  624. font-family: PingFangSC-Regular, PingFang SC;
  625. font-weight: 400;
  626. color: #666666;
  627. line-height: 24px;
  628. }
  629. }
  630. }
  631. }
  632. .learn-report-decator {
  633. // position: relative;
  634. // left: 0px;
  635. // bottom: 0px;
  636. width: 375px;
  637. height: 144px;
  638. z-index: 2;
  639. img {
  640. width: 100%;
  641. height: 100%;
  642. display: block;
  643. }
  644. }
  645. .create-poster {
  646. width: 100vw;
  647. height: 88px;
  648. background: #FEFEFE;
  649. position: fixed;
  650. left: 0;
  651. bottom: 0;
  652. z-index: 3;
  653. padding-top: 9px;
  654. box-sizing: border-box;
  655. display: flex;
  656. align-items: flex-start;
  657. justify-content: center;
  658. .create-button {
  659. width: 334px;
  660. height: 52px;
  661. background: #FF8024;
  662. border-radius: 26px;
  663. display: flex;
  664. justify-content: center;
  665. align-items: center;
  666. margin: 0 auto;
  667. .text {
  668. font-size: 18px;
  669. font-family: PingFangSC-Regular, PingFang SC;
  670. font-weight: 400;
  671. color: #FFFFFF;
  672. }
  673. img {
  674. width: 24px;
  675. height: 24px;
  676. display: block;
  677. margin-left: 8px;
  678. }
  679. }
  680. }
  681. }
  682. .van-overlay {
  683. width: 100vw;
  684. height: 100vh;
  685. background-color: rgba(0,0,0,0.4);
  686. z-index: 11;
  687. }
  688. .wrapper {
  689. width: 100vw;
  690. height: 100vh;
  691. overflow-y: scroll;
  692. z-index: 40;
  693. .poster-container {
  694. position: fixed;
  695. left: 50%;
  696. top: 6%;
  697. transform: translateX(-50%);
  698. }
  699. }
  700. .share-dialog {
  701. padding: 0px 86px;
  702. box-sizing: border-box;
  703. height: 236px;
  704. width: 100%;
  705. position: relative;
  706. background-color: #fff;
  707. .share-content {
  708. display: flex;
  709. justify-content: space-between;
  710. .share-item {
  711. display: flex;
  712. flex-direction: column;
  713. justify-content: center;
  714. margin-top: 18px;
  715. align-items: center;
  716. img {
  717. width: 51px;
  718. height: 51px;
  719. display: block;
  720. margin-bottom: 6px;
  721. }
  722. }
  723. }
  724. .cancel-butuon {
  725. font-size: 14px;
  726. font-family: PingFangSC-Regular, PingFang SC;
  727. font-weight: 600;
  728. color: #333333;
  729. position: absolute;
  730. bottom: 40px;
  731. left: 50%;
  732. transform: translateX(-50%);
  733. }
  734. }
  735. </style>