forked from erp-dev/erp
3.3 KiB
3.3 KiB
2026-01-11 工作日志
完成事项
API 审计日志中间件
实现了一个用于记录特定模块POST请求的中间件,用于保存"创建"操作的历史现场。
1. 新增 ApiAuditLog 模型 (api_v1/models.py)
记录以下信息:
url: 请求URL路径method: HTTP方法request_data: 请求体数据(JSON格式)query_params: URL查询参数user_id: 操作用户IDusername: 操作用户的用户名快照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)
新增配置项:
# API 审计日志配置
API_AUDIT_LOG_ENABLED = True
API_AUDIT_LOG_URL_PREFIXES = [
'/api/v1/',
'/api/v2/',
'/api/backend/',
]
中间件注册:
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(更新文档注释)
返回格式:
{
"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.ymldocker-compose.dev.ymldocker-compose.prod.yml
问题原因:settings.py 中 CACHE_HOST 默认值为 localhost,在容器化环境中无法连接到 Redis 服务。
待办事项
- 执行数据库迁移 (
uv run python manage.py migrate) - 测试中间件功能
- 重启 Docker 容器使配置生效