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

179 lines
5.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/** 统一社会信用代码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();
},
};
}