diff --git a/apps/frontend/src/features/auth/pages/RegisterPage.vue b/apps/frontend/src/features/auth/pages/RegisterPage.vue index 07efa02..82a0881 100644 --- a/apps/frontend/src/features/auth/pages/RegisterPage.vue +++ b/apps/frontend/src/features/auth/pages/RegisterPage.vue @@ -34,6 +34,15 @@ const submit = async () => { return; } + // 基础密码强度校验,避免命中后端 400 + const hasUpper = /[A-Z]/.test(form.password); + const hasNumber = /[0-9]/.test(form.password); + const hasSpecial = /[^A-Za-z0-9]/.test(form.password); + if (form.password.length < 8 || !hasUpper || !hasNumber || !hasSpecial) { + errorMessage.value = '密码需至少8位,且包含大写字母、数字和特殊字符'; + return; + } + isLoading.value = true; errorMessage.value = ''; try { @@ -51,6 +60,18 @@ const submit = async () => { console.warn('register failed', err); const status = err?.response?.status as number | undefined; const backendMsg = err?.response?.data?.message as string | undefined; + const fieldErrors = err?.response?.data?.errors as Record | undefined; + // 展示后端字段级错误(Zod) + if (fieldErrors) { + const pick = (...keys: string[]) => keys.flatMap((k) => fieldErrors[k] ?? []); + const messages = + pick('displayName', 'email', 'password', 'confirmPassword')[0] || + Object.values(fieldErrors).flat()[0]; + if (messages) { + errorMessage.value = messages; + return; + } + } if (!status) { errorMessage.value = '无法连接服务器,请检查网络或 API 地址配置。'; } else if (status === 409) {