791 lines
11 KiB
Markdown
791 lines
11 KiB
Markdown
# Paper Burner X - API 参考文档
|
||
|
||
## 认证
|
||
|
||
所有需要认证的端点都需要在请求头中包含 JWT Token:
|
||
|
||
```
|
||
Authorization: Bearer <token>
|
||
```
|
||
|
||
## 用户相关 API
|
||
|
||
### 用户设置
|
||
|
||
#### 获取用户设置
|
||
```
|
||
GET /api/user/settings
|
||
```
|
||
|
||
#### 更新用户设置
|
||
```
|
||
PUT /api/user/settings
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"ocrProvider": "mineru",
|
||
"translationModel": "deepseek",
|
||
"targetLanguage": "chinese",
|
||
...
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### API Keys 管理
|
||
|
||
#### 获取 API Keys 列表
|
||
```
|
||
GET /api/user/api-keys
|
||
|
||
Response:
|
||
[
|
||
{
|
||
"id": "uuid",
|
||
"provider": "deepseek",
|
||
"remark": "主要密钥",
|
||
"status": "VALID",
|
||
"order": 0,
|
||
"lastUsedAt": "2025-01-17T...",
|
||
"createdAt": "2025-01-01T..."
|
||
}
|
||
]
|
||
```
|
||
|
||
#### 添加 API Key
|
||
```
|
||
POST /api/user/api-keys
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"provider": "deepseek",
|
||
"keyValue": "sk-...",
|
||
"remark": "备用密钥",
|
||
"order": 1
|
||
}
|
||
|
||
Response:
|
||
{
|
||
"id": "uuid",
|
||
"provider": "deepseek",
|
||
"remark": "备用密钥",
|
||
"status": "UNTESTED",
|
||
"order": 1
|
||
}
|
||
```
|
||
|
||
#### 更新 API Key 状态
|
||
```
|
||
PATCH /api/user/api-keys/:id/status
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"status": "VALID"
|
||
}
|
||
```
|
||
|
||
#### 删除 API Key
|
||
```
|
||
DELETE /api/user/api-keys/:id
|
||
```
|
||
|
||
---
|
||
|
||
### 术语库管理
|
||
|
||
#### 获取术语库列表
|
||
```
|
||
GET /api/user/glossaries
|
||
```
|
||
|
||
#### 创建术语库
|
||
```
|
||
POST /api/user/glossaries
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"name": "医学术语",
|
||
"enabled": true,
|
||
"entries": [
|
||
{"source": "protein", "target": "蛋白质"},
|
||
{"source": "cell", "target": "细胞"}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### 更新术语库
|
||
```
|
||
PUT /api/user/glossaries/:id
|
||
```
|
||
|
||
#### 删除术语库
|
||
```
|
||
DELETE /api/user/glossaries/:id
|
||
```
|
||
|
||
---
|
||
|
||
### 已处理文件记录
|
||
|
||
#### 获取已处理文件列表
|
||
```
|
||
GET /api/user/processed-files
|
||
|
||
Response:
|
||
[
|
||
{
|
||
"fileIdentifier": "paper.pdf_1024000_1705478400000",
|
||
"fileName": "paper.pdf",
|
||
"processedAt": "2025-01-17T..."
|
||
}
|
||
]
|
||
```
|
||
|
||
#### 标记文件为已处理
|
||
```
|
||
POST /api/user/processed-files
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"fileIdentifier": "paper.pdf_1024000_1705478400000",
|
||
"fileName": "paper.pdf"
|
||
}
|
||
```
|
||
|
||
#### 检查单个文件是否已处理
|
||
```
|
||
GET /api/user/processed-files/check/:identifier
|
||
|
||
Response:
|
||
{
|
||
"processed": true
|
||
}
|
||
```
|
||
|
||
#### 批量检查文件是否已处理
|
||
```
|
||
POST /api/user/processed-files/check-batch
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"identifiers": [
|
||
"file1_id",
|
||
"file2_id",
|
||
"file3_id"
|
||
]
|
||
}
|
||
|
||
Response:
|
||
{
|
||
"file1_id": true,
|
||
"file2_id": false,
|
||
"file3_id": true
|
||
}
|
||
```
|
||
|
||
#### 清空已处理文件记录
|
||
```
|
||
DELETE /api/user/processed-files
|
||
```
|
||
|
||
---
|
||
|
||
## 文档管理 API
|
||
|
||
### 文档 CRUD
|
||
|
||
#### 获取文档列表
|
||
```
|
||
GET /api/documents?page=1&limit=20&status=COMPLETED
|
||
|
||
Response:
|
||
{
|
||
"documents": [...],
|
||
"pagination": {
|
||
"page": 1,
|
||
"limit": 20,
|
||
"total": 150,
|
||
"totalPages": 8
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 获取文档详情
|
||
```
|
||
GET /api/documents/:id
|
||
|
||
Response:
|
||
{
|
||
"id": "uuid",
|
||
"fileName": "paper.pdf",
|
||
"fileType": "pdf",
|
||
"status": "COMPLETED",
|
||
"ocrText": "...",
|
||
"translatedText": "...",
|
||
"annotations": [...],
|
||
"semanticGroups": {...}
|
||
}
|
||
```
|
||
|
||
#### 创建文档记录
|
||
```
|
||
POST /api/documents
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"fileName": "paper.pdf",
|
||
"fileSize": 1024000,
|
||
"fileType": "pdf",
|
||
"status": "PENDING"
|
||
}
|
||
|
||
Response:
|
||
{
|
||
"id": "uuid",
|
||
...
|
||
}
|
||
|
||
Error (配额超出):
|
||
{
|
||
"error": "Monthly document quota exceeded (100 documents)"
|
||
}
|
||
```
|
||
|
||
#### 更新文档
|
||
```
|
||
PUT /api/documents/:id
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"status": "OCR_COMPLETED",
|
||
"ocrText": "...",
|
||
"ocrProvider": "mineru"
|
||
}
|
||
```
|
||
|
||
#### 删除文档
|
||
```
|
||
DELETE /api/documents/:id
|
||
```
|
||
|
||
---
|
||
|
||
### 标注管理
|
||
|
||
#### 获取文档的所有标注
|
||
```
|
||
GET /api/documents/:id/annotations
|
||
|
||
Response:
|
||
[
|
||
{
|
||
"id": "uuid",
|
||
"type": "highlight",
|
||
"color": "#ffff00",
|
||
"startIndex": 100,
|
||
"endIndex": 200,
|
||
"text": "高亮文本",
|
||
"note": "我的笔记"
|
||
}
|
||
]
|
||
```
|
||
|
||
#### 创建标注
|
||
```
|
||
POST /api/documents/:id/annotations
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"type": "highlight",
|
||
"color": "#ffff00",
|
||
"startIndex": 100,
|
||
"endIndex": 200,
|
||
"text": "高亮文本",
|
||
"note": "我的笔记"
|
||
}
|
||
```
|
||
|
||
#### 更新标注
|
||
```
|
||
PUT /api/documents/:documentId/annotations/:annotationId
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"note": "更新后的笔记"
|
||
}
|
||
```
|
||
|
||
#### 删除标注
|
||
```
|
||
DELETE /api/documents/:documentId/annotations/:annotationId
|
||
```
|
||
|
||
---
|
||
|
||
### 意群数据
|
||
|
||
#### 保存/更新意群数据
|
||
```
|
||
POST /api/documents/:id/semantic-groups
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"groups": [
|
||
{
|
||
"id": 1,
|
||
"text": "语义组1",
|
||
"translation": "翻译1"
|
||
},
|
||
{
|
||
"id": 2,
|
||
"text": "语义组2",
|
||
"translation": "翻译2"
|
||
}
|
||
],
|
||
"version": "1.0",
|
||
"source": "auto"
|
||
}
|
||
```
|
||
|
||
#### 获取意群数据
|
||
```
|
||
GET /api/documents/:id/semantic-groups
|
||
|
||
Response:
|
||
{
|
||
"id": "uuid",
|
||
"documentId": "doc-uuid",
|
||
"groups": [...],
|
||
"version": "1.0",
|
||
"source": "auto",
|
||
"createdAt": "...",
|
||
"updatedAt": "..."
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 管理员 API
|
||
|
||
所有管理员 API 都需要 ADMIN 角色。
|
||
|
||
### 用户管理
|
||
|
||
#### 获取所有用户
|
||
```
|
||
GET /api/admin/users
|
||
|
||
Response:
|
||
[
|
||
{
|
||
"id": "uuid",
|
||
"email": "user@example.com",
|
||
"name": "User Name",
|
||
"role": "USER",
|
||
"isActive": true,
|
||
"createdAt": "..."
|
||
}
|
||
]
|
||
```
|
||
|
||
#### 更新用户状态
|
||
```
|
||
PUT /api/admin/users/:id/status
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"isActive": false
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 统计信息
|
||
|
||
#### 获取基础统计
|
||
```
|
||
GET /api/admin/stats
|
||
|
||
Response:
|
||
{
|
||
"totalUsers": 150,
|
||
"activeUsers": 120,
|
||
"totalDocuments": 5432,
|
||
"documentsToday": 45
|
||
}
|
||
```
|
||
|
||
#### 获取详细统计
|
||
```
|
||
GET /api/admin/stats/detailed
|
||
|
||
Response:
|
||
{
|
||
"basic": {
|
||
"totalUsers": 150,
|
||
"activeUsers": 120,
|
||
"totalDocuments": 5432,
|
||
"totalStorageMB": 2048,
|
||
"documentsToday": 45,
|
||
"documentsThisWeek": 234,
|
||
"documentsThisMonth": 987
|
||
},
|
||
"documentsByStatus": [
|
||
{"status": "COMPLETED", "count": 4500},
|
||
{"status": "FAILED", "count": 100}
|
||
],
|
||
"topUsers": [
|
||
{
|
||
"id": "uuid",
|
||
"email": "user@example.com",
|
||
"documentCount": 234
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### 获取使用趋势
|
||
```
|
||
GET /api/admin/stats/trends?days=30
|
||
|
||
Response:
|
||
[
|
||
{
|
||
"date": "2025-01-01",
|
||
"total": 150,
|
||
"completed": 140,
|
||
"failed": 10
|
||
},
|
||
{
|
||
"date": "2025-01-02",
|
||
"total": 180,
|
||
"completed": 170,
|
||
"failed": 10
|
||
}
|
||
]
|
||
```
|
||
|
||
---
|
||
|
||
### 用户配额管理
|
||
|
||
#### 获取用户配额
|
||
```
|
||
GET /api/admin/users/:userId/quota
|
||
|
||
Response:
|
||
{
|
||
"id": "uuid",
|
||
"userId": "user-uuid",
|
||
"maxDocumentsPerDay": -1,
|
||
"maxDocumentsPerMonth": 100,
|
||
"maxStorageSize": 1024,
|
||
"maxApiKeysCount": -1,
|
||
"documentsThisMonth": 45,
|
||
"currentStorageUsed": 256,
|
||
"lastMonthlyReset": "2025-01-01T..."
|
||
}
|
||
```
|
||
|
||
#### 更新用户配额
|
||
```
|
||
PUT /api/admin/users/:userId/quota
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"maxDocumentsPerMonth": 200,
|
||
"maxStorageSize": 2048
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 用户活动日志
|
||
|
||
#### 获取用户活动
|
||
```
|
||
GET /api/admin/users/:userId/activity?limit=50&offset=0
|
||
|
||
Response:
|
||
[
|
||
{
|
||
"id": "uuid",
|
||
"userId": "user-uuid",
|
||
"action": "document_create",
|
||
"resourceId": "doc-uuid",
|
||
"metadata": {
|
||
"fileName": "paper.pdf",
|
||
"fileType": "pdf"
|
||
},
|
||
"createdAt": "2025-01-17T..."
|
||
}
|
||
]
|
||
```
|
||
|
||
---
|
||
|
||
### 系统配置
|
||
|
||
#### 获取系统配置
|
||
```
|
||
GET /api/admin/config
|
||
|
||
Response:
|
||
{
|
||
"allowRegistration": "true",
|
||
"maxUploadSize": "100"
|
||
}
|
||
```
|
||
|
||
#### 更新系统配置
|
||
```
|
||
PUT /api/admin/config
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"key": "allowRegistration",
|
||
"value": "false",
|
||
"description": "是否允许用户注册"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 自定义源站管理
|
||
|
||
#### 获取全局源站列表
|
||
```
|
||
GET /api/admin/source-sites
|
||
|
||
Response:
|
||
[
|
||
{
|
||
"id": "uuid",
|
||
"displayName": "自定义模型",
|
||
"apiBaseUrl": "https://api.example.com",
|
||
"modelId": "model-name",
|
||
"availableModels": ["model-1", "model-2"],
|
||
"requestFormat": "openai"
|
||
}
|
||
]
|
||
```
|
||
|
||
#### 创建全局源站
|
||
```
|
||
POST /api/admin/source-sites
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"displayName": "自定义模型",
|
||
"apiBaseUrl": "https://api.example.com",
|
||
"modelId": "model-name",
|
||
"availableModels": ["model-1"],
|
||
"requestFormat": "openai"
|
||
}
|
||
```
|
||
|
||
#### 更新源站
|
||
```
|
||
PUT /api/admin/source-sites/:id
|
||
```
|
||
|
||
#### 删除源站
|
||
```
|
||
DELETE /api/admin/source-sites/:id
|
||
```
|
||
|
||
---
|
||
|
||
## 认证 API
|
||
|
||
### 注册
|
||
```
|
||
POST /api/auth/register
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"email": "user@example.com",
|
||
"password": "password123",
|
||
"name": "User Name"
|
||
}
|
||
|
||
Response:
|
||
{
|
||
"success": true,
|
||
"token": "jwt-token",
|
||
"user": {
|
||
"id": "uuid",
|
||
"email": "user@example.com",
|
||
"name": "User Name",
|
||
"role": "USER"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 登录
|
||
```
|
||
POST /api/auth/login
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"email": "user@example.com",
|
||
"password": "password123"
|
||
}
|
||
|
||
Response:
|
||
{
|
||
"success": true,
|
||
"token": "jwt-token",
|
||
"user": {
|
||
"id": "uuid",
|
||
"email": "user@example.com",
|
||
"name": "User Name",
|
||
"role": "USER"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 获取当前用户
|
||
```
|
||
GET /api/auth/me
|
||
Authorization: Bearer <token>
|
||
|
||
Response:
|
||
{
|
||
"user": {
|
||
"id": "uuid",
|
||
"email": "user@example.com",
|
||
"name": "User Name",
|
||
"role": "USER",
|
||
"createdAt": "..."
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 健康检查
|
||
|
||
```
|
||
GET /api/health
|
||
|
||
Response:
|
||
{
|
||
"status": "ok",
|
||
"timestamp": 1705478400000,
|
||
"mode": "docker",
|
||
"version": "1.0.0"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 错误响应
|
||
|
||
所有错误响应遵循以下格式:
|
||
|
||
```json
|
||
{
|
||
"error": "错误描述信息"
|
||
}
|
||
```
|
||
|
||
常见 HTTP 状态码:
|
||
- `200` - 成功
|
||
- `201` - 创建成功
|
||
- `400` - 请求参数错误
|
||
- `401` - 未认证
|
||
- `403` - 权限不足 / 配额超出
|
||
- `404` - 资源不存在
|
||
- `409` - 冲突(如邮箱已存在)
|
||
- `500` - 服务器错误
|
||
|
||
---
|
||
|
||
## 分页
|
||
|
||
支持分页的端点使用以下参数:
|
||
|
||
```
|
||
?page=1&limit=20
|
||
```
|
||
|
||
响应格式:
|
||
|
||
```json
|
||
{
|
||
"data": [...],
|
||
"pagination": {
|
||
"page": 1,
|
||
"limit": 20,
|
||
"total": 150,
|
||
"totalPages": 8
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 使用示例
|
||
|
||
### JavaScript / Fetch
|
||
|
||
```javascript
|
||
// 登录
|
||
const loginResponse = await fetch('/api/auth/login', {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify({
|
||
email: 'user@example.com',
|
||
password: 'password123'
|
||
})
|
||
});
|
||
const { token } = await loginResponse.json();
|
||
|
||
// 获取文档列表
|
||
const docsResponse = await fetch('/api/documents?page=1&limit=20', {
|
||
headers: { 'Authorization': `Bearer ${token}` }
|
||
});
|
||
const { documents, pagination } = await docsResponse.json();
|
||
|
||
// 创建文档
|
||
const createResponse = await fetch('/api/documents', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Authorization': `Bearer ${token}`,
|
||
'Content-Type': 'application/json'
|
||
},
|
||
body: JSON.stringify({
|
||
fileName: 'paper.pdf',
|
||
fileSize: 1024000,
|
||
fileType: 'pdf',
|
||
status: 'PENDING'
|
||
})
|
||
});
|
||
const newDoc = await createResponse.json();
|
||
```
|
||
|
||
### cURL
|
||
|
||
```bash
|
||
# 登录
|
||
TOKEN=$(curl -X POST http://localhost:3000/api/auth/login \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"email":"admin@paperburner.local","password":"admin123456"}' \
|
||
| jq -r '.token')
|
||
|
||
# 获取统计
|
||
curl http://localhost:3000/api/admin/stats \
|
||
-H "Authorization: Bearer $TOKEN"
|
||
|
||
# 创建 API Key
|
||
curl -X POST http://localhost:3000/api/user/api-keys \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"provider":"deepseek","keyValue":"sk-...","remark":"主密钥"}'
|
||
```
|
||
|
||
---
|
||
|
||
**最后更新**: 2025-01-17
|