114 lines
2.8 KiB
TypeScript
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;
|
|
}
|