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
// 身份证正则
export const idCardReg = /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)/
// 手机号验证
export const mobileReg = /^1[3-9]\d{9}$/;
// 验证身份证号 带校验位
export const validateIdCard = (idCard) => {
let flag = false;
// 15位和18位身份证号码的正则表达式
const regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
// 如果通过该验证,说明身份证格式正确,但准确性还需计算
if (regIdCard.test(idCard)) {
if (idCard.length === 18) {
const idCardWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 将前17位加权因子保存在数组里
const idCardY = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]; // 这是除以11后,可能产生的11位余数、验证码,也保存成数组
let idCardWiSum = 0; // 用来保存前17位各自乖以加权因子后的总和
for (let i = 0; i < 17; i++) {
idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i];
}
const idCardMod = idCardWiSum % 11; // 计算出校验码所在数组的位置
const idCardLast = idCard.substring(17); // 得到最后一位身份证号码
// 如果等于2,则说明校验码是10,身份证号码最后一位应该是X
if (idCardMod === 2) {
flag = idCardLast === 'X' || idCardLast === 'x';
} else {
// 用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
flag = idCardLast === idCardY[idCardMod] + '';
}
}
} else {
flag = false;
}
return flag;
}
// 手机号校验
export const mobileValidator = { pattern: mobileReg, message: "请输入正确的手机号" }
// 身份证校验
export const idCardRule = { validator: (value = '') => {
const val = value.trim()
if (validateIdCard(val)) {
return
}
return '身份证号格式错误'
} }
// 5级地址校验
export const addressValidator = { validator: (value) => {
if (!value) return
const array = value.split('/')
if (!array.length || array.length === 5) {
return
}
if (value.length < 5) {
return '请选择至第五级地址'
}
return
}}