diff --git a/main/manager-mobile/src/api/auth.ts b/main/manager-mobile/src/api/auth.ts index 8b3b2d2b..f9750a08 100644 --- a/main/manager-mobile/src/api/auth.ts +++ b/main/manager-mobile/src/api/auth.ts @@ -123,3 +123,21 @@ export function register(data: RegisterData) { }, }) } + +// 忘记密码数据类型 +export interface ForgotPasswordData { + phone: string + code: string + password: string + captchaId: string +} + +// 忘记密码(找回密码) +export function retrievePassword(data: ForgotPasswordData) { + return http.Put('/user/retrieve-password', data, { + meta: { + ignoreAuth: true, + toast: true, + }, + }) +} diff --git a/main/manager-mobile/src/pages/forgot-password/index.vue b/main/manager-mobile/src/pages/forgot-password/index.vue index deab9c09..f574d0e9 100644 --- a/main/manager-mobile/src/pages/forgot-password/index.vue +++ b/main/manager-mobile/src/pages/forgot-password/index.vue @@ -16,6 +16,8 @@ import { getEnvBaseUrl, sm2Encrypt } from "@/utils"; import { toast } from "@/utils/toast"; // 导入国际化相关功能 import { t, initI18n } from "@/i18n"; +// 导入API接口 +import { retrievePassword, sendSmsCode } from "@/api/auth"; // 获取屏幕边界到安全区域距离 let safeAreaInsets; @@ -129,7 +131,7 @@ async function refreshCaptcha() { } // 发送短信验证码 -async function sendSmsCode() { +async function handleSendSmsCode() { // 手机号格式验证 const phoneRegex = /^1[3-9]\d{9}$/; if (!phoneRegex.test(formData.value.mobile)) { @@ -144,12 +146,14 @@ async function sendSmsCode() { try { smsLoading.value = true; - // TODO: 调用发送短信验证码API - // await sendSmsCode({ - // mobile: formData.value.mobile, - // captcha: formData.value.captcha, - // captchaId: formData.value.captchaId - // }) + // 将手机号转换为国际格式 + const internationalPhone = formData.value.areaCode + formData.value.mobile; + // 调用发送短信验证码API + await sendSmsCode({ + phone: internationalPhone, + captcha: formData.value.captcha, + captchaId: formData.value.captchaId + }) toast.success(t("retrievePassword.captchaSendSuccess")); @@ -188,6 +192,9 @@ async function handleResetPassword() { return; } + // 将手机号转换为国际格式 + const internationalPhone = formData.value.areaCode + formData.value.mobile; + if (!formData.value.captcha) { toast.warning(t("retrievePassword.captchaRequired")); return; @@ -218,7 +225,7 @@ async function handleResetPassword() { // 检查SM2公钥是否配置 if (!sm2PublicKey.value) { - toast.warning(t('sm2.publicKeyNotConfigured')); + toast.warning(t("sm2.publicKeyNotConfigured")); return; } @@ -230,17 +237,17 @@ async function handleResetPassword() { encryptedPassword = sm2Encrypt(sm2PublicKey.value, captchaAndPassword); } catch (error) { console.error("密码加密失败:", error); - toast.warning(t('sm2.encryptionFailed')); + toast.warning(t("sm2.encryptionFailed")); return; } - // TODO: 调用重置密码API - // await resetPassword({ - // mobile: formData.value.mobile, - // mobileCaptcha: formData.value.mobileCaptcha, - // password: encryptedPassword, - // captchaId: formData.value.captchaId - // }) + // 调用重置密码API + await retrievePassword({ + phone: internationalPhone, + code: formData.value.mobileCaptcha, + password: encryptedPassword, + captchaId: formData.value.captchaId + }) toast.success(t("retrievePassword.passwordUpdateSuccess")); @@ -358,11 +365,11 @@ onMounted(async () => { :placeholder="t('retrievePassword.mobileCaptchaPlaceholder')" :maxlength="6" /> - + {{ smsCountdown > 0 - ? `${smsCountdown}${t("register.secondsLater")}` + ? `${smsCountdown}s` : t("retrievePassword.getMobileCaptcha") }} @@ -446,7 +453,7 @@ onMounted(async () => { custom-class="confirm-btn" @click="closeAreaCodeSheet" > - {{ t('login.confirm') }} + {{ t("login.confirm") }}