UNPKG

ttk-app-core

Version:

@ttk/recat enterprise develop framework

69 lines (68 loc) 2.96 kB
import schema from 'async-validator' import { collectDepends, validateDepends } from './dependValidator' /** * @description : 校验所有需要校验的文本域 * @param {Object} fields: 需要校验的文本域对象 {key: value, key2: value} * @param {Object} descriptor: 校验规则,含需要校验的文本域的对象.文本域的校验规则可以是一个数组 * 定义需要校验的字段和校验规则,详情可参考 * https://github.com/yiminghe/async-validator * const descriptor = { * code: [{ type: 'string', required: true, message: '请输入编码' }, { min: 6, max: 8, message: '编码长度不得小于6、大于8' }], * name: [{ type: 'string', required: true, message: '请输入名称' },{ min: 6, max: 8, message: '编码长度不得小于6、大于8' }], * sortNo: { type: 'string', required: true, message: '请输入顺序' }, * busTypeId: { type: 'string', required: true, message: '请选择业务类型' }, * url: { type: 'string', required: true, message: '请输入路径' } * } * @param {Function} formData: 整个表单数据,用于依赖校验时使用 * @returns {Array}: 返回一个长度为2的数组,第一个为boolean值,代表是否验证通过。第二个是错误消息状态,错误消息状态如下 * { * code: {state: 'error', message: '编码不能重复'} * name: {state: 'success', message: ''} * } */ export function fieldValidator(fields, descriptor, formData) { return async function validate() { // 为了避免每次都校验所有字段,下面添加筛选逻辑,只筛选出fields参数中包含的字段,即fields和descriptor的并集 let obj = {} let result = {} let depend for (let [key, value] of Object.entries(fields)) { if (!descriptor[key]) continue obj[key] = descriptor[key] result[key] = { state: 'success', message: '' } depend = collectDepends(key, descriptor[key]) } let res = await validator(fields, obj) if (formData) { res = await validateDepends(res, fields, formData) } result = { ...result, ...res } return [!Object.values(res).some((item) => item.state==="error"), result] // return [Object.keys(res).length === 0, result] }() } /** * @description 规矩校验器 * @param {Object} source: 文本域对象 * @param {Object} descriptor: 校验规则 * @returns {Object} 返回一个对象 {name: {state: 'error', message: ''}} */ async function validator(source, descriptor) { let checker = new schema(descriptor) let result = {} await checker.validate(source, { firstFields: true}) .then(() => { // 验证成功 // return result }) .catch(({ errors, fields }) => { if (errors) { // 校验失败的处理, 目前只返回第一条错误信息,如果需要返回多条错误信息,可在此修改 for (let [key, value] of Object.entries(fields)) { result[key] = { ...value[0], state: 'error' } } return result } }) return result }