diff --git a/apps/jingrow/frontend/src/locales/zh-CN.json b/apps/jingrow/frontend/src/locales/zh-CN.json index 113d58c..c54bb89 100644 --- a/apps/jingrow/frontend/src/locales/zh-CN.json +++ b/apps/jingrow/frontend/src/locales/zh-CN.json @@ -42,7 +42,7 @@ "Please confirm password": "请确认密码", "Passwords do not match": "两次输入的密码不一致", "Email (Optional)": "邮箱(可选)", - "Phone Number": "手机号", + "Mobile": "手机号", "Phone Number (Optional)": "手机号(可选)", "Please enter a valid email address": "请输入有效的邮箱地址", "Please enter phone number": "请输入手机号", diff --git a/apps/jingrow/frontend/src/views/HomePage.vue b/apps/jingrow/frontend/src/views/HomePage.vue index d1f2eed..ed8499c 100644 --- a/apps/jingrow/frontend/src/views/HomePage.vue +++ b/apps/jingrow/frontend/src/views/HomePage.vue @@ -48,7 +48,7 @@ const signupFormData = reactive({ password: '', confirmPassword: '', email: '', - phoneNumber: '' + mobile_no: '' }) const validatePasswordMatch = (_rule: any, value: string) => { @@ -58,41 +58,47 @@ const validatePasswordMatch = (_rule: any, value: string) => { return true } -const signupRules = { +// 动态生成验证规则,根据后端返回的 reqd 属性 +const signupFieldsReqd = ref>({ + username: true, + password: true, + email: false, + mobile_no: false +}) + +const signupRules = computed(() => ({ username: [ - { required: true, message: t('Please enter username'), trigger: 'blur' }, + ...(signupFieldsReqd.value.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' }, + ...(signupFieldsReqd.value.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' }, + ...(signupFieldsReqd.value.password ? [{ required: true, message: t('Please confirm password'), trigger: 'blur' }] : []), { validator: validatePasswordMatch, trigger: 'blur' } ], email: [ + ...(signupFieldsReqd.value.email ? [{ required: true, message: t('Please enter email'), trigger: 'blur' }] : []), { validator: (_rule: any, value: string) => { - if (!value) return true + if (!value) return !signupFieldsReqd.value.email || new Error(t('Please enter email')) const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ - if (!emailRegex.test(value)) { - return new Error(t('Please enter a valid email address')) - } - return true + return emailRegex.test(value) || new Error(t('Please enter a valid email address')) }, trigger: 'blur' } ], - phoneNumber: [ - { required: true, message: t('Please enter phone number'), trigger: 'blur' }, + mobile_no: [ + ...(signupFieldsReqd.value.mobile_no ? [{ 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 handleLogin = () => { showLoginModal.value = true @@ -134,7 +140,7 @@ const handleSignupSubmit = async () => { username: signupFormData.username, password: signupFormData.password, email: signupFormData.email || undefined, - phone_number: signupFormData.phoneNumber + phone_number: signupFormData.mobile_no }) if (result.success) { @@ -149,7 +155,7 @@ const handleSignupSubmit = async () => { signupFormData.password = '' signupFormData.confirmPassword = '' signupFormData.email = '' - signupFormData.phoneNumber = '' + signupFormData.mobile_no = '' } else { const loginResult = await authStore.login(signupFormData.username, signupFormData.password) if (loginResult.success) { @@ -158,7 +164,7 @@ const handleSignupSubmit = async () => { signupFormData.password = '' signupFormData.confirmPassword = '' signupFormData.email = '' - signupFormData.phoneNumber = '' + signupFormData.mobile_no = '' } else { message.warning(loginResult.error || t('Sign up successful, but auto login failed. Please login manually')) showSignupModal.value = false @@ -903,6 +909,22 @@ const removeHistoryItem = (index: number) => { } } +// 获取注册表单字段的必填属性 +const fetchSignupFields = async () => { + try { + const response = await fetch('/jingrow/signup/fields') + if (response.ok) { + const result = await response.json() + if (result.success && result.data) { + Object.assign(signupFieldsReqd.value, result.data) + } + } + } catch (error) { + console.error('Failed to fetch signup fields:', error) + // 使用默认值,不阻塞页面加载 + } +} + onMounted(async () => { window.addEventListener('resize', handleWindowResize) window.addEventListener('paste', handlePaste) @@ -910,6 +932,9 @@ onMounted(async () => { // 初始化认证状态 await authStore.initAuth() + // 获取注册表单字段的必填属性 + await fetchSignupFields() + // 检查服务器配置,判断是否显示注册链接 try { const response = await fetch('/jingrow/server-config') @@ -1508,7 +1533,7 @@ onUnmounted(() => {