wwf
15 小时以前 a32100e31b93bc378b11ab93617a9c40b081ad70
src/utils/ruleGenerator.js
@@ -3,7 +3,7 @@
export const ruleGenerator = {
  // 必填字段
  required(message = '此字段为必填项') {
    return { required: true, message, trigger: 'blur' }
    return { required: true, message, trigger: ['blur', 'change'] }
  },
  
  // 长度限制
@@ -35,7 +35,7 @@
          callback(new Error('请输入正确的手机号码'))
        }
      },
      trigger: ['blur', 'change']
      trigger: ['blur']
    }
  },
  //验证码验证
@@ -65,21 +65,7 @@
      trigger: ['blur', 'change']
    }
  },
  // 多选框验证
  checkbox(message) {
    return {
      validator: (rule, value, callback) => {
        if (!value) {
          callback(new Error(message));
        } else {
          callback();
        }
      },
      trigger: 'change'
    }
  },
  // 邮箱验证
  email() {
    return {
@@ -93,5 +79,149 @@
      },
      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'
    }
  },
}