makeOut.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. <template>
  2. <view class="scenic-makeOut">
  3. <u--form
  4. labelPosition="left"
  5. :model="form"
  6. ref="uForm"
  7. labelWidth="150rpx"
  8. >
  9. <view class="content info">
  10. <view class="title">
  11. {{ticketInfo.productName}}
  12. </view>
  13. <view class="notice" @click="showNotice = true">
  14. <view class="text">
  15. 预定须知
  16. </view>
  17. <image class="jiantou" src="../static/right.png" mode=""></image>
  18. </view>
  19. <u-form-item
  20. label="出游日期"
  21. borderBottom
  22. ref="startTime"
  23. required
  24. prop="startTime"
  25. >
  26. <view class="time-box" @click="chooseTime">
  27. {{form.startTime}}
  28. <image class="right-icon" src="../static/right.png" mode=""></image>
  29. </view>
  30. </u-form-item>
  31. <view class="signUp-box">
  32. <view class="label-box">
  33. <view class="label">
  34. 预订数量
  35. </view>
  36. <view class="desc">
  37. (最多10张)
  38. </view>
  39. </view>
  40. <view class="num-box">
  41. <view class="btn" :class="[form.bookNumber == 1?'disabled':'']" @click="add(-1)">
  42. -
  43. </view>
  44. <view class="num">
  45. {{form.bookNumber}}
  46. </view>
  47. <view class="btn" :class="[form.bookNumber == 10?'disabled':'']" @click="add(1)">
  48. +
  49. </view>
  50. </view>
  51. </view>
  52. </view>
  53. <view class="content ">
  54. <view class="sub-title">
  55. 取票人信息
  56. </view>
  57. <u-form-item
  58. label="姓名"
  59. borderBottom
  60. ref="item1"
  61. prop="contact.contactName"
  62. required
  63. >
  64. <u--input
  65. v-model="form.contact.contactName"
  66. border="none"
  67. placeholder="请输入姓名"
  68. ></u--input>
  69. </u-form-item>
  70. <u-form-item
  71. label="手机号"
  72. borderBottom
  73. ref="item1"
  74. prop="contact.contactTel"
  75. required
  76. >
  77. <u--input
  78. v-model="form.contact.contactTel"
  79. border="none"
  80. :maxlength="11"
  81. placeholder="请输入手机号"
  82. ></u--input>
  83. </u-form-item>
  84. <u-form-item
  85. label="邮箱"
  86. borderBottom
  87. ref="item1"
  88. prop="contact.contactEmail"
  89. required
  90. v-if="ticketInfo.admissionVoucher.admissionVoucherCode == 205 || ticketInfo.admissionVoucher.admissionVoucherCode == 302"
  91. >
  92. <u--input
  93. v-model="form.contact.contactEmail"
  94. border="none"
  95. placeholder="请输入邮箱号"
  96. ></u--input>
  97. </u-form-item>
  98. <u-form-item
  99. label="证件类型"
  100. borderBottom
  101. ref="item1"
  102. :required="showContact"
  103. v-if="showContact"
  104. >
  105. <view class="time-box" @click="chooseType('取票')">
  106. {{form.contact.psptType | filterType(that)}}
  107. <image class="right-icon" src="../static/right.png" mode=""></image>
  108. </view>
  109. </u-form-item>
  110. <u-form-item
  111. label="证件号"
  112. ref="item1"
  113. prop="contact.psptId"
  114. :required="showContact"
  115. v-if="showContact"
  116. >
  117. <u--input
  118. v-model="form.contact.psptId"
  119. border="none"
  120. placeholder="请输入证件号"
  121. :maxlength="18"
  122. ></u--input>
  123. </u-form-item>
  124. </view>
  125. <template v-if="required">
  126. <view class="content" v-for="(item,index) in form.touristList" :key="item">
  127. <view class="sub-title">
  128. 出游人信息
  129. </view>
  130. <view class="no">
  131. 第{{index+1}}位
  132. </view>
  133. <u-form-item
  134. label="姓名"
  135. borderBottom
  136. :ref="'touristList'+index+'name'"
  137. :prop="`touristList.${index}.name`"
  138. :required="required"
  139. >
  140. <u--input
  141. v-model="item.name"
  142. border="none"
  143. placeholder="请输入姓名"
  144. ></u--input>
  145. </u-form-item>
  146. <u-form-item
  147. label="手机号"
  148. borderBottom
  149. :ref="'touristList'+index+'tel'"
  150. :prop="'touristList.'+index+'.tel'"
  151. :required="required"
  152. >
  153. <u--input
  154. v-model="item.tel"
  155. border="none"
  156. :maxlength="11"
  157. placeholder="请输入手机号"
  158. ></u--input>
  159. </u-form-item>
  160. <u-form-item
  161. label="证件类型"
  162. borderBottom
  163. ref="item13"
  164. prop="name"
  165. :required="idRequired"
  166. v-if="idRequired"
  167. >
  168. <view class="time-box" @click="chooseType(index)">
  169. {{item.psptType | filterType(that)}}
  170. <image class="right-icon" src="../static/right.png" mode=""></image>
  171. </view>
  172. </u-form-item>
  173. <u-form-item
  174. label="证件号"
  175. ref="item14"
  176. :ref="'touristList'+index+'psptId'"
  177. :prop="'touristList.'+index+'.psptId'"
  178. :required="idRequired"
  179. v-if="idRequired"
  180. >
  181. <u--input
  182. v-model="item.psptId"
  183. border="none"
  184. placeholder="请输入证件号"
  185. :maxlength="18"
  186. ></u--input>
  187. </u-form-item>
  188. </view>
  189. </template>
  190. </u--form>
  191. <view class="btn-box">
  192. <view class="left">
  193. <view class="num">
  194. 共{{form.bookNumber}}件
  195. </view>
  196. <view class="total">
  197. 合计 <view class="price-box">
  198. <view class="unit">
  199. </view>
  200. <view class="price">
  201. {{total}}
  202. </view>
  203. </view>
  204. </view>
  205. </view>
  206. <button class="btn" @click="handleBuy" :loading="loading">
  207. 提交订单
  208. </button>
  209. </view>
  210. <u-calendar
  211. confirmDisabledText="请选择日期"
  212. :show="show"
  213. @confirm="confirmTime"
  214. @close="show = false"
  215. ref="calendar"
  216. :rowHeight="120"
  217. closeOnClickOverlay
  218. color="#EE4320"
  219. :customList="ticketInfo.priceCalendar"
  220. :monthNum="12"
  221. >
  222. </u-calendar>
  223. <u-picker :show="show1" :columns="columns" closeOnClickOverlay keyName="label" @cancel="close" @close="close" @confirm="confirm"></u-picker>
  224. <!-- 预定须知 -->
  225. <u-popup :show="showNotice" round="16rpx" mode="bottom" @close="showNotice = false">
  226. <view class="popup-title">
  227. {{ticketInfo.shopName}}
  228. </view>
  229. <view class="box">
  230. <template v-if="ticketInfo.drawAddress">
  231. <view class="sub-title">
  232. 取票地点
  233. </view>
  234. <view class="intro">
  235. {{ticketInfo.drawAddress}}
  236. </view>
  237. </template>
  238. <view class="sub-title">
  239. 入园方式
  240. </view>
  241. <view class="intro">
  242. {{ticketInfo.admissionVoucher.admissionVoucherCode | filterVoucherType}}
  243. </view>
  244. <view class="sub-title">
  245. 有效期
  246. </view>
  247. <view class="intro">
  248. {{ticketInfo.indate || '-'}}
  249. </view>
  250. <view class="sub-title">
  251. 预定截止
  252. </view>
  253. <view class="intro">
  254. {{ticketInfo.advanceDay}}天 {{ticketInfo.advanceHour}}小时
  255. </view>
  256. <view class="sub-title">
  257. 退改规则
  258. </view>
  259. <rich-text class="intro" :nodes="ticketInfo.mpLossInfo"></rich-text>
  260. <view class="sub-title">
  261. 预定须知
  262. </view>
  263. <rich-text class="intro" :nodes="ticketInfo.bookNotice"></rich-text>
  264. <view class="sub-title">
  265. 其他说明
  266. </view>
  267. <rich-text class="intro" :nodes="ticketInfo.info"></rich-text>
  268. </view>
  269. </u-popup>
  270. </view>
  271. </template>
  272. <script>
  273. import {createOrderNew} from '@/api/scenic.js'
  274. import {
  275. creatPayOrder,
  276. queryPayOrder,
  277. } from '@/api/payment.js'
  278. export default {
  279. data() {
  280. return {
  281. that:this,
  282. show:false,
  283. show1:false,
  284. showNotice:false,
  285. loading:false,
  286. form:{
  287. "scenicId":0,
  288. "epId":0,
  289. "channel":'ZhongShu',
  290. "bookNumber": 1,
  291. "contact": {
  292. "contactEmail": "",
  293. "contactName": "",
  294. "contactTel": "",
  295. "psptId": "",
  296. "psptType": 1
  297. },
  298. "couponValue": 0,
  299. "delivery": {
  300. "deliveryEndAddress": "",
  301. "deliveryType": 0,
  302. "receiverName": "",
  303. "telNum": "",
  304. "zipCode": ""
  305. },
  306. "productId": 0,
  307. "startTime": "",
  308. "touristList": [
  309. {
  310. "email": "",
  311. "name": "",
  312. "psptId": "",
  313. "psptType": 1,
  314. "tel": ""
  315. }
  316. ]
  317. },
  318. required:false,//游客信息是否必填
  319. idRequired:false,//游客身份证信息是否必填
  320. showContact:false,//取票人信息是否必填
  321. rules: {
  322. 'startTime':[
  323. {
  324. required: true,
  325. message: '请选择出游日期',
  326. trigger: ['blur', 'change']
  327. },
  328. ],
  329. contact:{
  330. contactName:[
  331. {
  332. required: true,
  333. message: '请输入姓名',
  334. trigger: ['blur', 'change']
  335. },
  336. ],
  337. contactTel:[
  338. {
  339. required: true,
  340. message: '请输入手机号',
  341. trigger: ['blur', 'change']
  342. },
  343. {
  344. // 自定义验证函数,见上说明
  345. validator: (rule, value, callback) => {
  346. // 上面有说,返回true表示校验通过,返回false表示不通过
  347. // uni.$u.test.mobile()就是返回true或者false的
  348. return uni.$u.test.mobile(value);
  349. },
  350. message: '手机号码不正确',
  351. // 触发器可以同时用blur和change
  352. trigger: ['change','blur'],
  353. }
  354. ],
  355. contactEmail:[
  356. {
  357. required: true,
  358. message: '请输入取票人邮箱',
  359. trigger: ['blur', 'change']
  360. },
  361. {
  362. // 自定义验证函数,见上说明
  363. validator: (rule, value, callback) => {
  364. // 上面有说,返回true表示校验通过,返回false表示不通过
  365. // uni.$u.test.mobile()就是返回true或者false的
  366. return uni.$u.test.email(value);
  367. },
  368. message: '邮箱号不正确',
  369. // 触发器可以同时用blur和change
  370. trigger: ['change','blur'],
  371. }
  372. ],
  373. psptId:[
  374. {
  375. required: true,
  376. message: '请输入证件号码',
  377. trigger: ['blur', 'change']
  378. }
  379. ],
  380. },
  381. touristList:[]
  382. },
  383. ticketInfo:{salePrice:0},
  384. columns: [
  385. [
  386. {
  387. label: '身份证',
  388. id: 1
  389. },
  390. {
  391. label: '护照',
  392. id: 2
  393. },
  394. {
  395. label: '军官证',
  396. id: 3
  397. },
  398. {
  399. label: '港澳通行证',
  400. id: 4
  401. },
  402. {
  403. label: '台胞证',
  404. id: 7
  405. },
  406. {
  407. label: '回乡证',
  408. id: 8
  409. },
  410. {
  411. label: '户口簿',
  412. id: 9
  413. },
  414. {
  415. label: '出生证明',
  416. id: 10
  417. },
  418. {
  419. label: '台湾通行证',
  420. id: 11
  421. },
  422. ]
  423. ],
  424. active:0,
  425. query: {
  426. "msgType": "wx.unifiedOrder",
  427. "orderDesc": "",
  428. "orderNo": "",
  429. "channel":'ZhongShu',
  430. "subOpenId": "",
  431. "userId": ""
  432. },
  433. payData:null,
  434. price:0
  435. }
  436. },
  437. filters: {
  438. filterType: function(value,that) {
  439. let msg
  440. that.columns[0].map(item=>{
  441. if(value == item.id){
  442. msg = item.label
  443. }
  444. })
  445. return msg;
  446. },
  447. filterVoucherType: function(val) {
  448. if(val == 1){
  449. return '实体票入园'
  450. }else if(val == 201){
  451. return '换票入园短信'
  452. }else if(val == 202){
  453. return '换票入园二维码'
  454. }else if(val == 203){
  455. return '换票入园数字码'
  456. }else if(val == 204){
  457. return '换票入园换票证'
  458. }else if(val == 205){
  459. return '换票入园邮件'
  460. }else if(val == 206){
  461. return '换票入园身份证'
  462. }else if(val == 207){
  463. return '换票入园护照'
  464. }else if(val == 208){
  465. return '换票入园港澳通行证'
  466. }else if(val == 209){
  467. return '换票入园军官证'
  468. }else if(val == 210){
  469. return '换票入园台胞证'
  470. }else if(val == 301){
  471. return '直接验证入园二维码'
  472. }else if(val == 302){
  473. return '直接验证入园邮件'
  474. }else if(val == 303){
  475. return '直接验证入园身份证'
  476. }else if(val == 304){
  477. return '直接验证入园护照'
  478. }else if(val == 305){
  479. return '直接验证入园港澳通行证'
  480. }else if(val == 306){
  481. return '直接验证入园军官证'
  482. }else if(val == 307){
  483. return '直接验证入园台胞证'
  484. }
  485. }
  486. },
  487. computed: {
  488. total() {
  489. if(this.price){
  490. return this.price*this.form.bookNumber
  491. }else{
  492. return this.ticketInfo.salePrice*this.form.bookNumber
  493. }
  494. }
  495. },
  496. methods: {
  497. confirmTime(val){
  498. if(!val.length) return uni.showToast({
  499. title:'请选择日期',
  500. icon:'none'
  501. })
  502. this.show = false
  503. this.form.startTime = val[0]
  504. this.ticketInfo.priceCalendar.forEach(item=>{
  505. if(item.departDate == val[0]){
  506. this.price = item.salePrice
  507. }
  508. })
  509. this.$refs.uForm.validateField('startTime')
  510. },
  511. confirm(val){
  512. console.log(val);
  513. this.show1 = false
  514. if(this.active == '取票'){
  515. this.form.contact.psptType = val.value[0].id
  516. }else{
  517. this.form.touristList[this.active].psptType = val.value[0].id
  518. }
  519. },
  520. close(){
  521. console.log(9999);
  522. this.show1 = false
  523. },
  524. chooseTime() {
  525. this.show = true
  526. },
  527. chooseType(index){
  528. this.show1 = true
  529. this.active = index
  530. },
  531. add(val){
  532. if((val==-1&&this.form.bookNumber == 1)||(val==1&&this.form.bookNumber == 10)) return
  533. if(val == 1){
  534. if(this.required){
  535. this.form.touristList.push({
  536. "email": "",
  537. "name": "",
  538. "psptId": "",
  539. "psptType": 1,
  540. "tel": ""
  541. })
  542. }
  543. }else{
  544. this.form.touristList.pop()
  545. }
  546. this.form.bookNumber+=val
  547. this.setRules()
  548. },
  549. handleBuy(){
  550. this.$refs.uForm.validate().then(res => {
  551. this.createOrderNew(this.form)
  552. })
  553. },
  554. createOrderNew(query){
  555. if (this.loading) return
  556. this.loading = true
  557. uni.showLoading({
  558. title: '支付中'
  559. })
  560. let that = this
  561. createOrderNew(query).then(res=>{
  562. if(res.state == 'Success'){
  563. this.query.orderNo = res.content.orderNo
  564. this.query.subOpenId = JSON.parse(uni.getStorageSync('userInfo')).openId
  565. this.query.orderDesc = this.ticketInfo.productName
  566. creatPayOrder(this.query).then(data => {
  567. that.payData = JSON.parse(data.content.miniPayRequest)
  568. if (data.content.miniPayRequest == null) return uni.hideLoading()
  569. console.log(666,that.payData);
  570. uni.requestPayment({
  571. "provider": "wxpay",
  572. "orderInfo": that.payData,
  573. "appid": that.payData
  574. .appId, // 微信开放平台 - 应用 - AppId,注意和微信小程序、公众号 AppId 可能不一致
  575. "paySign": that.payData.paySign,
  576. "nonceStr": that.payData.nonceStr, // 随机字符串
  577. "package": that.payData.package, // 固定值
  578. // "prepayid": that.payData.package, // 统一下单订单号
  579. "timeStamp": that.payData.timeStamp, // 时间戳(单位:秒)
  580. "signType": that.payData.signType, //签名算法
  581. success(msg) {
  582. console.log('msg', that.query.orderNo);
  583. queryPayOrder(that.query.orderNo).then(res1 => {
  584. uni.hideLoading()
  585. that.loading = false
  586. if (res1.state == 'Success') {
  587. uni.reLaunch({
  588. url: '/my/order/index'
  589. })
  590. }
  591. })
  592. },
  593. fail(e) {
  594. console.log('err', e);
  595. that.loading = false
  596. uni.hideLoading()
  597. uni.showToast({
  598. title: '取消支付',
  599. icon: 'fail'
  600. })
  601. // 取消支付后
  602. uni.reLaunch({
  603. url:'/my/order/scenic/detail?id='+that.query.orderNo
  604. })
  605. }
  606. })
  607. })
  608. }else{
  609. that.loading = false
  610. uni.hideLoading()
  611. uni.hideToast()
  612. if(res.content.indexOf('不符合资源') != -1){
  613. uni.showToast({
  614. title: res.content.split('不符合资源')[0]+'不合法',
  615. icon: 'none'
  616. })
  617. }else{
  618. uni.showToast({
  619. title: res.content,
  620. icon: 'none'
  621. })
  622. }
  623. }
  624. })
  625. },
  626. setRules() {
  627. //custInfoLimit=2,3,6,7这几种类型 游客信息必填 否则直接不填
  628. if(this.required){
  629. this.form.touristList.forEach((ele, index) => {
  630. this.$set(this.rules, `touristList.${index}.name`, [
  631. {
  632. required: true,
  633. message: '请填写姓名',
  634. trigger: ['blur', 'change']
  635. }
  636. ])
  637. this.$set(this.rules, `touristList.${index}.tel`, [
  638. {
  639. required: true,
  640. message: '请填写手机号',
  641. trigger: ['blur', 'change']
  642. },
  643. {
  644. validator: (rule, value, callback) => {
  645. // 上面有说,返回true表示校验通过,返回false表示不通过
  646. return uni.$u.test.mobile(value);
  647. },
  648. message: '手机号码不正确',
  649. // 触发器可以同时用blur和change
  650. trigger: ['change','blur'],
  651. }
  652. ])
  653. if(this.idRequired){
  654. this.$set(this.rules, `touristList.${index}.psptId`, [
  655. {
  656. required: true,
  657. message: '请填写证件号码',
  658. trigger: ['blur', 'change']
  659. }
  660. ])
  661. }
  662. })
  663. }
  664. console.log('rule',this.rules);
  665. this.$nextTick(() => {
  666. this.$refs.uForm.setRules(this.rules)
  667. })
  668. },
  669. },
  670. onReady() {
  671. //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
  672. // this.$refs.uForm.setRules(this.rules)
  673. this.setRules()
  674. },
  675. mounted() {
  676. // this.setRules()
  677. },
  678. onLoad(options) {
  679. let userInfo = JSON.parse(uni.getStorageSync('userInfo'))
  680. this.query.userId = userInfo.userId
  681. this.form.scenicId = options.id
  682. let that = this
  683. const eventChannel = this.getOpenerEventChannel();
  684. eventChannel.on('pay', function(data) {
  685. that.form.epId = data.epId
  686. that.ticketInfo = data
  687. that.ticketInfo.priceCalendar.map(i=>{i.bottomInfo = i.salePrice})
  688. that.form.productId = data.productId
  689. // 这几种类型 才需要填写游客信息
  690. if([2,3,6,7].includes(that.ticketInfo.custInfoLimit)){
  691. that.required = true
  692. // 必填游客身份证
  693. if([3,6].includes(that.ticketInfo.custInfoLimit)){
  694. that.idRequired = true
  695. }else{
  696. that.idRequired = false
  697. }
  698. }else{
  699. that.required = false
  700. that.form.touristList = []
  701. }
  702. // 这几种类型 才需要填写取票人证件信息
  703. if([4,6,7].includes(that.ticketInfo.custInfoLimit)){
  704. that.showContact = true
  705. }else{
  706. that.showContact = false
  707. delete that.form.contact.psptType
  708. delete that.form.contact.psptId
  709. }
  710. })
  711. }
  712. }
  713. </script>
  714. <style lang="scss" >
  715. .scenic-makeOut{
  716. background: #F9F9F9;
  717. border-radius: 0rpx 0rpx 0rpx 0rpx;
  718. padding: 20rpx 24rpx 120rpx;
  719. min-height: 100vh;
  720. .content{
  721. background: #FFFFFF;
  722. border-radius: 16rpx 16rpx 16rpx 16rpx;
  723. margin-bottom: 20rpx;
  724. padding: 24rpx;
  725. }
  726. .sub-title{
  727. font-weight: 600;
  728. font-size: 28rpx;
  729. color: #222222;
  730. padding-bottom: 24rpx;
  731. border-bottom: 1rpx solid #F0F0F0;
  732. }
  733. .no{
  734. padding: 24rpx 0;
  735. font-size: 28rpx;
  736. color: #222222;
  737. font-weight: bold;
  738. }
  739. .time-box{
  740. display: flex;
  741. justify-content: flex-end;
  742. text-align: center;
  743. .right-icon{
  744. width: 48rpx;
  745. height: 48rpx;
  746. }
  747. }
  748. .info{
  749. .title{
  750. font-weight: 600;
  751. font-size: 36rpx;
  752. color: #222222;
  753. width: 100%;
  754. white-space: nowrap;
  755. overflow: hidden;
  756. text-overflow: ellipsis;
  757. margin-top: 10rpx;
  758. }
  759. .notice{
  760. display: flex;
  761. align-items: center;
  762. font-size: 24rpx;
  763. color: #AAAAAA;
  764. margin-top: 20rpx;
  765. .jiantou{
  766. width: 48rpx;
  767. height: 48rpx;
  768. }
  769. }
  770. .signUp-box{
  771. display: flex;
  772. justify-content: space-between;
  773. align-items: center;
  774. padding-top: 20rpx;
  775. .label-box{
  776. display: flex;
  777. align-items: center;
  778. .label{
  779. font-weight: 300;
  780. font-size: 24rpx;
  781. color: #181818;
  782. }
  783. .desc{
  784. font-weight: 300;
  785. font-size: 24rpx;
  786. color: #AAAAAA;
  787. }
  788. }
  789. .num-box{
  790. display: flex;
  791. align-items: center;
  792. .btn.disabled{
  793. background: #F0F0F0;
  794. color: #AAAAAA;
  795. }
  796. .btn{
  797. width: 36rpx;
  798. height: 36rpx;
  799. line-height: 36rpx;
  800. border-radius: 50%;
  801. background: #E2ECFF;
  802. color: #3879F9;
  803. font-size: 30rpx;
  804. text-align: center;
  805. vertical-align: top;
  806. }
  807. .num{
  808. font-weight: 400;
  809. font-size: 24rpx;
  810. color: #222222;
  811. width: 50rpx;
  812. text-align: center;
  813. }
  814. }
  815. }
  816. }
  817. .btn-box {
  818. position: fixed;
  819. bottom: 0%;
  820. left: 0%;
  821. z-index: 2;
  822. width: 100%;
  823. display: flex;
  824. align-items: center;
  825. justify-content: space-between;
  826. box-sizing: border-box;
  827. padding: 10rpx 24rpx env(safe-area-inset-bottom);
  828. background: #fff;
  829. border-top: 1rpx solid #EEEEEE;
  830. .left{
  831. display: flex;
  832. align-items: flex-end;
  833. .num{
  834. font-weight: 300;
  835. font-size: 24rpx;
  836. color: #AAAAAA;
  837. }
  838. .total{
  839. font-weight: 300;
  840. font-size: 24rpx;
  841. color: #222222;
  842. display: flex;
  843. align-items: flex-end;
  844. margin-left: 6rpx;
  845. .price-box{
  846. display: flex;
  847. align-items: flex-end;
  848. font-weight: 400;
  849. font-size: 32rpx;
  850. color: #222222;
  851. .unit{
  852. font-size: 20rpx;
  853. }
  854. .price{
  855. font-weight: bold;
  856. }
  857. }
  858. }
  859. }
  860. .btn {
  861. width: 280rpx;
  862. height: 80rpx;
  863. line-height: 80rpx;
  864. text-align: center;
  865. background: $uni-color-primary;
  866. border-radius: 40rpx;
  867. font-weight: 600;
  868. font-size: 28rpx;
  869. color: #FFFFFF;
  870. margin: 0;
  871. }
  872. }
  873. .u-popup__content{
  874. padding: 0 24rpx 28rpx;
  875. position: relative;
  876. .popup-title{
  877. font-weight: 600;
  878. font-size: 32rpx;
  879. color: #222222;
  880. padding: 28rpx 0;
  881. border-bottom: 1rpx solid #F0F0F0;
  882. }
  883. .box{
  884. max-height: 70vh;
  885. overflow: auto;
  886. .sub-title{
  887. font-weight: 600;
  888. font-size: 28rpx;
  889. color: #222222;
  890. margin: 20rpx 0;
  891. border: none;
  892. }
  893. .intro{
  894. font-weight: 300;
  895. font-size: 24rpx;
  896. color: #AAAAAA;
  897. line-height: 40rpx;
  898. padding-bottom: 24rpx;
  899. }
  900. .border-bottom{
  901. border-bottom: 1rpx solid #F0F0F0!important;
  902. }
  903. }
  904. }
  905. }
  906. </style>