笔者上周开发过程中遇到了身份证校验的这个需求,项目里很多的地方都需要验证,于是就提成了一个单独的文件供我自己使用,今天也分享给大家。
一共分俩个文件
一:存放枚举值的,放到enums.js文件中(放入你们项目定义常量的文件里并导出就可以了)
enums.js文件新增此代码
export const vcity = {
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:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"
};
二:校验表单中的身份证是否符合规则。可以单独放一个文件,也可以放到你们项目中统一验证form表单的文件中。
verifyTheLegitimacyOfIdCard.js新增如下内容:
import { vcity } from '../utils/enums'; //导入enums刚刚加的常量,请按照你自己的项目结构导入
/**
* 验证身份证合法性
* @param cardId 身份证号码 String类型
* @returns boolean true合法,false不合法
*/
export const checkTheIdCard = (cardId) => {
// 检测身份证是否合法
return !!((
isCardNo(cardId) &&
checkProvince(cardId) &&
checkBirthday(cardId) &&
checkParity(cardId)
));
};
// 检查基本输入规则
const isCardNo = (cardId) => {
const reg = /(^\d{17}(\d|X|x)$)/;
return reg.test(cardId);
};
// 检测前两位是否为省份
const checkProvince = (cardId) => {
const province = cardId.substr(0, 2);
return Boolean(vcity[province]);
};
// 检测生日是否正确
const checkBirthday = (cardId) => {
const re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$/;
const arr_data = cardId.match(re_eighteen);
const year = arr_data[2];
const month = arr_data[3];
const day = arr_data[4];
const birthday = new Date(`${year}/${month}/${day}`);
return (verifyBirthday(year, month, day, birthday));
};
// 检测日期
const verifyBirthday = (year, month, day, birthday) => {
const now = new Date();
const now_year = now.getFullYear();
// 判断年月日是否合理
if (
birthday.getFullYear() == year &&
(birthday.getMonth() + 1) == month &&
birthday.getDate() == day
) {
// 判断年份的范围(3岁到100岁之间)
const time = now_year - year;
return (time >= 3 && time <= 100);
}
return false;
};
// 检测检验位是否正确
const checkParity = (cardId) => {
const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let cardTemp = 0, i, valnum;
for (i = 0; i < 17; i++) {
cardTemp += cardId.substr(i, 1) * arrInt[i];
}
valnum = arrCh[cardTemp % 11];
console.log('身份证检验位应该是: ', valnum);
return (valnum == cardId.substr(17, 1));
}
最后一步就是使用了:
首先在你需要验证身份证规则的组件中导入checkTheIdCard方法。
而后再提交表单的时候将身份证号单独验证:
onSubmit = async (saveAndNew = false) => {
// 判断是否有必填项未填等等,如果都填了进入以下步骤:
// 校验身份证号是否正确
const idNumber = {}; // {}代表你的form表单的数据,从中解构出身份证号。
// if(!idNumber || checkTheIdCard(idNumber)) 如果身份证号不是必填项请把判断条件改为这个
if (checkTheIdCard(idNumber)) { // 如果为true说明符合规则
// 你提交表单的代码放入这里
} else { // 为false表示不符合规则,给出提示
return message.error('您输入的身份证号码不符合规则,请重新输入');
}
};
这样你全局不管哪里需要验证身份证号码都可以导入此方法进行验证处理。
PS:此方法为最新身份证验证代码,未考虑一代身份证十五位的情况。如果有朋友特殊需要可以加笔者QQ或微信索要。1336791007