rwadurian/frontend/admin-web/src/utils/validators.ts

114 lines
2.8 KiB
TypeScript

/**
* 验证邮箱格式
*/
export function isValidEmail(email: string): boolean {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
/**
* 验证密码强度
* @returns 返回 0-4 表示强度等级
*/
export function getPasswordStrength(password: string): number {
let strength = 0;
if (password.length >= 6) strength++;
if (password.length >= 8) strength++;
if (/[a-z]/.test(password) && /[A-Z]/.test(password)) strength++;
if (/\d/.test(password)) strength++;
if (/[!@#$%^&*(),.?":{}|<>]/.test(password)) strength++;
return Math.min(strength, 4);
}
/**
* 验证手机号
*/
export function isValidPhone(phone: string): boolean {
const phoneRegex = /^1[3-9]\d{9}$/;
return phoneRegex.test(phone);
}
/**
* 验证密码格式 (6-20位)
*/
export function isValidPassword(password: string): boolean {
return password.length >= 6 && password.length <= 20;
}
/**
* 验证用户名 (2-20位字母数字下划线)
*/
export function isValidUsername(username: string): boolean {
const usernameRegex = /^[a-zA-Z0-9_]{2,20}$/;
return usernameRegex.test(username);
}
/**
* 验证数字范围
*/
export function isInRange(value: number, min: number, max: number): boolean {
return value >= min && value <= max;
}
/**
* 验证非空
*/
export function isNotEmpty(value: string | null | undefined): boolean {
return value !== null && value !== undefined && value.trim() !== '';
}
/**
* 表单验证规则
*/
export const validationRules = {
required: (message = '此字段为必填项') => ({
validate: (value: string) => isNotEmpty(value),
message,
}),
email: (message = '请输入有效的邮箱地址') => ({
validate: isValidEmail,
message,
}),
password: (message = '密码长度应为6-20位') => ({
validate: isValidPassword,
message,
}),
phone: (message = '请输入有效的手机号') => ({
validate: isValidPhone,
message,
}),
minLength: (min: number, message?: string) => ({
validate: (value: string) => value.length >= min,
message: message || `最少输入${min}个字符`,
}),
maxLength: (max: number, message?: string) => ({
validate: (value: string) => value.length <= max,
message: message || `最多输入${max}个字符`,
}),
range: (min: number, max: number, message?: string) => ({
validate: (value: number) => isInRange(value, min, max),
message: message || `请输入${min}-${max}之间的数字`,
}),
};
/**
* 验证单个字段
*/
export function validateField(
value: unknown,
rules: Array<{ validate: (v: unknown) => boolean; message: string }>
): string | null {
for (const rule of rules) {
if (!rule.validate(value)) {
return rule.message;
}
}
return null;
}