From 550feada98d6bf0e5159830c0bd2c845d2393b5e Mon Sep 17 00:00:00 2001
From: liuyg <376836862@qq.com>
Date: Mon, 06 Dec 2021 17:06:15 +0800
Subject: [PATCH] +

---
 src/views/securityGuard/securityGuard.vue |  145 +++++++++++++++++++++++++++++++++++------------
 1 files changed, 107 insertions(+), 38 deletions(-)

diff --git a/src/views/securityGuard/securityGuard.vue b/src/views/securityGuard/securityGuard.vue
index 49b09c2..136fc81 100644
--- a/src/views/securityGuard/securityGuard.vue
+++ b/src/views/securityGuard/securityGuard.vue
@@ -478,45 +478,114 @@
       oldm,
       oldd,
       ok = false;
-
-    const validatePassCardid = (rule, value, callback) => {
-      // console.log(oldy, oldm, oldd, year - oldy, mouth, day);
-      var test =
-        /^[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{3}([0-9]|X)$/;
-      if (!test.test(value)) {
-        callback(new Error("请输入正确身份证号码"));
-      } else {
-        // //加入校验18岁到60岁的
-        // oldy = +value.slice(6, 10);
-        // oldm = +value.slice(10, 12);
-        // oldd = +value.slice(12, 14);
-        // ok =
-        //   year - oldy < 18 || year - oldy > 60
-        //     ? false
-        //     : year - oldy == 18
-        //     ? mouth < oldm
-        //       ? false
-        //       : mouth > oldm
-        //       ? true
-        //       : day < oldd
-        //       ? false
-        //       : true
-        //     : year - oldy == 60
-        //     ? mouth < oldm
-        //       ? true
-        //       : mouth > oldm
-        //       ? false
-        //       : day <= oldd
-        //       ? false
-        //       : true
-        //     : true;
-        // if (ok) {
-        callback();
-        // } else {
-        //   // callback(new Error("根据国家要求,需在18岁至60岁"));
-        //   callback(new Error("年龄不符"));
-        // }
+    var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; // 加权因子
+    var ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]; // 身份证验证位值.10代表X
+    /**
+     * 判断身份证号码为18位时最后的验证位是否正确
+     * @param a_idCard 身份证号码数组
+     * @return
+     */
+    function isTrueValidateCodeBy18IdCard(a_idCard) {
+      var sum = 0; // 声明加权求和变量
+      if (a_idCard[17].toLowerCase() == "x") {
+        a_idCard[17] = 10; // 将最后位为x的验证码替换为10方便后续操作
       }
+      for (var i = 0; i < 17; i++) {
+        sum += Wi[i] * a_idCard[i]; // 加权求和
+      }
+      let valCodePosition = sum % 11; // 得到验证码所位置
+      if (a_idCard[17] == ValideCode[valCodePosition]) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+    /**
+     * 验证18位数身份证号码中的生日是否是有效生日
+     * @param idCard 18位书身份证字符串
+     * @return
+     */
+    function isValidityBrithBy18IdCard(idCard18) {
+      var year = idCard18.substring(6, 10);
+      var month = idCard18.substring(10, 12);
+      var day = idCard18.substring(12, 14);
+      var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
+      // 这里用getFullYear()获取年份,避免千年虫问题
+      if (
+        temp_date.getFullYear() != parseFloat(year) ||
+        temp_date.getMonth() != parseFloat(month) - 1 ||
+        temp_date.getDate() != parseFloat(day)
+      ) {
+        return false;
+      } else {
+        return true;
+      }
+    }
+    //去掉字符串头尾空格
+    function trim(str) {
+      return str.replace(/(^\s*)|(\s*$)/g, "");
+    }
+    const validatePassCardid = (rule, value, callback) => {
+      let ok = false;
+      if (value.length == 18) {
+        let idCard = trim(value.replace(/ /g, ""));
+        var a_idCard = idCard.split("");
+        if (
+          isValidityBrithBy18IdCard(idCard) &&
+          isTrueValidateCodeBy18IdCard(a_idCard)
+        ) {
+          //进行18位身份证的基本验证和第18位的验证
+          ok = true;
+        } else {
+          ok = false;
+        }
+      } else {
+        ok = false;
+      }
+
+      if (ok) {
+        callback();
+      } else {
+        callback(new Error("身份证错误"));
+      }
+      // console.log(oldy, oldm, oldd, year - oldy, mouth, day);
+      // var test =
+      //   /^[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{3}([0-9]|X)$/;
+      // if (!test.test(value)) {
+      //   callback(new Error("请输入正确身份证号码"));
+      // } else {
+      //   // //加入校验18岁到60岁的
+      //   // oldy = +value.slice(6, 10);
+      //   // oldm = +value.slice(10, 12);
+      //   // oldd = +value.slice(12, 14);
+      //   // ok =
+      //   //   year - oldy < 18 || year - oldy > 60
+      //   //     ? false
+      //   //     : year - oldy == 18
+      //   //     ? mouth < oldm
+      //   //       ? false
+      //   //       : mouth > oldm
+      //   //       ? true
+      //   //       : day < oldd
+      //   //       ? false
+      //   //       : true
+      //   //     : year - oldy == 60
+      //   //     ? mouth < oldm
+      //   //       ? true
+      //   //       : mouth > oldm
+      //   //       ? false
+      //   //       : day <= oldd
+      //   //       ? false
+      //   //       : true
+      //   //     : true;
+      //   // if (ok) {
+      //   callback();
+      //   // } else {
+      //   //   // callback(new Error("根据国家要求,需在18岁至60岁"));
+      //   //   callback(new Error("年龄不符"));
+      // }
+
+      // }
     };
     const validatePassPhone = (rule, value, callback) => {
       var test = /^(13[0-9]|14[0-9]|15[0-9]|17[0-9]|18[0-9]|19[0-9])\d{8}$/g;

--
Gitblit v1.9.3