UNPKG

cloud-symbol

Version:

123

311 lines (292 loc) 8.38 kB
//此组件提供特殊表单校验功能 //01.校验身份证输入是否正确 /** * * @param {Number || String} value 身份证 * @returns 校验通过返回TRUE 否则 返回FALSE */ function idCard(value) { // 加权因子 var weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 校验码 var check_code = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]; var code = value + ""; var last = value[17]; //最后一位 var seventeen = code.substring(0, 17); // ISO 7064:1983.MOD 11-2 // 判断最后一位校验码是否正确 var arr = seventeen.split(""); var len = arr.length; var num = 0; for (var i = 0; i < len; i++) { num = num + arr[i] * weight_factor[i]; } // 获取余数 var resisue = num % 11; var last_no = check_code[resisue]; // 格式的正则 // 正则思路 /* 第一位不可能是0 第二位到第六位可以是0-9 第七位到第十位是年份,所以七八位为19或者20 十一位和十二位是月份,这两位是01-12之间的数值 十三位和十四位是日期,是从01-31之间的数值 十五,十六,十七都是数字0-9 十八位可能是数字0-9,也可能是X */ var idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/; // 判断格式是否正确 var format = idcard_patter.test(value); // 返回验证结果,校验码和格式同时正确才算是合法的身份证号码 return last === last_no && format ? true : false; } //02 校验手机号是否正确 /** * * @param {Number || String} mobile 手机号 * @returns 校验通过返回TRUE 否则 返回FALSE */ function mobile(mobile) { var reg = /^[1][3,4,5,7,8,9][0-9]{9}$/; return reg.test(mobile); } // 03 通过身份证获取年龄 /** * * @param {Number || String}} value 身份证 * @returns 返回格式 YYYY-MM-DD 如 1999-05-01 */ function birthday(value) { var birthday = ""; if (value != null && value != "") { if (value.length == 15) { birthday = "19" + value.substr(6, 6); } else if (value.length == 18) { birthday = value.substr(6, 8); } birthday = birthday.replace(/(.{4})(.{2})/, "$1-$2-"); } return birthday; } //04 通过身份证获取年龄 /** * * @param {Number || String} value 身份证 * @returns 返回 身份证中年龄 如 22 */ function age(value) { var myDate = new Date(); var month = myDate.getMonth() + 1; var day = myDate.getDate(); var age = myDate.getFullYear() - value.substring(6, 10) - 1; if ( value.substring(10, 12) < month || (value.substring(10, 12) == month && value.substring(12, 14) <= day) ) { age++; } return age; } //05 通过身份证获取性别 /** * * @param {Number || String} value 身份证 * @returns 返回 字符串 男 或 女 */ function gender(value) { if (parseInt(value.substr(16, 1)) % 2 == 1) { return "男"; } else { return "女"; } } //06 校验银行卡 /** * * @param {Number || String} value 银行卡 * @returns 校验通过返回 TRUE 否则返回 FALSE */ function bankCard(value) { var lastNum = value.substr(value.length - 1, 1); //取出最后一位(与luhn进行比较) var first15Num = value.substr(0, value.length - 1); //前15或18位 var newArr = new Array(); for (var i = first15Num.length - 1; i > -1; i--) { //前15或18位倒序存进数组 newArr.push(first15Num.substr(i, 1)); } var arrJiShu = new Array(); //奇数位*2的积 <9 var arrJiShu2 = new Array(); //奇数位*2的积 >9 var arrOuShu = new Array(); //偶数位数组 for (var 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]); } var jishu_child1 = new Array(); //奇数位*2 >9 的分割之后的数组个位数 var jishu_child2 = new Array(); //奇数位*2 >9 的分割之后的数组十位数 for (var h = 0; h < arrJiShu2.length; h++) { jishu_child1.push(parseInt(arrJiShu2[h]) % 10); jishu_child2.push(parseInt(arrJiShu2[h]) / 10); } var sumJiShu = 0; //奇数位*2 < 9 的数组之和 var sumOuShu = 0; //偶数位数组之和 var sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和 var sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和 var sumTotal = 0; for (var m = 0; m < arrJiShu.length; m++) { sumJiShu = sumJiShu + parseInt(arrJiShu[m]); } for (var n = 0; n < arrOuShu.length; n++) { sumOuShu = sumOuShu + parseInt(arrOuShu[n]); } for (var 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值 var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10; var luhn = 10 - k; if (lastNum == luhn) { return true; } else { return false; } } //邮箱校验 /** * * @param {Number || String} value 邮箱 * @returns 校验通过返回 TRUE 否则返回 FALSE */ function email(value) { var check = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; return check.test(value); } // 座机号校验 /** * * @param {Number || String} value 座机号 * @returns 校验通过返回 TRUE 否则返回 FALSE */ function fixedPhone(value) { return /^\d{3,4}-\d{7,8}(-\d{3,4})?$/.test(value); } // 验证护照号码 /** * * @param {Number || String} value 护照号 * @returns 校验通过返回 TRUE 否则返回 FALSE */ function passport(value) { return /^((1[45]\d{7})|(G\d{8})|(P\d{7})|(S\d{7,8}))?$/.test(value); } //节流函数 function throttle(fn, delay) { // fn = test let timerId = null; let flag = true; return function () { if (!flag) return; flag = false; let self = this; let args = arguments; timerId && clearTimeout(timerId); timerId = setTimeout(function () { flag = true; fn.apply(self, args); }, delay || 1000); }; } //防抖函数 function debounce(fn, delay) { let timerId = null; return function () { let self = this; let args = arguments; timerId && clearTimeout(timerId); timerId = setTimeout(function () { fn.apply(self, args); }, delay || 1000); }; } //姓名脱敏 /** * * @param {String} name 姓名 * @returns 返回脱敏后的姓名 如传入 张三 => 张* 刘德华=> 刘*华 三上亚悠=> 三**悠 */ function nameHide(name) { if (name.length == 2) { name = name.substring(0, 1) + "*"; //字符串截取第一个字符, } else if (name.length == 3) { name = name.substring(0, 1) + "*" + name.substring(2, 3); //截取第一个和第三个字符 } else if (name.length > 3) { name = name.substring(0, 1) + "*" + "*" + name.substring(3, name.length); //截取第一个和大于第4个字符 } return name; } //手机号脱敏 /** * * @param {Number || String} mobile 手机号 * @returns 返回脱敏后的手机号 如传入 13388888888 返回 133****8888 */ function mobileHide(mobile) { let pat = /(\d{3})\d*(\d{4})/; mobile = mobile.replace(pat, "$1****$2"); return mobile; } //身份证脱敏 /** * * @param {Number || String} idCard 身份证 * @returns 返回脱敏后的身份证 如传入 370982199201303679 返回 370************679 */ function idCardHide(idCard) { return idCard.replace(/^(.{1})(?:\d+)(.{1})$/, '$1****************$2'); } //判断当前设备类型 /** * * @returns 返回当前设备类型 苹果 ios 安卓 android PC网页 web */ function getDeviceType() { let ua = navigator.userAgent.toLowerCase() if (ua.match(/iPhone\sOS/i) === 'iphone os' || ua.match(/iPad/i) === 'ipad') { // ios return 'ios' } if (ua.match(/Android/i) === 'android') { return 'android' } return 'web' } module.exports = { idCard, mobile, birthday, age, gender, bankCard, email, fixedPhone, passport, throttle, debounce, nameHide, mobileHide, idCardHide, getDeviceType };