2
0

feat:忘记密码功能完善

This commit is contained in:
zhongzm
2025-02-13 16:51:07 +08:00
parent e471f24764
commit 29f58edef6
3 changed files with 69 additions and 23 deletions

View File

@@ -66,7 +66,7 @@ export const useAppStore = defineStore(SetupStoreId.App, () => {
setTimeout(() => {
window.location.reload();
}, 100);
}, 50);
}
/** Update document title by locale */

View File

@@ -118,8 +118,8 @@ async function getCheckCode() {
<ASpace direction="vertical" size="large" class="w-full">
<div class="flex-y-center justify-between">
<ACheckbox>{{ $t('page.login.pwdLogin.rememberMe') }}</ACheckbox>
<!-- <AButton type="text" @click="toggleLoginModule('reset-pwd')">{{ t('page.login.pwdLogin.forgetPassword') }}</AButton>-->
<!-- <ACheckbox>{{ $t('page.login.pwdLogin.rememberMe') }}</ACheckbox>-->
<AButton type="text" @click="toggleLoginModule('reset-pwd')">{{ t('page.login.pwdLogin.forgetPassword') }}</AButton>
</div>
<AButton type="primary" block size="large" shape="round" :loading="authStore.loginLoading" @click="handleSubmit">
{{ $t('common.confirm') }}

View File

@@ -2,12 +2,14 @@
import { computed, reactive } from 'vue';
import { useRouterPush } from '@/hooks/common/router';
import { useAntdForm, useFormRules } from '@/hooks/common/form';
import {useCaptcha} from "@/hooks/business/captcha";
import {useI18n} from "vue-i18n";
import { useCaptcha } from "@/hooks/business/captcha";
import { useI18n } from "vue-i18n";
import { resetPasswordByEmail } from '@/service/api/auth';
defineOptions({
name: 'ResetPwd'
});
const { t } = useI18n();
const { toggleLoginModule } = useRouterPush();
const { formRef, validate } = useAntdForm();
@@ -18,13 +20,15 @@ interface FormModel {
code: string;
password: string;
confirmPassword: string;
uuid: string;
}
const model: FormModel = reactive({
email: '',
code: '',
password: '',
confirmPassword: ''
confirmPassword: '',
uuid: ''
});
type RuleRecord = Partial<Record<keyof FormModel, App.Global.FormRule[]>>;
@@ -32,19 +36,61 @@ type RuleRecord = Partial<Record<keyof FormModel, App.Global.FormRule[]>>;
const rules = computed<RuleRecord>(() => {
const { formRules, createConfirmPwdRule } = useFormRules();
const passwordValidateRule: App.Global.FormRule = {
validator: (_rule: any, value: string) => {
if (!value) {
return Promise.reject(t('page.login.register.passwordRequired'));
}
if (value.length < 6 || value.length > 20) {
return Promise.reject(t('page.login.register.passwordLength'));
}
if (!/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,20}$/.test(value)) {
return Promise.reject(t('page.login.register.passwordFormat'));
}
return Promise.resolve();
}
};
return {
//phone: formRules.phone,
email:formRules.email,
code:formRules.code,
password: formRules.pwd,
email: [
{ required: true, message: t('page.login.register.emailRequired') },
{ type: 'email', message: t('page.login.register.emailInvalid') }
],
code: [{ required: true, message: t('page.login.register.codeRequired') }],
password: [
{ required: true, message: t('page.login.register.passwordRequired') },
passwordValidateRule
],
confirmPassword: createConfirmPwdRule(model.password)
};
});
async function handleCaptcha() {
const res = await getCaptcha(model.email);
if (res) {
model.uuid = res.data.uuid;
if (res.data?.text) {
model.code = res.data.text;
}
}
}
async function handleSubmit() {
try {
await validate();
// request to reset password
$message?.success(t('page.login.common.validateSuccess'));
await resetPasswordByEmail({
email: model.email,
code: model.code,
password: model.password
});
window.$message?.success(t('page.login.resetPwd.resetSuccess'));
toggleLoginModule('pwd-login');
} catch (error) {
console.error('Reset password failed:', error);
window.$message?.error(t('page.login.resetPwd.resetFailed'));
}
}
</script>
@@ -53,14 +99,14 @@ async function handleSubmit() {
<AFormItem name="email">
<AInput v-model:value="model.email" size="large" :placeholder="t('page.login.common.emailPlaceholder')" />
</AFormItem>
<AFormItem name="code" >
<AFormItem name="code">
<div class="w-full flex-y-center gap-8px">
<AInput v-model:value="model.code" size="large" :placeholder="t('page.login.common.codePlaceholder')" />
<AButton
size="small"
:disabled="isCounting"
:loading="loading"
@click="getCaptcha(model.email)"
@click="handleCaptcha"
>
{{ label }}
</AButton>