/** * @description 用于表单提交时候的验证 * @param */ const formRegular = { specialChart: /[^%&',;=?$\x22]+/, // 含有特殊字符 password: /^[a-zA-Z]\w{5,11}$/, // 字母开头,6-12位,只能包含字符、数字和下划线 phone: /^[1][2,3,4,5,6,7,8,9][0-9]{9}$/, // 电话 emial: /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/, // 邮箱 idCard: /^\d{15}|\d{}18$/, // 身份证 float: /^[0-9]+(.[0-9]{0,2})?$/, // 最多两位小数 int: /^\+?[1-9][0-9]*$/ // 非0正整数 } const dealRegular = (type, val) => { let isOk = true for (let key in formRegular) { if (type === key) { isOk = formRegular[key].test(val) return isOk } } } const deepCopy = (source, trimIf) => { if (!source) { return source; } let sourceCopy = source instanceof Array ? [] : {}; for (let item in source) { if (typeof source[item] === 'object') { sourceCopy[item] = deepCopy(source[item]) } else { sourceCopy[item] = trimIf && Object.prototype.toString.call(source[item]) == "[object String]" ? source[ item].trim() : source[item]; } } return sourceCopy; }; /* 规范化输入 validateForm通过校验时返回经过trim及空值处理的新对象,如果未通过校验则返回false rule:字段校验规则 rule:{ "goodsNum":[ { type:'number', message:"领用数量最大为100" }, { required:true, message:"领用数量最大为100" }, { min:1, max:100, message:"领用数量为1-100!" } ], "goodsNum":[ { type:'phone', message:"请输入正确的手机号码" } ], "remark":[ { len:500, message:"备注最多支持500个字符" } ], "specialPattren":[ { pattern:/^[A-Z]{1}[0-9]{9}/g, message:"请输入以大写字母开头的长度为10的字符" } ] }, trimIf:是否需要去除空格 removeNull:是否需要将值为undefined,null,""的属性移除,默认值为false 目前支持校验方式: 1、针对number类型支持最大值max,最小值min校验,对于字符串支持长度len校验 2、对type等于phone,email等类型进行校验 3、支持用户传入pattern进行正则扩充校验 4、对于进行规范化输入的表单默认进行trim处理 5、removeNull默认为false,false时不对对具有undefined,null,空字符等处理,为true时会从对象上面剔除相关属性 */ let breakIf = false; const validateForm = (data, rule = null, trimIf = true, removeNull = false) => { let newobj = Object.prototype.toString.call(data) == '[object Array]' ? [] : {} for (let key in data) { if (breakIf) { break; } let type = Object.prototype.toString.call(data[key]) //针对引用类型做深拷贝处理 if (type === '[object Array]' || type === '[object Object]') { newobj[key] = deepCopy(data[key], trimIf) }else if (type === '[object Date]' || data[key] === '') { newobj[key] = data[key] } else if (data[key] === null || data[key] === undefined || data[key] === '') { //removeNull默认false,此时需要将值赋给新对象 if(!removeNull){ newobj[key] = data[key] } }else{ newobj[key] = trimIf && type === '[object String]' ? data[key].trim() : data[key] } if (rule && rule[key]) { for (let k in rule[key]) { // 判断是否为数字 if (rule[key][k].type && rule[key][k].type == "number" && isNaN(data[key])) { actionNext(rule[key][k].message) break; } // 判断手机号邮箱身份证等类型详见 if (rule[key][k].type && formRegular[rule[key][k].type] && !dealRegular(rule[key][k] .type, data[key])) { actionNext(rule[key][k].message) break; } // 根据用户提供的正则表达式判断 if (rule[key][k].pattern && !rule[key][k].pattern.test(data[key])) { actionNext(rule[key][k].message) break; } // 判断是否必填 if (rule[key][k].required && isEmpty(data[key])) { actionNext(rule[key][k].message) break; } //判断是否超过最大值最小值 if ((rule[key][k].max || rule[key][k].min) && data[key] && (data[key] > rule[key][k].max || data[key] < rule[key][k].min)) { actionNext(rule[key][k].message) break; } //长度校验(string,Array等具有length属性的类型都支持) if (rule[key][k].len && data[key] && data[key].length > rule[key][k].len) { actionNext(rule[key][k].message) break; } } } } initBreakIf() return !breakIf ? newobj : false; } const initBreakIf = () => { setTimeout(() => { breakIf = false }, 0) } const actionNext = (message) => { wx.showToast({ title: message, icon: 'none' }) breakIf = true // initBreakIf() } //判断是否为空 const isEmpty = (value) => { if (value === undefined || value === null || value === '') { return true } //数组 if (Object.prototype.toString.call(value) == '[object Array]' && value.length == 0) { return true } //对象 if (Object.prototype.toString.call(value) == '[object Object]' && Object.keys(value).length == 0) { return true } } /** * 校验字段是否为空 * @param {*} params 要校验的参数 * @param {*} rules 哪些字段要必传,和他要展示的错误提示内容 * @returns */ const checkParamsIsMust = (params, rules) => { let errMsg = '' for (let i = 0; i < rules.length; i++) { const key = rules[i].key const checkResult = isEmpty(params[key]) if (checkResult) { errMsg = `请填写${rules[i].keyStr}!` break } } return errMsg } export { validateForm, deepCopy, checkParamsIsMust, formRegular }