wwf
20 小时以前 e1b028d486713eaf55aaf35fbf334aa568059c0d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
//表单校验规则
 
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' 
    }
  },
}