From 52442082a2729c1eab8f8705cedd95b39393de57 Mon Sep 17 00:00:00 2001 From: jingrow Date: Fri, 26 Dec 2025 23:39:47 +0800 Subject: [PATCH] feat: adjust signup form validation based on locale --- apps/jingrow/frontend/src/locales/zh-CN.json | 5 +- apps/jingrow/frontend/src/views/HomePage.vue | 120 ++++++++++++------ .../frontend/src/views/auth/Signup.vue | 120 ++++++++++++------ 3 files changed, 163 insertions(+), 82 deletions(-) diff --git a/apps/jingrow/frontend/src/locales/zh-CN.json b/apps/jingrow/frontend/src/locales/zh-CN.json index 113d58c..91b1b85 100644 --- a/apps/jingrow/frontend/src/locales/zh-CN.json +++ b/apps/jingrow/frontend/src/locales/zh-CN.json @@ -42,8 +42,9 @@ "Please confirm password": "请确认密码", "Passwords do not match": "两次输入的密码不一致", "Email (Optional)": "邮箱(可选)", - "Phone Number": "手机号", - "Phone Number (Optional)": "手机号(可选)", + "Please enter email": "请输入邮箱", + "Mobile": "手机号", + "Mobile (Optional)": "手机号(可选)", "Please enter a valid email address": "请输入有效的邮箱地址", "Please enter phone number": "请输入手机号", "Please enter a valid phone number": "请输入有效的手机号码", diff --git a/apps/jingrow/frontend/src/views/HomePage.vue b/apps/jingrow/frontend/src/views/HomePage.vue index d1f2eed..539f250 100644 --- a/apps/jingrow/frontend/src/views/HomePage.vue +++ b/apps/jingrow/frontend/src/views/HomePage.vue @@ -3,7 +3,7 @@ import { computed, ref, watch, onMounted, onUnmounted, nextTick, reactive } from import { NButton, NSpace, useMessage, NModal, NForm, NFormItem, NInput, NText, NLayout, NLayoutSider, NLayoutHeader, NLayoutContent } from 'naive-ui' import { Icon } from '@iconify/vue' import { useSEO } from '@/shared/composables/useSEO' -import { t } from '@/shared/i18n' +import { t, getCurrentLocale } from '@/shared/i18n' import { useAuthStore } from '@/shared/stores/auth' import { signupApi } from '@/shared/api/auth' import AppHeader from '@/app/layouts/AppHeader.vue' @@ -58,41 +58,81 @@ const validatePasswordMatch = (_rule: any, value: string) => { return true } -const signupRules = { - username: [ - { required: true, message: t('Please enter username'), trigger: 'blur' }, - { min: 3, message: t('Username must be at least 3 characters'), trigger: 'blur' } - ], - password: [ - { required: true, message: t('Please enter password'), trigger: 'blur' }, - { min: 6, message: t('Password must be at least 6 characters'), trigger: 'blur' } - ], - confirmPassword: [ - { required: true, message: t('Please confirm password'), trigger: 'blur' }, - { validator: validatePasswordMatch, trigger: 'blur' } - ], - email: [ - { - validator: (_rule: any, value: string) => { - if (!value) return true - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ - if (!emailRegex.test(value)) { - return new Error(t('Please enter a valid email address')) - } - return true - }, - trigger: 'blur' - } - ], - phoneNumber: [ - { required: true, message: t('Please enter phone number'), trigger: 'blur' }, - { - pattern: /^1[3-9]\d{9}$/, - message: t('Please enter a valid phone number'), - trigger: 'blur' - } - ] -} +const isEnglish = computed(() => getCurrentLocale() === 'en-US') + +const signupRules = computed(() => { + const rules: any = { + username: [ + { required: true, message: t('Please enter username'), trigger: 'blur' }, + { min: 3, message: t('Username must be at least 3 characters'), trigger: 'blur' } + ], + password: [ + { required: true, message: t('Please enter password'), trigger: 'blur' }, + { min: 6, message: t('Password must be at least 6 characters'), trigger: 'blur' } + ], + confirmPassword: [ + { required: true, message: t('Please confirm password'), trigger: 'blur' }, + { validator: validatePasswordMatch, trigger: 'blur' } + ] + } + + // 英文版:email必填,手机号可选 + if (isEnglish.value) { + rules.email = [ + { required: true, message: t('Please enter email'), trigger: 'blur' }, + { + validator: (_rule: any, value: string) => { + // required规则已处理空值,这里只验证格式 + if (!value) return true + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + if (!emailRegex.test(value)) { + return new Error(t('Please enter a valid email address')) + } + return true + }, + trigger: 'blur' + } + ] + rules.phoneNumber = [ + { + validator: (_rule: any, value: string) => { + if (!value) return true + const phoneRegex = /^1[3-9]\d{9}$/ + if (!phoneRegex.test(value)) { + return new Error(t('Please enter a valid phone number')) + } + return true + }, + trigger: 'blur' + } + ] + } else { + // 中文版:email可选,手机号必填 + rules.email = [ + { + validator: (_rule: any, value: string) => { + if (!value) return true + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + if (!emailRegex.test(value)) { + return new Error(t('Please enter a valid email address')) + } + return true + }, + trigger: 'blur' + } + ] + rules.phoneNumber = [ + { required: true, message: t('Please enter phone number'), trigger: 'blur' }, + { + pattern: /^1[3-9]\d{9}$/, + message: t('Please enter a valid phone number'), + trigger: 'blur' + } + ] + } + + return rules +}) const handleLogin = () => { showLoginModal.value = true @@ -134,7 +174,7 @@ const handleSignupSubmit = async () => { username: signupFormData.username, password: signupFormData.password, email: signupFormData.email || undefined, - phone_number: signupFormData.phoneNumber + phone_number: isEnglish.value ? (signupFormData.phoneNumber || undefined) : signupFormData.phoneNumber }) if (result.success) { @@ -1508,7 +1548,7 @@ onUnmounted(() => {