LFPay app项目
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.
 
 
 
 

508 lines
11 KiB

<template>
<view style="height: 100%;">
<view v-if="!showAdd" class="container" @click.stop="hideKeyboard">
<view class="main-content">
<view class="status-area">
<text class="status-text-title">
{{languageData.bank.addBank}}
</text>
</view>
<view class="status-area">
<text class="status-text">
{{languageData.bank.checkPwd}}
</text>
</view>
<view class="password-area" @click.stop="handleFocus">
<view
v-for="(item, index) in 6"
:key="index"
class="password-item"
:class="{ active: currentFocusIndex === index }"
>
<text v-if="password[index]" class="password-dot">●</text>
</view>
</view>
<view v-if="showKeyboard" @click.stop="hideKeyboard"/>
<!-- 键盘 -->
<master-keyboard ref="keyboard"
keyboardtype="number"
:randomNumber="true"
:defaultValue="password"
@keyboardClick="handleClick"
></master-keyboard>
<button class="confirm-btn" :class="{ 'confirm-btn-active': password.length === 6 }" @click="handleConfirm">{{languageData.bank.agree}}</button>
<text class="tip-text">{{languageData.bank.pwdConstitute}}</text>
</view>
</view>
<view v-if="showAdd">
<view class="container2">
<view class="card">
<view class="select-box" @click.stop="withoutCode()">
<text class="menu-text">{{languageData.bank.freeNum}}</text>
<uni-icons :size="20" type="bottom" color="#666"></uni-icons>
</view>
</view>
<view class="card">
<view class="card-title">
<text class="input-title">{{languageData.bank.inputCardNum}}</text>
<uni-tooltip class="uni-stat-tooltip"
:content="languageData.bank.support" placement="left">
<uni-icons type="help-filled" size="16" color="#999999" />
</uni-tooltip>
</view>
<view class="input-group">
<view class="input-label">{{languageData.bank.bankName}}</view>
<uni-easyinput v-model="param.bankName" :placeholder="languageData.bank.inputBankName" :inputBorder="false"></uni-easyinput>
</view>
<view class="input-group">
<view class="input-label">{{languageData.bank.cardNum}}</view>
<uni-easyinput v-model="param.cardNum" :placeholder="languageData.bank.inputBankNum" :inputBorder="false"></uni-easyinput>
</view>
<view class="button-wrapper">
<button class="next-button" @click="handleNext">{{languageData.bank.next}}</button>
</view>
</view>
</view>
<view class="">
<!-- 弹出层 -->
<uni-popup ref="bankListPopup" type="bottom">
<view class="popup-content">
<view class="popup-header">
<text class="popup-title">{{languageData.bank.agreeAgreement}}</text>
<uni-icons @click="closeBankList" type="close" size="20" color="#666666" />
</view>
<view class="bank-list">
<view class="bank-item" @click="selectBank(bank)">
<text class="bank-item-name">{{languageData.bank.userAgreement}}</text>
<text class="bank-item-name">{{languageData.bank.bankAgreement}}</text>
</view>
</view>
<view class="button-wrapper">
<button class="disAgree-button" @click.stop="closeClauseList()">{{languageData.bank.disagree}}</button>
<button class="agree-button" @click.stop="submitAdd()">{{languageData.bank.agree}}</button>
</view>
</view>
</uni-popup>
</view>
</view>
<loading ref="loading" :custom="false" :shadeClick="false" :type="1" />
</view>
</template>
<script>
import keyboard from "@/components/master-keyboard/master-keyboard.vue";
import { checkPwd } from '@/api/mine/payPwd.js'
import { addBankCard } from '@/api/bank/index.js'
export default {
components: {
'master-keyboard': keyboard
},
data() {
return {
password: '',
name:'',
currentFocusIndex: -1,
showAdd:false,
showKeyboard: false,
param:{
userId:this.$store.state.user.userId,
payPasswd:'',
cardNum:'',
bankName:''
},
}
},
mounted() {
},
onLoad() {
this.languageData = this.$languageData;
uni.setNavigationBarTitle({
title: this.$languageData.navBar.addCard
});
},
methods: {
// 提交
submitAdd(){
// 处理下一步逻辑
uni.showToast({
title: '处理中...',
icon: 'none'
})
this.$refs.loading.open();
addBankCard(this.param).then(res=>{
if(res.code=='200'){
setTimeout(()=>{
this.$refs.loading.close();
},1500)
uni.showToast({
title: '添加成功',
icon: 'success',
duration:1000
})
this.$tab.navigateTo('/pages/mine/bankCard/index')
// this.$tab.reLaunch('/pages/mine/bankCard/index')
// uni.navigateBack()
}else if(res.code=='500' && res.message=='该银行卡已存在'){
uni.showToast({
title: '该银行卡用户已添加',
icon: 'none',
duration:1000
})
}else{
uni.showToast({
title: '添加失败,请联系管理员',
icon: 'none',
duration:1000
})
}
})
this.closeClauseList()
},
showClauseList() {
this.$refs.bankListPopup.open();
},
closeClauseList() {
this.$refs.bankListPopup.close();
},
withoutCode(){
uni.showToast({
title: '功能建设中...',
icon: 'none'
})
},
handleNext() {
let regex = /^(62[0-9]{14,17}|4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6[0-9]{15,18})$/
// console.log("-----",regex.test(this.param.cardNum))
if (!this.param.cardNum) {
uni.showToast({
title: '请输入银行卡号',
icon: 'none'
})
return
} else if (!this.param.bankName.replace(/\s/g, "")) {
uni.showToast({
title: '请输入银行名称',
icon: 'none'
})
return
} else if (!regex.test(this.param.cardNum.replace(/\s/g, ""))) {
uni.showToast({
title: '请检查银行卡正确性',
icon: 'none'
})
return
}else{
this.showClauseList()
}
},
handleClick(e){
if (this.password.length < 7) {
this.password = e.value
}
this.password = this.password.slice(0, 6)
this.currentFocusIndex = this.password.length
},
handleFocus() {
this.showKeyboard = !this.showKeyboard
this.$refs.keyboard.open(this.showKeyboard)//true 键盘显示 false 键盘隐藏
this.currentFocusIndex = this.password.length
},
hideKeyboard() {
this.showKeyboard = !this.showKeyboard
},
validatePassword() {
if (this.password.length !== 6) {
uni.showToast({
title: '请输入6位数字密码',
icon: 'none'
})
return false
}
return true
},
handleConfirm() {
if (!this.validatePassword()) return
// 验证原密码
this.param.payPasswd = this.password
// 调用验证原密码的接口
checkPwd(this.param).then(res=>{
this.password = ''
this.param.payPasswd = ''
if(res.data!=null){
// 转到添加页面
// this.name =
this.showAdd = true
}else{
uni.showToast({
title: '密码错误',
icon: 'error',
duration: 1000
})
}
})
},
handleBack() {
uni.showModal({
title: '提示',
content: '确认要放弃添加银行卡吗?',
success: (res) => {
if (res.confirm) {
uni.navigateBack()
}
}
})
}
}
}
</script>
<style lang="scss" scoped>
page {
height: 100%;
}
.card-tooltip {
display: flex;
justify-content: center;
align-items: center;
width: 40px;
height: 40px;
background-color: #ebebeb;
border-radius: 10px;
margin: 5px;
}
.uni-stat-tooltip {
display: flex;
justify-content: flex-end;
min-width: 200rpx;
max-width: 600rpx;
max-height: 200rpx;
}
.card-title{
display: flex;
justify-content: space-between;
}
.container {
height: 100%;
background-color: #FFFFFF;
display: flex;
flex-direction: column;
}
.popup-content {
background-color: #FFFFFF;
border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx;
padding-bottom: env(safe-area-inset-bottom);
}
.bank-item-name {
font-size: 20rpx;
color: #00a5bd;
margin-bottom: 12rpx;
display: block;
}
.bank-item {
padding: 30rpx;
}
.bank-list {
max-height: 600rpx;
overflow-y: auto;
}
.popup-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
border-bottom: 1px solid #EEEEEE;
}
.popup-title {
font-size: 16px;
color: #333333;
font-weight: 500;
}
.container2{
padding: 30rpx;
}
.header {
position: relative;
height: 88rpx;
display: flex;
align-items: center;
justify-content: center;
border-bottom: 1px solid #F5F5F5;
flex-shrink: 0;
}
.back-icon {
position: absolute;
left: 32rpx;
width: 40rpx;
height: 40rpx;
}
.title {
font-size: 36rpx;
color: #333333;
font-weight: 500;
}
.menu-text {
font-size: 26rpx;
font-weight: 600;
color: #333333;
}
.main-content {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
padding: 48rpx 32rpx;
}
.status-area {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 28rpx;
}
.status-text-title {
font-size: 40rpx;
font-weight: bold;
color: #333333;
}
.status-text {
font-size: 30rpx;
color: #333333;
}
.password-area {
display: flex;
justify-content: center;
gap: 32rpx;
margin-bottom: 80rpx;
}
.password-item {
width: 80rpx;
height: 80rpx;
border: 2px solid #E5E5E5;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
}
.password-item.active {
border-color: #F9AF21;
}
.password-dot {
font-size: 38rpx;
// color: #333333;
color: #F9AF21;
}
.hidden-input {
position: absolute;
top: -999rpx;
left: -999rpx;
}
.confirm-btn {
width: 600rpx;
height: 88rpx;
background-color: #CCCCCC;
color: #FFFFFF;
font-size: 32rpx;
border-radius: 44rpx;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 32rpx;
}
.confirm-btn-active {
background-color: #F9AF21;
}
.tip-text {
font-size: 24rpx;
color: #999999;
}
.card {
background-color: #ffffff;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 30rpx;
}
.select-box {
position: relative;
display: flex;
justify-content: space-between;
}
.input-title {
font-size: 16px;
color: #333333;
margin-bottom: 30rpx;
font-weight: 600;
}
.input-group {
display: flex;
align-items: center;
margin-bottom: 10rpx;
}
.input-label {
font-size: 14px;
color: #333333;
margin-right: 20rpx;
flex-shrink: 0;
}
.button-wrapper {
padding: 20rpx 0;
display: flex;
padding-bottom: 50rpx;
}
.agree-button {
width: 40%;
height: 70rpx;
line-height: 70rpx;
background-color: #49d100;
color: #ffffff;
font-size: 16px;
text-align: center;
border: 0;
}
::v-deep .uni-button:after{
border: 0;
}
.disAgree-button{
width: 40%;
height: 70rpx;
line-height: 70rpx;
background-color: #e6e6e6;
color: #ffffff;
font-size: 16px;
text-align: center;
border: none;
}
.next-button {
width: 80%;
height: 80rpx;
line-height: 80rpx;
background-color: #f5f5f5;
color: #999999;
font-size: 16px;
text-align: center;
border: none;
}
.next-button:active {
opacity: 0.8;
}
</style>