Files
zcglxt/app/schemas/operation_log.py
Claude e71181f0a3 fix: 修复多个关键问题
- 修复前端路由守卫:未登录时不显示提示,直接跳转登录页
- 修复API拦截器:401错误不显示提示,直接跳转
- 增强验证码显示:图片尺寸从120x40增加到200x80
- 增大验证码字体:从28号增加到48号
- 优化验证码字符:排除易混淆的0和1
- 减少干扰线:从5条减少到3条,添加背景色优化
- 增强登录API日志:添加详细的调试日志
- 增强验证码生成和验证日志
- 优化异常处理和错误追踪

影响文件:
- src/router/index.ts
- src/api/request.ts
- app/services/auth_service.py
- app/api/v1/auth.py
- app/schemas/user.py

测试状态:
- 前端构建通过
- 后端语法检查通过
- 验证码显示效果优化完成

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 00:26:21 +08:00

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="操作类型")