forked from erp-dev/erp
95 lines
2.5 KiB
Markdown
95 lines
2.5 KiB
Markdown
# 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` 为空字符串)
|
||
|
||
## 待办事项
|
||
|
||
- [ ] 执行数据库迁移 (`uv run python manage.py migrate`)
|
||
- [ ] 测试中间件功能
|