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

303 lines
7.8 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>
<view class="tips">
<!-- #ifdef MP-WEIXIN -->
{{
type === 'email'
? '在APP上找回密码和登录新设备时可通过绑定的邮箱验证'
: '在APP上找回密码和登录新设备时可通过绑定的手机号验证'
}}
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
{{
type === 'email'
? '找回密码和登录新设备时,可通过绑定的邮箱验证'
: '找回密码和登录新设备时,可通过绑定的手机号验证'
}}
<!-- #endif -->
</view>
<view class="view-country" v-if="type === 'mobile'" @click="toJump('countryList')">
<view>国家/地区</view>
<view class="text-#63b8af">{{ country.name }} +{{ country.code }}</view>
</view>
<input
:type="type === 'email' ? 'text' : 'number'"
class="input-account"
:value="email"
:placeholder="type === 'email' ? '请输入邮箱' : '请输入手机号'"
placeholder-class="input-placeholder"
:focus="true"
@input="updateInputEmail"
/>
<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="getEmailCode">{{ text }}</view>
</view>
<view class="button" @click="toUpdateEmail">确定</view>
</view>
</template>
<script>
import { mapActions, mapState } from 'pinia'
import { useUserStore } from '@/stores/user'
import { getEmailCodeRequest, updateEmailRequest, updatePhoneRequest } from '@/api/user'
import { useBasicStore } from '@/stores/basic'
import { PHONE_REG, EMAIL_REG } from '@/constant/reg'
export default {
data() {
return {
text: '获取验证码',
verificationCode: '',
token: '',
email: '',
pending: false,
type: '',
country: {
name: '中国',
code: '86'
}
}
},
computed: {
...mapState(useUserStore, ['userInfo']),
isAccountValid() {
if (!this.email) {
return false
}
if (this.type === 'email') {
return EMAIL_REG.test(this.email)
}
if (this.type === 'mobile') {
return PHONE_REG.test(this.email)
}
return false
}
},
onLoad(option) {
this.type = option.type
uni.setNavigationBarTitle({
title: this.type === 'email' ? '验证邮箱' : '验证手机号'
})
if (option.token) {
this.token = option.token
} else {
uni.setNavigationBarTitle({
title: this.type === 'email' ? '绑定邮箱' : '绑定手机号'
})
}
},
methods: {
...mapActions(useUserStore, ['updateUserInfo']),
...mapActions(useBasicStore, ['routeJump', 'backAndToast', 'getNetworkType']),
toJump(path) {
this.routeJump({
name: path,
events: {
country: data => {
this.country = data
}
}
})
},
updateInputEmail(data) {
this.email = data.detail.value
},
updateInputCode(data) {
this.verificationCode = data.detail.value
},
async getEmailCode() {
if (this.text !== '获取验证码') {
return
}
if (!this.isAccountValid) {
uni.showToast({
title: this.type === 'email' ? '请输入正确的邮箱' : '请输入正确的手机号',
icon: 'none'
})
return
}
const netWork = await this.getNetworkType()
if (!netWork) {
return
}
const { code, message } = await getEmailCodeRequest({
account: this.email,
channel: this.type === 'email' ? '2' : '1',
codeType: this.type === 'email' ? 6 : 3,
countryCode: this.type === 'mobile' ? this.country.code : undefined
})
if (code === 0) {
this.updateTime()
} else {
uni.showToast({
title: message,
icon: 'none'
})
}
},
async toUpdateEmail() {
if (!this.isAccountValid) {
uni.showToast({
title: this.type === 'email' ? '请输入正确的邮箱' : '请输入正确的手机号',
icon: 'none'
})
return
}
if (/^\d{6}$/.test(this.verificationCode)) {
const netWork = await this.getNetworkType()
if (!netWork) {
return
}
if (this.pending) {
return
}
this.pending = true
const params = {
verificationCode: this.verificationCode
}
if (this.type === 'email') {
params.email = this.email
} else {
params.account = this.email
params.countryCode = this.country.code
}
if (this.token !== '') {
params.unbindToken = this.token
}
const request = this.type === 'email' ? updateEmailRequest : updatePhoneRequest
const { code, message } = await request(params)
if (code === 0) {
this.updateUserInfo({
...this.userInfo,
[this.type]: this.email
})
this.backAndToast(this.type === 'email' ? '邮箱绑定成功' : '手机号绑定成功')
} else {
uni.showToast({
title: message,
icon: 'none'
})
}
this.pending = false
} else {
uni.showToast({
title: '验证码为6位纯数字',
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)
}
}
}
</script>
<style lang="scss">
page {
background-color: $uni-bg-color-grey;
}
</style>
<style scoped lang="scss">
.tips {
padding: 24rpx 32rpx 0 32rpx;
font-size: 28rpx;
color: #999999;
}
.view-country {
display: flex;
justify-content: space-between;
width: 616rpx;
height: 108rpx;
padding-right: 32rpx;
padding-left: 32rpx;
margin-top: 48rpx;
margin-left: 35rpx;
font-size: 28rpx;
line-height: 108rpx;
background: #ffffff;
border-radius: 16rpx;
}
.input-account {
width: 616rpx;
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;
}
.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;
}
.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;
}
</style>