天波h5前端应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

804 line
33KB

  1. <!--
  2. * @Date: 2022-03-29 16:57:58
  3. * @LastEditors: JinxChen
  4. * @LastEditTime: 2023-04-06 09:14:39
  5. * @FilePath: \TelpoH5FrontendWeb\src\views\package-list\index.vue
  6. * @description: TODO 小台风充值h5
  7. -->
  8. <template>
  9. <div class="package-list-container">
  10. <van-nav-bar :left-arrow="false" :border="true">
  11. <template #title>
  12. <h5 style="font-size: 16px">{{topupTitle}}</h5>
  13. </template>
  14. </van-nav-bar>
  15. <!-- 灰色线条 -->
  16. <div class="gray-line"></div>
  17. <!-- 套餐列表 -->
  18. <div class="topup-container">
  19. <div class="main">
  20. <!-- 无套餐时显示 -->
  21. <div class="noData_container" v-show="packageOrderList.length === 0 && !isShowNoData">
  22. <p>暂无相关套餐数据,请您联系管理员~</p>
  23. </div>
  24. <!-- 套餐订购 -->
  25. <div
  26. class="package-order-container"
  27. v-for="(item, index) in packageOrderList"
  28. :key="index"
  29. >
  30. <!-- 推荐 -->
  31. <div class="recom" v-show="false">
  32. <div class="shape"></div>
  33. <div class="square">
  34. <p>推荐</p>
  35. </div>
  36. </div>
  37. <!-- 套餐内容 -->
  38. <div class="order-content">
  39. <div class="title">
  40. <p>{{item.packageName}}<!-- :{{(item.packagesPrice/item.packageIssue).toFixed(0)}}元/月 --></p>
  41. </div>
  42. <div class="remark">
  43. <p>每月200分钟通话时长,1G流量</p>
  44. </div>
  45. <div class="details">
  46. <p>
  47. <span class="orange large">¥{{(item.packagesPrice/(item.packageIssue === 0 ? 1: item.packageIssue)).toFixed(0)}}</span>元/月,
  48. </p>
  49. <p class="total">
  50. <span>合计</span><span class="orange price">{{item.packagesPrice}}元</span>
  51. </p>
  52. </div>
  53. <!-- <div class="package-buy">
  54. <div class="buy-btn" @click="onBuy(item)">
  55. <p>第一步:充值话费</p>
  56. </div>
  57. </div> -->
  58. <div class="radios-con">
  59. <div class="pay-type">
  60. <p>支付方式:</p>
  61. </div>
  62. <van-radio-group v-model="radio" direction="horizontal" @change="onRaidoChange">
  63. <van-radio name="1">
  64. <template #default>
  65. <div class="radio-con">
  66. <span>微信</span>
  67. <img src="../../assets/wx-pay.png"/>
  68. </div>
  69. </template>
  70. </van-radio>
  71. <van-radio name="2">
  72. <template #default>
  73. <div class="radio-con">
  74. <span>支付宝</span>
  75. <img src="../../assets/alipay.png"/>
  76. </div>
  77. </template>
  78. </van-radio>
  79. <van-radio name="3">
  80. <template #default>
  81. <div class="radio-con">
  82. <span>12期花呗</span>
  83. <img src="../../assets/antpay.png"/>
  84. </div>
  85. </template>
  86. </van-radio>
  87. </van-radio-group>
  88. </div>
  89. <div class="package-buy">
  90. <div class="buy-btn" @click="onBuy(item)">
  91. <p>第一步:充值话费</p>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. </template>
  100. <script>
  101. import APIWx from "@/api/wx";
  102. import AppId from "@/config/appId";
  103. import { APIPay } from "@/api/pay";
  104. import APICore from "@/api/core";
  105. let wx = require("weixin-js-sdk"); // TODO 再封装,可拦截错误提示等操作
  106. import { isNotNull } from "@/utils/index";
  107. export default {
  108. name: "packageList",
  109. data() {
  110. return {
  111. topupTitle: "请选择套餐充值电话卡", //充值页面标题
  112. // 套餐列表, todo 需要从接口获取
  113. packageOrderList: [
  114. /* {
  115. packageName: '语音卡套餐(1年)',
  116. packagePayType: 1,
  117. packagesPrice: 240,
  118. packageIssue: 12,
  119. payWxPayProductId: process.env.NODE_ENV === "production" ? '1635123463911587840' : '1635122887959592960', //微信支付
  120. payAliPayProductId: process.env.NODE_ENV === "production" ? '1629407413618294784' : '1629405716684029952', //支付宝全额支付
  121. payAntPayProductId: process.env.NODE_ENV === "production" ? '1629407705558630400': '1629405558344859648', //支付宝花呗支付
  122. } */
  123. ],
  124. outTradeNo: "", //订单号
  125. price: "", //价格,
  126. isShowNoData: false, //是否显示无套餐内容, 默认false
  127. // 获取从路由的参数,import 调取激活接口需要用到
  128. params: {
  129. imei: '',
  130. iccid: '',
  131. manufactorId: '', //厂商id,一般用来获取core接口token
  132. appId: '', //公众号appId,需要对接多个不同公众号时动态从页面路由获取,
  133. },
  134. radio: '1', //支付方式单选按钮默认值
  135. payProductId: null, //套餐id
  136. packageIssue: null, //套餐分期
  137. payType: '1', //支付方式 1 微信, 2 支付宝,支付宝又分为花呗和全额支付,全额支付分期数传0 或者1 ,花呗则传 3 6 12
  138. };
  139. },
  140. created() {
  141. this.getAuth();
  142. this.getParams();
  143. this.getWxAutograph();
  144. // 套餐列表
  145. this.getDevicePayPackage();
  146. },
  147. /* mounted() {
  148. this.getParams();
  149. this.getWxAutograph();
  150. this.getLiveBasePackage();
  151. }, */
  152. methods: {
  153. // 根据code获取openId
  154. getOpenId() {
  155. let code = this.$store.getters.wxAuthCode;
  156. let openId = this.$store.getters.openId;
  157. if(isNotNull(openId)) {
  158. console.log("已经存在openId");
  159. } else {
  160. APIPay.getOpenId(code).then(res => {
  161. let data= res.data;
  162. if(data.code === 20000) {
  163. this.$store.commit("openId", data.data.openId);
  164. }
  165. })
  166. }
  167. },
  168. // 获取b端接口的token
  169. getAuth() {
  170. let manufactorId = "5bf13062-a41e-4d00-ba14-1101aad12650";
  171. APICore.getAuth({ manufactorId: manufactorId }).then(res => {
  172. this.$store.commit("gatewayToken", res.data.data);
  173. });
  174. },
  175. // 获取url传过来的参数
  176. getParams() {
  177. let params = this.$route.query;
  178. if (params) {
  179. let url = window.location.href.split("?code=")[1];
  180. if ( isNotNull(url) || window.location.href.indexOf("code") > -1) {
  181. let timeStamp = new Date().getTime();
  182. let code = url.split("&")[0];
  183. if (isNotNull(code)) {
  184. this.$store.commit("wxAuthCode", `${code}`);
  185. this.getOpenId();
  186. }
  187. }
  188. this.params = {...params};
  189. }
  190. },
  191. // 获取基本套餐信息
  192. getDevicePayPackage() {
  193. this.$toast.loading({
  194. message: "加载中",
  195. duration: 1500
  196. });
  197. APICore.devicePayPackage(this.params.imei)
  198. .then(res => {
  199. console.log("data", res.data);
  200. if (res.data.code === 106 || res.data.code === 104) {
  201. // token过期
  202. this.getAuth();
  203. setTimeout(() => {
  204. this.getDevicePayPackage();
  205. }, 1500);
  206. } else if (res.data.code === 0 && res.data.data === null) {
  207. this.isShowNoData = true;
  208. } else {
  209. if(res.data.data === null) {
  210. this.isShowNoData = false;
  211. } else {
  212. let data = res.data.data.packagesList;
  213. // 处理获取套餐的逻辑
  214. // 筛选 基础套餐,producModelId 1 是基础套餐;2 是加油包
  215. let packageList = data.filter(item => {
  216. return item.producModelId === 1
  217. });
  218. this.packageOrderList = packageList;
  219. console.log("套餐数据::", packageList);
  220. }
  221. this.$toast.success({
  222. message: "加载完成",
  223. duration: 1500
  224. });
  225. }
  226. })
  227. .catch(error => {
  228. this.$dialog.confirm({
  229. title: "获取套餐数据失败",
  230. message: error.message,
  231. showCancelButton: false,
  232. });
  233. })
  234. .finally(() => {
  235. setTimeout(() => {
  236. this.$toast.clear();
  237. }, 1500);
  238. });
  239. },
  240. // 返回
  241. onNavBack() {
  242. },
  243. // 获取微信jssdk
  244. getWxAutograph() {
  245. let that = this;
  246. return new Promise((resolve, reject) => {
  247. APIWx.createJSSDK({
  248. sUrl: window.location.href.split("#")[0],
  249. userId: '',
  250. appId: this.params.appId || AppId
  251. })
  252. .then(res => {
  253. let item = res.data.data;
  254. wx.config({
  255. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  256. appId: item.appId, // 必填,公众号的唯一标识
  257. timestamp: item.timeStamp, // 必填,生成签名的时间戳
  258. nonceStr: item.nonceStr, // 必填,生成签名的随机串
  259. signature: item.signature, // 必填,签名
  260. jsApiList: ["chooseWXPay"] // 必填,需要使用的JS接口列表
  261. });
  262. wx.ready(() => {
  263. resolve(true);
  264. });
  265. })
  266. .catch(err => {
  267. reject(false);
  268. console.log(err);
  269. });
  270. });
  271. },
  272. // 话费充值
  273. onBuy(data) {
  274. this.price = data.packagesPrice;
  275. // 遍历数据找到属于三种支付方式对应的套餐id, 1 微信 2 支付宝全额 3 支付宝分期
  276. let payTypeToPackAgeId = data.payTypeList;
  277. console.log("购买的套餐数据data", payTypeToPackAgeId);
  278. // 需要区分是要用微信支付还是支付宝花呗支付
  279. if (this.payType === '2') {
  280. // 全额
  281. this.payProductId = payTypeToPackAgeId.filter(item => {
  282. return item.payType === '2'
  283. })[0].productId;
  284. this.packageIssue = 0;
  285. console.log("this.payProductId", this.payProductId);
  286. this.aliPay(data);
  287. } else if (this.payType === '3') {
  288. // 分期
  289. this.payProductId = payTypeToPackAgeId.filter(item => {
  290. return item.payType === '3'
  291. })[0].productId;
  292. this.packageIssue = 12;
  293. this.payType = '2';
  294. console.log("this.payProductId2", this.payProductId);
  295. this.aliPay(data);
  296. } else {
  297. // 微信
  298. let openId = this.$store.getters.openId;
  299. this.payProductId = payTypeToPackAgeId.filter(item => {
  300. return item.payType === '1'
  301. })[0].productId;
  302. this.packageIssue = 0;
  303. console.log("this.payProductId3", this.payProductId);
  304. if(openId === null || openId === 'null') {
  305. this.$dialog.confirm({
  306. message: '获取OpenId失败,请您重新进入',
  307. showCancelButton: false,
  308. })
  309. } else {
  310. this.wxPay(data);
  311. }
  312. }
  313. },
  314. // 微信支付
  315. wxPay(data) {
  316. this.$toast.loading({
  317. message: "加载中"
  318. });
  319. console.log("微信支付", data);
  320. let orderData = data;
  321. let reqBody = {
  322. openId: this.$store.getters.openId, //openId
  323. imei: this.params.imei, //imei
  324. iccid: this.params.iccid,
  325. productId: this.payProductId, //套餐id
  326. packageName: /* data.productModel */ data.packagesName, //套餐名字
  327. packagePayType: Number(this.payType), //支付类型
  328. packageIssue: 0, //分期
  329. packagePrice: process.env.NODE_ENV === "production" ? data.packagesPrice * 100 : 1 //总金额单位为分,测试环境写死
  330. };
  331. this.$toast.clear();
  332. APICore.payLiveBaseDevice(reqBody)
  333. .then(res => {
  334. if (res.data.code === 104 || res.data.code === 106) {
  335. this.getAuth();
  336. setTimeout(() => {
  337. this.wxPay(orderData);
  338. }, 1000);
  339. } else if (res.data.code === 104) {
  340. this.$dialog.confirm({
  341. message: `${res.data.message}`
  342. })
  343. }
  344. let that = this;
  345. let wxData = res.data.data;
  346. that.outTradeNo = wxData.out_trade_no;
  347. console.log("wxData", wxData);
  348. // 本地测试
  349. /* that.$router.push({
  350. name: "payResult",
  351. query: {
  352. outTradeNo: that.outTradeNo,
  353. price: that.price,
  354. rechargeUrl: data.rechargeUrl || '',
  355. iccid: this.params.iccid,
  356. isAdmin: this.$route.query.isAdmin,
  357. serialNo: this.params.imei,
  358. routerName: this.params.routerName,
  359. issue: data.packageIssue
  360. }
  361. }); */
  362. /* wx.chooseWXPay({
  363. timestamp: wxData.timeStamp, // 支付签名时间戳,注意微信 jssdk 中的所有使用 timestamp 字段均为小写。但最新版的支付后台生成签名使用的 timeStamp 字段名需大写其中的 S 字符
  364. nonceStr: wxData.nonceStr, // 支付签名随机串,不长于 32 位
  365. package: wxData.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
  366. signType: wxData.signType, // 微信支付V3的传入 RSA ,微信支付V2的传入格式与V2统一下单的签名格式保持一致
  367. paySign: wxData.paySign, // 支付签名
  368. success: function(res) {
  369. // 支付成功后的回调函数
  370. that.$router.replace({
  371. name: "payResult",
  372. query: {
  373. outTradeNo: that.outTradeNo,
  374. price: that.price,
  375. rechargeUrl: data.rechargeUrl,
  376. iccid: that.params.iccid,
  377. isAdmin: that.$route.query.isAdmin || false,
  378. serialNo: that.params.imei,
  379. issue: that.packageIssue
  380. }
  381. });
  382. console.log("微信支付成功::", res);
  383. },
  384. fail: err => {
  385. console.log("支付出错了::", err);
  386. that.$dialog.confirm({
  387. title: "温馨提示",
  388. message: "出错了,请您重新进入",
  389. showCancelButton: false
  390. });
  391. },
  392. cancel: function(err) {
  393. // 用户取消支付
  394. that.$dialog.confirm({
  395. title: "温馨提示",
  396. message: "您取消了支付",
  397. showCancelButton: false
  398. });
  399. console.log("用户取消了支付::", err);
  400. }
  401. }); */
  402. this.onWxPay(wxData);
  403. })
  404. .catch(error => {
  405. console.log("error", error);
  406. })
  407. .finally(() => {
  408. this.$toast.clear();
  409. });
  410. },
  411. onWxPay(data) {
  412. let that = this;
  413. function onBridgeReady() {
  414. WeixinJSBridge.invoke(
  415. "getBrandWCPayRequest",
  416. {
  417. appId: AppId, //公众号ID,由商户传入
  418. timeStamp: data.timeStamp, //时间戳,自1970年以来的秒数
  419. nonceStr: data.nonceStr, //随机串
  420. package: data.package,
  421. signType: data.signType, //微信签名方式:
  422. paySign: data.paySign //微信签名
  423. },
  424. function(res) {
  425. if (res.err_msg == "get_brand_wcpay_request:ok") {
  426. // 使用以上方式判断前端返回,微信团队郑重提示:
  427. //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
  428. that.$router.replace({
  429. name: "payResult",
  430. query: {
  431. outTradeNo: that.outTradeNo,
  432. price: that.price,
  433. rechargeUrl: data.rechargeUrl,
  434. iccid: that.params.iccid,
  435. isAdmin: that.$route.query.isAdmin || false,
  436. serialNo: that.params.imei,
  437. issue: that.packageIssue
  438. }
  439. });
  440. } else {
  441. that.$dialog.confirm({
  442. message: "您取消了支付",
  443. showCancelButton: false
  444. });
  445. }
  446. }
  447. );
  448. }
  449. if (typeof WeixinJSBridge == "undefined") {
  450. if (document.addEventListener) {
  451. document.addEventListener(
  452. "WeixinJSBridgeReady",
  453. onBridgeReady,
  454. false
  455. );
  456. } else if (document.attachEvent) {
  457. document.attachEvent("WeixinJSBridgeReady", onBridgeReady);
  458. document.attachEvent(
  459. "onWeixinJSBridgeReady",
  460. onBridgeReady
  461. );
  462. }
  463. } else {
  464. onBridgeReady();
  465. }
  466. },
  467. // 跳转到支付宝花呗外部链接
  468. aliPay(data) {
  469. console.log("选择了支付宝::", data);
  470. this.$toast.loading({
  471. message: "加载中"
  472. });
  473. let orderData = data;
  474. let reqBody = {
  475. openId: this.$store.getters.openId, //openId
  476. imei: this.params.imei, //imei
  477. iccid: this.params.iccid,
  478. productId: this.payProductId, //套餐id
  479. packageName: /* data.productModel + ',' + */data.packagesName, //套餐名字
  480. packagePayType: Number(this.payType), //支付类型
  481. packageIssue: this.packageIssue, //分期
  482. packagePrice: process.env.NODE_ENV === "production" ? data.packagesPrice * 100 : 1 //总金额单位为分,测试环境写死
  483. };
  484. this.$toast.clear();
  485. APICore.payLiveBaseDevice(reqBody)
  486. .then(res => {
  487. if (res.data.code === 104 || res.data.code === 106) {
  488. this.getAuth();
  489. setTimeout(() => {
  490. this.aliPay(orderData);
  491. }, 1000);
  492. }
  493. let that = this;
  494. let alipayData = res.data.data.xmlStrMap;
  495. that.outTradeNo = alipayData.outTradeNo;
  496. let alipayForm = decodeURI(alipayData.payXmlStr);
  497. that.$store.commit("isFromWx", true);
  498. let alipayUserId = process.env.NODE_ENV === "production" ? 69 : 18;
  499. this.$router.replace({
  500. name: "payResult",
  501. query: {
  502. rechargeUrl:
  503. data.rechargeUrl ||
  504. `https://id.ssjlai.com/frontend/#/alipay`,
  505. outTradeNo: that.outTradeNo,
  506. price: that.price,
  507. alipayForm: alipayForm,
  508. iccid: that.params.iccid,
  509. isAdmin: that.$route.query.isAdmin || false,
  510. serialNo: that.params.imei,
  511. alipayUserId: alipayUserId,
  512. productId: this.payProductId
  513. }
  514. });
  515. })
  516. .catch(error => {
  517. console.log("error", error);
  518. this.$dialog.confirm({
  519. message: `${error.message}`,
  520. showCancelButton: false
  521. })
  522. })
  523. .finally(() => {
  524. this.$toast.clear();
  525. });
  526. },
  527. // 支付类型切换
  528. onRaidoChange(value) {
  529. console.log("选择的支付类型是", value);
  530. this.payType = value;
  531. }
  532. }
  533. };
  534. </script>
  535. <style lang="scss">
  536. .van-nav-bar__title {
  537. max-width: 80% !important;
  538. font-size: 16px;
  539. }
  540. </style>
  541. <style lang="scss" scoped>
  542. .package-list-container {
  543. background-color: white;
  544. height: 100vh;
  545. .topup-container {
  546. position: relative;
  547. /* margin: 20px; */
  548. display: flex;
  549. justify-content: space-between;
  550. align-items: center;
  551. flex-direction: column;
  552. background-color: white;
  553. overflow: scroll;
  554. height: calc(100vh - 88px);
  555. .main {
  556. display: flex;
  557. justify-content: center;
  558. align-items: center;
  559. flex-direction: column;
  560. .tips {
  561. padding: 10px;
  562. }
  563. .noData_container {
  564. margin: 100px auto 0;
  565. height: 120px;
  566. /* background: url(../../../assets/img/news-noData.png) center no-repeat; */
  567. background-size: 165px 120px;
  568. display: flex;
  569. justify-content: center;
  570. align-items: flex-end;
  571. font-size: 16px;
  572. color: #999;
  573. p {
  574. font-size: 16px;
  575. }
  576. /* @include colorAndFont(#999, 28); */
  577. }
  578. p {
  579. padding: 10px;
  580. font-size: 16px;
  581. }
  582. .cancel-button {
  583. width: 30vw;
  584. border-radius: 5px;
  585. background-color: #2599ff;
  586. color: #fff;
  587. min-height: 40px;
  588. display: flex;
  589. justify-content: center;
  590. align-items: center;
  591. font-size: 16px;
  592. }
  593. .package-order-container {
  594. position: relative;
  595. margin: 10px 0;
  596. /* padding: 0 20px; */
  597. z-index: 999;
  598. box-shadow: rgba(14, 30, 37, 0.12) 0 3px 5px 0,
  599. rgba(14, 30, 37, 0.32) 0 2px 16px 0;
  600. .recom {
  601. position: absolute;
  602. top: -7px;
  603. left: -26px;
  604. border-style: solid;
  605. border-width: 0 40px 40px;
  606. border-color: transparent transparent red;
  607. transform: rotate(-45deg);
  608. text-align: center;
  609. z-index: 9999;
  610. p {
  611. padding: 0;
  612. color: white;
  613. font-size: 14px;
  614. }
  615. .shape {
  616. position: absolute;
  617. top: -1px;
  618. left: -21px;
  619. border-style: solid;
  620. border-width: 0 21px 21px;
  621. border-color: transparent transparent white;
  622. }
  623. .square {
  624. height: 15px;
  625. width: 35px;
  626. position: absolute;
  627. top: 21px;
  628. left: -20px;
  629. background: red;
  630. font-size: 14px;
  631. }
  632. }
  633. .order-content {
  634. padding: 15px 10px;
  635. .title {
  636. display: flex;
  637. justify-content: flex-start;
  638. p {
  639. font-size: 16px;
  640. font-weight: bold;
  641. }
  642. }
  643. .details {
  644. display: flex;
  645. justify-content: flex-start;
  646. align-items: center;
  647. p {
  648. height: 40px;
  649. @include center();
  650. font-size: 14px;
  651. padding: 5px 0 5px 10px;
  652. }
  653. .total {
  654. font-size: 16px;
  655. padding: 0;
  656. }
  657. .orange {
  658. color: orange;
  659. }
  660. .large {
  661. font-size: 26px;
  662. margin: 0 2px;
  663. }
  664. .price {
  665. font-size: 16px;
  666. }
  667. /* .buy-btn {
  668. height: 30px;
  669. width: 100px;
  670. display: flex;
  671. justify-content: center;
  672. align-items: center;
  673. background: orange;
  674. border-radius: 45px;
  675. p {
  676. font-size: 16px;
  677. padding: 0;
  678. color: red;
  679. }
  680. } */
  681. }
  682. .remark {
  683. display: flex;
  684. justify-content: flex-start;
  685. p {
  686. font-size: 14px;
  687. padding: 5px 10px;
  688. /* font-weight: bold; */
  689. }
  690. }
  691. .package-buy {
  692. @include center();
  693. padding: 5px 8px;
  694. @include center();
  695. .buy-btn {
  696. height: 40px;
  697. width: 200px;
  698. padding: 0 5px;
  699. display: flex;
  700. justify-content: center;
  701. align-items: center;
  702. background: orange;
  703. border-radius: 20px;
  704. p {
  705. font-size: 16px;
  706. padding: 0;
  707. color: white;
  708. }
  709. }
  710. }
  711. .radios-con {
  712. /* padding: 20px 10px; */
  713. /* @include center(); */
  714. /* align-items: center; */
  715. padding: 10px 0 10px 10px;
  716. font-size: 14px;
  717. /* box-shadow: rgba(14, 30, 37, 0.12) 0 3px 5px 0,
  718. rgba(14, 30, 37, 0.32) 0 2px 16px 0; */
  719. img {
  720. height: 20px;
  721. width: 20px;
  722. margin: 2px;
  723. }
  724. .pay-type {
  725. text-align: left;
  726. p {
  727. font-size: 14px;
  728. padding: 0 0 10px 0;
  729. }
  730. }
  731. .radio-con {
  732. @include center();
  733. }
  734. .van-cell-text {
  735. display: flex;
  736. justify-content: flex-start;
  737. align-items: center;
  738. span {
  739. font-size: 14px;
  740. padding: 0 5px;
  741. }
  742. }
  743. }
  744. }
  745. .content {
  746. font-size: 14px;
  747. }
  748. }
  749. }
  750. }
  751. .gray-line {
  752. height: 10px;
  753. width: 100%;
  754. background: #f2f4f5;
  755. }
  756. .order-description {
  757. height: 60px;
  758. display: flex;
  759. justify-content: flex-start;
  760. align-items: flex-start;
  761. flex-direction: column;
  762. padding: 5px 0 10px 10px;
  763. h5 {
  764. font-size: 14px;
  765. padding: 10px 0 0 0;
  766. }
  767. }
  768. .pay-radios {
  769. position: relative;
  770. top: 0;
  771. width: 100%;
  772. /* background-color: red; */
  773. /* padding: 0 15px; */
  774. .radios-con {
  775. padding: 20px 10px;
  776. /* @include center(); */
  777. align-items: center;
  778. font-size: 18px;
  779. box-shadow: rgba(14, 30, 37, 0.12) 0 3px 5px 0,
  780. rgba(14, 30, 37, 0.32) 0 2px 16px 0;
  781. img {
  782. height: 35px;
  783. width: auto;
  784. }
  785. .van-cell-text {
  786. display: flex;
  787. justify-content: flex-start;
  788. align-items: center;
  789. span {
  790. padding: 0 5px;
  791. }
  792. }
  793. }
  794. }
  795. }
  796. </style>