wx-starlock/pages/user/updatePassword.vue
2025-07-29 11:07:43 +08:00

214 lines
5.0 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>
<input
class="input"
:password="true"
:value="password"
maxlength="20"
placeholder="请输入新密码"
placeholder-class="input-placeholder"
@input="updateNewPassword"
/>
<view class="view-top">
<input
type="number"
class="input-verify"
:value="verificationCode"
maxlength="6"
placeholder="请输入验证码"
placeholder-class="input-placeholder"
@input="updateInputCode"
/>
<view class="button-verify" @click="getPhoneCode">{{ text }}</view>
</view>
<view class="text-tips">密码必须是8-20至少包括数字/字母/符号中的2种</view>
<view class="button" @click="updatePassword">保存</view>
</view>
</template>
<script>
import { mapActions, mapState } from 'pinia'
import { test } from 'uview-plus'
import { useUserStore } from '@/stores/user'
import { changePasswordRequest, getEmailCodeRequest } from '@/api/user'
import { useBasicStore } from '@/stores/basic'
export default {
data() {
return {
text: '获取验证码',
password: '',
pending: false,
verificationCode: ''
}
},
computed: {
...mapState(useUserStore, ['userInfo'])
},
methods: {
...mapActions(useUserStore, ['updateUserInfo']),
...mapActions(useBasicStore, ['backAndToast', 'getNetworkType']),
updateNewPassword(data) {
this.password = data.detail.value
},
updateInputCode(data) {
this.verificationCode = data.detail.value
},
async getPhoneCode() {
if (this.text !== '获取验证码') {
return
}
const netWork = await this.getNetworkType()
if (!netWork) {
return
}
const { code, message } = await getEmailCodeRequest({
channel: '1',
codeType: 9
})
if (code === 0) {
this.updateTime()
} else {
uni.showToast({
title: message,
icon: 'none'
})
}
},
updateTime() {
let time = 120
this.text = `${time} s`
const now = new Date().getTime()
const timer = setInterval(() => {
const second = parseInt((new Date().getTime() - now) / 1000, 10)
this.text = `${time - second} s`
if (time <= second) {
clearInterval(timer)
this.text = '获取验证码'
}
}, 1000)
},
async updatePassword() {
if (this.password === '') {
uni.showToast({
title: '密码不能为空',
icon: 'none'
})
return
}
if (this.password.length < 8 || this.password.length > 20) {
uni.showToast({
title: '密码长度必须是8-20位',
icon: 'none'
})
return
}
if (!(this.verificationCode.length === 6 && test.digits(this.verificationCode))) {
uni.showToast({
title: '验证码为6位纯数字',
icon: 'none'
})
return
}
const netWork = await this.getNetworkType()
if (!netWork) {
return
}
if (this.pending) {
return
}
this.pending = true
const { code, message } = await changePasswordRequest({
verificationCode: this.verificationCode,
password: this.password,
channel: '1'
})
if (code === 0) {
this.backAndToast('密码重置成功')
} else {
uni.showToast({
title: message,
icon: 'none'
})
}
this.pending = false
}
}
}
</script>
<style lang="scss">
page {
background-color: $uni-bg-color-grey;
}
</style>
<style scoped lang="scss">
.input {
width: 616rpx;
height: 108rpx;
padding-right: 32rpx;
padding-left: 32rpx;
margin-top: 48rpx;
margin-left: 35rpx;
background: #ffffff;
border-radius: 16rpx;
}
.input-placeholder {
height: 108rpx;
font-size: 36rpx;
font-weight: bold;
line-height: 108rpx;
}
.button {
width: 680rpx;
height: 96rpx;
margin-top: 32rpx;
margin-left: 35rpx;
font-size: 32rpx;
line-height: 96rpx;
color: #ffffff;
text-align: center;
background: #4777ee;
border-radius: 16rpx;
}
.text-tips {
margin-top: 32rpx;
font-size: 28rpx;
color: #9b9b9b;
text-align: center;
}
.view-top {
display: flex;
align-items: center;
}
.input-verify {
width: 316rpx;
height: 108rpx;
padding-right: 32rpx;
padding-left: 32rpx;
margin-top: 48rpx;
margin-left: 35rpx;
background: #ffffff;
border-radius: 16rpx;
}
.button-verify {
width: 265rpx;
height: 108rpx;
margin-top: 48rpx;
margin-left: 35rpx;
font-size: 32rpx;
line-height: 108rpx;
color: #ffffff;
text-align: center;
background: #4777ee;
border-radius: 16rpx;
}
</style>