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 |