purchase-let/pages/charge/charge.vue

381 lines
8.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 会员充值 -->
<template>
<view class="member">
<view class="card" :style="{'background-image':'url(../../static/icon/charge_bg.webp)'}">
<view class="card-info">
<u-image width="100rpx" height="100rpx" :src="userInfo.avatar" />
<view class="card-info-right">
<view class="phone">{{userInfo.mobile}}</view>
<view class="level">初级会员 享受{{userInfo.discount}}折优惠</view>
</view>
</view>
<view class="charge">
<view class="charge-left">
<view>
<text>当前已充值{{userInfo.total_recharge_amount}}升级还需{{userInfo.next_limit}}</text>
<text>{{userInfo.next_level}}</text>
</view>
<up-line-progress :percentage="30" activeColor="#A26341" inactiveColor="#fff"
height="8rpx"></up-line-progress>
</view>
<view class="charge-right">升级会员</view>
</view>
</view>
<!-- 充值规格 -->
<view class="rules">
<view class="rules-title">
<view class="rules-title-main">充值规格</view>
<view class="rules-title-record" @click="onPageToRecord">
充值记录
<up-icon name="arrow-right"></up-icon>
</view>
</view>
<view class="rules-con">
<block v-for="item in chargeRulesList" :key="item.id">
<view class="rules-con-item" :class="{'active':isChooseMoney==item.id?true:false}"
@click="isChooseMoney = item.id">
<view class="rules-con-item-main">{{item.name}}</view>
<view class="rules-con-item-sub">{{item.remark?item.remark:'永久'}}</view>
<view class="rules-con-item-amount">
<text class="symbol">¥</text>
<text>{{item.value}}</text>
</view>
</view>
</block>
<view class="rules-con-item" :class="{'active':isChooseMoney=='input'?true:false}"
@click="isChooseMoney = 'input'">
<view class="rules-con-item-main">自定义金额</view>
<view class="rules-con-item-sub">永久</view>
<view class="rules-con-item-amount">
<up-input v-model="chargeMoney" placeholder="点击输入金额" border="none" type="number" color="#333"
fontSize="28rpx" inputAlign="center"
placeholderStyle="color:'#989898';'font-size':'24rpx';text-align:center;"></up-input>
</view>
</view>
</view>
</view>
<!-- 注意事项 -->
<view class="attention">
<view class="attention-title"><text>注意事项:</text></view>
<view class="attention-tips">1、充值后帐户的金额不能提现可用于消费使用</view>
<view class="attention-tips">2、账户充值出现问题可联系平台客服也可拨打平台客服咨询热线4008888888</view>
</view>
<view class="member-btn" @click="onConfirmCharge">
<view class="btn-wrap">
确认充值
</view>
</view>
</view>
</template>
<script setup>
import {
rechargeApi,
rechargeAmountApi
} from "@/api/user.js";
import {
onLoad
} from "@dcloudio/uni-app";
import {
ref
} from "vue";
import useUserStore from "@/store/user";
//用户信息
const userInfo = useUserStore().userInfo;
const isChooseMoney = ref('');
const chargeMoney = ref('');
// 充值规则
const chargeRulesList = ref([]);
const getChargeRules = () => {
rechargeAmountApi().then(rs => {
chargeRulesList.value = rs.data;
})
}
// 充值记录产看
const onPageToRecord = () => {
uni.navigateTo({
url: '/pages/charge/charge_record',
fail(err) {
console.log(err);
}
})
}
// 确认充值
const onConfirmCharge = () => {
if (!isChooseMoney.value) return uni.$u.toast('充值金额不能为空');
let money = 0;
if (isChooseMoney.value == 'input') {
money = chargeMoney.value;
} else {
const rule = chargeRulesList.value.find(i => i.id == isChooseMoney.value);
if (rule != undefined) {
money = rule.value;
}
}
rechargeApi({
price: money
}).then(res => {
if (!res.data?.nonceStr) return uni.$u.toast('支付失败!');
uni.requestPayment({
provider: 'wxpay',
timeStamp: res.data.timeStamp,
nonceStr: res.data.nonceStr,
package: res.data.package,
signType: res.data.signType,
paySign: res.data.paySign,
success: (e) => {
if (e.errMsg == 'requestPayment:ok') {
uni.showModal({
title: '充值成功',
confirmText: '查看记录',
cancelText: '继续充值',
success: (e) => {
chargeMoney.value = '';
isChooseMoney.value = '';
if (e.confirm) {
uni.navigateTo({
url: '/pages/charge/charge_record'
})
}
},
fail(err) {
console.log(err);
}
})
} else uni.$u.toast('支付失败')
},
fail: (e) => {
uni.$u.toast('用户取消支付');
}
})
})
}
onLoad(() => {
getChargeRules();
})
</script>
<style lang="scss">
.member {
padding: 40rpx 0 300rpx 0;
.card {
background: linear-gradient(to right, #F7EED7, #E7DAAF);
background-size: 100%;
background-repeat: no-repeat;
height: 272rpx;
margin: 0 30rpx 30rpx;
border-radius: 10rpx;
padding: 20rpx 0 0 20rpx;
box-sizing: border-box;
.card-info {
display: flex;
align-items: center;
margin-bottom: 30rpx;
.card-info-right {
margin-left: 40rpx;
.phone {
margin-bottom: 12rpx;
font-weight: 600;
font-size: 32rpx;
color: #444444;
}
.level {
font-size: 28rpx;
color: #7B5232;
}
}
}
.charge {
display: flex;
align-items: center;
padding-right: 38rpx;
.charge-left {
flex: 1;
margin-right: 30rpx;
&>view {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10rpx;
text {
font-size: 22rpx;
color: #A26341;
}
}
}
.charge-right {
width: 148rpx;
height: 52rpx;
line-height: 52rpx;
background: #7B5232;
border-radius: 30rpx;
font-size: 22rpx;
color: #FFFFFF;
text-align: center;
}
}
}
.rules {
background: #FFFFFF;
border-radius: 16rpx;
margin: 0 30rpx 30rpx;
padding: 30rpx;
.rules-title {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 34rpx;
.rules-title-main {
font-weight: 600;
font-size: 32rpx;
color: #444444;
}
.rules-title-record {
display: flex;
align-items: center;
font-size: 28rpx;
color: #444444;
}
}
.rules-con {
display: flex;
flex-wrap: wrap;
.rules-con-item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 188rpx;
height: 220rpx;
border: 2rpx solid #F1F1F1;
border-radius: 16rpx;
margin-bottom: 28rpx;
&:not(:nth-child(3n)) {
margin-right: 26rpx;
}
.rules-con-item-main {
margin-bottom: 10rpx;
font-size: 30rpx;
color: #333333;
}
.rules-con-item-sub {
margin-bottom: 30rpx;
font-size: 24rpx;
color: #777777;
}
.rules-con-item-amount {
text {
font-weight: 600;
font-size: 32rpx;
color: #333333;
}
.symbol {
font-size: 20rpx;
}
}
}
.active {
border: 2rpx solid #EFCC6E;
background: #FEF8E7;
}
}
}
.attention {
margin: 0 30rpx;
.attention-title {
position: relative;
font-weight: 600;
font-size: 32rpx;
color: #262626;
margin-bottom: 20rpx;
margin-left: 10rpx;
text {
margin-left: 14rpx;
}
&::before {
content: "";
display: block;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 6rpx;
height: 70%;
border-radius: 4rpx;
background: #FF8056;
}
}
.attention-tips {
font-size: 24rpx;
color: #7A7A7A;
margin-bottom: 30rpx;
}
}
.member-btn {
position: fixed;
bottom: 0rpx;
left: 50%;
transform: translateX(-50%);
height: 110rpx;
background-color: #F6F6F6;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
padding-bottom: constant(safe-area-inset-bottom);
/* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom);
/* 兼容 iOS >= 11.2 */
.btn-wrap {
width: 670rpx;
height: 80rpx;
line-height: 80rpx;
margin: 0 auto;
background: #EFCC6E;
border-radius: 40rpx;
font-size: 32rpx;
color: #FFFFFF;
text-align: center;
}
}
}
</style>