Files
everything-is-suitable/everything-is-suitable-test/python_e2e/core/validation_service.py
T
张翔 08ea5fbe98 feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
2026-03-28 14:37:29 +08:00

157 lines
4.5 KiB
Python

"""
验证服务
提供各种边界条件的验证功能。
"""
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()