import getType from "../type/getType"; /** * @description: 校验是否为身份证 * @param {string} code * @return {*} */ export default (code: string): boolean => { const dataType = getType(code); if (dataType !== "string") return false; code = code.toUpperCase(); const citys = { "11": "北京", "12": "天津", "13": "河北", "14": "山西", "15": "内蒙古", "21": "辽宁", "22": "吉林", "23": "黑龙江 ", "31": "上海", "32": "江苏", "33": "浙江", "34": "安徽", "35": "福建", "36": "江西", "37": "山东", "41": "河南", "42": "湖北 ", "43": "湖南", "44": "广东", "45": "广西", "46": "海南", "50": "重庆", "51": "四川", "52": "贵州", "53": "云南", "54": "西藏 ", "61": "陕西", "62": "甘肃", "63": "青海", "64": "宁夏", "65": "新疆", "81": "中国香港", "82": "中国澳门", "83": "中国台湾", "91": "国外", }; if (!/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/i.test(code)) return false; if (!Object.prototype.hasOwnProperty.call(citys, code.slice(0, 2))) return false; const birthday = code.slice(6, 10) + "-" + Number(code.slice(10, 12)) + "-" + Number(code.slice(12, 14)); const birthdayDate = new Date(birthday.replace(/-/g, "/")); // 校验生日是否与身份证生日一致 if (birthday != birthdayDate.getFullYear() + "-" + (birthdayDate.getMonth() + 1) + "-" + birthdayDate.getDate()) return false; // 校验生日是否在当前时间后 if (birthdayDate.getTime() > new Date().getTime()) return false; const arr = code.split(""); // ∑(ai×Wi)(mod 11) // 加权因子 const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 校验位 const parity = [1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2]; let sum = 0; let ai = 0; let wi = 0; for (let i = 0; i < 17; i++) { ai = Number(arr[i]); wi = factor[i]; sum += ai * wi; } const last = parity[sum % 11]; if (last != arr[17]) return false; return true; };