# Paper Burner X - API 参考文档 ## 认证 所有需要认证的端点都需要在请求头中包含 JWT Token: ``` Authorization: Bearer ``` ## 用户相关 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 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