diff --git a/src/store/modules/app/index.ts b/src/store/modules/app/index.ts index 4db3aef..ecbf135 100644 --- a/src/store/modules/app/index.ts +++ b/src/store/modules/app/index.ts @@ -66,7 +66,7 @@ export const useAppStore = defineStore(SetupStoreId.App, () => { setTimeout(() => { window.location.reload(); - }, 100); + }, 50); } /** Update document title by locale */ diff --git a/src/views/_builtin/login/modules/pwd-login.vue b/src/views/_builtin/login/modules/pwd-login.vue index 41978cc..ec468cf 100644 --- a/src/views/_builtin/login/modules/pwd-login.vue +++ b/src/views/_builtin/login/modules/pwd-login.vue @@ -118,8 +118,8 @@ async function getCheckCode() {
- {{ $t('page.login.pwdLogin.rememberMe') }} - + + {{ t('page.login.pwdLogin.forgetPassword') }}
{{ $t('common.confirm') }} diff --git a/src/views/_builtin/login/modules/reset-pwd.vue b/src/views/_builtin/login/modules/reset-pwd.vue index bf03805..6c76f84 100644 --- a/src/views/_builtin/login/modules/reset-pwd.vue +++ b/src/views/_builtin/login/modules/reset-pwd.vue @@ -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>; @@ -32,19 +36,61 @@ type RuleRecord = Partial>; const rules = computed(() => { 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() { - await validate(); - // request to reset password - $message?.success(t('page.login.common.validateSuccess')); + try { + await validate(); + + 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')); + } } @@ -53,17 +99,17 @@ async function handleSubmit() { - +
- - - {{ label }} - + + + {{ label }} +