activityForm.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. <template>
  2. <view>
  3. <Loading :type="3" :loadStatus="loadStatus" :showText="errorText" />
  4. <zj-page-layout v-if="detailData" :hasFooter="true" bgColor="#ffffff">
  5. <view class="swiper-container" v-if="bannerList.length > 0">
  6. <swiper class="banner-swiper" @change="changeBanner" :autoplay="true">
  7. <block v-for="(item, index) in bannerList" :key="index">
  8. <swiper-item>
  9. <image :src="item" mode="aspectFill"></image>
  10. </swiper-item>
  11. </block>
  12. </swiper>
  13. <view class="dots-conatiner">
  14. <view class="con" :style="'width:' + bannerList.length * 20 + 'rpx;'">
  15. <view class="dot" :style="'transform:translateX(' + bannerCurrent * 100 + '%)'"></view>
  16. </view>
  17. </view>
  18. <view class="explain" @tap="toExplain">活动说明</view>
  19. </view>
  20. <view class="all-container">
  21. <view class="form-container">
  22. <view class="row" v-if="websitName">
  23. <view class="label">所属网点</view>
  24. <u--input placeholder="" border="none" inputAlign="right" v-model="websitName" readonly></u--input>
  25. </view>
  26. <view class="row">
  27. <view class="label"><text>*</text>您的姓名</view>
  28. <u--input
  29. placeholder="请输入您的姓名"
  30. border="none"
  31. inputAlign="right"
  32. v-model="name"
  33. :readonly="isDisabled"
  34. ></u--input>
  35. </view>
  36. <view class="row">
  37. <view class="label"><text>*</text>您的电话</view>
  38. <u--input
  39. placeholder="请输入您的电话"
  40. border="none"
  41. inputAlign="right"
  42. v-model="phone"
  43. :maxlength="11"
  44. :readonly="isDisabled"
  45. ></u--input>
  46. </view>
  47. <view class="row" v-if="detailData.enablePosition">
  48. <view class="label"><text>*</text>您的地址</view>
  49. <u--input
  50. placeholder="请输入您的地址"
  51. border="none"
  52. inputAlign="right"
  53. v-model="address"
  54. :readonly="isDisabled"
  55. ></u--input>
  56. <view class="r" @tap="getLocation"><text class="iconfont icon-dingwei1"></text>定位</view>
  57. </view>
  58. </view>
  59. <block v-for="(item, index) in questionList" :key="index">
  60. <view class="picker-container" v-if="item.type == 1 || item.type == 2">
  61. <view class="label"
  62. ><text v-if="item.isRequire">*</text>{{ item.question }}({{
  63. { 1: '单选', 2: '多选' }[item.type]
  64. }})</view
  65. >
  66. <view class="img-list" v-if="item.answerType == 1 || item.answerType == 3">
  67. <view
  68. class="item"
  69. :class="it.active ? 'active' : ''"
  70. v-for="(it, idx) in item.answer"
  71. :key="idx"
  72. @tap="clickOption(index, idx)"
  73. >
  74. <image v-if="it.option_files.length" :src="it.option_files[0].url" mode="aspectFill"></image>
  75. <view class="text" v-if="item.answerType == 1">{{ it.option_value }}</view>
  76. </view>
  77. </view>
  78. <view class="text-list" v-else>
  79. <view
  80. class="item"
  81. :class="it.active ? 'active' : ''"
  82. v-for="(it, idx) in item.answer"
  83. :key="idx"
  84. @tap="clickOption(index, idx)"
  85. >
  86. {{ it.option_value }}
  87. </view>
  88. </view>
  89. </view>
  90. <view class="input-container" v-else-if="item.type == 3">
  91. <view class="label"><text v-if="item.isRequire">*</text>{{ item.question }}</view>
  92. <u--textarea
  93. autoHeight
  94. :placeholder="`请输入${item.question}`"
  95. border="none"
  96. :maxlength="item.answer[0].option_limit"
  97. count
  98. v-model="item.inputValue"
  99. :disabled="isDisabled"
  100. ></u--textarea>
  101. </view>
  102. <view class="input-container" v-else-if="item.type == 4">
  103. <view class="label"><text v-if="item.isRequire">*</text>{{ item.question }}</view>
  104. <view class="images">
  105. <view class="img" v-for="(it, idx) in item.fileValue" :key="idx">
  106. <image :src="it" mode="aspectFill" @tap="prevImg(it, item.fileValue)"></image>
  107. <text class="iconfont icon-guanbi1" @tap="delImage(questionList, index, idx)"></text>
  108. </view>
  109. <view
  110. class="add"
  111. @tap="addImage(questionList, index)"
  112. v-if="item.fileValue.length < item.answer[0].option_limit"
  113. >
  114. <text class="iconfont icon-xiangji"></text>
  115. <text class="text">图片</text>
  116. </view>
  117. </view>
  118. </view>
  119. <view class="input-container" v-else-if="item.type == 5">
  120. <view class="label"><text v-if="item.isRequire">*</text>{{ item.question }}</view>
  121. <view class="images">
  122. <view v-for="(it, idx) in item.fileValue" :key="idx" class="img" style="width: 100%">
  123. <video :src="it" style="width: 100%; height: 240px"></video>
  124. <text
  125. style="z-index: 100000"
  126. class="iconfont icon-guanbi1"
  127. @tap="delImage(questionList, index, idx)"
  128. ></text>
  129. </view>
  130. <view
  131. class="add"
  132. @tap="addVideo(questionList, index)"
  133. v-if="item.fileValue.length < item.answer[0].option_limit"
  134. >
  135. <text class="iconfont icon-xiangji"></text>
  136. <text class="text">视频</text>
  137. </view>
  138. </view>
  139. </view>
  140. </block>
  141. <view class="carousel-container" v-if="applyList && applyList.length > 0">
  142. <carousel :list="applyList" :showNum="3" :standstill="1000">
  143. <template slot-scope="slot">
  144. <view class="item" v-for="(item, index) in slot.data" :key="index">
  145. <view class="left">
  146. <view class="name">{{ item.name }}[{{ item.mobile }}]</view>
  147. <view class="text">{{ item.remark }}</view>
  148. </view>
  149. <!-- <view class="right">{{item.createTime | timeFilter}}</view> -->
  150. <view class="right">{{ item.min }}分钟前</view>
  151. </view>
  152. </template>
  153. </carousel>
  154. </view>
  155. </view>
  156. <template slot="footer">
  157. <view class="footer-btn-group">
  158. <u-button text="活动记录" @tap="toList"></u-button>
  159. <u-button type="primary" text="提交" @click="submitData" v-if="!isDisabled"></u-button>
  160. </view>
  161. </template>
  162. </zj-page-layout>
  163. </view>
  164. </template>
  165. <script>
  166. import carousel from '@/components/carousel'
  167. import { uploadImgFull } from '@/common/utils/util.js'
  168. import { wxConfig, mini_env } from '@/common/utils/util'
  169. export default {
  170. components: {
  171. carousel
  172. },
  173. data() {
  174. return {
  175. loadStatus: 1,
  176. errorText: '',
  177. id: '',
  178. websitName: '',
  179. bannerList: [], // 轮播图列表
  180. bannerCurrent: 0, // 轮播图当前值
  181. detailData: null,
  182. questionList: [],
  183. applyList: [],
  184. name: '',
  185. phone: '',
  186. address: '',
  187. isNotYetStarted: true,
  188. userInfo: null
  189. }
  190. },
  191. async onLoad({ id, websitName }) {
  192. // if (uni.getStorageSync('activityFormjilu')) {
  193. // uni.removeStorageSync('activityFormjilu')
  194. // } else {
  195. // uni.setStorageSync('activityFormjilu', true)
  196. // window.location.reload()
  197. // }
  198. this.id = id
  199. this.websitName = websitName || ''
  200. this.getDetail()
  201. this.userInfo = await this.$getUserInfo()
  202. this.name = this.userInfo.nickName
  203. this.phone = this.userInfo.mobile
  204. },
  205. onShow() {
  206. if (uni.getStorageSync('formDataaaa')) {
  207. let { name, phone, address, websitName } = uni.getStorageSync('formDataaaa')
  208. this.websitName = websitName
  209. this.name = name
  210. this.phone = phone
  211. this.address = address
  212. uni.removeStorageSync('formDataaaa')
  213. }
  214. },
  215. computed: {
  216. isDisabled() {
  217. return (
  218. !this.detailData.isShow ||
  219. this.isNotYetStarted ||
  220. !!~[2, 3].indexOf(this.detailData.status) ||
  221. (this.detailData.limit == 0 && this.detailData.submitLimit != -1)
  222. )
  223. }
  224. },
  225. methods: {
  226. getDetail() {
  227. this.$api
  228. .post('/promotion/questionnaire/detail', {
  229. id: this.id
  230. })
  231. .then(res => {
  232. this.detailData = res.data
  233. this.bannerList = res.data.detailImgs.split(',')
  234. res.data.promotionQuestionnaireItems.forEach(item => {
  235. item.answer = JSON.parse(item.answer)
  236. item.inputValue = ''
  237. item.fileValue = []
  238. item.answer.forEach(it => {
  239. it.active = false
  240. })
  241. })
  242. this.questionList = res.data.promotionQuestionnaireItems
  243. console.log(this.questionList)
  244. this.applyList = res.data.promotionQuestionnaireUsers
  245. // 获取当前时间
  246. var currentTime = new Date()
  247. // 解析日期字符串
  248. var dateParts = res.data.startTime.split(/[\s-:]/)
  249. // 构造日期对象
  250. var specifiedTime = new Date(
  251. parseInt(dateParts[0]), // 年
  252. parseInt(dateParts[1]) - 1, // 月(月份从0开始,所以需要减1)
  253. parseInt(dateParts[2]), // 日
  254. parseInt(dateParts[3]), // 时
  255. parseInt(dateParts[4]), // 分
  256. parseInt(dateParts[5]) // 秒
  257. )
  258. // 比较当前时间和指定时间
  259. if (currentTime.getTime() >= specifiedTime.getTime()) {
  260. this.isNotYetStarted = false
  261. }
  262. if (res.data.status == 2) {
  263. this.$tips(`该活动已过期,不可提交报名!`)
  264. } else if (res.data.status == 3) {
  265. this.$tips(`该活动已终止,不可提交报名!`)
  266. } else if (!!~[0, 1].indexOf(this.detailData.status) && res.data.submitLimit > -1) {
  267. this.$tips(`您还可以提交${res.data.limit}次`)
  268. }
  269. this.loadStatus = 0
  270. })
  271. .catch(res => {
  272. this.errorText = res.message
  273. this.loadStatus = 2
  274. })
  275. },
  276. clickOption(index, idx) {
  277. if (this.isDisabled) {
  278. return
  279. }
  280. // 单选题
  281. if (this.questionList[index].type == 1) {
  282. this.questionList[index].answer.forEach((item, ind_) => {
  283. this.questionList[index].answer.splice(ind_, 1, {
  284. ...item,
  285. active: ind_ == idx ? (this.questionList[index].isRequire ? true : !item.active) : false
  286. })
  287. })
  288. }
  289. // 多选题
  290. else {
  291. this.questionList[index].answer.splice(idx, 1, {
  292. ...this.questionList[index].answer[idx],
  293. active: !this.questionList[index].answer[idx].active
  294. })
  295. }
  296. },
  297. // 切换广告图
  298. changeBanner(e) {
  299. this.bannerCurrent = e.detail.current
  300. },
  301. toList() {
  302. this.$navToPage({
  303. url: `/packageHome/pages/codeActivity/applyList?id=${this.id}`
  304. })
  305. },
  306. toExplain() {
  307. this.$navToPage({
  308. url: `/packageHome/pages/codeActivity/activityExplain?id=${this.id}`
  309. })
  310. },
  311. submitData() {
  312. // 校验必填
  313. if (!this.name) return this.$toast('请输入您的姓名')
  314. if (!this.phone) return this.$toast('请输入您的电话')
  315. if (!/^1[3456789]\d{9}$/.test(this.phone)) return this.$toast('请填写正确的电话号码')
  316. if (this.detailData.enablePosition && !this.address) return this.$toast('请输入您的地址')
  317. for (let i = 0; i < this.questionList.length; i++) {
  318. if (this.questionList[i].isRequire) {
  319. // 单选题多选题
  320. if (
  321. (this.questionList[i].type == 1 || this.questionList[i].type == 2) &&
  322. this.questionList[i].answer.every(o => !o.active)
  323. ) {
  324. return this.$toast(`请选择${this.questionList[i].question}`)
  325. }
  326. // 填写题
  327. if (this.questionList[i].type == 3 && !this.questionList[i].inputValue) {
  328. return this.$toast(`请输入${this.questionList[i].question}`)
  329. }
  330. // 图片视频题
  331. if (
  332. (this.questionList[i].type == 4 || this.questionList[i].type == 5) &&
  333. !this.questionList[i].fileValue.length
  334. ) {
  335. return this.$toast(`请完善${this.questionList[i].question}`)
  336. }
  337. }
  338. }
  339. // 生成题目提交信息
  340. // let items = [];
  341. let questionList = JSON.parse(JSON.stringify(this.questionList))
  342. for (let index = 0; index < questionList.length; index++) {
  343. // 单选题多选题
  344. if (questionList[index].type == 1 || questionList[index].type == 2) {
  345. questionList[index].answer = questionList[index].answer
  346. questionList[index].answer = JSON.stringify(questionList[index].answer)
  347. }
  348. // 填写题
  349. if (questionList[index].type == 3) {
  350. questionList[index].answer[0].option_value = questionList[index].inputValue
  351. questionList[index].answer = JSON.stringify(questionList[index].answer)
  352. }
  353. // 图片视频题
  354. if (questionList[index].type == 4 || questionList[index].type == 5) {
  355. questionList[index].answer[0].option_value = questionList[index].fileValue
  356. questionList[index].answer = JSON.stringify(questionList[index].answer)
  357. }
  358. }
  359. this.$api
  360. .postJson('/promotion/activity/add', {
  361. userName: this.name,
  362. userMobile: this.phone,
  363. userAddress: this.address,
  364. items: questionList,
  365. promotionQuestionnaireId: this.id,
  366. customWebsitName: this.websitName || ''
  367. })
  368. .then(res => {
  369. this.$successToast('提交成功')
  370. this.$navToPage(
  371. {
  372. url: `/packageHome/pages/codeActivity/applyList?id=${this.id}`
  373. },
  374. 'redirectTo'
  375. )
  376. })
  377. },
  378. // 添加图片
  379. async addImage(questionList, index) {
  380. if (this.isDisabled) {
  381. return
  382. }
  383. uni.chooseImage({
  384. count: 1,
  385. sizeType: ['compressed'],
  386. success: res => {
  387. uni.showLoading()
  388. res.tempFilePaths.forEach(async item => {
  389. let data = await uploadImgFull(item)
  390. questionList.splice(index, 1, {
  391. ...questionList[index],
  392. fileValue: [...questionList[index].fileValue, data.url]
  393. })
  394. })
  395. uni.hideLoading()
  396. },
  397. fail: err => {}
  398. })
  399. },
  400. async addVideo(questionList, index) {
  401. if (this.isDisabled) {
  402. return
  403. }
  404. uni.chooseVideo({
  405. count: 1,
  406. success: async res => {
  407. uni.showLoading()
  408. let data = await uploadImgFull(res.tempFilePath)
  409. questionList.splice(index, 1, {
  410. ...questionList[index],
  411. fileValue: [...questionList[index].fileValue, data.url]
  412. })
  413. uni.hideLoading()
  414. },
  415. fail: err => {}
  416. })
  417. },
  418. // 删除图片
  419. delImage(questionList, index, idx) {
  420. questionList[index].fileValue.splice(idx, 1)
  421. // questionList.splice(index, 1, {...questionList[index], fileValue: files})
  422. },
  423. //预览图片
  424. prevImg(url, urls) {
  425. uni.previewImage({
  426. current: url,
  427. urls: urls
  428. })
  429. },
  430. async getRegionByLatLng(lat, lng) {
  431. const result = new Promise((resolve, reject) => {
  432. this.$api
  433. .post('/lbs/amap/region/query', {
  434. lat,
  435. lng
  436. })
  437. .then(res => {
  438. resolve(res.data)
  439. })
  440. })
  441. return result
  442. },
  443. // 地图选点
  444. getLocation() {
  445. uni.chooseLocation({
  446. success: async res => {
  447. let addressData = await this.getRegionByLatLng(res.latitude, res.longitude)
  448. this.address = addressData.provinceName + addressData.cityName + addressData.areaName + res.address
  449. uni.setStorageSync('formDataaaa', {
  450. websitName: this.websitName,
  451. name: this.name,
  452. phone: this.phone,
  453. address: this.address
  454. })
  455. },
  456. fail: res => {
  457. uni.getSetting({
  458. success: res => {
  459. if (!res.authSetting['scope.userLocation']) {
  460. uni.showModal({
  461. title: '是否授权当前位置',
  462. content: '需要获取您的地理位置,请确认授权,否则地图功能将无法使用',
  463. success: tip => {
  464. if (tip.confirm) {
  465. uni.openSetting({
  466. success: data => {
  467. if (data.authSetting['scope.userLocation'] === true) {
  468. this.$successToast('授权成功')
  469. setTimeout(() => {
  470. this.getLocation()
  471. }, 1000)
  472. }
  473. }
  474. })
  475. }
  476. }
  477. })
  478. }
  479. }
  480. })
  481. }
  482. })
  483. }
  484. }
  485. }
  486. </script>
  487. <style lang="scss" scoped>
  488. .swiper-container {
  489. position: relative;
  490. .explain {
  491. position: absolute;
  492. right: 30rpx;
  493. top: 30rpx;
  494. width: 160rpx;
  495. height: 60rpx;
  496. border-radius: 60rpx;
  497. background: #ffffff;
  498. font-size: 28rpx;
  499. color: $assist-color;
  500. border: 1px solid $assist-color;
  501. display: flex;
  502. align-items: center;
  503. justify-content: center;
  504. }
  505. .banner-swiper {
  506. height: 600rpx;
  507. image,
  508. video {
  509. height: 600rpx;
  510. width: 750rpx;
  511. display: block;
  512. margin: 0 auto 0;
  513. overflow: hidden;
  514. }
  515. }
  516. .dots-conatiner {
  517. position: absolute;
  518. width: 100%;
  519. bottom: 40rpx;
  520. display: flex;
  521. align-items: center;
  522. justify-content: center;
  523. .con {
  524. border-radius: 4rpx;
  525. overflow: hidden;
  526. height: 4rpx;
  527. background-color: rgba($color: #ffffff, $alpha: 0.3);
  528. }
  529. .dot {
  530. width: 20rpx;
  531. height: 4rpx;
  532. background-color: #ffffff;
  533. transition: all 0.3s;
  534. }
  535. }
  536. }
  537. .all-container {
  538. padding: 0 20rpx 40rpx;
  539. }
  540. .form-container {
  541. .row {
  542. display: flex;
  543. align-items: center;
  544. margin-top: 40rpx;
  545. .label {
  546. font-size: 28rpx;
  547. font-weight: 500;
  548. margin-right: 30rpx;
  549. text {
  550. color: red;
  551. }
  552. }
  553. .r {
  554. color: $theme-color;
  555. margin-left: 12rpx;
  556. }
  557. }
  558. }
  559. .input-container {
  560. margin-top: 40rpx;
  561. .label {
  562. font-size: 28rpx;
  563. font-weight: 500;
  564. text {
  565. color: red;
  566. }
  567. }
  568. ::v-deep .u-textarea {
  569. margin-top: 20rpx;
  570. background: #f5f5f5;
  571. }
  572. .images {
  573. display: flex;
  574. flex-wrap: wrap;
  575. .add {
  576. display: flex;
  577. flex-direction: column;
  578. align-items: center;
  579. justify-content: center;
  580. width: 146rpx;
  581. height: 146rpx;
  582. border: 2rpx dashed #dadada;
  583. border-radius: 10rpx;
  584. margin-top: 20rpx;
  585. .iconfont {
  586. font-size: 48rpx;
  587. color: #999999;
  588. }
  589. .text {
  590. font-size: 24rpx;
  591. color: #999999;
  592. margin-top: 10rpx;
  593. }
  594. }
  595. .img {
  596. position: relative;
  597. margin-right: 20rpx;
  598. margin-top: 20rpx;
  599. &:nth-child(4n) {
  600. margin-right: 0;
  601. }
  602. image {
  603. width: 150rpx;
  604. height: 150rpx;
  605. border-radius: 10rpx;
  606. overflow: hidden;
  607. display: block;
  608. }
  609. video {
  610. width: 100%;
  611. height: 240px;
  612. }
  613. text {
  614. position: absolute;
  615. right: -10rpx;
  616. top: -10rpx;
  617. width: 40rpx;
  618. height: 40rpx;
  619. border-radius: 50%;
  620. background: #ff3f42;
  621. font-size: 24rpx;
  622. color: #ffffff;
  623. text-align: center;
  624. line-height: 40rpx;
  625. display: block;
  626. }
  627. }
  628. }
  629. }
  630. .picker-container {
  631. margin-top: 40rpx;
  632. .label {
  633. font-size: 28rpx;
  634. font-weight: 500;
  635. text {
  636. color: red;
  637. }
  638. }
  639. .text-list {
  640. display: flex;
  641. flex-wrap: wrap;
  642. .item {
  643. margin-top: 20rpx;
  644. margin-right: 20rpx;
  645. width: calc((100% - 40rpx) / 3);
  646. height: 60rpx;
  647. border-radius: 60rpx;
  648. background: #f5f5f5;
  649. font-size: 28rpx;
  650. display: flex;
  651. align-items: center;
  652. justify-content: center;
  653. box-sizing: border-box;
  654. &:nth-child(3n) {
  655. margin-right: 0;
  656. }
  657. &.active {
  658. border: 1px solid $assist-color;
  659. color: $assist-color;
  660. background: #ffffff;
  661. }
  662. }
  663. }
  664. .img-list {
  665. display: flex;
  666. flex-wrap: wrap;
  667. .item {
  668. margin-top: 20rpx;
  669. margin-right: 20rpx;
  670. width: calc((100% - 40rpx) / 3);
  671. border-radius: 8rpx;
  672. display: flex;
  673. flex-direction: column;
  674. align-items: center;
  675. justify-content: center;
  676. box-sizing: border-box;
  677. padding: 10rpx;
  678. image {
  679. width: 100%;
  680. height: 120rpx;
  681. }
  682. .text {
  683. font-size: 28rpx;
  684. margin-top: 12rpx;
  685. }
  686. &:nth-child(3n) {
  687. margin-right: 0;
  688. }
  689. &.active {
  690. border: 1px solid $assist-color;
  691. .text {
  692. color: $assist-color;
  693. }
  694. }
  695. }
  696. }
  697. }
  698. .carousel-container {
  699. margin-top: 40rpx;
  700. padding-top: 40rpx;
  701. border-top: 1px solid #eaeaea;
  702. .item {
  703. display: flex;
  704. justify-content: space-between;
  705. padding: 20rpx 0;
  706. .left {
  707. .name {
  708. font-weight: 500;
  709. }
  710. .text {
  711. margin-top: 12rpx;
  712. font-size: 28rpx;
  713. }
  714. }
  715. .right {
  716. font-size: 28rpx;
  717. color: $sec-font;
  718. }
  719. }
  720. }
  721. </style>