@@ -1,7 +1,7 @@ | |||||
<!-- | <!-- | ||||
* @Date: 2022-08-17 16:19:13 | * @Date: 2022-08-17 16:19:13 | ||||
* @LastEditors: JinxChen | * @LastEditors: JinxChen | ||||
* @LastEditTime: 2023-03-13 08:54:16 | |||||
* @LastEditTime: 2023-03-20 14:05:40 | |||||
* @FilePath: \TelpoH5FrontendWeb\README.md | * @FilePath: \TelpoH5FrontendWeb\README.md | ||||
* @description: 项目说明 | * @description: 项目说明 | ||||
--> | --> | ||||
@@ -252,8 +252,14 @@ update | |||||
- 修改 最后一步按钮文案 | - 修改 最后一步按钮文案 | ||||
## v1.0.29 | ## v1.0.29 | ||||
`2023.3.13` | `2023.3.13` | ||||
update | |||||
- 修改 正式环境金额 | |||||
feat | |||||
- 增加 套餐列表从接口获取 | |||||
## v1.0.30 | |||||
`2023.3.14` | |||||
feat | |||||
- cardInfo | |||||
- 增加 物联网卡套餐信息查询页面 | |||||
- 增加 加油包合基础套餐购买页面 |
@@ -28,6 +28,7 @@ export const APICore = { | |||||
payLiveBaseDevice, //微信统一下单 | payLiveBaseDevice, //微信统一下单 | ||||
GpsDeviceFence, //围栏 redis | GpsDeviceFence, //围栏 redis | ||||
cardPackageList, //零川基础套餐列表 | cardPackageList, //零川基础套餐列表 | ||||
devicePayPackage, | |||||
} | } | ||||
/* const headerAuth = this.$store.getters.gatewayToken; */ | /* const headerAuth = this.$store.getters.gatewayToken; */ | ||||
// 获取告警详情 | // 获取告警详情 | ||||
@@ -85,4 +86,11 @@ function cardPackageList(data) { | |||||
data, | data, | ||||
}); | }); | ||||
} | } | ||||
function devicePayPackage(imei) { | |||||
return service({ | |||||
url: `${baseUrl}/core/api/v1/open/card/GetDevicePayPackage`, | |||||
method: 'get', | |||||
params: {imei}, | |||||
}) | |||||
} | |||||
export default APICore; | export default APICore; |
@@ -1,11 +1,11 @@ | |||||
/* | /* | ||||
* @Date: 2021-11-20 10:26:39 | * @Date: 2021-11-20 10:26:39 | ||||
* @LastEditors: JinxChen | * @LastEditors: JinxChen | ||||
* @LastEditTime: 2023-02-27 09:59:02 | |||||
* @LastEditTime: 2023-03-20 14:05:54 | |||||
* @FilePath: \TelpoH5FrontendWeb\src\config\models.js | * @FilePath: \TelpoH5FrontendWeb\src\config\models.js | ||||
* @description: | * @description: | ||||
*/ | */ | ||||
export const VERSION_MODEL = '1.0.29F'; //版本号 | |||||
export const VERSION_MODEL = '1.0.30F'; //版本号 | |||||
export const IMAGE_URL = { | export const IMAGE_URL = { | ||||
production: 'http://zfb.ssjlai.com/web/', | production: 'http://zfb.ssjlai.com/web/', | ||||
test: 'http://zfb.ssjlai.com/web/', | test: 'http://zfb.ssjlai.com/web/', | ||||
@@ -1,7 +1,7 @@ | |||||
/* | /* | ||||
* @Author: linwl | * @Author: linwl | ||||
* @Date: 2020-04-13 14:47:59 | * @Date: 2020-04-13 14:47:59 | ||||
* @LastEditTime: 2023-02-24 10:47:44 | |||||
* @LastEditTime: 2023-03-13 16:35:17 | |||||
* @LastEditors: JinxChen | * @LastEditors: JinxChen | ||||
* @Description: axios请求配置 | * @Description: axios请求配置 | ||||
* @FilePath: \TelpoH5FrontendWeb\src\http\webapi.js | * @FilePath: \TelpoH5FrontendWeb\src\http\webapi.js | ||||
@@ -41,7 +41,7 @@ service.interceptors.request.use( | |||||
/* if (localStorage.getItem('webapiToken')) { | /* if (localStorage.getItem('webapiToken')) { | ||||
} */ | } */ | ||||
request.headers.AuthToken = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySW5mbyI6eyJVc2VySWQiOiJjZTQzOWU1Yy03NWVjLTRhMTEtYWJmMC02YTdhM2IzY2UwMGQiLCJMb2dpbk5hbWUiOiIxODI3NzQyNjcxMiIsIkxvZ2luVHlwZSI6MX0sIkV4cCI6MTY4NDg5NTk5ODg4NS4wfQ.VK_fNU0QrCJwsc_Dxa_lPP1dvnxo73TfKzV_bJquqxU'; | |||||
request.headers.AuthToken = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySW5mbyI6eyJVc2VySWQiOiJjZTQzOWU1Yy03NWVjLTRhMTEtYWJmMC02YTdhM2IzY2UwMGQiLCJMb2dpbk5hbWUiOiIxODI3NzQyNjcxMiIsIkxvZ2luVHlwZSI6MX0sIkV4cCI6MTY4NjY0NTI1MTQ4NC4wfQ.cm3AblDTivfbuJ-OgDAglWVsJFWiJZyrpt_BmNq499g'; | |||||
return request; | return request; | ||||
}, | }, | ||||
errorHandler | errorHandler | ||||
@@ -1,7 +1,7 @@ | |||||
/* | /* | ||||
* @Date: 2023-02-25 16:34:35 | * @Date: 2023-02-25 16:34:35 | ||||
* @LastEditors: JinxChen | * @LastEditors: JinxChen | ||||
* @LastEditTime: 2023-02-26 15:30:31 | |||||
* @LastEditTime: 2023-03-14 09:33:17 | |||||
* @FilePath: \TelpoH5FrontendWeb\src\router\index.js | * @FilePath: \TelpoH5FrontendWeb\src\router\index.js | ||||
* @description: | * @description: | ||||
*/ | */ | ||||
@@ -25,6 +25,7 @@ const routes = [ | |||||
{ path: '/packageList', name: 'packageList', component: resolve => require(['@/views/package-list'], resolve) }, | { path: '/packageList', name: 'packageList', component: resolve => require(['@/views/package-list'], resolve) }, | ||||
{ path: '/payResult', name: 'payResult', component: resolve => require(['@/views/pay-result'], resolve) }, | { path: '/payResult', name: 'payResult', component: resolve => require(['@/views/pay-result'], resolve) }, | ||||
{ path: '/cardInfo', name: 'cardInfo', component: resolve => require(['@/views/card-info'], resolve) }, | { path: '/cardInfo', name: 'cardInfo', component: resolve => require(['@/views/card-info'], resolve) }, | ||||
{ path: '/packageBuy', name: 'packageBuy', component: resolve => require(['@/views/package-buy'], resolve) }, | |||||
{ path: '/buyRecord', name: 'buyRecord', component: resolve => require(['@/views/buy-record'], resolve) }, | { path: '/buyRecord', name: 'buyRecord', component: resolve => require(['@/views/buy-record'], resolve) }, | ||||
{ path: '/activeStatus', name: 'activeStatus', component: resolve => require(['@/views/active-status'], resolve) }, | { path: '/activeStatus', name: 'activeStatus', component: resolve => require(['@/views/active-status'], resolve) }, | ||||
{ path: '/cardActive', name: 'cardActive', component: resolve => require(['@/views/card-active'], resolve) }, | { path: '/cardActive', name: 'cardActive', component: resolve => require(['@/views/card-active'], resolve) }, | ||||
@@ -93,10 +93,10 @@ export default { | |||||
}) | }) | ||||
}, | }, | ||||
onNavBack() { | onNavBack() { | ||||
/* this.$router.push({ | |||||
name: "check", | |||||
query: { serialNo: this.$route.query.serialNo, iccid: this.$route.query.iccid, isShowMenu: true} | |||||
}); */ | |||||
this.$router.replace({ | |||||
name: "cardInfo", | |||||
query: { imei: this.$route.query.imei, iccid: this.$route.query.iccid, isShowMenu: true} | |||||
}); | |||||
}, | }, | ||||
// 复制订单号 | // 复制订单号 | ||||
onCopy(type) { | onCopy(type) { | ||||
@@ -1,7 +1,7 @@ | |||||
<!-- | <!-- | ||||
* @Date: 2022-04-15 10:22:36 | * @Date: 2022-04-15 10:22:36 | ||||
* @LastEditors: JinxChen | * @LastEditors: JinxChen | ||||
* @LastEditTime: 2023-02-26 15:05:41 | |||||
* @LastEditTime: 2023-03-14 11:42:57 | |||||
* @FilePath: \TelpoH5FrontendWeb\src\views\card-info\index.vue | * @FilePath: \TelpoH5FrontendWeb\src\views\card-info\index.vue | ||||
* @description: | * @description: | ||||
--> | --> | ||||
@@ -71,6 +71,9 @@ | |||||
<script> | <script> | ||||
import APIWx from "@/api/wx"; | import APIWx from "@/api/wx"; | ||||
import { APIPay } from "@/api/pay"; | |||||
import { isNotNull } from "@/utils/index"; | |||||
import APICore from "@/api/core"; | |||||
export default { | export default { | ||||
name:'cardInfo', | name:'cardInfo', | ||||
inject: ["reload"], | inject: ["reload"], | ||||
@@ -89,6 +92,7 @@ export default { | |||||
isUnicom: null, //是否是联通 | isUnicom: null, //是否是联通 | ||||
}, | }, | ||||
isShowMenu: this.$route.query.isShowMenu, | isShowMenu: this.$route.query.isShowMenu, | ||||
params: {} | |||||
} | } | ||||
}, | }, | ||||
computed: { | computed: { | ||||
@@ -102,9 +106,49 @@ export default { | |||||
} | } | ||||
}, | }, | ||||
created() { | created() { | ||||
this.getCardInfo(); | |||||
this.getAuth(); | |||||
this.getParams(); | |||||
this.getCardInfo(); | |||||
}, | }, | ||||
methods: { | methods: { | ||||
// 获取core token | |||||
getAuth() { | |||||
let manufactorId = "5bf13062-a41e-4d00-ba14-1101aad12650"; | |||||
APICore.getAuth({ manufactorId: manufactorId }).then(res => { | |||||
this.$store.commit("gatewayToken", res.data.data); | |||||
}); | |||||
}, | |||||
// 获取url传过来的参数 | |||||
getParams() { | |||||
let params = this.$route.query; | |||||
if (params) { | |||||
let url = window.location.href.split("?code=")[1]; | |||||
if ( isNotNull(url) || window.location.href.indexOf("code") > -1) { | |||||
let timeStamp = new Date().getTime(); | |||||
let code = url.split("&")[0]; | |||||
if (isNotNull(code)) { | |||||
this.$store.commit("wxAuthCode", `${code}`); | |||||
this.getOpenId(); | |||||
} | |||||
} | |||||
this.params = {...params}; | |||||
} | |||||
}, | |||||
// 根据code获取openId | |||||
getOpenId() { | |||||
let code = this.$store.getters.wxAuthCode; | |||||
let openId = this.$store.getters.openId; | |||||
if(isNotNull(openId)) { | |||||
console.log("已经存在openId"); | |||||
} else { | |||||
APIPay.getOpenId(code).then(res => { | |||||
let data= res.data; | |||||
if(data.code === 20000) { | |||||
this.$store.commit("openId", data.data.openId); | |||||
} | |||||
}) | |||||
} | |||||
}, | |||||
//获取小台风物联网卡信息 | //获取小台风物联网卡信息 | ||||
getCardInfo() { | getCardInfo() { | ||||
this.$toast.loading({ message: '查询中...' }); | this.$toast.loading({ message: '查询中...' }); | ||||
@@ -147,14 +191,14 @@ export default { | |||||
}, | }, | ||||
// 购买套餐 | // 购买套餐 | ||||
onMealBuy() { | onMealBuy() { | ||||
this.$router.push({ | |||||
name: 'packageList', | |||||
this.$router.replace({ | |||||
name: 'packageBuy', | |||||
query: { imei: this.$route.query.imei, iccid: this.$route.query.iccid, isShowMenu: this.isShowMenu} | query: { imei: this.$route.query.imei, iccid: this.$route.query.iccid, isShowMenu: this.isShowMenu} | ||||
}) | }) | ||||
}, | }, | ||||
// 订购记录 | // 订购记录 | ||||
onRecordCheck () { | onRecordCheck () { | ||||
this.$router.push({ | |||||
this.$router.replace({ | |||||
name: 'buyRecord', | name: 'buyRecord', | ||||
query: { imei: this.$route.query.imei, iccid: this.$route.query.iccid, isShowMenu: this.isShowMenu} | query: { imei: this.$route.query.imei, iccid: this.$route.query.iccid, isShowMenu: this.isShowMenu} | ||||
}) | }) | ||||
@@ -0,0 +1,670 @@ | |||||
<!-- | |||||
* @Date: 2023-03-14 09:32:37 | |||||
* @LastEditors: JinxChen | |||||
* @LastEditTime: 2023-03-14 11:35:43 | |||||
* @FilePath: \TelpoH5FrontendWeb\src\views\package-buy\index.vue | |||||
* @description: | |||||
--> | |||||
<template> | |||||
<div class="package-buy-container"> | |||||
<van-nav-bar :left-arrow="false" :border="true"> | |||||
<template #title> | |||||
<h5 style="font-size: 16px">套餐订购</h5> | |||||
</template> | |||||
</van-nav-bar> | |||||
<!-- 套餐内容 --> | |||||
<div class="package-container"> | |||||
<van-tabs | |||||
type="line" | |||||
v-model="active" | |||||
color="#1890ff" | |||||
background="#fafafa" | |||||
swipeable | |||||
line-width="20%" | |||||
line-height="4px" | |||||
> | |||||
<van-tab title="加油包"> | |||||
<div class="refuel-package" v-if="refuelPackageList.length > 0"> | |||||
<div | |||||
class="refuel-item" | |||||
v-for="(item, index) in refuelPackageList" | |||||
:key="index" | |||||
> | |||||
<div class="title"> | |||||
<p>{{item.packagesName}}</p> | |||||
</div> | |||||
<div class="bottom"> | |||||
<span> | |||||
{{item.packagesPrice}} | |||||
<span class="price-span">元</span> | |||||
</span> | |||||
<div class="btn-button" @click="onBuyRefuel(item)"> | |||||
<p>立即订购</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="data-null" v-else> | |||||
<img src="@/assets/img/news-noData.png" alt /> | |||||
<span>暂无加油包</span> | |||||
</div> | |||||
</van-tab> | |||||
<van-tab title="基础套餐"> | |||||
<div class="base-package" v-if="basePackageList.length > 0"> | |||||
<div | |||||
class="base-item" | |||||
v-for="(item, index) in basePackageList" | |||||
:key="index" | |||||
> | |||||
<div class="base-item-content"> | |||||
<!-- <div class="title"> | |||||
<p>{{item.packagesName}}</p> | |||||
</div>--> | |||||
<div class="remark"> | |||||
<p>每月200分钟通话时长,1G流量</p> | |||||
</div> | |||||
<div class="details"> | |||||
<p> | |||||
<span | |||||
class="orange large" | |||||
>¥{{(item.packagesPrice/(item.packageIssue === 0 ? 1: item.packageIssue)).toFixed(0)}}</span>元/月, | |||||
</p> | |||||
<p class="total"> | |||||
<span>合计</span> | |||||
<span class="orange price">{{item.packagesPrice}}元</span> | |||||
</p> | |||||
</div> | |||||
<div class="radios-con"> | |||||
<div class="pay-type"> | |||||
<p>支付方式:</p> | |||||
</div> | |||||
<van-radio-group | |||||
v-model="radio" | |||||
direction="horizontal" | |||||
@change="onRaidoChange" | |||||
> | |||||
<van-radio name="1"> | |||||
<template #default> | |||||
<div class="radio-con"> | |||||
<span>微信</span> | |||||
<img src="../../assets/wx-pay.png" /> | |||||
</div> | |||||
</template> | |||||
</van-radio> | |||||
<van-radio name="2"> | |||||
<template #default> | |||||
<div class="radio-con"> | |||||
<span>支付宝</span> | |||||
<img src="../../assets/alipay.png" /> | |||||
</div> | |||||
</template> | |||||
</van-radio> | |||||
<van-radio name="3"> | |||||
<template #default> | |||||
<div class="radio-con"> | |||||
<span>12期花呗</span> | |||||
<img src="../../assets/antpay.png" /> | |||||
</div> | |||||
</template> | |||||
</van-radio> | |||||
</van-radio-group> | |||||
</div> | |||||
<div class="package-buy"> | |||||
<div class="buy-btn" @click="onBuyBase(item)"> | |||||
<p>套餐订购</p> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div class="data-null" v-else> | |||||
<img src="@/assets/img/news-noData.png" alt /> | |||||
<span>暂无基础套餐</span> | |||||
</div> | |||||
</van-tab> | |||||
</van-tabs> | |||||
</div> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import APICore from "@/api/core"; | |||||
import APIWx from "@/api/wx"; | |||||
import AppId from "@/config/appId"; | |||||
import { APIPay } from "@/api/pay"; | |||||
let wx = require("weixin-js-sdk"); // TODO 再封装,可拦截错误提示等操作 | |||||
export default { | |||||
name:'', | |||||
data(){ | |||||
return { | |||||
basePackageList: [], //基础套餐 | |||||
refuelPackageList: [], //加油包 | |||||
outTradeNo: "", //订单号 | |||||
price: "", //价格, | |||||
isShowNoData: false, //是否显示无套餐内容, 默认false | |||||
radio: '1', //支付方式单选按钮默认值 | |||||
payProductId: null, //套餐id | |||||
packageIssue: null, //套餐分期 | |||||
payType: '1', //支付方式 1 微信, 2 支付宝,支付宝又分为花呗和全额支付,全额支付分期数传0 或者1 ,花呗则传 3 6 12 | |||||
active: 0, //tabs默认选择的下标 | |||||
} | |||||
}, | |||||
methods: { | |||||
// 获取core token | |||||
getAuth() { | |||||
let manufactorId = "5bf13062-a41e-4d00-ba14-1101aad12650"; | |||||
APICore.getAuth({ manufactorId: manufactorId }).then(res => { | |||||
this.$store.commit("gatewayToken", res.data.data); | |||||
}); | |||||
}, | |||||
// 获取微信授权 | |||||
getWxAutograph(){ | |||||
let that = this; | |||||
return new Promise((resolve, reject) => { | |||||
APIWx.createJSSDK({ | |||||
sUrl: window.location.href.split("#")[0], | |||||
userId: '', | |||||
appId: AppId | |||||
}) | |||||
.then(res => { | |||||
let item = res.data.data; | |||||
wx.config({ | |||||
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 | |||||
appId: item.appId, // 必填,公众号的唯一标识 | |||||
timestamp: item.timeStamp, // 必填,生成签名的时间戳 | |||||
nonceStr: item.nonceStr, // 必填,生成签名的随机串 | |||||
signature: item.signature, // 必填,签名 | |||||
jsApiList: ["chooseWXPay"] // 必填,需要使用的JS接口列表 | |||||
}); | |||||
wx.ready(() => { | |||||
resolve(true); | |||||
}); | |||||
}) | |||||
.catch(err => { | |||||
reject(false); | |||||
console.log(err); | |||||
}); | |||||
}); | |||||
}, | |||||
// 获取套餐列表数据 | |||||
getDevicePayPackage() { | |||||
this.$toast.loading({ | |||||
message: "加载中", | |||||
duration: 1500 | |||||
}); | |||||
APICore.devicePayPackage(this.$route.query.imei) | |||||
.then(res => { | |||||
console.log("data", res.data); | |||||
if (res.data.code === 106 || res.data.code === 104) { | |||||
// token过期 | |||||
this.getAuth(); | |||||
setTimeout(() => { | |||||
this.getDevicePayPackage(); | |||||
}, 1500); | |||||
} else if (res.data.code === 0 && res.data.data === null) { | |||||
this.isShowNoData = true; | |||||
} else { | |||||
if(res.data.data === null) { | |||||
this.isShowNoData = false; | |||||
} else { | |||||
let data = res.data.data.packagesList; | |||||
// 处理获取套餐的逻辑 | |||||
// 筛选 基础套餐,producModelId 1 是基础套餐;2 是加油包 | |||||
this.basePackageList = data.filter(item => { | |||||
return item.producModelId === 1 | |||||
}); | |||||
this.refuelPackageList = data.filter(item => { | |||||
return item.producModelId === 2 | |||||
}); | |||||
} | |||||
this.$toast.success({ | |||||
message: "加载完成", | |||||
duration: 1500 | |||||
}); | |||||
} | |||||
}) | |||||
.catch(error => { | |||||
this.$dialog.confirm({ | |||||
title: "获取套餐数据失败", | |||||
message: error.message, | |||||
showCancelButton: false, | |||||
}); | |||||
}) | |||||
.finally(() => { | |||||
setTimeout(() => { | |||||
this.$toast.clear(); | |||||
}, 1500); | |||||
}); | |||||
}, | |||||
// 购买加油包 | |||||
onBuyRefuel(data){ | |||||
console.log("加油包", data); | |||||
this.price = data.packagesPrice; | |||||
this.wxPay(data,1); | |||||
}, | |||||
// 购买基础套餐 | |||||
onBuyBase(data) { | |||||
console.log("基础包", data); | |||||
this.price = data.packagesPrice; | |||||
let payTypeToPackAgeId = data.payTypeList; | |||||
if (this.payType === '2') { | |||||
// 全额 | |||||
this.payProductId = payTypeToPackAgeId.filter(item => { | |||||
return item.payType === '2' | |||||
})[0].productId; | |||||
this.packageIssue = 0; | |||||
console.log("this.payProductId", this.payProductId); | |||||
this.aliPay(data); | |||||
} else if (this.payType === '3') { | |||||
// 分期 | |||||
this.payProductId = payTypeToPackAgeId.filter(item => { | |||||
return item.payType === '3' | |||||
})[0].productId; | |||||
this.packageIssue = 12; | |||||
this.payType = '2'; | |||||
console.log("this.payProductId2", this.payProductId); | |||||
this.aliPay(data); | |||||
} else { | |||||
// 微信 | |||||
let openId = this.$store.getters.openId; | |||||
this.payProductId = payTypeToPackAgeId.filter(item => { | |||||
return item.payType === '1' | |||||
})[0].productId; | |||||
this.packageIssue = 0; | |||||
console.log("this.payProductId3", this.payProductId); | |||||
if(openId === null || openId === 'null') { | |||||
this.$dialog.confirm({ | |||||
message: '获取OpenId失败,请您重新进入', | |||||
showCancelButton: false, | |||||
}) | |||||
} else { | |||||
this.wxPay(data); | |||||
} | |||||
} | |||||
}, | |||||
// 支付类型切换 | |||||
onRaidoChange(value) { | |||||
console.log("选择的支付类型是", value); | |||||
this.payType = value; | |||||
}, | |||||
// 微信支付 | |||||
wxPay(data, packageType) { | |||||
let that = this; | |||||
const orderData = data; | |||||
let reqBody = { | |||||
openId: this.$store.getters.openId, //openId | |||||
imei: that.$route.query.imei, //imei | |||||
productId: orderData.packagesId, //套餐id | |||||
packageName: | |||||
orderData.productModel + "," + orderData.packagesName, //套餐名字 | |||||
packagePayType: '1', //支付类型, 默认微信 | |||||
packageIssue: orderData.packageIssue, //分期 | |||||
packagePrice: orderData.packagesPrice * 100 | |||||
}; | |||||
// 1.获取微信预下单Id | |||||
APICore.payLiveBaseDevice(reqBody) | |||||
.then(res => { | |||||
if (res.data.code === 104 || res.data.code === 106) { | |||||
this.getAuth(); | |||||
setTimeout(() => { | |||||
this.wxPay(orderData); | |||||
}, 1000); | |||||
} | |||||
let wxData = res.data.data; | |||||
let outTradeNo = wxData.out_trade_no; | |||||
that.outTradeNo = wxData.out_trade_no; | |||||
//this.checkWxPayResult(outTradeNo); | |||||
//this.closeTime(); | |||||
// 调起微信支付收银台 | |||||
wx.chooseWXPay({ | |||||
timestamp: wxData.timeStamp, // 支付签名时间戳,注意微信 jssdk 中的所有使用 timestamp 字段均为小写。但最新版的支付后台生成签名使用的 timeStamp 字段名需大写其中的 S 字符 | |||||
nonceStr: wxData.nonceStr, // 支付签名随机串,不长于 32 位 | |||||
package: wxData.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*) | |||||
signType: wxData.signType, // 微信支付V3的传入 RSA ,微信支付V2的传入格式与V2统一下单的签名格式保持一致 | |||||
paySign: wxData.paySign, // 支付签名 | |||||
success: function(res) { | |||||
console.log("微信支付成功::", res); | |||||
if(packageType === 1) { | |||||
// 加油包不用跳转,直接提示支付成功 | |||||
that.$toast.success({ | |||||
message: '支付成功' | |||||
}); | |||||
} else { | |||||
// 套餐订购,跳转查询页面 | |||||
that.$router.replace({ | |||||
name: "payResult", | |||||
query: { | |||||
outTradeNo: that.outTradeNo, | |||||
price: that.price, | |||||
rechargeUrl: data.rechargeUrl, | |||||
iccid: that.$route.query.iccid, | |||||
isAdmin: that.$route.query.isAdmin || false, | |||||
serialNo: that.$route.query.imei, | |||||
issue: that.packageIssue | |||||
} | |||||
}); | |||||
} | |||||
}, | |||||
fail: err => { | |||||
console.log("支付出错了::", err); | |||||
that.$dialog.confirm({ | |||||
title: "支付失败", | |||||
message: "出错了,请您联系管理员" | |||||
}); | |||||
}, | |||||
cancel: function(err) { | |||||
// 用户取消支付 | |||||
that.$dialog.confirm({ | |||||
message: "您取消了支付" | |||||
}); | |||||
} | |||||
}); | |||||
}) | |||||
.catch(error => { | |||||
console.log("error", error); | |||||
}) | |||||
}, | |||||
// 跳转到支付宝花呗外部链接 | |||||
aliPay(data) { | |||||
console.log("选择了支付宝::", data); | |||||
this.$toast.loading({ | |||||
message: "加载中" | |||||
}); | |||||
let orderData = data; | |||||
let that = this; | |||||
let reqBody = { | |||||
openId: this.$store.getters.openId, //openId | |||||
imei: that.$route.query.imei, //imei | |||||
productId: this.payProductId, //套餐id | |||||
packageName: /* data.productModel + ',' + */data.packagesName, //套餐名字 | |||||
packagePayType: Number(this.payType), //支付类型 | |||||
packageIssue: this.packageIssue, //分期 | |||||
packagePrice: process.env.NODE_ENV === "production" ? data.packagesPrice * 100 : 1 //总金额单位为分,测试环境写死 | |||||
}; | |||||
this.$toast.clear(); | |||||
APICore.payLiveBaseDevice(reqBody) | |||||
.then(res => { | |||||
if (res.data.code === 104 || res.data.code === 106) { | |||||
this.getAuth(); | |||||
setTimeout(() => { | |||||
this.aliPay(orderData); | |||||
}, 1000); | |||||
} | |||||
let alipayData = res.data.data.xmlStrMap; | |||||
that.outTradeNo = alipayData.outTradeNo; | |||||
let alipayForm = decodeURI(alipayData.payXmlStr); | |||||
that.$store.commit("isFromWx", true); | |||||
let alipayUserId = process.env.NODE_ENV === "production" ? 42 : 18; | |||||
this.$router.replace({ | |||||
name: "payResult", | |||||
query: { | |||||
rechargeUrl: | |||||
data.rechargeUrl || | |||||
`https://id.ssjlai.com/frontend/#/alipay`, | |||||
outTradeNo: that.outTradeNo, | |||||
price: that.price, | |||||
alipayForm: alipayForm, | |||||
iccid: that.$route.query.iccid, | |||||
isAdmin: that.$route.query.isAdmin || false, | |||||
serialNo: that.$route.query.imei, | |||||
alipayUserId: alipayUserId, | |||||
productId: this.payProductId | |||||
} | |||||
}); | |||||
}) | |||||
.catch(error => { | |||||
console.log("error", error); | |||||
this.$dialog.confirm({ | |||||
message: `${error.message}`, | |||||
showCancelButton: false | |||||
}) | |||||
}) | |||||
.finally(() => { | |||||
this.$toast.clear(); | |||||
}); | |||||
}, | |||||
}, | |||||
created() { | |||||
/* this.getAuth(); */ | |||||
this.getWxAutograph(); | |||||
// 套餐列表 | |||||
this.getDevicePayPackage(); | |||||
}, | |||||
} | |||||
</script> | |||||
<style lang="scss"> | |||||
.package-buy-container { | |||||
.van-tabs { | |||||
min-height: 100vh; | |||||
background: #fafafa; | |||||
&.blue { | |||||
background: #1890ff !important; | |||||
} | |||||
.van-tabs__wrap { | |||||
height: 50px; | |||||
width: 100%; | |||||
.van-tabs__nav { | |||||
.van-tab { | |||||
@include center(); | |||||
padding: 0; | |||||
span { | |||||
color: #333333; | |||||
font-size: 16px; | |||||
padding: 4px; | |||||
} | |||||
&.van-tab--active { | |||||
span { | |||||
color: #1890ff; | |||||
font-weight: 500; | |||||
font-size: 16px; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
</style> | |||||
<style scoped lang="scss"> | |||||
.package-buy-container { | |||||
height: 100vh; | |||||
overflow: hidden; | |||||
.package-container { | |||||
height: calc(100vh - 88px); | |||||
background: #fafafa; | |||||
.refuel-package { | |||||
height: calc(100vh - 88px); | |||||
padding: 10px 20px; | |||||
overflow: scroll; | |||||
.refuel-item { | |||||
padding: 10px; | |||||
margin-bottom: 20px; | |||||
background-color: #fff; | |||||
border-top-right-radius: 5px; | |||||
border-bottom-right-radius: 5px; | |||||
border-top-left-radius: 3px; | |||||
border-bottom-left-radius: 3px; | |||||
border-left: 3px solid #1890ff; | |||||
box-shadow: rgba(60, 64, 67, 0.3) 0px 1px 2px 0px, | |||||
rgba(60, 64, 67, 0.15) 0px 2px 6px 2px; | |||||
p, | |||||
span { | |||||
font-size: 16px; | |||||
} | |||||
.title { | |||||
text-align: left; | |||||
padding-top: 10px; | |||||
font-weight: 500; | |||||
} | |||||
.tips { | |||||
margin-top: 10px; | |||||
p { | |||||
font-size: 14px; | |||||
} | |||||
} | |||||
.bottom { | |||||
padding-top: 20px; | |||||
display: flex; | |||||
justify-content: space-between; | |||||
align-items: center; | |||||
span { | |||||
font-size: 20px; | |||||
color: #fca842; | |||||
font-weight: bold; | |||||
.price-span { | |||||
margin-left: 5px; | |||||
font-size: 14px; | |||||
} | |||||
} | |||||
.btn-button { | |||||
height: 35px; | |||||
width: 100px; | |||||
@include center(); | |||||
background-color: #fca842; | |||||
border-radius: 17px; | |||||
p { | |||||
font-size: 14px; | |||||
color: #fff; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.base-package { | |||||
height: calc(100vh - 88px); | |||||
position: relative; | |||||
.base-item { | |||||
margin: 10px; | |||||
z-index: 999; | |||||
box-shadow: rgba(14, 30, 37, 0.12) 0 3px 5px 0, | |||||
rgba(14, 30, 37, 0.32) 0 2px 16px 0; | |||||
padding: 15px 10px; | |||||
background-color: #fff; | |||||
/* border-radius: 5px; */ | |||||
.title { | |||||
display: flex; | |||||
justify-content: flex-start; | |||||
p { | |||||
font-size: 16px; | |||||
font-weight: bold; | |||||
} | |||||
} | |||||
.details { | |||||
display: flex; | |||||
justify-content: flex-start; | |||||
align-items: center; | |||||
p { | |||||
height: 40px; | |||||
@include center(); | |||||
font-size: 14px; | |||||
padding: 5px 0 5px 10px; | |||||
} | |||||
.total { | |||||
font-size: 16px; | |||||
padding: 0; | |||||
} | |||||
.orange { | |||||
color: orange; | |||||
} | |||||
.large { | |||||
font-size: 26px; | |||||
margin: 0 2px; | |||||
} | |||||
.price { | |||||
font-size: 16px; | |||||
} | |||||
/* .buy-btn { | |||||
height: 30px; | |||||
width: 100px; | |||||
display: flex; | |||||
justify-content: center; | |||||
align-items: center; | |||||
background: orange; | |||||
border-radius: 45px; | |||||
p { | |||||
font-size: 16px; | |||||
padding: 0; | |||||
color: red; | |||||
} | |||||
} */ | |||||
} | |||||
.remark { | |||||
display: flex; | |||||
justify-content: flex-start; | |||||
p { | |||||
font-size: 14px; | |||||
padding: 5px 10px; | |||||
/* font-weight: bold; */ | |||||
} | |||||
} | |||||
.package-buy { | |||||
@include center(); | |||||
padding: 5px 8px; | |||||
.buy-btn { | |||||
height: 40px; | |||||
width: 200px; | |||||
padding: 0 5px; | |||||
display: flex; | |||||
justify-content: center; | |||||
align-items: center; | |||||
background: orange; | |||||
border-radius: 20px; | |||||
p { | |||||
font-size: 16px; | |||||
padding: 0; | |||||
color: white; | |||||
} | |||||
} | |||||
} | |||||
.radios-con { | |||||
/* padding: 20px 10px; */ | |||||
/* @include center(); */ | |||||
/* align-items: center; */ | |||||
padding: 10px 0 10px 10px; | |||||
font-size: 14px; | |||||
/* box-shadow: rgba(14, 30, 37, 0.12) 0 3px 5px 0, | |||||
rgba(14, 30, 37, 0.32) 0 2px 16px 0; */ | |||||
img { | |||||
height: 20px; | |||||
width: 20px; | |||||
margin: 2px; | |||||
} | |||||
.pay-type { | |||||
text-align: left; | |||||
p { | |||||
font-size: 14px; | |||||
padding: 0 0 10px 0; | |||||
} | |||||
} | |||||
.radio-con { | |||||
@include center(); | |||||
} | |||||
.van-cell-text { | |||||
display: flex; | |||||
justify-content: flex-start; | |||||
align-items: center; | |||||
span { | |||||
font-size: 14px; | |||||
padding: 0 5px; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.content { | |||||
font-size: 14px; | |||||
} | |||||
} | |||||
.data-null { | |||||
height: calc(100vh - 88px); | |||||
@include center(); | |||||
flex-direction: column; | |||||
span { | |||||
font-size: 14px; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
</style> |
@@ -1,7 +1,7 @@ | |||||
<!-- | <!-- | ||||
* @Date: 2022-03-29 16:57:58 | * @Date: 2022-03-29 16:57:58 | ||||
* @LastEditors: JinxChen | * @LastEditors: JinxChen | ||||
* @LastEditTime: 2023-03-13 08:55:33 | |||||
* @LastEditTime: 2023-03-20 14:06:14 | |||||
* @FilePath: \TelpoH5FrontendWeb\src\views\package-list\index.vue | * @FilePath: \TelpoH5FrontendWeb\src\views\package-list\index.vue | ||||
* @description: TODO 小台风充值h5 | * @description: TODO 小台风充值h5 | ||||
--> | --> | ||||
@@ -18,7 +18,7 @@ | |||||
<div class="topup-container"> | <div class="topup-container"> | ||||
<div class="main"> | <div class="main"> | ||||
<!-- 无套餐时显示 --> | <!-- 无套餐时显示 --> | ||||
<div class="noData_container" v-show="packageOrderList.length === 0 && isShowNoData"> | |||||
<div class="noData_container" v-show="packageOrderList.length === 0 && !isShowNoData"> | |||||
<p>暂无相关套餐数据,请您联系管理员~</p> | <p>暂无相关套餐数据,请您联系管理员~</p> | ||||
</div> | </div> | ||||
<!-- 套餐订购 --> | <!-- 套餐订购 --> | ||||
@@ -38,7 +38,7 @@ | |||||
<!-- 套餐内容 --> | <!-- 套餐内容 --> | ||||
<div class="order-content"> | <div class="order-content"> | ||||
<div class="title"> | <div class="title"> | ||||
<p>{{item.packageName}}<!-- :{{(item.packagePrice/item.packageIssue).toFixed(0)}}元/月 --></p> | |||||
<p>{{item.packageName}}<!-- :{{(item.packagesPrice/item.packageIssue).toFixed(0)}}元/月 --></p> | |||||
</div> | </div> | ||||
<div class="remark"> | <div class="remark"> | ||||
<p>每月200分钟通话时长,1G流量</p> | <p>每月200分钟通话时长,1G流量</p> | ||||
@@ -46,10 +46,10 @@ | |||||
<div class="details"> | <div class="details"> | ||||
<p> | <p> | ||||
<span class="orange large">¥{{(item.packagePrice/(item.packageIssue === 0 ? 1: item.packageIssue)).toFixed(0)}}</span>元/月, | |||||
<span class="orange large">¥{{(item.packagesPrice/(item.packageIssue === 0 ? 1: item.packageIssue)).toFixed(0)}}</span>元/月, | |||||
</p> | </p> | ||||
<p class="total"> | <p class="total"> | ||||
<span>合计</span><span class="orange price">{{item.packagePrice}}元</span> | |||||
<span>合计</span><span class="orange price">{{item.packagesPrice}}元</span> | |||||
</p> | </p> | ||||
</div> | </div> | ||||
<!-- <div class="package-buy"> | <!-- <div class="package-buy"> | ||||
@@ -114,15 +114,15 @@ export default { | |||||
topupTitle: "请选择套餐充值电话卡", //充值页面标题 | topupTitle: "请选择套餐充值电话卡", //充值页面标题 | ||||
// 套餐列表, todo 需要从接口获取 | // 套餐列表, todo 需要从接口获取 | ||||
packageOrderList: [ | packageOrderList: [ | ||||
{ | |||||
/* { | |||||
packageName: '语音卡套餐(1年)', | packageName: '语音卡套餐(1年)', | ||||
packagePayType: 1, | packagePayType: 1, | ||||
packagePrice: 240, | |||||
packagesPrice: 240, | |||||
packageIssue: 12, | packageIssue: 12, | ||||
payWxPayProductId: process.env.NODE_ENV === "production" ? '1629407413618294784' : '1629405716684029952', //微信支付 | |||||
payWxPayProductId: process.env.NODE_ENV === "production" ? '1635123463911587840' : '1635122887959592960', //微信支付 | |||||
payAliPayProductId: process.env.NODE_ENV === "production" ? '1629407413618294784' : '1629405716684029952', //支付宝全额支付 | payAliPayProductId: process.env.NODE_ENV === "production" ? '1629407413618294784' : '1629405716684029952', //支付宝全额支付 | ||||
payAntPayProductId: process.env.NODE_ENV === "production" ? '1629407705558630400': '1629405558344859648', //支付宝花呗支付 | payAntPayProductId: process.env.NODE_ENV === "production" ? '1629407705558630400': '1629405558344859648', //支付宝花呗支付 | ||||
} | |||||
} */ | |||||
], | ], | ||||
outTradeNo: "", //订单号 | outTradeNo: "", //订单号 | ||||
price: "", //价格, | price: "", //价格, | ||||
@@ -145,8 +145,8 @@ export default { | |||||
this.getAuth(); | this.getAuth(); | ||||
this.getParams(); | this.getParams(); | ||||
this.getWxAutograph(); | this.getWxAutograph(); | ||||
// todo 接口列表 | |||||
/* this.getLiveBasePackage(); */ | |||||
// 套餐列表 | |||||
this.getDevicePayPackage(); | |||||
}, | }, | ||||
/* mounted() { | /* mounted() { | ||||
this.getParams(); | this.getParams(); | ||||
@@ -193,49 +193,45 @@ export default { | |||||
} | } | ||||
}, | }, | ||||
// 获取基本套餐信息 | // 获取基本套餐信息 | ||||
getLiveBasePackage() { | |||||
getDevicePayPackage() { | |||||
this.$toast.loading({ | this.$toast.loading({ | ||||
message: "获取套餐中", | |||||
message: "加载中", | |||||
duration: 1500 | duration: 1500 | ||||
}); | }); | ||||
let reqBody = { | |||||
manufactorId:"", | |||||
productModelId:0, | |||||
iccid:"", | |||||
pageNumber:1, | |||||
begNumber:20 | |||||
} | |||||
APICore.cardPackageList(reqBody) | |||||
APICore.devicePayPackage(this.params.imei) | |||||
.then(res => { | .then(res => { | ||||
console.log("data", res.data); | console.log("data", res.data); | ||||
if (res.data.code === 106 || res.data.code === 104) { | if (res.data.code === 106 || res.data.code === 104) { | ||||
// token过期 | // token过期 | ||||
this.getAuth(); | this.getAuth(); | ||||
setTimeout(() => { | setTimeout(() => { | ||||
this.getLiveBasePackage(); | |||||
this.getDevicePayPackage(); | |||||
}, 1500); | }, 1500); | ||||
} else if (res.data.code === 0 && res.data.data === null) { | } else if (res.data.code === 0 && res.data.data === null) { | ||||
this.isShowNoData = true; | this.isShowNoData = true; | ||||
}else { | |||||
let data = res.data.data.list; | |||||
if(data === null) { | |||||
this.isShowNoData = true; | |||||
} else { | |||||
if(res.data.data === null) { | |||||
this.isShowNoData = false; | |||||
} else { | } else { | ||||
this.packageOrderList = data.filter(item => { | |||||
return item.pechargeUrl === '1629405716684029952' || item.pechargeUrl === '1629405558344859648'; | |||||
let data = res.data.data.packagesList; | |||||
// 处理获取套餐的逻辑 | |||||
// 筛选 基础套餐,producModelId 1 是基础套餐;2 是加油包 | |||||
let packageList = data.filter(item => { | |||||
return item.producModelId === 1 | |||||
}); | }); | ||||
console.log("套餐数据::", data); | |||||
this.packageOrderList = packageList; | |||||
console.log("套餐数据::", packageList); | |||||
} | } | ||||
this.$toast.success({ | |||||
message: "加载完成", | |||||
duration: 1500 | |||||
}); | |||||
} | } | ||||
this.$toast.success({ | |||||
message: "成功获取套餐", | |||||
duration: 1500 | |||||
}); | |||||
}) | }) | ||||
.catch(error => { | .catch(error => { | ||||
this.$dialog.confirm({ | this.$dialog.confirm({ | ||||
title: "获取套餐数据失败", | title: "获取套餐数据失败", | ||||
message: error, | |||||
message: error.message, | |||||
showCancelButton: false, | showCancelButton: false, | ||||
}); | }); | ||||
}) | }) | ||||
@@ -280,20 +276,36 @@ export default { | |||||
}, | }, | ||||
// 话费充值 | // 话费充值 | ||||
onBuy(data) { | onBuy(data) { | ||||
this.price = data.packagePrice; | |||||
this.price = data.packagesPrice; | |||||
// 遍历数据找到属于三种支付方式对应的套餐id, 1 微信 2 支付宝全额 3 支付宝分期 | |||||
let payTypeToPackAgeId = data.payTypeList; | |||||
console.log("购买的套餐数据data", payTypeToPackAgeId); | |||||
// 需要区分是要用微信支付还是支付宝花呗支付 | // 需要区分是要用微信支付还是支付宝花呗支付 | ||||
if (this.payType === '2') { | if (this.payType === '2') { | ||||
this.payProductId = process.env.NODE_ENV === "production" ? '1629407413618294784' : '1629405716684029952', //支付宝全额支付 | |||||
// 全额 | |||||
this.payProductId = payTypeToPackAgeId.filter(item => { | |||||
return item.payType === '2' | |||||
})[0].productId; | |||||
this.packageIssue = 0; | this.packageIssue = 0; | ||||
console.log("this.payProductId", this.payProductId); | |||||
this.aliPay(data); | this.aliPay(data); | ||||
} else if (this.payType === '3') { | } else if (this.payType === '3') { | ||||
this.payProductId = process.env.NODE_ENV === "production" ? '1629407705558630400': '1629405558344859648', //支付宝花呗支付 | |||||
// 分期 | |||||
this.payProductId = payTypeToPackAgeId.filter(item => { | |||||
return item.payType === '3' | |||||
})[0].productId; | |||||
this.packageIssue = 12; | this.packageIssue = 12; | ||||
this.payType = '2' | |||||
this.payType = '2'; | |||||
console.log("this.payProductId2", this.payProductId); | |||||
this.aliPay(data); | this.aliPay(data); | ||||
} else { | } else { | ||||
// 微信 | |||||
let openId = this.$store.getters.openId; | let openId = this.$store.getters.openId; | ||||
this.payProductId = process.env.NODE_ENV === "production" ? '1629407413618294784': '1629405716684029952'; //支付宝花呗支付 | |||||
this.payProductId = payTypeToPackAgeId.filter(item => { | |||||
return item.payType === '1' | |||||
})[0].productId; | |||||
this.packageIssue = 0; | |||||
console.log("this.payProductId3", this.payProductId); | |||||
if(openId === null || openId === 'null') { | if(openId === null || openId === 'null') { | ||||
this.$dialog.confirm({ | this.$dialog.confirm({ | ||||
message: '获取OpenId失败,请您重新进入', | message: '获取OpenId失败,请您重新进入', | ||||
@@ -315,10 +327,10 @@ export default { | |||||
openId: this.$store.getters.openId, //openId | openId: this.$store.getters.openId, //openId | ||||
imei: this.params.imei, //imei | imei: this.params.imei, //imei | ||||
productId: this.payProductId, //套餐id | productId: this.payProductId, //套餐id | ||||
packageName: /* data.productModel */ data.packageName, //套餐名字 | |||||
packageName: /* data.productModel */ data.packagesName, //套餐名字 | |||||
packagePayType: Number(this.payType), //支付类型 | packagePayType: Number(this.payType), //支付类型 | ||||
packageIssue: 12, //分期 | |||||
packagePrice: process.env.NODE_ENV === "production" ? data.packagePrice * 100 : 1 //总金额单位为分,测试环境写死 | |||||
packageIssue: 0, //分期 | |||||
packagePrice: process.env.NODE_ENV === "production" ? data.packagesPrice * 100 : 1 //总金额单位为分,测试环境写死 | |||||
}; | }; | ||||
this.$toast.clear(); | this.$toast.clear(); | ||||
APICore.payLiveBaseDevice(reqBody) | APICore.payLiveBaseDevice(reqBody) | ||||
@@ -410,10 +422,10 @@ export default { | |||||
openId: this.$store.getters.openId, //openId | openId: this.$store.getters.openId, //openId | ||||
imei: this.params.imei, //imei | imei: this.params.imei, //imei | ||||
productId: this.payProductId, //套餐id | productId: this.payProductId, //套餐id | ||||
packageName: /* data.productModel + ',' + */data.packageName, //套餐名字 | |||||
packageName: /* data.productModel + ',' + */data.packagesName, //套餐名字 | |||||
packagePayType: Number(this.payType), //支付类型 | packagePayType: Number(this.payType), //支付类型 | ||||
packageIssue: this.packageIssue, //分期 | packageIssue: this.packageIssue, //分期 | ||||
packagePrice: process.env.NODE_ENV === "production" ? data.packagePrice * 100 : 1 //总金额单位为分,测试环境写死 | |||||
packagePrice: process.env.NODE_ENV === "production" ? data.packagesPrice * 100 : 1 //总金额单位为分,测试环境写死 | |||||
}; | }; | ||||
this.$toast.clear(); | this.$toast.clear(); | ||||
APICore.payLiveBaseDevice(reqBody) | APICore.payLiveBaseDevice(reqBody) | ||||
@@ -527,7 +539,7 @@ export default { | |||||
.package-order-container { | .package-order-container { | ||||
position: relative; | position: relative; | ||||
margin: 10px 0; | margin: 10px 0; | ||||
/* padding: 0 0 0 20px; */ | |||||
/* padding: 0 20px; */ | |||||
z-index: 999; | z-index: 999; | ||||
box-shadow: rgba(14, 30, 37, 0.12) 0 3px 5px 0, | box-shadow: rgba(14, 30, 37, 0.12) 0 3px 5px 0, | ||||
rgba(14, 30, 37, 0.32) 0 2px 16px 0; | rgba(14, 30, 37, 0.32) 0 2px 16px 0; | ||||
@@ -623,6 +635,7 @@ export default { | |||||
} | } | ||||
} | } | ||||
.package-buy { | .package-buy { | ||||
@include center(); | |||||
padding: 5px 8px; | padding: 5px 8px; | ||||
@include center(); | @include center(); | ||||
.buy-btn { | .buy-btn { | ||||