generated from Leo_Ding/web-template
83 lines
2.4 KiB
JavaScript
83 lines
2.4 KiB
JavaScript
/**
|
|
* 表单验证工具 - Vue 3 兼容
|
|
* 包含:手机号、邮箱、身份证号 验证规则
|
|
*/
|
|
|
|
// 验证手机号(中国大陆)
|
|
export const validatePhone = (_rule, value) => {
|
|
console.log('validatePhone', value);
|
|
const phoneRegex = /^1[3-9]\d{9}$/;
|
|
if (!value) {
|
|
return Promise.reject('手机号不能为空');
|
|
}
|
|
if (!phoneRegex.test(value)) {
|
|
return Promise.reject('请输入正确的手机号');
|
|
}
|
|
return Promise.resolve();
|
|
};
|
|
|
|
// 验证邮箱
|
|
export const validateEmail = (_rule, value) => {
|
|
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
|
|
if (!value) {
|
|
return Promise.reject('邮箱不能为空');
|
|
}
|
|
if (!emailRegex.test(value)) {
|
|
return Promise.reject('请输入正确的邮箱地址');
|
|
}
|
|
return Promise.resolve();
|
|
};
|
|
|
|
// 验证身份证号码(支持 15 位和 18 位,含校验)
|
|
export const validateIdCard = (_rule, value) => {
|
|
const idCardRegex = /(^\d{15}$)|(^\d{18}$)|(^\d{18}X$)/i;
|
|
|
|
if (!value) {
|
|
return Promise.reject('身份证号不能为空');
|
|
}
|
|
|
|
if (!idCardRegex.test(value)) {
|
|
return Promise.reject('身份证号格式不正确');
|
|
}
|
|
|
|
// 更严格的 18 位身份证校验(含最后一位校验码)
|
|
if (value.length === 18) {
|
|
const Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; // 加权因子
|
|
const Vi = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; // 校验码
|
|
|
|
let sum = 0;
|
|
for (let i = 0; i < 17; i++) {
|
|
sum += parseInt(value[i], 10) * Wi[i];
|
|
}
|
|
const checkCode = Vi[sum % 11];
|
|
if (checkCode !== value[17].toUpperCase()) {
|
|
return Promise.reject('身份证号校验失败,请输入正确的身份证号');
|
|
}
|
|
}
|
|
|
|
// 可选:验证生日部分(仅做基础判断)
|
|
let year, month, day;
|
|
if (value.length === 15) {
|
|
year = '19' + value.substring(6, 8);
|
|
month = value.substring(8, 10);
|
|
day = value.substring(10, 12);
|
|
} else {
|
|
year = value.substring(6, 10);
|
|
month = value.substring(10, 12);
|
|
day = value.substring(12, 14);
|
|
}
|
|
|
|
const isValidDate = !isNaN(new Date(year, month - 1, day));
|
|
if (!isValidDate) {
|
|
return Promise.reject('身份证号中的出生日期不合法');
|
|
}
|
|
|
|
const currentYear = new Date().getFullYear();
|
|
const birthYear = parseInt(year, 10);
|
|
if (birthYear < 1900 || birthYear > currentYear) {
|
|
return Promise.reject('出生年份不合法');
|
|
}
|
|
|
|
return Promise.resolve();
|
|
};
|