From e471f24764c739fc6d6ce7f534511703db5eea35 Mon Sep 17 00:00:00 2001 From: zhongzm Date: Thu, 13 Feb 2025 16:20:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E9=82=AE=E7=AE=B1?= =?UTF-8?q?=E9=87=8D=E7=BD=AE=E5=AF=86=E7=A0=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/langs/en-us.ts | 3 ++- src/service/api/auth.ts | 9 +++++++- src/typings/auto-imports.d.ts | 1 + src/views/userInfo/resetpwd/index.vue | 31 +++++++++++++++++++++++---- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/locales/langs/en-us.ts b/src/locales/langs/en-us.ts index d438dbe..ddeb18a 100644 --- a/src/locales/langs/en-us.ts +++ b/src/locales/langs/en-us.ts @@ -282,7 +282,8 @@ const local: any = { passwordLength: 'Password must be at least 6 characters', resetSuccess: 'Password reset successfully', resetFailed: 'Password reset failed, please try again', - byPassword:'reset by current Password' + byPassword:'Reset by current Password', + byEmail: 'Reset by email verification code', }, bindWeChat: { title: 'Bind WeChat' diff --git a/src/service/api/auth.ts b/src/service/api/auth.ts index f390dcb..260ceaa 100644 --- a/src/service/api/auth.ts +++ b/src/service/api/auth.ts @@ -198,7 +198,14 @@ export function resetPassword(data: { oldPassword: string; newPassword: string } params: data }); } - +/** Reset password by email */ +export function resetPasswordByEmail(data: { email: string; code: string; password: string }) { + return request({ + url: '/u/user/profile/forgotPwd', + method: 'put', + params: data + }); +} diff --git a/src/typings/auto-imports.d.ts b/src/typings/auto-imports.d.ts index 896f459..796de0b 100644 --- a/src/typings/auto-imports.d.ts +++ b/src/typings/auto-imports.d.ts @@ -197,6 +197,7 @@ declare global { const refWithControl: typeof import('@vueuse/core')['refWithControl'] const removeEmptyChildren: typeof import('../utils/menu')['removeEmptyChildren'] const resetPassword: typeof import('../service/api/auth')['resetPassword'] + const resetPasswordByEmail: typeof import('../service/api/auth')['resetPasswordByEmail'] const resolveComponent: typeof import('vue')['resolveComponent'] const resolveRef: typeof import('@vueuse/core')['resolveRef'] const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] diff --git a/src/views/userInfo/resetpwd/index.vue b/src/views/userInfo/resetpwd/index.vue index 928db69..98a36eb 100644 --- a/src/views/userInfo/resetpwd/index.vue +++ b/src/views/userInfo/resetpwd/index.vue @@ -13,7 +13,7 @@ import { Radio, } from 'ant-design-vue'; import { useRouter } from 'vue-router'; -import { resetPassword } from '@/service/api/auth'; +import { resetPassword, resetPasswordByEmail } from '@/service/api/auth'; const AInputPassword = Input.Password; const ARadioGroup = Radio.Group; @@ -47,10 +47,28 @@ const formModel = reactive({ const formRules = computed>(() => { const { createConfirmPwdRule } = useFormRules(); + // 密码验证规则 + const passwordValidateRule: Rule = { + validator: (_rule: Rule, value: string) => { + if (!value) { + return Promise.reject(t('page.login.register.passwordRequired')); + } + // 长度验证:6-20位 + 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(); + } + }; + const baseRules = { password: [ { required: true, message: t('page.login.register.passwordRequired') }, - { min: 6, message: t('page.login.resetPwd.passwordLength') } + passwordValidateRule ], confirmPassword: createConfirmPwdRule(formModel.password) }; @@ -107,7 +125,12 @@ async function handleSubmit() { newPassword: formModel.password }); } else { - // TODO: 通过邮箱验证码重置的接口 + // 通过邮箱验证码重置 + await resetPasswordByEmail({ + email: formModel.email, + code: formModel.code, + password: formModel.password + }); } window.$message?.success(t('page.login.resetPwd.resetSuccess')); @@ -137,7 +160,7 @@ const handleBack = () => { {{ t('page.login.resetPwd.byPassword') }} - + {{ t('page.login.resetPwd.byEmail') }}