//表单校验规则
|
|
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'
|
}
|
},
|
}
|