206 lines
6.2 KiB
JavaScript
206 lines
6.2 KiB
JavaScript
|
const strategies = {
|
|||
|
// errorMsg参数,提升了适用性
|
|||
|
isNotNull: function(value, errorMsg, regType) { //去空字符,不为空
|
|||
|
// regType 2去除所有空格
|
|||
|
if (regType == 2 && value) {
|
|||
|
value = value.replace(/(^\s*)|(\s*$)/g, "")
|
|||
|
}
|
|||
|
if (value === '' || value === undefined || value === false || JSON.stringify(value) === '[]' || JSON
|
|||
|
.stringify(value) === '{}') {
|
|||
|
// 返回字符串true 错误信息
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
},
|
|||
|
minLength: function(value, errorMsg, length) { //限制最小长度
|
|||
|
if (value.length < length) {
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
},
|
|||
|
maxLength: function(value, errorMsg, length) { //限制最大长度
|
|||
|
if (value == null || value.length < 1) {
|
|||
|
return errorMsg;
|
|||
|
} else if (value.length > length) {
|
|||
|
return `${errorMsg},最多¥${length}字`;
|
|||
|
}
|
|||
|
},
|
|||
|
isAllPhone: function(value, errorMsg, regType, regText) {
|
|||
|
regText = regText || '电话号码'
|
|||
|
let reg = /((^400)-([0-9]{7})$)|(^1[3-9]\d{9}$)|((^0\d{2,3})-(\d{7,8})$)/
|
|||
|
if (value == null || value.length < 1) {
|
|||
|
return errorMsg;
|
|||
|
} else if (!reg.test(value)) {
|
|||
|
return `${value} ${regText}无效`
|
|||
|
}
|
|||
|
},
|
|||
|
isMobile: function(value, errorMsg) {
|
|||
|
// if (!/^((\+?86)|(\(\+86\)))?(13[012356789][0-9]{8}|15[012356789][0-9]{8}|18[02356789][0-9]{8}|147[0-9]{8}|1349[0-9]{7}|([0-9]{3,4}-)?[0-9]{7,8})$/.test(value)) { //电话号码校验
|
|||
|
if (value == null || value.length < 1) {
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
if (!/^(1[0-9]{10})$/.test(value)) { //电话号码校验
|
|||
|
return `${value} 手机号无效`;
|
|||
|
}
|
|||
|
},
|
|||
|
isZuoji: function(value, errorMsg) {
|
|||
|
if (!/0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d{7,8}|\(?0\d{2,3}[)-]*\d{7,8}$/.test(value)) { //座机号码校验
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
},
|
|||
|
isNotText: function(value, errorMsg) {
|
|||
|
if (!/^[\u4e00-\u9fa5]+$/.test(value)) { //非中文校验
|
|||
|
} else {
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
},
|
|||
|
isWechat: function(value, errorMsg) {
|
|||
|
if (!/^[a-zA-Z]{1}[-_a-zA-Z0-9]{5,29}$/.test(value)) { //微信号码校验
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
},
|
|||
|
isEmail: function(value, errorMsg) {
|
|||
|
if (!/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(value)) { //邮箱校验
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
},
|
|||
|
isMoney: function(value, errorMsg, regType) {
|
|||
|
// regType 1大于0;2可为0
|
|||
|
let regArr = {
|
|||
|
1: /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/,
|
|||
|
2: /^(([0-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
|
|||
|
}
|
|||
|
let reg = regArr[regType]
|
|||
|
if (value == '') {
|
|||
|
return errorMsg;
|
|||
|
} else if (regType == 1 && value * 1 === 0) {
|
|||
|
return `${errorMsg},不可为0`;
|
|||
|
} else if (!reg.test(value)) {
|
|||
|
return `${errorMsg},最多2位小数`;
|
|||
|
}
|
|||
|
},
|
|||
|
isUrl: function(value, errorMsg) {
|
|||
|
if (value.indexOf('http') < 0) {
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
},
|
|||
|
isNumber: function(value, errorMsg, regType) {
|
|||
|
// 1可为0;2大于0
|
|||
|
let reg = regType == 1 ? /^\+?[0-9]*$/ : /^[1-9]\d*$/
|
|||
|
if (!reg.test(value)) {
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
},
|
|||
|
isFloatNum: function(value, errorMsg, regType, dotLen) {
|
|||
|
// dotLen 保留几位小数
|
|||
|
// regType 1大于0;2可为0
|
|||
|
let regArr = {
|
|||
|
1: {
|
|||
|
1: /^(([1-9][0-9]*)|(([0]\.\d{1}|[1-9][0-9]*\.\d{1})))$/,
|
|||
|
2: /^(([0-9][0-9]*)|(([0]\.\d{1}|[1-9][0-9]*\.\d{1})))$/
|
|||
|
},
|
|||
|
2: {
|
|||
|
1: /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/,
|
|||
|
2: /^(([0-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
|
|||
|
}
|
|||
|
}
|
|||
|
let reg = regArr[dotLen][regType]
|
|||
|
if (value == '') {
|
|||
|
return errorMsg;
|
|||
|
} else if (regType == 1 && value * 1 === 0) {
|
|||
|
return `${errorMsg},不可为0`;
|
|||
|
} else if (!reg.test(value)) {
|
|||
|
return `${errorMsg},最多${dotLen}位小数`;
|
|||
|
}
|
|||
|
},
|
|||
|
isIdCard: function(value, errorMsg) {
|
|||
|
var regIdCard =
|
|||
|
/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
|
|||
|
if (value == null || value.length < 1) {
|
|||
|
return errorMsg;
|
|||
|
}
|
|||
|
if (regIdCard.test(value)) {
|
|||
|
if (value.length == 18) {
|
|||
|
var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4,
|
|||
|
2); //将前17位加权因子保存在数组里
|
|||
|
var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3,
|
|||
|
2); //这是除以11后,可能产生的11位余数、验证码,也保存成数组
|
|||
|
var idCardWiSum = 0; //用来保存前17位各自乖以加权因子后的总和
|
|||
|
for (var i = 0; i < 17; i++) {
|
|||
|
idCardWiSum += value.substring(i, i + 1) * idCardWi[i];
|
|||
|
}
|
|||
|
var idCardMod = idCardWiSum % 11; //计算出校验码所在数组的位置
|
|||
|
var idCardLast = value.substring(17); //得到最后一位身份证号码
|
|||
|
//如果等于2,则说明校验码是10,身份证号码最后一位应该是X
|
|||
|
if (idCardMod == 2) {
|
|||
|
if (idCardLast == "X" || idCardLast == "x") {} else {
|
|||
|
return `${value} 身份证号码最后一位应为X`;
|
|||
|
}
|
|||
|
} else {
|
|||
|
//用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
|
|||
|
if (idCardLast == idCardY[idCardMod]) {} else {
|
|||
|
return `${value} 身份证号码无效`;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
return `${value} 身份证号码无效`;
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
class Validate {
|
|||
|
constructor() {
|
|||
|
this.cache = []
|
|||
|
}
|
|||
|
}
|
|||
|
Validate.prototype.add = function(value, item = {}) {
|
|||
|
let {
|
|||
|
checkType,
|
|||
|
errorMsg,
|
|||
|
length,
|
|||
|
regType = 1,
|
|||
|
regText,
|
|||
|
dotLen = 2
|
|||
|
} = item
|
|||
|
this.cache.push(function() {
|
|||
|
// 规则
|
|||
|
let method, arr;
|
|||
|
//判断为已有的策略还是新增的
|
|||
|
if (typeof checkType === 'string') {
|
|||
|
arr = checkType.split(':');
|
|||
|
let strategy = arr.shift();
|
|||
|
method = strategies[strategy];
|
|||
|
} else {
|
|||
|
arr = [];
|
|||
|
method = checkType;
|
|||
|
}
|
|||
|
arr.unshift(value);
|
|||
|
arr.push(errorMsg);
|
|||
|
let lengthArr = ['minLength', 'maxLength']
|
|||
|
if (lengthArr.includes(checkType) && length) {
|
|||
|
arr.push(length);
|
|||
|
}
|
|||
|
let regTypeArr = ['isNotNull', 'isAllPhone', 'isMoney', 'isNumber', 'isFloatNum']
|
|||
|
if (regTypeArr.includes(checkType)) {
|
|||
|
arr.push(regType);
|
|||
|
}
|
|||
|
let regTextArr = ['isAllPhone']
|
|||
|
if (regTextArr.includes(checkType)) {
|
|||
|
arr.push(regText);
|
|||
|
}
|
|||
|
let dotLenArr = ['isFloatNum']
|
|||
|
if (dotLenArr.includes(checkType)) {
|
|||
|
arr.push(dotLen);
|
|||
|
}
|
|||
|
return method.apply(null, arr);
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
Validate.prototype.start = function() {
|
|||
|
for (let i = 0, validatorFunc; validatorFunc = this.cache[i++];) {
|
|||
|
let msg = validatorFunc();
|
|||
|
if (msg) {
|
|||
|
return msg;
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
export default Validate
|