1
0
forked from erp-dev/erp
Files
erpnew/docs/2026-01-11_summary.md
2026-01-12 17:46:04 +08:00

111 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 容器使配置生效