| | |
| | | export const ruleGenerator = { |
| | | // 必填字段 |
| | | required(message = '此字段为必填项') { |
| | | return { required: true, message, trigger: 'blur' } |
| | | return { required: true, message, trigger: ['blur', 'change'] } |
| | | }, |
| | | |
| | | // 长度限制 |
| | |
| | | callback(new Error('请输入正确的手机号码')) |
| | | } |
| | | }, |
| | | trigger: ['blur', 'change'] |
| | | trigger: ['blur'] |
| | | } |
| | | }, |
| | | //验证码验证 |
| | |
| | | trigger: ['blur', 'change'] |
| | | } |
| | | }, |
| | | |
| | | // 多选框验证 |
| | | checkbox(message) { |
| | | return { |
| | | validator: (rule, value, callback) => { |
| | | if (!value) { |
| | | callback(new Error(message)); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }, |
| | | trigger: 'change' |
| | | } |
| | | }, |
| | | |
| | | |
| | | // 邮箱验证 |
| | | email() { |
| | | return { |
| | |
| | | }, |
| | | 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' |
| | | } |
| | | }, |
| | | } |