fix:注册界面用户名和电话号码格式校验修改
This commit is contained in:
@@ -254,8 +254,9 @@ const local: any = {
|
|||||||
birthDate: 'Birth Date',
|
birthDate: 'Birth Date',
|
||||||
birthDatePlaceholder: 'Please select birth date',
|
birthDatePlaceholder: 'Please select birth date',
|
||||||
birthDateRequired: 'Please select birth date',
|
birthDateRequired: 'Please select birth date',
|
||||||
phoneInvalid:"The mobile phone number is incorrect",
|
phoneInvalid: 'Please enter a valid phone number',
|
||||||
phoneExists:"The mobile phone number has been registered",
|
phoneExists: 'This phone number is already registered',
|
||||||
|
phoneOptional: 'Phone number is optional',
|
||||||
emailInvalid:"The email is incorrect",
|
emailInvalid:"The email is incorrect",
|
||||||
emailExists:"The email has been registered",
|
emailExists:"The email has been registered",
|
||||||
emailRequired:"The email cannot be empty",
|
emailRequired:"The email cannot be empty",
|
||||||
|
|||||||
@@ -254,8 +254,9 @@ const local:any = {
|
|||||||
birthDate: '出生日期',
|
birthDate: '出生日期',
|
||||||
birthDatePlaceholder: '请选择出生日期',
|
birthDatePlaceholder: '请选择出生日期',
|
||||||
birthDateRequired: '请选择出生日期',
|
birthDateRequired: '请选择出生日期',
|
||||||
phoneInvalid:"手机号格式不正确",
|
phoneInvalid:"请输入有效的手机号码",
|
||||||
phoneExists:"手机号已经注册",
|
phoneExists:"该手机号已被注册",
|
||||||
|
phoneOptional: '手机号为选填项',
|
||||||
emailInvalid:"邮箱格式不正确",
|
emailInvalid:"邮箱格式不正确",
|
||||||
emailExists:"邮箱已经注册",
|
emailExists:"邮箱已经注册",
|
||||||
emailRequired:"邮箱不能为空",
|
emailRequired:"邮箱不能为空",
|
||||||
|
|||||||
@@ -107,28 +107,32 @@ const basicRules = computed<Record<string, Rule | Rule[]>>(() => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const validatePhone = async (_rule: Rule, value: string) => {
|
const validatePhone = async (_rule: Rule, value: string) => {
|
||||||
// 如果没有填写手机号,直接返回成功
|
if (!value) {
|
||||||
if (!value || value.trim() === '') {
|
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 手机号格式验证
|
// 去除所有空格后再验证
|
||||||
const phonePattern = /^1[3-9]\d{9}$/;
|
const trimmedValue = value.replace(/\s/g, '');
|
||||||
if (!phonePattern.test(value)) {
|
if (!trimmedValue) {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 基本格式验证 - 至少3个字符
|
||||||
|
const phonePattern = /^.{3,}$/;
|
||||||
|
if (!phonePattern.test(trimmedValue)) {
|
||||||
return Promise.reject(t('page.login.register.phoneInvalid'));
|
return Promise.reject(t('page.login.register.phoneInvalid'));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 手机号重复性验证
|
// 手机号重复性验证 - 使用去除空格后的值
|
||||||
try {
|
try {
|
||||||
const { exists } = await authStore.checkUserRepeat({ phonenumber: value, authType: 'u' });
|
const { exists } = await authStore.checkUserRepeat({ phonenumber: trimmedValue, authType: 'u' });
|
||||||
if (exists) {
|
if (exists) {
|
||||||
return Promise.reject(t('page.login.register.phoneExists'));
|
return Promise.reject(t('page.login.register.phoneExists'));
|
||||||
}
|
}
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// 如果服务器验证出错,不阻止表单提交
|
|
||||||
console.error('Phone validation error:', error);
|
console.error('Phone validation error:', error);
|
||||||
return Promise.resolve();
|
return Promise.reject(t('page.login.register.validationError'));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -137,7 +141,9 @@ const basicRules = computed<Record<string, Rule | Rule[]>>(() => {
|
|||||||
{ required: true, message: t('page.login.register.usernameRequired'), trigger: 'change' },
|
{ required: true, message: t('page.login.register.usernameRequired'), trigger: 'change' },
|
||||||
{ validator: validateUsername, trigger: 'blur' }
|
{ validator: validateUsername, trigger: 'blur' }
|
||||||
],
|
],
|
||||||
phone: [{ validator: validatePhone, trigger: 'blur' }],
|
phone: [
|
||||||
|
{ validator: validatePhone, trigger: 'blur' }
|
||||||
|
],
|
||||||
birthDate: [{ required: true, message: t('page.login.register.birthDateRequired') }],
|
birthDate: [{ required: true, message: t('page.login.register.birthDateRequired') }],
|
||||||
fullName: []
|
fullName: []
|
||||||
};
|
};
|
||||||
@@ -258,6 +264,60 @@ async function handleSubmit() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 处理手机号输入
|
||||||
|
const handlePhoneInput = (e: Event) => {
|
||||||
|
const input = e.target as HTMLInputElement;
|
||||||
|
let value = input.value;
|
||||||
|
|
||||||
|
// 去除所有空格
|
||||||
|
value = value.replace(/\s/g, '');
|
||||||
|
|
||||||
|
// 处理加号:只保留第一个加号,去除其他加号
|
||||||
|
if (value.includes('+')) {
|
||||||
|
const parts = value.split('+');
|
||||||
|
value = '+' + parts.slice(1).join('').replace(/\+/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 去除非数字和加号以外的字符
|
||||||
|
value = value.replace(/[^\d+]/g, '');
|
||||||
|
|
||||||
|
// 如果只有加号,清空值
|
||||||
|
if (value === '+') {
|
||||||
|
value = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 限制长度
|
||||||
|
if (value.length > 20) {
|
||||||
|
value = value.slice(0, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 格式化手机号
|
||||||
|
if (value.startsWith('+')) {
|
||||||
|
// 如果以+开头
|
||||||
|
if (value.startsWith('+86')) {
|
||||||
|
// 中国区号格式:+86 185 1234 5678
|
||||||
|
const restNumber = value.slice(3); // 去掉+86
|
||||||
|
if (restNumber) {
|
||||||
|
value = `+86 ${restNumber.replace(/(\d{3})(\d{4})(\d{4})/, '$1 $2 $3')}`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 其他国际号码格式:+xx xxxx xxxx xxxx
|
||||||
|
const countryCode = value.match(/^\+\d{1,3}/)?.[0] || '';
|
||||||
|
const restNumber = value.slice(countryCode.length);
|
||||||
|
const formattedRest = restNumber.replace(/(\d{4})/g, '$1 ').trim();
|
||||||
|
value = countryCode ? `${countryCode} ${formattedRest}` : formattedRest;
|
||||||
|
}
|
||||||
|
} else if (value.startsWith('1') && value.length <= 11) {
|
||||||
|
// 如果是国内手机号(以1开头且长度不超过11位):185 1234 5678
|
||||||
|
value = value.replace(/(\d{3})(\d{4})(\d{4})/, '$1 $2 $3');
|
||||||
|
} else {
|
||||||
|
// 其他情况(可能是直接输入的国外号码):xxxx xxxx xxxx
|
||||||
|
value = value.replace(/(\d{4})/g, '$1 ').trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
basicModel.phone = value;
|
||||||
|
};
|
||||||
|
|
||||||
// 在script setup部分添加一个新的计算属性
|
// 在script setup部分添加一个新的计算属性
|
||||||
const showSteps = computed(() => !isMobile.value);
|
const showSteps = computed(() => !isMobile.value);
|
||||||
</script>
|
</script>
|
||||||
@@ -329,7 +389,13 @@ const showSteps = computed(() => !isMobile.value);
|
|||||||
</ACol>
|
</ACol>
|
||||||
<ACol :lg="24" :span="24">
|
<ACol :lg="24" :span="24">
|
||||||
<AFormItem name="phone" :label="t('page.login.register.phone')">
|
<AFormItem name="phone" :label="t('page.login.register.phone')">
|
||||||
<AInput v-model:value="basicModel.phone" />
|
<AInput
|
||||||
|
v-model:value="basicModel.phone"
|
||||||
|
:placeholder="t('page.login.common.phonePlaceholder')"
|
||||||
|
@input="handlePhoneInput"
|
||||||
|
:maxLength="20"
|
||||||
|
allow-clear
|
||||||
|
/>
|
||||||
</AFormItem>
|
</AFormItem>
|
||||||
</ACol>
|
</ACol>
|
||||||
<ACol :lg="24" :span="24">
|
<ACol :lg="24" :span="24">
|
||||||
@@ -540,4 +606,8 @@ const showSteps = computed(() => !isMobile.value);
|
|||||||
.birth-date-picker {
|
.birth-date-picker {
|
||||||
margin-top: 2px !important;
|
margin-top: 2px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.phone-input {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Reference in New Issue
Block a user