pay_order.vue 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  1. <template>
  2. <view class="orderDetails">
  3. <view class="content" v-if="details">
  4. <view class="address">
  5. <view class="add">{{address}} {{name}} {{atlasAdd}} </view>
  6. <view class="name">
  7. <view class="name_left">
  8. {{details.cNickName}} <text>{{details.cPhone}}</text>
  9. </view>
  10. <view class="toggle" @click="changeAddress(details.cId)">
  11. 更换地址
  12. </view>
  13. </view>
  14. </view>
  15. <view class="list_content">
  16. <view class="list_title">
  17. <view class="title_left">
  18. <text></text>体验项目
  19. </view>
  20. <view class="js">商户:{{details.js.cNickName}}</view>
  21. </view>
  22. <view class="lists" v-for="(item,index) in projects" :key="index">
  23. <view class="imgs">
  24. <image :src="$globalData.publicUrl + item.cCover" mode="" />
  25. </view>
  26. <view class="right">
  27. <view class="list_title">
  28. <view class="title">{{item.cTitle}}</view>
  29. <view class="time">服务时长:{{item.nMinute}}分钟</view>
  30. </view>
  31. <view class="price">
  32. <view class="counter">份数:{{item.number}} </view>
  33. <view class="money">¥{{item.dPrice}}</view>
  34. </view>
  35. </view>
  36. </view>
  37. <view class="total">
  38. <text style="font-size: 28rpx;">总计</text>
  39. <view class="total_price" v-if="orderType ==2">
  40. ¥<text class="price">{{priceDifference}}</text>
  41. </view>
  42. <view class="total_price" v-else>
  43. ¥<text class="price">{{dTotalMoney}}</text>
  44. </view>
  45. </view>
  46. <view class="time_coupon">
  47. <!-- <view class="select_coupon" @click="isSelectDate = true">
  48. <text>预约时间 <text class="red">*</text> </text>
  49. <view class="right" v-if="preferential>0">-{{preferential}}元
  50. <image src="../../static/identify/more.png" mode="" />
  51. </view>
  52. <view class="right" v-else>请选择上门时间
  53. <image src="../../static/identify/more.png" mode="" />
  54. </view>
  55. </view> -->
  56. <view class="select_coupon" @click="selectCoupon">
  57. <text>优惠券</text>
  58. <view class="right" v-if="preferential>0">-{{preferential}}元
  59. <image src="../../static/identify/more.png" mode="" />
  60. </view>
  61. <view class="right" v-else>{{couponNum}}张可用
  62. <image src="../../static/identify/more.png" mode="" />
  63. </view>
  64. </view>
  65. </view>
  66. </view>
  67. <view class="face" v-if="!details.parentNo">
  68. <view class="face_one">
  69. <view class="title_left"> <text></text>出行方式</view>
  70. <view class="btn">滴滴/出租</view>
  71. </view>
  72. <view class="face_one">
  73. <view>车费</view>
  74. <view class="price"> 预估:{{details.fare || 0}}元</view>
  75. </view>
  76. <view class="face_three">
  77. 车费¥{{details.fare || 0}}全程 {{details.distance.toFixed(2)}} 公里,起步价
  78. <span v-if="!baseDistance == ''">{{baseDistance}}</span>
  79. <span v-else>3</span>
  80. 公里
  81. <span v-if="!baseFare == ''">{{baseFare}}</span>
  82. <span v-else>9.3</span>
  83. 元;超出
  84. <span v-if="!baseDistance == ''">{{baseDistance}}</span>
  85. <span v-else>3</span>公里
  86. 后,每公里
  87. <span v-if="!additionalFarePer == ''">{{additionalFarePer}}</span>
  88. <span v-else>2.4</span>
  89. 元。
  90. </view>
  91. </view>
  92. <view class="pay_type">
  93. <view class="pay_title"> <text></text>支付方式</view>
  94. <view class="pay_box">
  95. <!-- <view class="container"> -->
  96. <radio-group @change="onPaymentRadioChange">
  97. <view class="public wx_pay">
  98. <image src="../../static/identify/weixin.png" mode="" />
  99. <text>微信支付</text>
  100. <radio value="1" class="radio" />
  101. </view>
  102. <view class="public wx_pay">
  103. <image src="../../static/identify/qianbao.png" mode="" />
  104. <text>账户余额({{dBalance}})</text>
  105. <radio value="2" class="radio" />
  106. </view>
  107. <view class="public wx_pay" v-if="orderType ==2">
  108. <image src="../../static/identify/rmb.png" mode="" />
  109. <text>现金支付</text>
  110. <radio value="3" class="radio" />
  111. </view>
  112. </radio-group>
  113. <!-- </view> -->
  114. </view>
  115. </view>
  116. <view class="yuyue">
  117. <view class="prices">合计:
  118. <text v-if="orderType == 2">{{priceDifference}}</text>
  119. <text v-else>{{totalPrice}}</text>
  120. </view>
  121. <view class="btn" @click="goPay" v-if="remainingTime>0">
  122. <view class="">
  123. 立即支付
  124. </view>
  125. <view class="remaining_time">
  126. 剩余 <u-count-down :timestamp="remainingTime" @end="Refresh"></u-count-down>
  127. </view>
  128. </view>
  129. <view class="btn" v-else>
  130. <view class="">
  131. 已过期
  132. </view>
  133. </view>
  134. </view>
  135. </view>
  136. <view class="time_popup" v-if="isTime">
  137. <view class="popup_content">
  138. <view class="popup_title">
  139. 请预约时间
  140. </view>
  141. <view class="describe">
  142. 您还没有预约上门时间,<br />
  143. 请先去预约时间再进行下单
  144. </view>
  145. <view class="popup_btn">
  146. <view class="popup_cancel" @click="isTime = false">
  147. 取消
  148. </view>
  149. <view class="popup_subscribe" @click="isTime = false,isSelectDate = true">
  150. 预约时间
  151. </view>
  152. </view>
  153. </view>
  154. </view>
  155. <seelctName @dateSend="getDate" v-if="isSelectDate" />
  156. </view>
  157. </template>
  158. <script>
  159. import wx from 'weixin-js-sdk'
  160. import seelctName from '../../components/select_time.vue'
  161. import {
  162. orderDeatails,
  163. getInfo,
  164. payoff,
  165. pay,
  166. getSignature,
  167. getCoupon,
  168. tFareSetting,
  169. verification
  170. } from '../../api/index.js'
  171. export default {
  172. components: {
  173. seelctName
  174. },
  175. data() {
  176. return {
  177. isSelect: true,
  178. isCoupon: false,
  179. couponNum: 0,
  180. couponMoney: 0,
  181. orderId: '',
  182. publicUrl: 'https://1910ca70.r6.cpolar.top',
  183. details: [],
  184. projects: [],
  185. address: '',
  186. atlasAdd: '',
  187. name: '',
  188. money: 0,
  189. dTotalMoney: 0,
  190. carFace: 0,
  191. selectedPayment: null, // 初始状态下,没有选项被选中
  192. dBalance: 0, //账户余额
  193. payData: {
  194. appId: '',
  195. nonceStr: '',
  196. package: '',
  197. paySign: '',
  198. signType: '',
  199. timeStamp: '',
  200. },
  201. form: {
  202. dMoney: 0,
  203. cOpenId: uni.getStorageSync('wx_copenid'),
  204. },
  205. remainingTime: '',
  206. baseFare: '', //起步价
  207. baseDistance: '', //起步距离
  208. additionalFarePer: '', //超出费用
  209. cId: '', //订单id
  210. couponReceiveId: '', //优惠券id
  211. preferential: '', //优惠金额
  212. totalPrice: '', //总金额
  213. priceDifference: '', //升级差价
  214. orderType: '',
  215. isTime: false,
  216. isSelectDate: false
  217. }
  218. },
  219. methods: {
  220. getDate(data) {
  221. this.isSelectDate = false
  222. console.log(data)
  223. },
  224. fareSetting(id) {
  225. let data = {}
  226. data.deptId = id
  227. data.enable = 1
  228. tFareSetting(data).then(res => {
  229. this.baseDistance = res.data.data.records[0].baseDistance
  230. this.additionalFarePer = res.data.data.records[0].additionalFarePer
  231. this.baseFare = res.data.data.records[0].baseFare
  232. })
  233. },
  234. Refresh() {
  235. this.remainingTime = 0
  236. },
  237. myCoupon() {
  238. var openId = {
  239. openid: uni.getStorageSync('wx_copenid')
  240. }
  241. getCoupon(openId).then(res => {
  242. if (res.data.data.length > 0) {
  243. this.couponNum = res.data.data.length
  244. } else {
  245. this.couponNum = 0
  246. }
  247. })
  248. },
  249. selectCoupon() {
  250. if (this.remainingTime > 0) {
  251. uni.navigateTo({
  252. url: '/pages/my/coupon?title=' + 'select'
  253. })
  254. } else {
  255. uni.showToast({
  256. title: '已过期,请重新下单',
  257. icon: 'none'
  258. })
  259. }
  260. },
  261. changeAddress(id) {
  262. uni.navigateTo({
  263. url: '../my/remember?name=支付订单&orderNo=' + id
  264. })
  265. // if(this.isSelect){
  266. // }else{
  267. // uni.showToast({
  268. // title: '待支付订单不可修改地址',
  269. // icon: 'none'
  270. // })
  271. // }
  272. },
  273. //选择支付方式
  274. onPaymentRadioChange(e) {
  275. this.selectedPayment = e.target.value
  276. },
  277. // 支付
  278. goPay() {
  279. this.form.dMoney = this.totalPrice
  280. if (this.selectedPayment == null) {
  281. uni.showToast({
  282. title: '请选择支付方式',
  283. icon: 'none'
  284. })
  285. } else if (this.remainingTime == 0) {
  286. uni.showToast({
  287. title: '订单已过期',
  288. icon: 'none'
  289. })
  290. } else if (this.selectedPayment == 1) {
  291. //微信支付
  292. this.weixinPay()
  293. } else if (this.selectedPayment == 2) {
  294. //余额支付
  295. this.nowYuyue()
  296. }else if(this.selectedPayment == 3){
  297. this.rmbPay()
  298. }
  299. },
  300. //微信支付
  301. weixinPay() {
  302. var data = {
  303. cId: this.details.cId,
  304. payType: this.selectedPayment,
  305. couponReceiveId: this.couponReceiveId,
  306. preferential: this.preferential, //优惠金额
  307. totalPrice: this.totalPrice, //总金额
  308. }
  309. let url = 'https://test.baoxianzhanggui.com/fragrance/'
  310. payoff(data).then(res => {
  311. let payConfig = JSON.parse(res.data.data)
  312. getSignature(url).then(res => {
  313. this.wxconfig = res.data
  314. wx.config({
  315. beta: true,
  316. debug: false,
  317. appId: this.wxconfig.appId, // 公众号ID
  318. // appId: uni.getAppBaseInfo().host.appId, // 公众号ID
  319. timestamp: this.wxconfig.timestamp, // 时间戳,自1970年以来的秒数
  320. nonceStr: this.wxconfig.nonceStr, // 随机串
  321. signature: this.wxconfig.sign, // 微信签名方式
  322. jsApiList: ['getBrandWCPayRequest']
  323. });
  324. var vm = this
  325. wx.invoke(
  326. 'getBrandWCPayRequest', { // 下面参数内容都是后台返回的
  327. 'appId': payConfig.appid, // 公众号名称,由商户传入
  328. 'timeStamp': payConfig.timeStamp, // 时间戳
  329. 'nonceStr': payConfig.nonceStr, // 随机串
  330. 'package': payConfig.package, // 预支付id
  331. 'signType': payConfig.signType, // 微信签名方式
  332. 'paySign': payConfig.paySign, // 微信签名
  333. },
  334. function(res) {
  335. // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
  336. // JSON.stringify(res);
  337. if (res.err_msg == "get_brand_wcpay_request:ok") {
  338. vm.$message.success(
  339. "支付成功") // 使用alert来弹窗 支付成功 是没有反应的。所以这里改为框架页面的弹窗就好了。注意必须要上这个微信浏览器内置事件外 转this指向才能弹窗
  340. // vm.isDisabledSubmitBtn = false;
  341. uni.switchTab({
  342. url: '../order/order',
  343. })
  344. } else if (res.err_msg == "get_brand_wcpay_request:cancel") {
  345. uni.showToast({
  346. title: '已取消支付',
  347. icon: 'none'
  348. })
  349. // alert('支付取消');
  350. // vm.isDisabledSubmitBtn = false;
  351. } else {
  352. alert('付款失败');
  353. // vm.isDisabledSubmitBtn = false;
  354. }
  355. })
  356. })
  357. })
  358. },
  359. //拉取微信支付的方法
  360. pullWchatPay(data) {
  361. var that = this;
  362. let onBridgeReady = () => {
  363. if (WeixinJSBridge && appId) {
  364. WeixinJSBridge.invoke(
  365. 'getBrandWCPayRequest', {
  366. appId: data.appId,
  367. nonceStr: data.nonceStr,
  368. package: data.package,
  369. paySign: data.paySign,
  370. signType: data.signType,
  371. timeStamp: data.timeStamp
  372. },
  373. function(res) {
  374. console.log('调起支付时的警告');
  375. if (res.err_msg === 'get_brand_wcpay_request:ok') {
  376. _this.payType = 0;
  377. console.log('支付成功回调')
  378. } else {
  379. console.log('支付失败')
  380. }
  381. }
  382. )
  383. }
  384. }
  385. // 检测支付环境中的 WeixinJSBridge
  386. if (typeof WeixinJSBridge == "undefined") {
  387. if (document.addEventListener) {
  388. //android机型,调取支付支付环境偶尔有延迟,这里增加延时器处理
  389. var timev = setTimeout(() => {
  390. clearTimeout(timev)
  391. document.addEventListener('WeixinJSBridgeReady', onBridgeReady(),
  392. false);
  393. }, 1000)
  394. } else if (document.attachEvent) {
  395. document.attachEvent('WeixinJSBridgeReady', onBridgeReady());
  396. document.attachEvent('onWeixinJSBridgeReady', onBridgeReady());
  397. }
  398. } else {
  399. onBridgeReady();
  400. }
  401. },
  402. //账号余额支付
  403. nowYuyue() {
  404. if (parseInt(this.dBalance) < parseInt(this.totalPrice)) {
  405. uni.showModal({
  406. title: '账户余额不足',
  407. content: '请充值',
  408. success: function(res) {
  409. if (res.confirm) {
  410. uni.navigateTo({
  411. url: '../my/pay?name=充值'
  412. })
  413. } else if (res.cancel) {}
  414. }
  415. });
  416. } else {
  417. var data = {
  418. cId: this.details.cId,
  419. payType: this.selectedPayment,
  420. couponReceiveId: this.couponReceiveId,
  421. preferential: this.preferential, //优惠金额
  422. totalPrice: this.totalPrice, //总金额
  423. }
  424. payoff(data).then(res => {
  425. if (res.data.code == 200) {
  426. uni.showToast({
  427. title: '支付成功!',
  428. })
  429. setTimeout(() => {
  430. uni.switchTab({
  431. url: '../order/order',
  432. })
  433. }, 2000)
  434. } else {
  435. uni.showToast({
  436. icon: 'error',
  437. title: res.data.msg,
  438. })
  439. }
  440. })
  441. }
  442. },
  443. //现金支付
  444. rmbPay(){
  445. var data = {
  446. cId: this.details.cId,
  447. payType: this.selectedPayment,
  448. couponReceiveId: this.couponReceiveId,
  449. preferential: this.preferential, //优惠金额
  450. totalPrice: this.totalPrice, //总金额
  451. }
  452. payoff(data).then(res => {
  453. if (res.data.code == 200) {
  454. uni.showToast({
  455. title: '支付成功!',
  456. })
  457. setTimeout(() => {
  458. uni.switchTab({
  459. url: '../order/order',
  460. })
  461. }, 2000)
  462. } else {
  463. uni.showToast({
  464. icon: 'error',
  465. title: res.data.msg,
  466. })
  467. }
  468. })
  469. },
  470. getInfo() {
  471. getInfo().then(res => {
  472. this.dBalance = res.data.data.dBalance.toFixed(2)
  473. })
  474. },
  475. getOrder() {
  476. let order = {
  477. orderNo: this.orderId,
  478. // orderNo: 'YORDER2025062000007',
  479. couponReceiveId: this.couponId
  480. }
  481. orderDeatails(order).then(res => {
  482. this.cId = res.data.data.records[0].cId
  483. this.details = res.data.data.records[0],
  484. this.totalPrice = this.details.totalPrice,
  485. this.priceDifference = this.details.priceDifference,
  486. this.orderType = this.details.orderType,
  487. console.log(res)
  488. this.projects = res.data.data.records[0].cGoods,
  489. this.address = res.data.data.records[0].address,
  490. this.atlasAdd = res.data.data.records[0].atlasAdd,
  491. this.name = res.data.data.records[0].name,
  492. this.dTotalMoney = res.data.data.records[0].dTotalMoney,
  493. this.totalPrice = res.data.data.records[0].totalPrice,
  494. this.remainingTime = res.data.data.records[0].remainingTime,
  495. this.fareSetting(res.data.data.records[0].deptId),
  496. this.getInfo()
  497. })
  498. },
  499. verification() {
  500. let order = {
  501. cId: this.cId,
  502. couponReceiveId: this.couponId
  503. }
  504. verification(order).then(res => {
  505. if (res.data.msg == '不满足优惠券门槛金额') {
  506. uni.showToast({
  507. title: res.data.msg,
  508. icon: 'none'
  509. })
  510. }
  511. this.couponReceiveId = res.data.data.couponReceiveId
  512. this.preferential = res.data.data.preferential
  513. this.totalPrice = res.data.data.totalPrice
  514. // this.details = res.data.data.records[0],
  515. // this.projects = res.data.data.records[0].cGoods,
  516. // this.address = res.data.data.records[0].address
  517. // this.atlasAdd = res.data.data.records[0].atlasAdd
  518. // this.name = res.data.data.records[0].name
  519. // this.dTotalMoney = res.data.data.records[0].totalPrice
  520. // this.remainingTime = res.data.data.records[0].remainingTime
  521. // this.fareSetting(res.data.data.records[0].deptId)
  522. // this.getInfo()
  523. })
  524. },
  525. },
  526. onLoad(options) {
  527. // if(options.couponMoney){
  528. // this.couponMoney = options.couponMoney
  529. // this.isCoupon = true
  530. // this.couponId = options.couponId
  531. // }else if(options.orderNo){
  532. // }
  533. this.orderId = options.orderNo
  534. if (options.page == 'order') {
  535. // this.isSelect = false
  536. }
  537. wx.checkJsApi({
  538. jsApiList: ['chooseImage'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
  539. success: function(res) {
  540. // 以键值对的形式返回,可用的api值true,不可用为false
  541. // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
  542. }
  543. });
  544. },
  545. onShow() {
  546. this.getInfo()
  547. this.myCoupon()
  548. this.getOrder()
  549. let couponData = uni.getStorageSync('couponData');
  550. if (couponData) {
  551. // this.couponMoney = couponData.discountValue
  552. // this.isCoupon = true
  553. this.couponId = couponData.id
  554. this.verification()
  555. }
  556. // uni.$on('returnData', function(data) {
  557. // this.couponMoney = data.discountValue
  558. // this.isCoupon = true
  559. // this.$router.go(0)
  560. // })
  561. }
  562. }
  563. </script>
  564. <style lang="scss" scoped>
  565. .orderDetails {
  566. height: 100%;
  567. background-color: #e8f2f4;
  568. // overflow-y: scroll;
  569. background: linear-gradient(152deg, #DCFFF8 0%, #F1FEFF 100%);
  570. padding: 30rpx 40rpx;
  571. .content {
  572. overflow-y: auto;
  573. .address {
  574. background-color: #fff;
  575. border-radius: 20rpx;
  576. padding: 24rpx;
  577. color: #000;
  578. position: relative;
  579. margin-bottom: 24rpx;
  580. .add {
  581. font-weight: 600;
  582. font-size: 30rpx;
  583. color: #2F3437;
  584. line-height: 35rpx;
  585. margin-bottom: 12rpx;
  586. }
  587. .name {
  588. width: 100%;
  589. color: #666;
  590. display: flex;
  591. align-items: center;
  592. justify-content: space-between;
  593. .name_left {
  594. font-size: 26rpx;
  595. color: #333333;
  596. text {
  597. font-size: 26rpx;
  598. color: #999999;
  599. margin-left: 20rpx;
  600. }
  601. }
  602. .toggle {
  603. width: 152rpx;
  604. height: 52rpx;
  605. background: linear-gradient(135deg, #1AD8CF 0%, #21C8C0 100%);
  606. border-radius: 98rpx;
  607. font-size: 26rpx;
  608. color: #FFFFFF;
  609. display: flex;
  610. align-items: center;
  611. justify-content: center;
  612. }
  613. }
  614. .back {
  615. position: absolute;
  616. top: 50%;
  617. right: 30rpx;
  618. margin-top: -16rpx;
  619. image {
  620. width: 16rpx;
  621. transform: rotate(180deg);
  622. }
  623. }
  624. }
  625. }
  626. .yuyue {
  627. position: fixed;
  628. bottom: 0;
  629. left: 0;
  630. width: calc(100% - 60rpx);
  631. height: 100rpx;
  632. background-color: #fff;
  633. padding: 20rpx 30rpx;
  634. display: flex;
  635. align-items: center;
  636. justify-content: space-between;
  637. .prices {
  638. font-size: 28rpx;
  639. color: #b0b5b7;
  640. text {
  641. color: #d3362b;
  642. }
  643. }
  644. .btn {
  645. color: #fff;
  646. width: 300rpx;
  647. // height: 70rpx;
  648. // line-height: 70rpx;
  649. padding: 10rpx 0;
  650. background: linear-gradient(to right, #53aebc, #12d4f4);
  651. border-radius: 10rpx;
  652. text-align: center;
  653. display: flex;
  654. flex-direction: column;
  655. .remaining_time {
  656. height: 30rpx;
  657. margin-top: 10rpx;
  658. font-size: 24rpx;
  659. ::v-deep.u-countdown-time {
  660. font-size: 24rpx !important;
  661. }
  662. }
  663. }
  664. }
  665. .list_content {
  666. width: 100%;
  667. background: #FFFFFF;
  668. box-shadow: 0px 4px 12px 0px rgba(88, 209, 187, 0.2);
  669. border-radius: 24px 24px 24px 24px;
  670. margin-bottom: 24rpx;
  671. padding: 24rpx;
  672. box-sizing: border-box;
  673. .list_title {
  674. display: flex;
  675. align-items: center;
  676. justify-content: space-between;
  677. margin-bottom: 24rpx;
  678. .title_left {
  679. font-weight: 600;
  680. font-size: 28rpx;
  681. color: #2F3437;
  682. display: flex;
  683. align-items: center;
  684. text {
  685. display: inline-block;
  686. width: 6rpx;
  687. height: 28rpx;
  688. background: #20CBC2;
  689. margin-right: 12rpx;
  690. }
  691. }
  692. .js {
  693. width: 188rpx;
  694. height: 52rpx;
  695. background: #DEFFFD;
  696. border-radius: 4rpx;
  697. padding: 8rpx 16rpx;
  698. font-size: 26rpx;
  699. color: #00B8B0;
  700. box-sizing: border-box;
  701. }
  702. }
  703. .total {
  704. width: 100%;
  705. display: flex;
  706. justify-content: space-between;
  707. .total_price {
  708. font-size: 28rpx;
  709. color: #F53E54;
  710. .price {
  711. font-weight: 600;
  712. font-size: 36rpx;
  713. color: #F53E54;
  714. }
  715. }
  716. }
  717. .time_coupon {
  718. border-top: 1px solid #eeeeee;
  719. // padding-top: 24rpx;
  720. margin-top: 24rpx;
  721. .select_coupon {
  722. display: flex;
  723. justify-content: space-between;
  724. margin-top: 26rpx;
  725. text {
  726. font-size: 28rpx;
  727. color: #333333;
  728. .red {
  729. font-weight: 600;
  730. font-size: 28rpx;
  731. color: #F53E54;
  732. margin-left: 10rpx;
  733. }
  734. }
  735. .right {
  736. font-size: 26rpx;
  737. display: flex;
  738. align-items: center;
  739. image {
  740. width: 28rpx;
  741. height: 28rpx;
  742. margin-left: 8rpx;
  743. }
  744. }
  745. }
  746. }
  747. }
  748. .lists {
  749. width: 100%;
  750. // height: 160rpx;
  751. display: flex;
  752. justify-content: space-between;
  753. border-radius: 24rpx;
  754. margin-bottom: 28rpx;
  755. .imgs {
  756. width: 160rpx;
  757. height: 160rpx;
  758. border-radius: 20rpx;
  759. overflow: hidden;
  760. image {
  761. width: 100%;
  762. height: 100%;
  763. }
  764. }
  765. .right {
  766. flex: 1;
  767. padding-left: 30rpx;
  768. display: flex;
  769. flex-direction: column;
  770. justify-content: space-between;
  771. .list_title {
  772. display: flex;
  773. justify-content: space-between;
  774. align-items: center;
  775. .title {
  776. font-size: 34rpx;
  777. font-weight: bold;
  778. }
  779. .time {
  780. font-size: 24rpx;
  781. }
  782. }
  783. .js {
  784. color: #8f9394;
  785. }
  786. .price {
  787. // padding-top: 50rpx;
  788. display: flex;
  789. justify-content: space-between;
  790. .counter {
  791. color: #c8caca;
  792. }
  793. .money {
  794. font-size: 24rpx;
  795. color: #333333;
  796. }
  797. .counter {
  798. display: flex;
  799. view {
  800. width: 60rpx;
  801. height: 60rpx;
  802. line-height: 60rpx;
  803. background-color: #f7f8fa;
  804. text-align: center;
  805. border-radius: 60rpx;
  806. font-size: 50rpx;
  807. }
  808. text {
  809. width: 100rpx;
  810. text-align: center;
  811. line-height: 60rpx;
  812. }
  813. }
  814. }
  815. }
  816. }
  817. .face {
  818. width: 100%;
  819. background-color: #fff;
  820. // margin: 0 30rpx;
  821. border-radius: 20rpx;
  822. padding: 24rpx;
  823. box-shadow: 0px 4rpx 12rpx 0px rgba(88, 209, 187, 0.05);
  824. box-sizing: border-box;
  825. .face_one {
  826. display: flex;
  827. justify-content: space-between;
  828. align-items: center;
  829. font-size: 28rpx;
  830. margin-bottom: 12rpx;
  831. .title_left {
  832. font-weight: 600;
  833. font-size: 28rpx;
  834. color: #2F3437;
  835. display: flex;
  836. align-items: center;
  837. text {
  838. display: inline-block;
  839. width: 6rpx;
  840. height: 28rpx;
  841. background: #20CBC2;
  842. margin-right: 12rpx;
  843. }
  844. }
  845. .btn {
  846. font-size: 28rpx;
  847. color: #00B8B0;
  848. }
  849. .price {
  850. color: #999999;
  851. }
  852. }
  853. .face_three {
  854. font-size: 26rpx;
  855. color: #999999;
  856. }
  857. }
  858. .pay_type {
  859. background: #FFFFFF;
  860. box-shadow: 0px 4rpx 12rpx 0px rgba(88, 209, 187, 0.1);
  861. border-radius: 20rpx;
  862. margin-top: 24rpx;
  863. padding: 24rpx;
  864. box-sizing: border-box;
  865. .pay_title {
  866. width: 100%;
  867. margin-bottom: 24rpx;
  868. font-weight: 600;
  869. font-size: 32rpx;
  870. color: #2F3437;
  871. font-weight: 600;
  872. font-size: 28rpx;
  873. color: #2F3437;
  874. display: flex;
  875. align-items: center;
  876. text {
  877. display: inline-block;
  878. width: 6rpx;
  879. height: 28rpx;
  880. background: #20CBC2;
  881. margin-right: 12rpx;
  882. }
  883. }
  884. .public {
  885. width: 100%;
  886. height: 10%;
  887. border-radius: 20rpx;
  888. background-color: #ffffff;
  889. margin-bottom: 20px;
  890. }
  891. .wx_pay {
  892. width: 100%;
  893. height: 48rpx;
  894. margin-bottom: 16rpx;
  895. display: flex;
  896. justify-content: space-between;
  897. align-items: center;
  898. // padding: 10rpx;
  899. image {
  900. width: 40rpx;
  901. height: 40rpx;
  902. margin-right: 10rpx;
  903. }
  904. text {
  905. flex: 1;
  906. font-size: 30rpx;
  907. color: #333333;
  908. }
  909. checkbox .wx-checkbox-input {
  910. width: 40rpx;
  911. height: 40rpx;
  912. border-radius: 50%;
  913. }
  914. checkbox .wx-checkbox-input.wx-checkbox-input-checked {
  915. border: none;
  916. background: #37C674;
  917. }
  918. }
  919. .account_pay {
  920. width: 100%;
  921. height: 48rpx;
  922. margin-bottom: 16rpx;
  923. display: flex;
  924. justify-content: space-between;
  925. align-items: center;
  926. // padding: 10rpx;
  927. image {
  928. width: 50rpx;
  929. height: 50rpx;
  930. margin-right: 10rpx;
  931. }
  932. text {
  933. font-size: 30rpx;
  934. color: #333333;
  935. }
  936. checkbox .wx-checkbox-input {
  937. width: 40rpx;
  938. height: 40rpx;
  939. border-radius: 50%;
  940. }
  941. checkbox .wx-checkbox-input.wx-checkbox-input-checked {
  942. border: none;
  943. background: #37C674;
  944. }
  945. }
  946. .account_pay {
  947. width: 100%;
  948. height: 10%;
  949. margin-bottom: 20rpx;
  950. display: flex;
  951. justify-content: space-between;
  952. align-items: center;
  953. padding: 10rpx;
  954. image {
  955. width: 40rpx;
  956. height: 40rpx;
  957. margin-right: 10rpx;
  958. }
  959. text {
  960. flex: 1;
  961. font-size: 30rpx;
  962. color: #333333;
  963. }
  964. .right {
  965. text-align: right;
  966. padding-right: 10px;
  967. }
  968. }
  969. }
  970. }
  971. .time_popup {
  972. width: 100vw;
  973. height: 100vh;
  974. position: fixed;
  975. top: 0px;
  976. left: 0px;
  977. display: flex;
  978. align-items: center;
  979. justify-content: center;
  980. background: rgba(0, 0, 0, 0.4);
  981. .popup_content {
  982. width: 630rpx;
  983. height: 420rpx;
  984. background: #FFFFFF;
  985. border-radius: 24rpx;
  986. display: flex;
  987. flex-direction: column;
  988. justify-content: space-between;
  989. .popup_title {
  990. height: 92rpx;
  991. background: #E6F8F7;
  992. border-radius: 24rpx;
  993. text-align: center;
  994. font-weight: 600;
  995. font-size: 32rpx;
  996. line-height: 92rpx;
  997. color: #000000;
  998. }
  999. .describe {
  1000. flex: 1;
  1001. text-align: center;
  1002. font-size: 28rpx;
  1003. color: #333333;
  1004. padding: 64rpx 0px;
  1005. }
  1006. .popup_btn {
  1007. width: 100%;
  1008. height: 116rpx;
  1009. display: flex;
  1010. align-items: center;
  1011. justify-content: space-between;
  1012. padding: 24rpx 60rpx;
  1013. box-sizing: border-box;
  1014. border-top: 2rpx solid #EEEEEE;
  1015. .popup_cancel {
  1016. width: 182rpx;
  1017. height: 68rpx;
  1018. border-radius: 106rpx;
  1019. border: 2rpx solid #BBBBBB;
  1020. font-size: 32rpx;
  1021. color: #999999;
  1022. display: flex;
  1023. align-items: center;
  1024. justify-content: center;
  1025. }
  1026. .popup_subscribe {
  1027. width: 268rpx;
  1028. height: 68rpx;
  1029. background: linear-gradient(90deg, #1AD7CE 0%, #21C9C1 100%);
  1030. border-radius: 106rpx;
  1031. font-size: 32rpx;
  1032. color: #FFFFFF;
  1033. display: flex;
  1034. align-items: center;
  1035. justify-content: center;
  1036. }
  1037. }
  1038. }
  1039. }
  1040. </style>