daoji_h5/utils/validate.js

206 lines
6.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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大于02可为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可为02大于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大于02可为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