2025-10-12 10:22:54 +08:00

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();
};