/** * 表单验证工具 - 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(); };