156 lines
4.3 KiB
JavaScript
Raw Permalink Normal View History

2026-01-19 18:52:18 +08:00
import dayjs from 'dayjs';
import { toast } from '@/utils/widget';
import validate from "@/utils/validate";
const FormRule = {
date: checkDate,
input: checkInput,
radio: checkListItem,
select: checkListItem,
textarea: checkInput,
selectMobile: checkInput,
selectAndOther: checkInput,
selectAndImage: checkListItem,
multiSelectAndOther: checkMultiList,
files: checkFiles,
runTime: checkInput,
2026-01-19 18:52:18 +08:00
}
const fixedRule = {
mobile: checkMobile,
idCard: checkIdCard,
}
export default function verify(items, rule = {}, data = {}) {
const rules = { ...fixedRule, ...rule };
for (let item of items) {
const value = data[item.title];
// 非自定义表单 数据验证
if (item.operateType === 'formCell' && FormRule[item.type]) {
const valid = FormRule[item.type](item, value);
if (!valid) return false
}
// 自定义校验规则 检验表单
// 自定义校验表单规则 必须是函数且返回结果只能是 错误信息或者 true
if (typeof rules[item.title] === 'function') {
const res = rules[item.title](value, item.name);
if (typeof res === 'string') {
toast(res);
return false
} else if (res !== true) {
console.error('自定义检验规则只能返回 字符串或者true')
}
}
}
return true
}
function checkDate({ name, required }, value) {
if (!required && !isTrueValue(value)) return true;
if (required && !isTrueValue(value)) {
2026-01-19 18:52:18 +08:00
toast(`请选择${name}`)
return false
}
if (!dayjs(value).isValid()) {
toast(`${name}格式不正确`)
return false
}
return true
}
function checkListItem({ range, name, required }, value) {
if (isTrueValue(value)) {
if (!Array.isArray(range) || range.length === 0) {
toast(`${name}所选值无效,请重新选择`)
return false
}
const candidate = typeof value === 'string' || typeof value === 'number' ? String(value) : value;
const isObjectRange = range.length > 0 && range[0] && typeof range[0] === 'object';
if (isObjectRange) {
const values = range
.map((i) => (i && typeof i === 'object' && 'value' in i ? i.value : undefined))
.filter((i) => i !== undefined && i !== null)
.map((i) => String(i));
if (!values.includes(String(candidate))) {
toast(`${name}所选值无效,请重新选择`)
return false
}
} else if (!range.map((i) => String(i)).includes(String(candidate))) {
2026-01-19 18:52:18 +08:00
toast(`${name}所选值无效,请重新选择`)
return false
}
} else {
if (required) {
toast(`请选择${name}`)
return false
}
}
return true
}
function checkMobile(value, name) {
if (isTrueValue(value)) {
const res = validate.isMobile(value);
if (res) return true;
else return `${name}格式不正确`
}
return true
}
function checkIdCard(value, name) {
if (isTrueValue(value)) {
const [res, msg] = validate.isChinaId(value);
if (res) return true;
else return msg || `${name}格式不正确`
}
return true
}
function checkInput({ name, required, wordLimit, inputType }, value) {
if (!required && !isTrueValue(value)) return true;
2026-01-19 18:52:18 +08:00
if (required && !isTrueValue(value)) {
toast(`请输入${name}`)
return false
}
if (wordLimit > 0 && inputType === 'text' && value.toString().length > wordLimit) {
toast(`${name}最多输入${wordLimit}个字符`)
return false
}
return true
}
function checkMultiList({ name, required }, value) {
const list = Array.isArray(value) ? value.filter(isTrueValue) : [];
if (required && list.length === 0) {
toast(`请选择${name}`)
return false
}
return true
}
function checkFiles({ name, required }, value) {
const list = Array.isArray(value)
? value
.map((i) => {
if (typeof i === 'string') return i;
if (i && typeof i === 'object' && i.url) return String(i.url);
return '';
})
.filter((i) => typeof i === 'string' && i.trim() !== '')
: typeof value === 'string' && value.trim() !== ''
? [value]
: [];
if (required && list.length === 0) {
toast(`请上传${name}`)
return false
}
return true
}
2026-01-19 18:52:18 +08:00
function isTrueValue(value) {
if (typeof value === 'string') return value.trim() !== '';
if (typeof value === 'number') return true;
return Boolean(value)
}