""" 验证服务 提供各种边界条件的验证功能。 """ import re from typing import Dict, Any, Tuple, Optional class ValidationService: """验证服务类""" # 验证规则常量 USERNAME_MIN_LENGTH = 3 USERNAME_MAX_LENGTH = 20 USERNAME_PATTERN = re.compile(r'^[a-zA-Z0-9_]+$') EMAIL_PATTERN = re.compile(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$') ROLE_NAME_MIN_LENGTH = 1 ROLE_NAME_MAX_LENGTH = 50 ROLE_CODE_MIN_LENGTH = 1 ROLE_CODE_MAX_LENGTH = 30 ROLE_CODE_PATTERN = re.compile(r'^[a-zA-Z0-9_]+$') @staticmethod def validate_username(username: str) -> Tuple[bool, Optional[str]]: """ 验证用户名 Returns: (is_valid, error_message) """ if not username: return False, "用户名不能为空" if len(username) < ValidationService.USERNAME_MIN_LENGTH: return False, f"用户名长度不能少于{ValidationService.USERNAME_MIN_LENGTH}个字符" if len(username) > ValidationService.USERNAME_MAX_LENGTH: return False, f"用户名长度不能超过{ValidationService.USERNAME_MAX_LENGTH}个字符" if not ValidationService.USERNAME_PATTERN.match(username): return False, "用户名只能包含字母、数字和下划线" return True, None @staticmethod def validate_email(email: str) -> Tuple[bool, Optional[str]]: """ 验证邮箱格式 Returns: (is_valid, error_message) """ if not email: return False, "邮箱不能为空" if not ValidationService.EMAIL_PATTERN.match(email): return False, "邮箱格式不正确" return True, None @staticmethod def validate_role_name(name: str) -> Tuple[bool, Optional[str]]: """ 验证角色名称 Returns: (is_valid, error_message) """ if not name: return False, "角色名称不能为空" if len(name) > ValidationService.ROLE_NAME_MAX_LENGTH: return False, f"角色名称长度不能超过{ValidationService.ROLE_NAME_MAX_LENGTH}个字符" return True, None @staticmethod def validate_role_code(code: str) -> Tuple[bool, Optional[str]]: """ 验证角色编码 Returns: (is_valid, error_message) """ if not code: return False, "角色编码不能为空" if len(code) > ValidationService.ROLE_CODE_MAX_LENGTH: return False, f"角色编码长度不能超过{ValidationService.ROLE_CODE_MAX_LENGTH}个字符" if not ValidationService.ROLE_CODE_PATTERN.match(code): return False, "角色编码只能包含字母、数字和下划线" return True, None @staticmethod def validate_user_data(data: Dict[str, Any]) -> Dict[str, Any]: """ 验证用户数据 Returns: {"valid": bool, "errors": Dict[str, str]} """ errors = {} # 验证用户名 if "username" in data: is_valid, error = ValidationService.validate_username(data["username"]) if not is_valid: errors["username"] = error # 验证邮箱 if "email" in data: is_valid, error = ValidationService.validate_email(data["email"]) if not is_valid: errors["email"] = error return { "valid": len(errors) == 0, "errors": errors } @staticmethod def validate_role_data(data: Dict[str, Any]) -> Dict[str, Any]: """ 验证角色数据 Returns: {"valid": bool, "errors": Dict[str, str]} """ errors = {} # 验证角色名称 if "name" in data: is_valid, error = ValidationService.validate_role_name(data["name"]) if not is_valid: errors["name"] = error # 验证角色编码 if "code" in data: is_valid, error = ValidationService.validate_role_code(data["code"]) if not is_valid: errors["code"] = error return { "valid": len(errors) == 0, "errors": errors } # 全局验证服务实例 validation_service = ValidationService()