08ea5fbe98
添加用户管理视图、API和状态管理文件
157 lines
4.5 KiB
Python
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()
|