// 校验身份证号
const validateIDCard = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入证件号码!'))
} else {
if(formData.value.credentialsType == 1){
if(!isSocialCreditCode(value)){
callback(new Error('请输入正确的统一社会信用号码!'))
}
}
if(formData.value.credentialsType == 3){
if (!checkIDCard(value)) {
callback(new Error('请输入正确的身份证件号码!'))
}
}
return callback();
}
}
// 验证规则
const CIrules = reactive({
credentialsNum:[
{ required: true, message: '请输入证件号码', trigger: 'change' },
{ validator: validateIDCard, trigger:'blur'}
],
})
<el-form :model="formData" :rules="CIrules" ref="ruleFormRefCustomer" label-width="120px">
<el-col :span="12">
<el-form-item label="证件号码" prop="credentialsNum">
<el-input v-model="formData.credentialsNum" clearable placeholder="请输入证件号码"/>
</el-form-item>
</el-col>
</el-form>
还需要注意 prop需要和验证规则CIrules里的字段一致
校验统一社会信用代码是从别人那里搬过来的,页面太多链接🔗就不贴了,但是好用,感谢🙏
/**
* 校验统一社会信用代码
* @param val{String}
* @param checkEnable{Boolean}
* @returns {Boolean}
*/
export const isSocialCreditCode = (val, checkEnable = false) => {
// 前置条件即校验规则的第1至5要求
const pattern = /^([1-9ANY])([1-9])([0-9]{6})([0-9A-HJ-NP-RT-UW-Y]{10})$/;
if (!pattern.test(val) || !checkEnable) return pattern.test(val);
// 定义求模基数31
const MODE_BASE = 31;
// 空字符串
const EMPTY_STR= "";
// 代码字符数组, 其下标作为代码字符数值
const CHAR_CODES = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T', 'U', 'W', 'X', 'Y'];
// 各位置序号上的加权因子
const WEIGHT_FACTORS = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
// 初始化一个与信用代码等长的空的代码字符数值数组
// 用于和加权因子进行乘积求和运算
let values = new Array(val.length);
// 初始化求和值
let sum = 0;
// 将信用代码字符串转换为代码字符数值数组
val.split(EMPTY_STR).forEach((item, index) => values[index] = CHAR_CODES.findIndex(elem => elem === item));
// 删除最后一位元素(第18位不参与求和计算)
const endValue = values.pop();
// 将字符数组数值逐个元素与加权因子乘积求和
WEIGHT_FACTORS.forEach((item, index) => sum += item * values[index]);
// 换算校验代码字符
// let checkCode = CHAR_CODES[MODE_BASE - sum % MODE_BASE];
// return val.substring(17, 18) === checkCode;
// 不换算回字符了,直接用第18位的数值进行比较
return endValue === (MODE_BASE - sum % MODE_BASE);
}
// 检验身份证号
export function checkIDCard(cardNum) {
return /^[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]$/.test(cardNum)
}