# Design Document: External API Enhancement
## Overview
本设计文档描述了标注平台外部API增强功能的技术实现方案,包括:
1. 项目初始化接口增加标签传入功能
2. 增加多边形标注类型支持
3. 创建长期有效的管理员Token脚本
4. 编写API测试脚本
## Architecture
### 系统架构图
```mermaid
graph TB
subgraph External System
ES[样本中心]
end
subgraph Backend API
ER[External Router]
ES_SVC[External Service]
JWT[JWT Service]
end
subgraph Database
DB[(MySQL)]
end
subgraph Scripts
TOKEN_SCRIPT[generate_admin_token.py]
TEST_SCRIPT[test_external_api.py]
end
ES -->|POST /api/external/projects/init| ER
ER --> ES_SVC
ES_SVC --> DB
JWT --> ES_SVC
TOKEN_SCRIPT --> JWT
TEST_SCRIPT -->|HTTP Requests| ER
```
## Components and Interfaces
### 1. 标签数据结构
```python
class TagItem(BaseModel):
"""标签项"""
tag: str # 标签名称
color: Optional[str] = None # 颜色,可选,格式: #RRGGBB
```
### 2. 更新的项目初始化请求
```python
class ProjectInitRequest(BaseModel):
name: str
description: Optional[str] = ""
task_type: TaskType # 新增 polygon 类型
data: List[TaskDataItem]
external_id: Optional[str] = None
tags: Optional[List[TagItem]] = None # 新增标签列表
```
### 3. 任务类型枚举更新
```python
class TaskType(str, Enum):
TEXT_CLASSIFICATION = "text_classification"
IMAGE_CLASSIFICATION = "image_classification"
OBJECT_DETECTION = "object_detection"
NER = "ner"
POLYGON = "polygon" # 新增多边形标注
```
### 4. XML配置生成逻辑
根据任务类型和标签生成对应的XML配置:
```python
def generate_config_with_tags(task_type: TaskType, tags: List[TagItem]) -> str:
"""根据任务类型和标签生成XML配置"""
# 为没有颜色的标签生成随机颜色
# 根据任务类型选择对应的标签组件
# 生成完整的XML配置
```
### 5. 颜色生成工具
```python
def generate_random_color() -> str:
"""生成随机颜色,返回 #RRGGBB 格式"""
import random
return f"#{random.randint(0, 0xFFFFFF):06x}"
```
## Data Models
### 标签存储
标签信息直接嵌入到项目的XML配置中,不需要额外的数据库表。
### XML配置示例
**文本分类(带标签):**
```xml
```
**多边形标注:**
```xml
```
## Correctness Properties
*A property is a characteristic or behavior that should hold true across all valid executions of a system—essentially, a formal statement about what the system should do. Properties serve as the bridge between human-readable specifications and machine-verifiable correctness guarantees.*
### Property 1: 标签处理完整性
*For any* 项目初始化请求包含tags参数,创建的项目配置中应包含所有传入的标签,且:
- 指定颜色的标签使用指定颜色
- 未指定颜色的标签具有有效的颜色值(#RRGGBB格式)
**Validates: Requirements 1.1, 1.2, 1.3, 1.4**
### Property 2: Polygon配置生成正确性
*For any* polygon类型的项目创建请求,生成的XML配置应包含PolygonLabels组件,且所有传入的标签都作为Label子元素存在。
**Validates: Requirements 2.1, 2.2**
## Error Handling
### 错误场景
| 场景 | 错误码 | HTTP状态码 | 处理方式 |
|------|--------|-----------|---------|
| 无效的颜色格式 | INVALID_COLOR_FORMAT | 400 | 返回错误信息,指出无效的颜色值 |
| 标签名称为空 | INVALID_TAG_NAME | 400 | 返回错误信息,要求提供有效的标签名 |
| 不支持的任务类型 | INVALID_TASK_TYPE | 400 | 返回错误信息,列出支持的任务类型 |
### 颜色格式验证
```python
import re
def validate_color(color: str) -> bool:
"""验证颜色格式是否为有效的 #RRGGBB"""
return bool(re.match(r'^#[0-9A-Fa-f]{6}$', color))
```
## Testing Strategy
### 单元测试
1. **颜色生成测试**
- 验证生成的颜色格式正确
- 验证颜色值在有效范围内
2. **XML配置生成测试**
- 验证各任务类型的配置生成
- 验证标签正确嵌入配置
3. **标签验证测试**
- 验证颜色格式验证逻辑
- 验证标签名称验证逻辑
### 属性测试
使用 Hypothesis 库进行属性测试:
1. **标签处理属性测试**
- 生成随机标签列表
- 验证所有标签都出现在配置中
- 验证颜色处理正确
2. **Polygon配置属性测试**
- 生成随机polygon项目请求
- 验证配置包含PolygonLabels
### 集成测试
1. **API端到端测试**
- 测试5种任务类型的完整流程
- 验证标签传入功能
- 验证导出功能
### 测试配置
- 属性测试最少运行100次迭代
- 使用 pytest + hypothesis 框架
- 测试文件位于 `backend/test/` 目录
## Implementation Notes
### 脚本说明
#### generate_admin_token.py
```python
"""
生成长期有效的管理员Token脚本
功能:
1. 查找或创建管理员用户
2. 生成99999天有效期的Token
3. 输出Token并验证有效性
使用方式:
python scripts/generate_admin_token.py
"""
```
#### test_external_api.py
```python
"""
外部API测试脚本
功能:
1. 测试5种标注类型的项目创建
2. 测试进度查询接口
3. 测试数据导出接口
4. 验证标签传入功能
使用方式:
python scripts/test_external_api.py --base-url http://localhost:8003 --token
"""
```
### 文件变更清单
| 文件 | 变更类型 | 说明 |
|------|---------|------|
| backend/schemas/external.py | 修改 | 添加TagItem、更新TaskType枚举、更新ProjectInitRequest |
| backend/services/external_service.py | 修改 | 添加标签处理逻辑、添加polygon配置模板 |
| backend/EXTERNAL_API_DOCUMENTATION.md | 修改 | 更新API文档,添加tags参数说明 |
| backend/scripts/generate_admin_token.py | 新增 | 生成长期Token脚本 |
| backend/scripts/test_external_api.py | 新增 | API测试脚本 |
| backend/test/test_external_api_tags.py | 新增 | 标签功能单元测试 |