From adf2fb3eb6f01020ac4bd5280f3e17b69a8e6f5e Mon Sep 17 00:00:00 2001 From: cdswyda Date: Wed, 8 Sep 2021 11:53:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(dataVerificationCtrl.js):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=BA=AB=E4=BB=BD=E8=AF=81=E9=AA=8C=E8=AF=81=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/dataVerificationCtrl.js | 40 ++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/controllers/dataVerificationCtrl.js b/src/controllers/dataVerificationCtrl.js index afa97a5..62454bf 100644 --- a/src/controllers/dataVerificationCtrl.js +++ b/src/controllers/dataVerificationCtrl.js @@ -1448,7 +1448,7 @@ const dataVerificationCtrl = { } } else if(type == 'validity'){ - if(type2 == 'card' && !/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(cellValue)){ + if(type2 == 'card' && !validateIdCard(cellValue)){ return false; } @@ -1651,4 +1651,42 @@ const dataVerificationCtrl = { }, } +function validateIdCard(idCard) { + // 15位和18位身份证号码的正则表达式 + var 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) { + var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); // 将前17位加权因子保存在数组里 + var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 这是除以11后,可能产生的11位余数、验证码,也保存成数组 + var idCardWiSum = 0; // 用来保存前17位各自乖以加权因子后的总和 + for (var i = 0; i < 17; i++) { + idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i]; + } + + var idCardMod = idCardWiSum % 11; // 计算出校验码所在数组的位置 + var idCardLast = idCard.substring(17); // 得到最后一位身份证号码 + + // 如果等于2,则说明校验码是10,身份证号码最后一位应该是X + if (idCardMod == 2) { + if (idCardLast == "X" || idCardLast == "x") { + return true; + } else { + return false; + } + } else { + // 用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码 + if (idCardLast == idCardY[idCardMod]) { + return true; + } else { + return false; + } + } + } + } else { + return false; + } +} + export default dataVerificationCtrl; \ No newline at end of file