safety-eval-website/src/utils/validators.js

179 lines
5.3 KiB
JavaScript
Raw Normal View History

2026-07-06 16:22:59 +08:00
/** 统一社会信用代码18 位,不含 I/O/S/V/Z */
export const CREDIT_CODE_PATTERN = /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/;
/** 18 位身份证号 */
export const ID_CARD_PATTERN = /^\d{17}[\dX]$/i;
/** 手机号 */
export const MOBILE_PHONE_PATTERN = /^1[3-9]\d{9}$/;
/** 固话或手机 */
export const PHONE_PATTERN = /^(\d{3,4}-?\d{7,8}|1[3-9]\d{9})$/;
/** 经度 */
export const LONGITUDE_PATTERN = /^-?((1[0-7]\d)|(\d{1,2}))(\.\d+)?$|^180(\.0+)?$/;
/** 纬度 */
export const LATITUDE_PATTERN = /^-?([1-8]?\d(\.\d+)?|90(\.0+)?)$/;
/** URL */
export const URL_PATTERN = /^(https?:\/\/)[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=.]*$/;
export function creditCodeRule(required = true) {
return {
required,
message: required ? "请输入统一社会信用代码" : undefined,
pattern: CREDIT_CODE_PATTERN,
...(required ? {} : { validateTrigger: "onBlur" }),
validator: (_, value) => {
if (!value) {
return required ? Promise.reject(new Error("请输入统一社会信用代码")) : Promise.resolve();
}
if (!CREDIT_CODE_PATTERN.test(value.trim())) {
return Promise.reject(new Error("统一社会信用代码格式不正确"));
}
return Promise.resolve();
},
};
}
export function idCardRule(required = true) {
return {
required,
validator: (_, value) => {
if (!value) {
return required ? Promise.reject(new Error("请输入身份证号")) : Promise.resolve();
}
const id = String(value).trim();
if (!ID_CARD_PATTERN.test(id)) {
return Promise.reject(new Error("身份证号格式不正确"));
}
return Promise.resolve();
},
};
}
export function phoneRule(label = "联系电话", required = true) {
return {
required,
validator: (_, value) => {
if (!value) {
return required ? Promise.reject(new Error(`请输入${label}`)) : Promise.resolve();
}
const str = String(value).replace(/\s+/g, "");
if (!PHONE_PATTERN.test(str)) {
return Promise.reject(new Error(`${label}格式不正确`));
}
return Promise.resolve();
},
};
}
export function mobileRule(label = "账号", required = true) {
return {
required,
validator: (_, value) => {
if (!value) {
return required ? Promise.reject(new Error(`请输入${label}`)) : Promise.resolve();
}
const str = String(value).replace(/\s+/g, "");
if (!MOBILE_PHONE_PATTERN.test(str)) {
return Promise.reject(new Error(`${label}应为11位手机号`));
}
return Promise.resolve();
},
};
}
export function longitudeRule(required = false) {
return {
required,
validator: (_, value) => {
if (value === undefined || value === null || value === "") {
return required ? Promise.reject(new Error("请输入经度")) : Promise.resolve();
}
const num = Number(value);
if (Number.isNaN(num) || num < -180 || num > 180) {
return Promise.reject(new Error("经度格式不正确(-180 ~ 180"));
}
return Promise.resolve();
},
};
}
export function latitudeRule(required = false) {
return {
required,
validator: (_, value) => {
if (value === undefined || value === null || value === "") {
return required ? Promise.reject(new Error("请输入纬度")) : Promise.resolve();
}
const num = Number(value);
if (Number.isNaN(num) || num < -90 || num > 90) {
return Promise.reject(new Error("纬度格式不正确(-90 ~ 90"));
}
return Promise.resolve();
},
};
}
export function urlRule(label = "网址", required = false) {
return {
required,
validator: (_, value) => {
if (!value) {
return required ? Promise.reject(new Error(`请输入${label}`)) : Promise.resolve();
}
if (!URL_PATTERN.test(String(value).trim())) {
return Promise.reject(new Error(`${label}格式不正确`));
}
return Promise.resolve();
},
};
}
export function positiveNumberRule(label, required = false) {
return {
required,
validator: (_, value) => {
if (value === undefined || value === null || value === "") {
return required ? Promise.reject(new Error(`请输入${label}`)) : Promise.resolve();
}
const num = Number(value);
if (Number.isNaN(num) || num < 0) {
return Promise.reject(new Error(`${label}应为非负数字`));
}
return Promise.resolve();
},
};
}
/** 非负整数(人员数量等) */
export function nonNegativeIntegerRule(label, required = false) {
return {
required,
validator: (_, value) => {
if (value === undefined || value === null || value === "") {
return required ? Promise.reject(new Error(`请输入${label}`)) : Promise.resolve();
}
const num = Number(value);
if (!Number.isInteger(num) || num < 0) {
return Promise.reject(new Error(`${label}应为非负整数`));
}
return Promise.resolve();
},
};
}
export function dateRangeRule(label = "证书有效期") {
return {
validator: (_, value) => {
const allEmpty = Array.isArray(value) && value.every(item => item === "" || item == null);
if (allEmpty || !value || !value[0] || !value[1]) {
return Promise.reject(new Error(`请选择${label}`));
}
return Promise.resolve();
},
};
}