Files
lucky_shop/pages_tool/member/pay_password.vue
2025-10-27 15:55:29 +08:00

279 lines
6.6 KiB
Vue
Raw Permalink 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>
<page-meta :page-style="themeColor"></page-meta>
<view class="container">
<view class="tips" v-if="step != 0">请输入6位支付密码建议不要使用重复或连续数字</view>
<view class="tips" v-else>验证码已发送至{{ memberInfo.mobile | mobile }}请在下方输入4位数字验证码</view>
<view class="password-wrap">
<myp-one :maxlength="step == 0 ? 4 : 6" :is-pwd="step != 0" @input="input" ref="input" :auto-focus="true"></myp-one>
<view v-show="step == 0" class="dynacode" :class="dynacodeData.seconds == 120 ? 'color-base-text' : 'color-tip'" @click="sendMobileCode">
{{ dynacodeData.codeText }}
</view>
<view class="action-tips" v-show="step == 0">输入短信验证码</view>
<view class="action-tips" v-show="step == 1">请设置支付密码</view>
<view class="action-tips" v-show="step == 2">请再次输入</view>
<view class="btn color-base-bg color-base-border" :class="{ disabled: !isClick }" @click="confirm">确认</view>
</view>
</view>
</template>
<script>
import mypOne from '@/pages_tool/components/myp-one/myp-one.vue';
export default {
components: {
mypOne
},
data() {
return {
isClick: false,
step: 1,
key: '', // 短信key
code: '', // 动态码
password: '', // 密码
repassword: '', // 重复密码
isSub: false, // 防重复提交
back: '', // 返回页
dynacodeData: {
seconds: 120,
timer: null,
codeText: '获取验证码',
isSend: false
}
};
},
onLoad(option) {
if (option.back) this.back = option.back;
// 判断登录
if (!this.storeToken) {
this.$util.redirectTo('/pages_tool/login/login');
} else {
if (this.memberInfo.mobile == '') {
uni.showModal({
title: '提示',
content: '设置支付密码需要先绑定手机号,是否立即绑定?',
success: res => {
if (res.confirm) {
this.$util.redirectTo('/pages_tool/member/info', {
action: 'mobile',
back: this.back
}, 'redirectTo');
} else {
if (this.back) this.$util.redirectTo(this.back);
else this.$util.redirectTo('/pages/member/index');
}
}
});
} else {
this.step = 0;
this.sendMobileCode();
}
}
},
methods: {
input(val) {
if (this.step == 0) {
if (val.length == 4) {
this.isClick = true;
this.code = val;
} else {
this.isClick = false;
}
} else if (this.step == 1) {
if (val.length == 6) {
this.isClick = true;
this.password = val;
} else {
this.isClick = false;
}
} else {
if (val.length == 6) {
this.isClick = true;
this.repassword = val;
} else {
this.isClick = false;
}
}
},
confirm() {
if (this.isClick) {
if (this.step == 0) {
this.$api.sendRequest({
url: '/api/member/verifypaypwdcode',
data: {
code: this.code,
key: this.key
},
success: res => {
if (res.code == 0) {
this.$refs.input.clear();
this.isClick = false;
this.step = 1;
} else {
this.$util.showToast({
title: res.message
});
}
}
});
} else if (this.step == 1) {
this.$refs.input.clear();
this.isClick = false;
this.step = 2;
} else {
if (this.password == this.repassword) {
if (this.isSub) return;
this.isSub = true;
this.$api.sendRequest({
url: '/api/member/modifypaypassword',
data: {
key: this.key,
code: this.code,
password: this.password
},
success: res => {
if (res.code >= 0) {
this.$util.showToast({
title: '修改成功'
});
setTimeout(() => {
if (this.back) this.$util.redirectTo(this.back, {},
'redirectTo');
else this.$util.redirectTo('/pages/member/index');
}, 2000);
} else {
this.initInfo();
this.$util.showToast({
title: res.message
});
}
}
});
} else {
this.$util.showToast({
title: '两次输入的密码不一致',
success: res => {
this.initInfo();
}
});
}
}
}
},
initInfo() {
this.isClick = false;
this.step = 1;
this.password = '';
this.repassword = '';
this.oldpassword = '';
this.isSub = false;
this.$refs.input.clear();
},
/**
* 发送手机动态码
*/
sendMobileCode() {
if (this.dynacodeData.seconds != 120) return;
if (this.dynacodeData.isSend) return;
this.dynacodeData.isSend = true;
this.$api.sendRequest({
url: '/api/member/paypwdcode',
success: res => {
this.dynacodeData.isSend = false;
if (res.code >= 0) {
this.key = res.data.key;
if (this.dynacodeData.seconds == 120 && this.dynacodeData.timer == null) {
this.dynacodeData.timer = setInterval(() => {
this.dynacodeData.seconds--;
this.dynacodeData.codeText = this.dynacodeData.seconds + 's后可重新获取';
}, 1000);
}
} else {
this.$util.showToast({
title: res.message
});
}
},
fail: () => {
this.$util.showToast({
title: 'request:fail'
});
this.dynacodeData.isSend = false;
}
});
}
},
filters: {
mobile(mobile) {
return mobile.substring(0, 4 - 1) + '****' + mobile.substring(6 + 1);
}
},
watch: {
'dynacodeData.seconds': {
handler(newValue, oldValue) {
if (newValue == 0) {
clearInterval(this.dynacodeData.timer);
this.dynacodeData = {
seconds: 120,
timer: null,
codeText: '获取动态码',
isSend: false
};
}
},
immediate: true,
deep: true
}
}
};
</script>
<style lang="scss">
.container {
width: 100vw;
height: 100vh;
background: #fff;
.tips {
width: 60%;
margin: 0 auto;
text-align: center;
padding-top: 100rpx;
}
.password-wrap {
width: 80%;
margin: 0 auto;
margin-top: 40rpx;
.action-tips {
text-align: center;
font-weight: 600;
margin-top: 80rpx;
}
.dynacode {
line-height: 1;
margin-top: 20rpx;
font-size: $font-size-tag;
}
.btn {
margin: 0 auto;
margin-top: 30rpx;
height: 80rpx;
line-height: 80rpx;
border-radius: $border-radius;
color: #fff;
text-align: center;
&.disabled {
background: #ccc !important;
border-color: #ccc !important;
color: #fff;
}
}
}
}
</style>