Files
central-task/.trae/documents/任务中心管理系统实现计划.md

266 lines
7.8 KiB
Markdown
Raw Normal View History

2025-12-05 13:45:16 +08:00
# 任务中心管理系统最终实现计划
## 项目结构设计
2025-12-11 14:33:32 +08:00
2025-12-05 13:45:16 +08:00
1. 创建Django项目`task_center`
2. 创建任务管理应用:`tasks`
3. 配置数据库为SQLite
4. 集成Bootstrap前端框架
5. 配置pytest测试框架
## 数据库模型设计
### Client模型
2025-12-11 14:33:32 +08:00
| 字段名 | 类型 | 描述 |
| ----------- | -------------------------- | --------- |
| id | AutoField | 客户端ID |
| name | CharField(unique=True) | 客户端标识 |
| token | CharField(max\_length=128) | API Token |
| last\_seen | DateTimeField | 最后活跃时间 |
| created\_at | DateTimeField | 创建时间 |
2025-12-05 13:45:16 +08:00
### Task模型
2025-12-11 14:33:32 +08:00
| 字段名 | 类型 | 描述 |
| ---------------- | ----------------------------------------------------- | ------------------ |
| id | AutoField | 任务ID |
| name | CharField | 任务名称 |
| client\_name | CharField(null=True, blank=True) | 指定执行客户端 |
| script | TextField(null=True, blank=True) | 执行脚本 |
| status | CharField(choices=STATUS\_CHOICES, default='pending') | 任务状态 |
| timeout\_seconds | IntegerField(default=259200) | 超时时间默认3天=259200秒 |
| created\_at | DateTimeField | 创建时间 |
| updated\_at | DateTimeField | 更新时间 |
| assigned\_to | CharField(null=True, blank=True) | 实际执行客户端 |
| started\_at | DateTimeField(null=True, blank=True) | 开始执行时间 |
| completed\_at | DateTimeField(null=True, blank=True) | 完成时间 |
2025-12-05 13:45:16 +08:00
### TaskResult模型
2025-12-11 14:33:32 +08:00
| 字段名 | 类型 | 描述 |
| ------------ | -------------------------------------- | ----- |
| id | AutoField | 结果ID |
| task | ForeignKey(Task) | 关联任务 |
| client | ForeignKey(Client) | 执行客户端 |
| result\_file | FileField(upload\_to='task\_results/') | 结果文件 |
| status | CharField(choices=STATUS\_CHOICES) | 执行状态 |
| message | TextField(null=True, blank=True) | 执行消息 |
| created\_at | DateTimeField | 创建时间 |
2025-12-05 13:45:16 +08:00
## 状态定义
2025-12-11 14:33:32 +08:00
2025-12-05 13:45:16 +08:00
```python
STATUS_CHOICES = [
('pending', '待分配'),
('assigned', '已分配'),
('running', '执行中'),
('success', '成功'),
('failed', '失败'),
('retrying', '重试中'),
('timeout', '超时,关闭'),
]
```
## API接口设计
### 认证机制
2025-12-11 14:33:32 +08:00
* **所有API端点均需token认证**
* 客户端通过HTTP头`Authorization: Token <token>`进行身份验证
* 使用Django REST Framework的TokenAuthentication
* 未提供有效token的请求将返回401 Unauthorized
2025-12-05 13:45:16 +08:00
### 任务管理API
2025-12-11 14:33:32 +08:00
* `GET /api/tasks/` - 获取任务列表(需认证)
* `GET /api/tasks/<id>/` - 获取任务详情(需认证)
* `POST /api/tasks/` - 创建任务(需认证)
* `PUT /api/tasks/<id>/` - 更新任务(需认证)
* `DELETE /api/tasks/<id>/` - 删除任务(需认证)
2025-12-05 13:45:16 +08:00
### 客户端API
2025-12-11 14:33:32 +08:00
* `POST /api/tasks/claim/` - 客户端原子认领任务(需认证)
* `POST /api/tasks/<id>/start/` - 客户端开始执行任务(需认证)
* `POST /api/tasks/<id>/complete/` - 客户端完成任务(需认证)
* `POST /api/task_results/` - 上传任务结果(需认证,支持文件上传)
2025-12-05 13:45:16 +08:00
### 客户端管理API
2025-12-11 14:33:32 +08:00
* `GET /api/clients/` - 获取客户端列表(需认证)
* `POST /api/clients/` - 创建客户端(需认证)
* `GET /api/clients/<id>/` - 获取客户端详情(需认证)
2025-12-05 13:45:16 +08:00
### 文件下载API
2025-12-11 14:33:32 +08:00
* `GET /api/task_results/<id>/download/` - 下载任务结果文件(需认证)
2025-12-05 13:45:16 +08:00
## 文件上传实现细节
### 1. Django媒体文件配置
2025-12-11 14:33:32 +08:00
2025-12-05 13:45:16 +08:00
```python
# settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
```
### 2. 文件上传API实现
2025-12-11 14:33:32 +08:00
* 使用Django REST Framework的`MultiPartParser``FormParser`
* API端点`POST /api/task_results/`
* 支持`multipart/form-data`格式上传文件
* 上传字段:`task_id``status``message``result_file`
2025-12-05 13:45:16 +08:00
### 3. 前端文件上传实现
2025-12-11 14:33:32 +08:00
* 使用HTML5的`input type="file"`元素
* 表单设置`enctype="multipart/form-data"`
* 使用Bootstrap样式美化文件上传控件
* 支持进度条显示(可选)
2025-12-05 13:45:16 +08:00
### 4. 文件存储策略
2025-12-11 14:33:32 +08:00
* 本地文件系统存储:`media/task_results/`目录
* 文件名自动生成,避免冲突
* 支持大文件上传通过Django默认配置
2025-12-05 13:45:16 +08:00
### 5. 文件下载实现
2025-12-11 14:33:32 +08:00
* API端点`GET /api/task_results/<id>/download/`
* 返回`Content-Disposition: attachment`头,触发浏览器下载
* 支持断点续传通过Django默认配置
2025-12-05 13:45:16 +08:00
## 前端页面设计
2025-12-11 14:33:32 +08:00
2025-12-05 13:45:16 +08:00
1. 任务列表页:展示所有任务,支持筛选和搜索
2. 任务创建页:表单创建新任务
3. 任务详情页:查看任务详情和执行结果历史
4. 客户端管理页:管理客户端列表
5. 结果文件上传页:支持文件上传和状态更新
6. 结果文件下载功能:点击即可下载
## 核心功能实现
### 1. 全API Token认证
2025-12-11 14:33:32 +08:00
* 所有API视图均使用`TokenAuthentication`
* 配置`DEFAULT_AUTHENTICATION_CLASSES``DEFAULT_PERMISSION_CLASSES`
2025-12-05 13:45:16 +08:00
### 2. 原子任务认领机制
2025-12-11 14:33:32 +08:00
* 使用数据库事务确保任务认领的原子性
* 客户端调用`/api/tasks/claim/`时,系统自动查找并分配可用任务
2025-12-05 13:45:16 +08:00
### 3. 任务超时自动回收
2025-12-11 14:33:32 +08:00
* 使用Django管理命令定期检查超时任务
* 超过`timeout_seconds`的任务自动设置为`timeout`状态
* 管理命令:`python manage.py check_task_timeouts`
2025-12-05 13:45:16 +08:00
### 4. 任务结果版本管理
2025-12-11 14:33:32 +08:00
* TaskResult模型记录每次执行结果
* 支持查看任务的完整执行历史
* 支持下载不同版本的结果文件
2025-12-05 13:45:16 +08:00
## 测试用例设计
### 目录结构
2025-12-11 14:33:32 +08:00
2025-12-05 13:45:16 +08:00
```
task_center/
├── tasks/
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── test_models.py
│ │ ├── test_views.py
│ │ ├── test_api.py
│ │ ├── test_integration.py
│ │ └── test_factories.py
│ └── ...
├── conftest.py
└── pytest.ini
```
### 测试类型
2025-12-11 14:33:32 +08:00
2025-12-05 13:45:16 +08:00
1. **模型测试**:测试模型字段、方法和关系
2. **API测试**测试所有API端点的功能和认证机制
3. **文件上传测试**:测试文件上传和下载功能
4. **视图测试**:测试前端视图渲染
5. **集成测试**:测试完整的任务流程
2025-12-11 14:33:32 +08:00
6. **工厂测试**使用factory\_boy创建测试数据
2025-12-05 13:45:16 +08:00
## 实现步骤
2025-12-11 14:33:32 +08:00
2025-12-05 13:45:16 +08:00
1. 创建Django项目和应用
2. 配置项目设置数据库、REST Framework、认证、媒体文件等
3. 实现数据库模型
4. 实现API视图和序列化器包括文件上传功能
5. 配置URL路由
6. 实现前端模板,包括文件上传表单
7. 实现任务超时管理命令
8. 编写测试用例
9. 测试API接口和功能
## 技术栈
2025-12-11 14:33:32 +08:00
* 后端Django 5.0.6 + Django REST Framework
* 前端HTML + Bootstrap 5
* 数据库SQLite
* 文件存储:本地文件系统
* 测试pytest + factory\_boy
2025-12-05 13:45:16 +08:00
## 预期效果
2025-12-11 14:33:32 +08:00
* 所有API端点均需要token认证
* 支持结果文件的上传和下载功能
* 后台可通过admin或API创建和管理任务
* 客户端通过API进行身份验证原子认领任务
* 支持任务超时自动回收
* 完整的任务执行历史记录
* 简单大方的Bootstrap前端界面
* 全面的测试用例覆盖