You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
shangmenanmo/utils/validate.js

206 lines
6.2 KiB

5 months ago
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