本次提交对全项目的国际化调用进行了规范化重构:
1. 为中文/英文语言包新增了avatar和gender的别名映射,兼容旧有headImg/sex写法
2. 修正了lang.js中的注释路径错误
3. 将所有页面和组件内的$lang调用从短路径改为带业务模块前缀的完整命名空间路径,例如将$lang('title')改为$lang('article.list.title')
4. 优化了i18n-lazy.js的注释说明,补充了正确的key命名格式示例
5. 统一了分销、订单、会员等模块的国际化key层级,确保所有语言调用路径一致
281 lines
6.8 KiB
Vue
281 lines
6.8 KiB
Vue
<template>
|
|
<view :style="themeColor" class="container">
|
|
<view class="tips" v-if="step != 0">{{ $lang('member.pay_password.passwordTips') }}</view>
|
|
<view class="tips" v-else>{{ $lang('member.pay_password.codeSentTips', { mobile: memberInfo.mobile | mobile }) }}</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">{{ $lang('member.pay_password.inputSmsCode') }}</view>
|
|
<view class="action-tips" v-show="step == 1">{{ $lang('member.pay_password.setPayPassword') }}</view>
|
|
<view class="action-tips" v-show="step == 2">{{ $lang('member.pay_password.inputAgain') }}</view>
|
|
<view class="btn color-base-bg color-base-border" :class="{ disabled: !isClick }" @click="confirm">{{ $lang('member.pay_password.confirm') }}</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import mypOne from '../_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;
|
|
|
|
this.dynacodeData.codeText = this.$lang('member.pay_password.getCode');
|
|
|
|
// 判断登录
|
|
if (!this.storeToken) {
|
|
this.$util.redirectTo(this.$util.LOGIN_PAGE_URL);
|
|
} else {
|
|
if (this.memberInfo.mobile == '') {
|
|
uni.showModal({
|
|
title: this.$lang('member.pay_password.tipsTitle'),
|
|
content: this.$lang('member.pay_password.bindMobileFirst'),
|
|
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(this.$util.MEMBER_PAGE_URL);
|
|
}
|
|
}
|
|
});
|
|
} 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: this.$lang('member.pay_password.modifySuccess')
|
|
});
|
|
setTimeout(() => {
|
|
if (this.back) this.$util.redirectTo(this.back, {},
|
|
'redirectTo');
|
|
else this.$util.redirectTo(this.$util.MEMBER_PAGE_URL);
|
|
}, 2000);
|
|
} else {
|
|
this.initInfo();
|
|
this.$util.showToast({
|
|
title: res.message
|
|
});
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
this.$util.showToast({
|
|
title: this.$lang('member.pay_password.passwordMismatch'),
|
|
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.$lang('member.pay_password.resendAfter', { seconds: this.dynacodeData.seconds });
|
|
}, 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: this.$lang('getDynacode'),
|
|
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>
|