diff --git a/packages/devui-vue/devui/form/src/use-validate.ts b/packages/devui-vue/devui/form/src/use-validate.ts new file mode 100644 index 0000000000..62c01d5bda --- /dev/null +++ b/packages/devui-vue/devui/form/src/use-validate.ts @@ -0,0 +1,119 @@ +import AsyncValidator from 'async-validator'; + +export default function useValidate() { + + // 校验函数 + const validate = (descriptor, validateObject) => { + const validator = new AsyncValidator(descriptor); + return validator.validate(validateObject); + } + + // 创建内置校验器 + const createDevUIBuiltinValidator = (rule) => { + let res = {...rule}; + if(res.min !== undefined) { + res = { + ...res, + message: res.message ?? `最小值为${res.min}`, + asyncValidator: (r, val) => { + return new Promise((resolve, reject) => { + if(val < res.min) { + reject('最小值为' + res.min); + }else { + resolve('校验通过'); + } + }) + } + } + } + + if(res.max !== undefined) { + res = { + ...res, + message: res.message ?? `最大值为${res.max}`, + asyncValidator: (r, val) => { + return new Promise((resolve, reject) => { + if(val > res.max) { + reject('最大值为' + res.max); + }else { + resolve('校验通过'); + } + }) + } + } + } + + if(res.maxlength !== undefined) { + res = { + ...res, + max: res.maxlength, + message: res.message ?? `最大长度为${res.maxlength}` + } + delete res.maxlength; + delete res.asyncValidator; + } + + if(res.minlength !== undefined) { + res = { + ...res, + min: res.minlength, + message: res.message ?? `最小长度为${res.minlength}` + } + delete res.minlength; + delete res.asyncValidator; + } + + + if(res.requiredTrue !== undefined) { + res = { + ...res, + message: res.message ?? `必须为true值`, + asyncValidator: (r, val) => { + return new Promise((resolve, reject) => { + if(!val) { + reject('必须为true值'); + }else { + resolve('校验通过'); + } + }) + } + } + } + if(res.email !== undefined){ + res = { + ...res, + type: 'email', + message: res.message ?? '邮箱格式不正确' + } + delete res.asyncValidator; + } + if(res.pattern !== undefined){ + res = { + ...res, + type: 'pattern', + message: res.message ?? '正则不匹配' + } + delete res.asyncValidator; + } + if(res.whitespace === true){ + res = { + ...res, + type: 'string', + message: res.message ?? '不能全为空格', + asyncValidator: (r, val) => { + return new Promise((resolve, reject) => { + if(val.trim() === '') { + reject('不能全为空格'); + }else { + resolve('校验通过'); + } + }) + } + } + } + + return res; + } + + return {validate, createDevUIBuiltinValidator}; +}