//表单校验规则 export const ruleGenerator = { // 必填字段 required(message = '此字段为必填项') { return { required: true, message, trigger: ['blur', 'change'] } }, // 长度限制 length(min, max, fieldName = '') { const message = fieldName ? `${fieldName}长度应在${min}到${max}个字符之间` : `长度应在${min}到${max}个字符之间` return { validator: (rule, value, callback) => { if (!value || (value.length >= min && value.length <= max)) { callback() } else { callback(new Error(message)) } }, trigger: 'blur' } }, // 手机号验证 phone() { return { validator: (rule, value, callback) => { const reg = /^1[3-9]\d{9}$/ if (!value || reg.test(value)) { callback() } else { callback(new Error('请输入正确的手机号码')) } }, trigger: ['blur'] } }, //验证码验证 code() { return { validator: (rule, value, callback) => { const reg = /^\d{4}$/ if (!value || reg.test(value)) { callback() } else { callback(new Error('请输入正确的验证码')) } }, trigger: ['blur', 'change'] } }, password() { return { validator: (rule, value, callback) => { const reg = /^\d{6}$/ if (!value || reg.test(value)) { callback() } else { callback(new Error('密码格式为6个字符')) } }, trigger: ['blur', 'change'] } }, // 邮箱验证 email() { return { validator: (rule, value, callback) => { const reg = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ if (!value || reg.test(value)) { callback() } else { callback(new Error('请输入正确的邮箱地址')) } }, trigger: 'blur' } }, // 大于等于0的正整数验证 positiveInteger(min = 0) { return { validator: (rule, value, callback) => { if (!value) { callback() } else { // 检查是否为正整数且大于等于min const num = Number(value) const isPositiveInteger = Number.isInteger(num) && num >= min && num >= 0 if (isPositiveInteger) { callback() } else { callback(new Error(min === 0 ? '请输入大于等于0的正整数' : `请输入大于等于${min}的正整数`)) } } }, trigger: ['blur', 'change'] } }, // 身份证号验证 idCard() { return { validator: (rule, value, callback) => { if (!value) { callback() return } // 18位身份证正则表达式 const reg18 = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/ // 15位身份证正则表达式(老式) const reg15 = /^[1-9]\d{5}\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}$/ if (reg18.test(value)) { // 18位身份证校验码验证 const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] const checkCodes = ['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]) * weights[i] } const checkCode = checkCodes[sum % 11] if (checkCode.toUpperCase() === value[17].toUpperCase()) { callback() } else { callback(new Error('请输入正确的身份证号码')) } } else if (reg15.test(value)) { // 15位身份证校验通过 callback() } else { callback(new Error('请输入正确的身份证号码')) } }, trigger: ['blur', 'change'] } }, // 统一社会信用代码验证 creditCode() { return { validator: (rule, value, callback) => { if (!value) { callback() return } // 统一社会信用代码由18位字符组成:1位登记管理部门代码 + 1位机构类别代码 + 6位登记管理机关行政区划码 + 9位主体识别码(组织机构代码) + 1位校验码 const reg = /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/ if (!reg.test(value)) { callback(new Error('请输入正确的统一社会信用代码')) return } // 校验码计算 const weights = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28] const checkCodes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T', 'U', 'W', 'X', 'Y'] let sum = 0 for (let i = 0; i < 17; i++) { const char = value[i] // 将字符转换为对应的数值 const num = char >= '0' && char <= '9' ? parseInt(char) : char.charCodeAt(0) - 55 sum += num * weights[i] } const mod = 31 const remainder = sum % mod const checkCode = checkCodes[(mod - remainder) % mod] if (checkCode === value[17].toUpperCase()) { callback() } else { callback(new Error('请输入正确的统一社会信用代码')) } }, trigger: ['blur', 'change'] } }, // 金额验证(保留2位小数) money(min = 0) { return { validator: (rule, value, callback) => { if (!value) { callback() return } // 金额正则:整数部分不限位数,小数部分最多2位 const reg = /^(0|[1-9]\d*)(\.\d{1,2})?$/ if (!reg.test(value)) { callback(new Error('请输入正确的金额')) return } const num = parseFloat(value) if (num < min) { callback(new Error(`金额不能小于${min}`)) } else { callback() } }, trigger: ['blur', 'change'] } }, // 多选框验证 checkbox(message) { return { validator: (rule, value, callback) => { if (!value) { callback(new Error(message)); } else { callback(); } }, trigger: 'change' } }, }