UNPKG

vue-rise-realize

Version:

一款服务于 Rise 前端低代码平台的表单渲染器

466 lines (450 loc) 12.9 kB
/** * 判断银行卡号 */ const isBankNo = (bankno) => { let lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一位(与luhn进行比较) let first15Num = bankno.substr(0, bankno.length - 1); //前15或18位 let newArr = new Array(); for (let i = first15Num.length - 1; i > -1; i--) { //前15或18位倒序存进数组 newArr.push(first15Num.substr(i, 1)); } let arrJiShu = new Array(); //奇数位*2的积 <9 let arrJiShu2 = new Array(); //奇数位*2的积 >9 let arrOuShu = new Array(); //偶数位数组 for (let j = 0; j < newArr.length; j++) { if ((j + 1) % 2 == 1) { //奇数位 if (parseInt(newArr[j]) * 2 < 9) arrJiShu.push(parseInt(newArr[j]) * 2); else arrJiShu2.push(parseInt(newArr[j]) * 2); } //偶数位 else arrOuShu.push(newArr[j]); } let jishu_child1 = new Array(); //奇数位*2 >9 的分割之后的数组个位数 let jishu_child2 = new Array(); //奇数位*2 >9 的分割之后的数组十位数 for (let h = 0; h < arrJiShu2.length; h++) { jishu_child1.push(parseInt(arrJiShu2[h]) % 10); jishu_child2.push(parseInt(arrJiShu2[h]) / 10); } let sumJiShu = 0; //奇数位*2 < 9 的数组之和 let sumOuShu = 0; //偶数位数组之和 let sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和 let sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和 let sumTotal = 0; for (let m = 0; m < arrJiShu.length; m++) { sumJiShu = sumJiShu + parseInt(arrJiShu[m]); } for (let n = 0; n < arrOuShu.length; n++) { sumOuShu = sumOuShu + parseInt(arrOuShu[n]); } for (let p = 0; p < jishu_child1.length; p++) { sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p]); sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p]); } //计算总和 sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu) + parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2); //计算luhn值 let k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10; let luhn = 10 - k; if (lastNum == luhn) { return true; } else { return false; } }; export const checkCardNum = (rule, value, callback) => { let num = /^\d*$/; //全数字 //开头6位 let strBin = '10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99'; if (value === '') { callback(new Error('请输入银行卡号')); } else if (!num.exec(value)) { callback(new Error('银行卡号必须全为数字')); } else if (value.length < 16 || value.length > 19) { callback(new Error('银行卡号长度必须在16到19位之间')); } else if (strBin.indexOf(value.substring(0, 2)) == -1) { callback(new Error('请输入正确的银行卡号')); } else if (!isBankNo(value)) { callback(new Error('请输入正确的银行卡号')); } else { callback(); } }; /** * 身份证校验函数 */ const validateIdent = { aIdentityCode_City: { // 城市代码列表 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: '国外 ', }, IdentityCode_isCardNo(card) { //检查号码是否符合规范,包括长度,类型 let reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/; //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X if (reg.test(card) === false) { return false; } return true; }, IdentityCode_checkProvince(card) { //取身份证前两位,校验省份 let province = card.substr(0, 2); if (validateIdent.aIdentityCode_City[province] == undefined) { return false; } return true; }, IdentityCode_checkBirthday(card) { //检查生日是否正确,15位以'19'年份来进行补齐。 let len = card.length; //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字 if (len == '15') { let re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/; let arr_data = card.match(re_fifteen); // 正则取号码内所含出年月日数据 let year = arr_data[2]; let month = arr_data[3]; let day = arr_data[4]; let birthday = new Date('19' + year + '/' + month + '/' + day); return validateIdent.IdentityCode_verifyBirthday( '19' + year, month, day, birthday, ); } //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X if (len == '18') { let re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/; let arr_data = card.match(re_eighteen); // 正则取号码内所含出年月日数据 let year = arr_data[2]; let month = arr_data[3]; let day = arr_data[4]; let birthday = new Date(year + '/' + month + '/' + day); return validateIdent.IdentityCode_verifyBirthday( year, month, day, birthday, ); } return false; }, IdentityCode_verifyBirthday(year, month, day, birthday) { //校验日期 ,15位以'19'年份来进行补齐。 let now = new Date(); let now_year = now.getFullYear(); //年月日是否合理 if ( birthday.getFullYear() == year && birthday.getMonth() + 1 == month && birthday.getDate() == day ) { //判断年份的范围(3岁到150岁之间) let time = now_year - year; if (time >= 3 && time <= 150) { return true; } return false; } return false; }, IdentityCode_checkParity(card) { //校验位的检测 card = validateIdent.IdentityCode_changeFivteenToEighteen(card); // 15位转18位 let len = card.length; if (len == '18') { let arrInt = new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, ); let arrCh = new Array( '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2', ); let cardTemp = 0, i, valnum; for (i = 0; i < 17; i++) { cardTemp += card.substr(i, 1) * arrInt[i]; } valnum = arrCh[cardTemp % 11]; if (valnum == card.substr(17, 1)) { return true; } return false; } return false; }, IdentityCode_changeFivteenToEighteen(card) { //15位转18位身份证号 if (card.length == '15') { let arrInt = new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, ); let arrCh = new Array( '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2', ); let cardTemp = 0, i; card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6); for (i = 0; i < 17; i++) { cardTemp += card.substr(i, 1) * arrInt[i]; } card += arrCh[cardTemp % 11]; return card; } return card; }, }; //身份证号码检验主入口 export const IdentityCodeValid = (rule, card, callback) => { let pass = true; let sex = ''; //是否为空 if ((pass && card === '') || card === undefined) pass = false; //校验长度,类型 if (pass && validateIdent.IdentityCode_isCardNo(card) === false) pass = false; //检查省份 if (pass && validateIdent.IdentityCode_checkProvince(card) === false) pass = false; //校验生日 if (pass && validateIdent.IdentityCode_checkBirthday(card) === false) pass = false; //检验位的检测 if (pass && validateIdent.IdentityCode_checkParity(card) === false) pass = false; if (pass) { let iCard = validateIdent.IdentityCode_changeFivteenToEighteen(card); if (parseInt(iCard.charAt(16)) % 2 == 0) { sex = '0'; // 女生 } else { sex = '1'; // 男生 } console.log(sex ? '男生' : '女生'); callback(); } else { callback(new Error('请输入正确的身份证号码!')); } }; /* * 校验字符串是否为纯数字(正则) */ export const checkNum = (rule, value, callback) => { const reg = /^[0-9]+.?[0-9]*$/; if (reg.test(value)) { callback(); } else { callback(new Error('只能输入数字类型')); } }; /* * 检验手机号 */ export const checkPhone = (rule, value, callback) => { const reg = /^1[3|4|5|7|8][0-9]{9}$/; //验证规则,第一位是【1】开头,第二位有【3,4,5,7,8】,第三位及以后可以是【0-9】 // const reg = /^1[0-9]{10}$/;//不验证第二位,防止几年后新增号码段 if (reg.test(value)) { callback(); } else { callback(new Error('请输入正确的手机号码!')); } }; /* * 验证座机号 */ export const checkTel = (rule, value, callback) => { const reg = /^(\d3,4|\d{3,4}-)?\d{7,8}$/; if (reg.test(value)) { callback(); } else { callback(new Error('请输入正确的座机号码!')); } }; /** * 校验url */ export const IsURL = (rule, value, callback) => { const reg = /^\b(((https?|ftp):\/\/)?[-a-z0-9]+(\.[-a-z0-9]+)*\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|asia|coop|aero|[a-z][a-z]|((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d))\b(\/[-a-z0-9_:/@&?=+,.!/~%$]*)?)$/i; if (reg.test(value)) { callback(); } else { callback(new Error('请输入正确的网址!')); } }; /* * 检验邮箱 */ export const checkEmail = (rule, value, callback) => { const reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/; if (reg.test(value)) { callback(); } else { callback(new Error('请输入正确的邮箱地址!')); } }; /* * 校验ip */ export const checkIp = (rule, value, callback) => { const reSpaceCheck = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; if (reSpaceCheck.test(value)) { value.match(reSpaceCheck); if ( RegExp.$1 <= 255 && RegExp.$1 >= 0 && RegExp.$2 <= 255 && RegExp.$2 >= 0 && RegExp.$3 <= 255 && RegExp.$3 >= 0 && RegExp.$4 <= 255 && RegExp.$4 >= 0 ) { callback(); } else { callback(new Error('请输入正确的ip地址!')); } } else { callback(new Error('请输入正确的ip地址!')); } }; /* * 检验金额 */ export const checkMoney = (rule, money, callback) => { money = String(money); money = money.replace(/(^\s*)|(\s*$)/g, ''); const reg = /^[0-9]*\.?[0-9]{0,2}$/; const regNum = /^[0-9]+.?[0-9]*$/; if (!regNum.test(money)) { callback(new Error('含有非数字字符!')); } else if (money[0] == '0' && money.length > 2 && money[1] !== '.') { callback(new Error('请输入正确的金额!')); } else if (!reg.test(money)) { callback(new Error('请输入正确的金额!')); } else { callback(); } }; /* * 检验否是汉字 */ export const checkCharacter = (rule, value, callback) => { const reg = /^[\u4e00-\u9fa5]{0,}$/; if (reg.test(value)) { callback(); } else { callback(new Error('只能输入汉字!')); } }; /* * 统一社会信用代码 */ export const creditCode = (rule, value, callback) => { const reg = /^[^_IOZSVa-z\\W]{2}\\d{6}[^_IOZSVa-z\\W]{10}$/; if (reg.test(value)) { callback(); } else { callback(new Error('请输入正确的统一社会信用代码!')); } }; /* * 传真号码 */ export const checkFax = (rule, value, callback) => { const reg = /^[0-9]{1}([0-9]|;|;|-|-|\\+|\\+){0,49}$/; if (reg.test(value)) { callback(); } else { callback(new Error('请输入正确的传真号码!')); } };