敢为人鲜小程序前端代码仓库
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.
 
 
 

394 lines
11 KiB

<template>
<view class="wallet-page">
<!-- 导航栏 -->
<navbar title="钱包" leftClick @leftClick="$utils.navigateBack" bgColor="#019245" color="#fff" />
<!-- 总余额展示区 -->
<view class="balance-card" :style="{ backgroundImage: `url(${configList.config_money_image})` }">
<view class="balance-info">
<view class="balance-title">总余额</view>
<view class="balance-amount">{{ userInfo.balance ? userInfo.balance.toFixed(2) : '0.00' }}</view>
<view class="balance-actions">
<view class="action-btn recharge-btn" v-if="!isRecharge" @tap="navigateToRecharge">
<text>去充值</text>
<text class="arrow">></text>
</view>
<view class="action-btn recharge-btn" v-if="isRecharge" @tap="isRecharge = false">
<text>提现</text>
<text class="arrow">></text>
</view>
<view class="action-btn" v-else />
<view class="action-btn detail-btn" @tap="navigateToDetail">
<text>资产明细</text>
<text class="arrow">></text>
</view>
</view>
</view>
</view>
<!-- 提现表单 -->
<view class="withdraw-section">
<view class="section-title">{{ isRecharge ? '我要充值' : '我要提现' }}</view>
<!-- 提现金额输入框 -->
<view class="input-item">
<text class="currency-symbol">¥</text>
<input v-if="!isRecharge" class="amount-input" type="digit" v-model="withdrawAmount"
placeholder="请输入提现金额" @blur="validateAmount" />
<input v-else class="amount-input" type="digit" v-model="rechargeAmount" placeholder="请输入充值金额"
@blur="validateAmount" />
</view>
<!-- 真实姓名输入框 -->
<view class="input-item" v-if="!isRecharge">
<input class="name-input" type="nickname" v-model="realName" placeholder="请输入真实姓名"
@blur="validateName" />
</view>
<!-- 提现说明 -->
<view class="withdraw-notes" v-if="!isRecharge">
<view class="notes-title">提现说明</view>
<view class="notes-list">
<view class="note-item" v-for="(rule, index) in walletData.withdrawRules" :key="index">
<text>{{ index + 1 }}{{ rule }}</text>
</view>
</view>
</view>
</view>
<!-- 提现按钮 -->
<view class="submit-btn-wrapper">
<button class="submit-btn" @tap="submitWithdraw" :disabled="!isFormValid">
{{ isRecharge ? '立即充值' : '立即提现' }}
</button>
</view>
</view>
</template>
<script>
import navbar from '@/components/base/navbar.vue'
// import { walletData } from '@/static/js/mockWallet.js'
export default {
components: {
navbar
},
data() {
return {
walletData: null,
withdrawAmount: '',
rechargeAmount: '',
realName: '',
amountError: '',
nameError: '',
isFormValid: true,
isRecharge: false
}
},
onLoad() {
// this.walletData = walletData
},
methods: {
// 导航到充值页面
navigateToRecharge() {
this.isRecharge = true
},
// 导航到资产明细页面
navigateToDetail() {
this.$utils.navigateTo('/pages_order/mine/assets')
},
// 验证提现金额
validateAmount() {
if (!this.withdrawAmount) {
this.amountError = '请输入提现金额'
return false
}
const amount = parseFloat(this.withdrawAmount)
if (isNaN(amount) || amount <= 0) {
this.amountError = '请输入有效的提现金额'
return false
}
if (amount > this.walletData.balance) {
this.amountError = '提现金额不能大于余额'
return false
}
if (amount > 200) {
this.amountError = '单笔提现不能超过200元'
return false
}
this.amountError = ''
return true
},
// 验证真实姓名
validateName() {
if (!this.realName) {
this.nameError = '请输入真实姓名'
return false
}
if (this.realName.length < 2) {
this.nameError = '请输入有效的姓名'
return false
}
this.nameError = ''
return true
},
// 提交提现申请
submitWithdraw() {
if (this.isRecharge) {
return this.recharge()
}
// 再次验证表单
if (!this.validateAmount() || !this.validateName()) {
// 显示具体错误
if (this.amountError) {
uni.showToast({
title: this.amountError,
icon: 'error'
})
return
}
if (this.nameError) {
uni.showToast({
title: this.nameError,
icon: 'error'
})
return
}
return
}
// 如果在isFormVaild为false的情况下进入函数 则为多次点击 直接返回
if (this.isFormValid) {
this.isFormValid = false
}else return
// 显示提交中状态
uni.showLoading({
title: '提交中...'
})
// 模拟提交过程
// setTimeout(() => {
// uni.hideLoading()
// uni.showToast({
// title: '提现申请已提交',
// icon: 'success'
// })
// // 模拟余额变更
// this.walletData.balance -= parseFloat(this.withdrawAmount)
// // 清空表单
// this.withdrawAmount = ''
// this.realName = ''
// this.isFormValid = true
// }, 1500)
},
recharge() {
uni.showModal({
title: '确认充值',
content: '充值金额为' + this.rechargeAmount + '元',
confirmColor: '#019245',
success: (res) => {
// 这里编写函数逻辑
if (res.confirm) {
uni.showLoading({
title: '充值中...'
})
this.$api('cashIn', { amount: this.rechargeAmount } , res => {
uni.hideLoading()
if (res.code === 200) {
uni.requestPaymentWxPay(res)
.then(() => {
this.$store.commit('getUserInfo')
this.rechargeAmount = ''
this.isRecharge = false
})
.catch(() => {
uni.showToast({
title: '充值失败',
icon: 'error'
})
})
}
})
// 模拟重置时间
// setTimeout(() => {
// // 模拟余额变更
// this.walletData.balance += parseFloat(this.rechargeAmount)
// // 重置表单
// this.rechargeAmount = ''
// this.isRecharge = false
// }, 1500)
}
},
fail: (err) => {
console.log(err);
}
})
}
}
}
</script>
<style lang="scss" scoped>
.wallet-page {
}
.balance-card {
width: 96%;
height: 280rpx;
background-size: cover;
background-position: center;
padding: 30rpx;
box-sizing: border-box;
position: relative;
margin: 20rpx auto;
border-radius: 20rpx;
.balance-info {
position: relative;
z-index: 2;
color: #fff;
}
.balance-title {
font-size: 28rpx;
margin-bottom: 10rpx;
}
.balance-amount {
font-size: 56rpx;
font-weight: bold;
margin-bottom: 20rpx;
}
.balance-actions {
display: flex;
justify-content: space-between;
// justify-content: center;
align-items: center;
.action-btn {
padding: 10rpx 24rpx;
font-size: 24rpx;
border-radius: 30rpx;
display: flex;
align-items: center;
}
.recharge-btn {
background-color: #fff;
color: $uni-color;
border: none;
min-width: 120rpx;
height: 60rpx;
justify-content: center;
font-size: 24rpx;
font-weight: normal;
gap: 4rpx;
// line-height: 1;
padding: 0 20rpx;
}
.detail-btn {
.arrow {
margin-left: 10rpx;
}
}
}
}
.withdraw-section {
padding: 30rpx;
// background-color: #fff;
.section-title {
font-size: 32rpx;
color: #333;
margin-bottom: 30rpx;
font-weight: bold;
}
.input-item {
display: flex;
align-items: center;
padding: 24rpx 20rpx;
margin-bottom: 20rpx;
background-color: #e7e7e7;
border-radius: 20rpx;
.currency-symbol {
color: #FF0000;
margin-right: 20rpx;
}
.amount-input,
.name-input {
flex: 1;
font-size: 28rpx;
height: 60rpx;
}
.name-input {
padding-left: 40rpx;
}
}
.withdraw-notes {
margin-top: 40rpx;
.notes-title {
font-size: 28rpx;
color: #333;
margin-bottom: 20rpx;
}
.notes-list {
.note-item {
font-size: 26rpx;
color: #666;
line-height: 1.6;
margin-bottom: 10rpx;
}
}
}
}
.submit-btn-wrapper {
padding: 40rpx 30rpx;
.submit-btn {
width: 100%;
height: 88rpx;
background-color: $uni-color;
color: #fff;
font-size: 32rpx;
border-radius: 44rpx;
display: flex;
align-items: center;
justify-content: center;
border: none;
&:disabled {
background-color: #ccc;
color: rgba(255, 255, 255, 0.6);
}
}
}
</style>