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.

295 lines
11 KiB

<template>
<div class="app-container">
5 years ago
<div v-if="retrieveStep===1" class="pwd-container">
<div>
5 years ago
<h4 class="title">找回密码</h4>
<el-tabs
v-model="retrieveType" class="login-form"
>
<el-tab-pane label="手机找回" name="phone">
<el-form ref="phoneForm" :model="retrieveAccountForm" :rules="phoneRules" label-width="0px">
<el-form-item prop="phoneNumber">
<el-input v-model="retrieveAccountForm.phoneNumber" autocomplete="off"
placeholder="请输入手机号"
5 years ago
/>
</el-form-item>
<el-form-item label="" prop="code">
4 years ago
<el-input v-model="retrieveAccountForm.code" class="width50" autocomplete="off" placeholder="请输入验证码" />
<el-button :disabled="emailValidateCodeBtn" class="ml-20" type="primary"
5 years ago
@click="sendPhoneValidateCodeHandle"
>
{{ emailValidateCodeBtnText }}
</el-button>
</el-form-item>
<el-form-item>
4 years ago
<el-button class="width-full" type="primary" @click="phoneRetrievePassWordHandle">
5 years ago
找回密码
</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="邮箱找回" name="email">
<el-form ref="emailForm" :model="retrieveAccountForm" :rules="emailRules"
5 years ago
label-width="0px"
status-icon
5 years ago
>
<el-form-item label="" prop="email">
<el-input v-model="retrieveAccountForm.email" autocomplete="off" placeholder="请输入邮箱" />
5 years ago
</el-form-item>
<el-form-item>
4 years ago
<el-button class="width-full" type="primary" @click="sendEmailValidateHandle">
5 years ago
找回密码
</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</div>
5 years ago
<div v-if="retrieveStep===2" class="reset-pwd-view">
<div>
5 years ago
<h4 class="title">重置密码</h4>
<div class="rest-pwd-user-view">
<i class="el-icon-user" />
<span>{{ resetAccount }}</span>
</div>
<el-form ref="resetPwdForm" :model="resetPwdForm" :rules="pwdRules" label-width="0px">
5 years ago
<el-form-item label="" prop="password">
<el-input v-model="resetPwdForm.password" autocomplete="off" placeholder="请输入密码"
show-password
5 years ago
/>
</el-form-item>
<el-form-item label="" prop="rePassword">
<el-input v-model="resetPwdForm.rePassword" autocomplete="off" placeholder="请再次输入密码"
show-password
5 years ago
/>
</el-form-item>
<el-form-item>
4 years ago
<el-button type="primary" @click="resetPasswordHandle">
5 years ago
提交
</el-button>
</el-form-item>
</el-form>
</div>
</div>
5 years ago
<div v-if="retrieveStep==3" class="msg-view">
<p>
我们已向你的邮箱中发送了重置密码的邮件请查看并点击邮件中的链接
没有收到邮件请检查您的垃圾邮件或者重新发送
</p>
</div>
</div>
</template>
<script>
5 years ago
import constants from '@/utils/constants'
5 years ago
export default {
name: 'RetrievePwd',
data() {
5 years ago
let validateRePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请再次输入密码'))
} else if (value !== this.resetPwdForm.rePassword) {
callback(new Error('两次输入密码不一致!'))
} else {
callback()
}
}
return {
5 years ago
retrieveStep: 1,
retrieveType: 'phone',
5 years ago
emailValidateCodeBtn: false,
emailValidateCodeBtnText: '发送验证码',
5 years ago
emailSendSuccess: true,
retrieveAccountForm: {
5 years ago
phoneNumber: '',
email: '',
password: ''
},
5 years ago
resetAccount: '',
resetPwdForm: {
code: '',
password: '',
rePassword: ''
},
phoneRules: {
phoneNumber: [
{required: true, trigger: 'blur', message: '请输入手机号'},
{
5 years ago
pattern: /^(?:0|86|\+86)?1[3456789]\d{9}$/,
message: '请输入正确的手机号'
}
],
code: {required: true, trigger: 'blur', message: '请输入验证码'}
5 years ago
},
5 years ago
emailRules: {
email: [
{required: true, trigger: 'blur', message: '请输入邮箱'},
{
pattern: /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/,
message: '请输入正确的邮箱'
}
]
},
5 years ago
pwdRules: {
5 years ago
password: [
{required: true, trigger: 'blur', message: '请输入新密码'},
{
pattern: constants.passwordReg,
message: constants.passwordRegDesc
}
],
5 years ago
rePassword: [{required: true, trigger: 'blur', validator: validateRePass}]
}
}
},
created() {
let code = this.$route.query.code
if (code) {
5 years ago
this.resetAccount = this.$route.query.email
this.resetPwdForm.code = code
5 years ago
this.retrieveStep = 2
}
},
methods: {
sendPhoneValidateCodeHandle() {
this.$refs['phoneForm'].validateField('phoneNumber', err => {
if (!err) {
4 years ago
this.sendPhoneValidateCode()
5 years ago
}
})
},
4 years ago
sendPhoneValidateCode() {
5 years ago
let phoneNumber = this.retrieveAccountForm.phoneNumber
5 years ago
this.$refs['phoneForm'].validateField('phoneNumber', err => {
if (!err) {
this.emailValidateCodeBtn = true
5 years ago
this.$api.request({
url: '/retrieve/password/phone/code',
method: 'get',
4 years ago
params: {phoneNumber: phoneNumber}
5 years ago
}).then(() => {
5 years ago
this.msgSuccess('验证码发送成功,5分钟内有效')
this.emailValidateCodeBtn = true
let count = 60
let timer = setInterval(() => {
count--
this.emailValidateCodeBtnText = count + 's后重新发送'
if (count == 0) {
this.emailValidateCodeBtnText = '发送验证码'
this.emailValidateCodeBtn = false
clearInterval(timer)
}
}, 1000)
})
}
})
},
phoneRetrievePassWordHandle() {
this.$refs['phoneForm'].validate(valid => {
if (valid) {
this.$api.post('/retrieve/password/check/phone-code', this.retrieveAccountForm).then(res => {
if (res.data) {
this.msgSuccess('验证成功')
this.resetPwdForm.code = res.data
this.resetAccount = this.retrieveAccountForm.phoneNumber
this.retrieveStep = 2
}
})
}
})
},
resetPasswordHandle() {
this.$refs['resetPwdForm'].validate(valid => {
if (valid) {
this.$api.post('/retrieve/password/reset', this.resetPwdForm).then(res => {
if (res.data) {
this.msgSuccess('密码重置成功,快去登录吧')
5 years ago
setTimeout(() => {
this.$router.push({path: '/login'})
}, 2000)
5 years ago
}
})
}
})
},
sendEmailValidateHandle() {
this.$refs['emailForm'].validateField('email', err => {
if (!err) {
4 years ago
this.sendEmailValidate()
5 years ago
}
})
},
4 years ago
sendEmailValidate() {
5 years ago
this.$refs['emailForm'].validate(valid => {
if (valid) {
this.$api.request({
url: '/retrieve/password/email',
method: 'get',
4 years ago
params: {email: this.retrieveAccountForm.email}
5 years ago
}).then(() => {
this.retrieveStep = 3
})
5 years ago
}
})
}
}
}
</script>
5 years ago
<style lang="scss" scoped>
4 years ago
@import '@/assets/styles/mixin.scss';
.app-container {
height: 100%;
width: 100%;
display: flex;
justify-content: center;
align-content: center;
}
5 years ago
.title {
color: rgba(16, 16, 16, 100);
font-size: 28px;
text-align: center;
}
.pwd-container {
width: 20%;
height: 50%;
5 years ago
align-content: center;
div {
width: 350px;
5 years ago
}
}
.reset-pwd-view {
div {
width: 350px;
.rest-pwd-user-view {
line-height: 80px;
height: 100px;
padding: 10px;
.el-icon-user {
display: inline-block;
width: 20%;
color: #717171;
text-align: left;
font-size: 50px;
}
span {
color: #4c4c4c;
display: inline-block;
text-align: center;
font-size: 19px;
width: 80%;
}
}
5 years ago
}
}
5 years ago
.msg-view {
@include position-center(xy);
text-align: center;
color: #929292;
width: 30%;
}
</style>