Files
zcglxt/backend_new/app/schemas/operation_log.py

127 lines
4.8 KiB
Python

"""
操作日志相关的Pydantic Schema
"""
from typing import Optional, List, Dict, Any
from datetime import datetime
from pydantic import BaseModel, Field
from enum import Enum
class OperationModuleEnum(str, Enum):
"""操作模块枚举"""
AUTH = "auth" # 认证模块
ASSET = "asset" # 资产模块
DEVICE_TYPE = "device_type" # 设备类型模块
ORGANIZATION = "organization" # 机构模块
BRAND_SUPPLIER = "brand_supplier" # 品牌供应商模块
ALLOCATION = "allocation" # 调拨模块
MAINTENANCE = "maintenance" # 维修模块
SYSTEM_CONFIG = "system_config" # 系统配置模块
USER = "user" # 用户模块
STATISTICS = "statistics" # 统计模块
class OperationTypeEnum(str, Enum):
"""操作类型枚举"""
CREATE = "create" # 创建
UPDATE = "update" # 更新
DELETE = "delete" # 删除
QUERY = "query" # 查询
EXPORT = "export" # 导出
IMPORT = "import" # 导入
LOGIN = "login" # 登录
LOGOUT = "logout" # 登出
APPROVE = "approve" # 审批
REJECT = "reject" # 拒绝
ASSIGN = "assign" # 分配
TRANSFER = "transfer" # 调拨
SCRAP = "scrap" # 报废
class OperationResultEnum(str, Enum):
"""操作结果枚举"""
SUCCESS = "success"
FAILED = "failed"
class OperationLogBase(BaseModel):
"""操作日志基础Schema"""
operator_id: int = Field(..., description="操作人ID")
operator_name: str = Field(..., min_length=1, max_length=100, description="操作人姓名")
operator_ip: Optional[str] = Field(None, max_length=50, description="操作人IP")
module: OperationModuleEnum = Field(..., description="模块名称")
operation_type: OperationTypeEnum = Field(..., description="操作类型")
method: str = Field(..., min_length=1, max_length=10, description="请求方法")
url: str = Field(..., min_length=1, max_length=500, description="请求URL")
params: Optional[str] = Field(None, description="请求参数")
result: OperationResultEnum = Field(default=OperationResultEnum.SUCCESS, description="操作结果")
error_msg: Optional[str] = Field(None, description="错误信息")
duration: Optional[int] = Field(None, ge=0, description="执行时长(毫秒)")
user_agent: Optional[str] = Field(None, max_length=500, description="用户代理")
extra_data: Optional[Dict[str, Any]] = Field(None, description="额外数据")
class OperationLogCreate(OperationLogBase):
"""创建操作日志Schema"""
pass
class OperationLogInDB(BaseModel):
"""数据库中的操作日志Schema"""
id: int
operator_id: int
operator_name: str
operator_ip: Optional[str]
module: str
operation_type: str
method: str
url: str
params: Optional[str]
result: str
error_msg: Optional[str]
duration: Optional[int]
user_agent: Optional[str]
extra_data: Optional[Dict[str, Any]]
created_at: datetime
class Config:
from_attributes = True
class OperationLogResponse(OperationLogInDB):
"""操作日志响应Schema"""
pass
class OperationLogQueryParams(BaseModel):
"""操作日志查询参数"""
operator_id: Optional[int] = Field(None, description="操作人ID")
operator_name: Optional[str] = Field(None, description="操作人姓名")
module: Optional[OperationModuleEnum] = Field(None, description="模块名称")
operation_type: Optional[OperationTypeEnum] = Field(None, description="操作类型")
result: Optional[OperationResultEnum] = Field(None, description="操作结果")
start_time: Optional[datetime] = Field(None, description="开始时间")
end_time: Optional[datetime] = Field(None, description="结束时间")
keyword: Optional[str] = Field(None, description="关键词")
page: int = Field(default=1, ge=1, description="页码")
page_size: int = Field(default=20, ge=1, le=100, description="每页数量")
class OperationLogStatistics(BaseModel):
"""操作日志统计Schema"""
total_count: int = Field(..., description="总操作次数")
success_count: int = Field(..., description="成功次数")
failed_count: int = Field(..., description="失败次数")
today_count: int = Field(..., description="今日操作次数")
module_distribution: List[Dict[str, Any]] = Field(default_factory=list, description="模块分布")
operation_distribution: List[Dict[str, Any]] = Field(default_factory=list, description="操作类型分布")
class OperationLogExport(BaseModel):
"""操作日志导出Schema"""
start_time: Optional[datetime] = Field(None, description="开始时间")
end_time: Optional[datetime] = Field(None, description="结束时间")
operator_id: Optional[int] = Field(None, description="操作人ID")
module: Optional[str] = Field(None, description="模块名称")
operation_type: Optional[str] = Field(None, description="操作类型")