# 2026-01-11 工作日志 ## 完成事项 ### API 审计日志中间件 实现了一个用于记录特定模块POST请求的中间件,用于保存"创建"操作的历史现场。 #### 1. 新增 `ApiAuditLog` 模型 (`api_v1/models.py`) 记录以下信息: - `url`: 请求URL路径 - `method`: HTTP方法 - `request_data`: 请求体数据(JSON格式) - `query_params`: URL查询参数 - `user_id`: 操作用户ID - `username`: 操作用户的用户名快照 - `response_status`: HTTP响应状态码 - `created_at`: 创建时间 #### 2. 新增 Celery Task (`api_v1/tasks.py`) - `save_api_audit_log`: 异步保存审计日志任务 - 通过Celery队列异步执行,避免阻塞API响应 #### 3. 新增中间件 (`flower/middleware.py`) - `ApiAuditLogMiddleware`: API审计日志中间件 - 只记录POST请求 - 通过URL前缀白名单过滤 - 支持multipart/form-data请求,文件字段只记录元信息(文件名、大小、类型) - 在AuthenticationMiddleware之后运行,可获取request.user - 对于JWT认证,手动调用JWTAuthentication获取用户信息 #### 4. 配置更新 (`flower/settings.py`) 新增配置项: ```python # API 审计日志配置 API_AUDIT_LOG_ENABLED = True API_AUDIT_LOG_URL_PREFIXES = [ '/api/v1/', '/api/v2/', '/api/backend/', ] ``` 中间件注册: ```python MIDDLEWARE = [ ... 'flower.middleware.ApiAuditLogMiddleware', # 放在最后 ] ``` #### 5. 数据库迁移 - 迁移文件: `api_v1/migrations/0009_apiauditlog.py` #### 6. Admin 注册 (`api_v1/admin.py`) - 新增 `ApiAuditLogAdmin` 管理类 - 支持按 URL、用户名搜索 - 支持按方法、响应状态码、时间过滤 - 所有字段只读,禁止添加和修改(只允许查看和删除) ### 7. 新增 `jobs_last_status_summary` 字段 在 `PrintingOrderListSerializer` 中新增字段,用于按最后完成状态分组统计。 - **修改文件**: `api_v1/views/printing/serializers.py` - **修改文件**: `api_v1/views/printing/views.py`(更新文档注释) 返回格式: ```json { "jobs_status_summary": [ {"state_name": "进度二", "state_id": 2, "count": 3} ], "jobs_last_status_summary": [ {"state_name": "进度一", "count": 2}, {"state_name": "", "count": 1} ] } ``` 字段说明: - `jobs_status_summary`: 按下一待执行状态分组 - `jobs_last_status_summary`: 按最后完成状态分组(未开始时 `state_name` 为空字符串) ### 8. 修复 `_upsert_product` 重复数据问题 修改 `api_v1/tasks.py` 中的 `_upsert_product` 函数,使用 `filter().first()` 替代 `get_or_create`,容忍数据库中存在重复的 `(merchant, human_id)` 记录。 原因:`Product` 模型没有设置 `unique_together = ('merchant', 'human_id')` 约束,多同步源可能导致重复数据,`get_or_create` 会抛出 `MultipleObjectsReturned` 错误。 ### 9. 修复 Docker Compose 中 Celery 服务缺少 CACHE_HOST 配置 在以下文件中为 `celery_worker` 和 `celery_beat` 服务添加 `CACHE_HOST` 和 `CACHE_PORT` 环境变量: - `docker-compose.yml` - `docker-compose.dev.yml` - `docker-compose.prod.yml` 问题原因:`settings.py` 中 `CACHE_HOST` 默认值为 `localhost`,在容器化环境中无法连接到 Redis 服务。 ## 待办事项 - [x] 执行数据库迁移 (`uv run python manage.py migrate`) - [x] 测试中间件功能 - [x] 重启 Docker 容器使配置生效