197 lines
5.6 KiB
Vue

<template>
<a-form ref="emailResetFormRef" :model="emailFormData" :rules="formRules">
<a-form-item name="email">
<a-input v-model:value="emailFormData.email" :placeholder="$t('login.emailPlaceholder')" size="large">
<template #prefix>
<mail-outlined style="color: rgba(0, 0, 0, 0.25)" />
</template>
</a-input>
</a-form-item>
<a-form-item name="emailValidCode">
<a-row :gutter="8">
<a-col :span="17">
<a-input
v-model:value="emailFormData.emailValidCode"
:placeholder="$t('login.emailCodePlaceholder')"
size="large"
>
<template #prefix>
<mail-outlined style="color: rgba(0, 0, 0, 0.25)" />
</template>
</a-input>
</a-col>
<a-col :span="7">
<a-button size="large" style="width: 100%" @click="getEmailValidCode" :disabled="state.smsSendBtn">{{
(!state.smsSendBtn && $t('login.getSmsCode')) || state.time + ' s'
}}</a-button>
</a-col>
</a-row>
</a-form-item>
<a-form-item name="newPassword">
<a-input-password
v-model:value="emailFormData.newPassword"
:placeholder="$t('login.newPwdPlaceholder')"
size="large"
>
<template #prefix>
<LockOutlined style="color: rgba(0, 0, 0, 0.25)" />
</template>
</a-input-password>
</a-form-item>
<a-form-item>
<a-row :gutter="8">
<a-col :span="7">
<a-button style="width: 100%" round size="large" href="/login">{{ $t('login.backLogin') }}</a-button>
</a-col>
<a-col :span="17">
<a-button type="primary" style="width: 100%" :loading="islogin" round size="large" @click="submitReset">{{
$t('login.restPassword')
}}</a-button>
</a-col>
</a-row>
</a-form-item>
</a-form>
<a-modal
v-model:visible="visible"
:width="400"
:title="$t('login.machineValidation')"
@cancel="handleCancel"
@ok="handleOk"
>
<a-form ref="emailLoginFormModalRef" :model="emailFormModalData" :rules="formModalRules">
<a-form-item name="validCode">
<a-row :gutter="8">
<a-col :span="17">
<a-input
v-model:value="emailFormModalData.validCode"
:placeholder="$t('login.validLaceholder')"
size="large"
>
<template #prefix>
<verified-outlined style="color: rgba(0, 0, 0, 0.25)" />
</template>
</a-input>
</a-col>
<a-col :span="7">
<img
:src="validCodeBase64"
style="border: 1px solid var(--border-color-split); cursor: pointer; width: 100%; height: 40px"
@click="getPhonePicCaptcha"
/>
</a-col>
</a-row>
</a-form-item>
</a-form>
</a-modal>
</template>
<script setup name="emailFindForm">
import { message } from 'ant-design-vue'
import router from '@/router'
import { required, rules } from '@/utils/formRules'
import userCenterApi from '@/api/sys/userCenterApi'
import smCrypto from '@/utils/smCrypto'
const emailResetFormRef = ref()
const emailFormData = ref({})
const islogin = ref(false)
let state = ref({
time: 60,
smsSendBtn: false
})
let formRules = ref({})
const emailValidCodeReqNo = ref('')
// 点击获取邮箱验证码
const getEmailValidCode = () => {
formRules.value.email = [required(), rules.email]
delete formRules.value.emailValidCode
delete formRules.value.newPassword
emailResetFormRef.value.validate().then(() => {
// 显示弹框
visible.value = true
// 获取内部图片验证码
getPhonePicCaptcha()
})
}
// 点击找回按钮
const submitReset = () => {
formRules.value.email = [required(), rules.email]
formRules.value.emailValidCode = [required(), rules.number]
formRules.value.newPassword = [required()]
emailResetFormRef.value.validate().then(() => {
emailFormData.value.validCode = emailFormData.value.emailValidCode
emailFormData.value.validCodeReqNo = emailValidCodeReqNo.value
emailFormData.value.newPassword = smCrypto.doSm2Encrypt(emailFormData.value.newPassword)
islogin.value = true
userCenterApi
.userFindPasswordByEmail(emailFormData.value)
.then(() => {
router.replace({
path: '/'
})
message.success('找回成功')
})
.finally(() => {
islogin.value = false
})
})
}
// 弹框的
const visible = ref(false)
const emailLoginFormModalRef = ref()
const emailFormModalData = ref({})
const validCodeBase64 = ref('')
const formModalRules = {
validCode: [required(), rules.lettersNum]
}
const getPhonePicCaptcha = () => {
userCenterApi.userGetPicCaptcha().then((data) => {
validCodeBase64.value = data.validCodeBase64
emailFormModalData.value.validCodeReqNo = data.validCodeReqNo
})
}
const handleCancel = () => {
visible.value = false
}
const handleOk = () => {
// 获取到里面的验证码,并发送邮箱
emailLoginFormModalRef.value.validate().then(() => {
visible.value = false
// 发送邮箱,首先拿到刚刚输入的邮箱
emailFormModalData.value.email = emailFormData.value.email
// 禁用发送按钮,并设置为倒计时
state.value.smsSendBtn = true
const interval = window.setInterval(() => {
if (state.value.time-- <= 0) {
state.value.time = 60
state.value.smsSendBtn = false
window.clearInterval(interval)
}
}, 1000)
const hide = message.loading('验证码发送中..', 0)
userCenterApi
.userFindPasswordGetEmailValidCode(emailFormModalData.value)
.then((data) => {
emailValidCodeReqNo.value = data
visible.value = false
setTimeout(hide, 500)
})
.catch(() => {
setTimeout(hide, 100)
clearInterval(interval)
state.value.smsSendBtn = false
})
.finally(() => {
emailFormModalData.value.validCode = ''
})
})
}
</script>
<style scoped></style>