使用策略模式统一管理校验规则

450 阅读1分钟

公共方法抽取

/*
 * @Date: 2020-11-17 15:33:42
 * @Description: 查询条件正则方法抽取
 */
//  正则集合
const REG_SET= {
    phone_reg:/^1[3456789]\d{9}$/,
    card_reg:/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
    tel_reg:/0\d{2}-\d{7,8}/,
    email_reg:/^([a-zA-Z0-9]+[-_\.]?)+@[a-zA-Z0-9]+\.[a-z]+$/,
    url_reg:/^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
}
// 默认校验集合
const default_strategies = {
    // 不能为空
    isEmpty:(value,message) => {            
        if( value==="") return message
    },
    // 长度校验小于多少位
    minLength:(value,length,message) => {  
        const valueLen = (value+"").length  //如果传入的值为Number,需隐式转换
        if(valueLen < length) return message
    },
    // 手机号校验
    isPhone:(value,message) => {           
        if(!REG_SET['phone_reg'].test(value)) return message
    },
    // 身份证号码校验
    isCard:(value,message)=> {
        if(!REG_SET['card_reg'].test(value)) return message
    },
    // 固话校验
    isTel:(value,message)=> {
        if(!REG_SET['tel_reg'].test(value)) return message
    },
    // 邮箱校验
    isEmail:(value,message)=> {
        if(!REG_SET['email_reg'].test(value)) return message
    },
    // url校验
    isUrl:(value,message)=> {
        if(!REG_SET['url_reg'].test(value)) return message
    },
}
// 策略类
export default class Vaildator{
    constructor(strategies={}){
        this.cache = []   
        this.strategies = Object.assign(default_strategies,strategies)
    }
    /**
     * @description  添加校验对象和规则  
     * @param{value} 校验的对象
     * @param{rules} 校验的规则的集合
     */
    add( value,rules ){
        const _this = this
        rules.forEach(rule=>{
            ~function(rule){
                const ary = rule.strategy.split(":"),
                    msg = rule.errMsg;
                _this.cache.push( function(){
                    const strategy = ary.shift()  // 校验的键
                    ary.unshift(value)
                    ary.push(msg)
                    return _this.strategies[strategy].apply(null,ary)
                })
            }(rule)
        })
    }
    /** 
     * @description 开启校验
     */
    start(){
        const len = this.cache.length
        for( let i = 0;  i<len ;i++ ){
            let errMsg = undefined
            if( this.cache[i]) errMsg = this.cache[i]()
            if(errMsg) return errMsg
        }
    }
}

组件内使用方式

import Vaildator from 'until/check.js'

// new 一个规则校验对象,如果没有对应校验规则可以自己添加校验策略
const checkObj = new Vaildator({
    isCard:(value,message)=>{
        if(!(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(value))) return message
    }
})
const a = '',b = "131127199810260530",c="13722807589";
checkObj.add(b,[{
    strategy: 'isCard',
    errMsg: '请输入正确的身份证号!'
}])
checkObj.add(a,[{
    strategy: 'isEmpty',
    errMsg: '输入内容不能为空!'
}])	
const errmsg = checkObj.start()
console.log(errmsg)