import { validateFormats } from './format' import { Verify } from './verify'; const verify = new Verify(); export class Validate { validates = {} verify constructor() { this.verify = verify; this.addValidates(validateFormats); } /** * 添加统一验证方法 * @param options 大的配置对象,类似如下: * { phone:[['require','手机号不能为空'], ['isPhone','请输入正确的手机号码']], captcha: {require: '验证码不能为空', isLowerletter:'验证码输入错误'} * } */ addValidates = (vFormats) => { for (let key in vFormats) { this.validates[key] = this.verify.check(vFormats[key]); } } /** * 验证待检查字段 * @param values 待检测的值对象,如 * {loginName:18818818888,password:12345678,captcha:abcd} * @param options 检测字段对象,如 * { * loginName:'phone', * loginPassword: { * require:'不能为空',inLength:{message:'8-14位',args:[8,14]} * }, * phoneCode:['captcha',{isLowerletter:'请输入正确验证码'}] * } */ check = (values, options) => { const finalResult = {passedAll:false}; let isPassed = true; for (let name in options) { var validate = options[name]; var result = this.checkOne(values[name], validate); isPassed = isPassed && result.passed; finalResult[name] = result; } finalResult.passedAll = isPassed; return finalResult; } /** * 验证单个待检查字段 * @param value 待检测的值,如果为数组,则当成多个参数传入 * @param format 验证格式,可以为字符串、对象或数组 * 字符串如'phone' * 对象如{isLowerletter:'请输入正确验证码'} * 数组如['captcha',{isLowerletter:'请输入正确验证码'}],首个元素为格式名称,第2个元素为验证格式 * @param scope 将错误信息绑定的作用域,默认绑定如$scope.message.phone */ checkOne = (value, format) => { if(!format) return null; let result, formatName; if(Array.isArray(format)){ formatName = format[0]; result = this.verify.check(format[1])(value) }else if(typeof format === 'object'){ result = this.verify.check(format)(value) }else if(typeof format === 'string'){ formatName = format; result = this.validates[format] ? this.validates[format](value) : null } if(result && formatName) { result.format = formatName; } return result; } }