|
|
@@ -14,12 +14,23 @@
|
|
14
|
14
|
|
|
15
|
15
|
| 阶段 | 新增 API |
|
|
16
|
16
|
|------|---------|
|
|
17
|
|
-| 阶段 0 | 文档 CRUD |
|
|
18
|
|
-| 阶段 1 | 模板管理、DOCX 下载导出 |
|
|
|
17
|
+| 阶段 0 | 文档 CRUD、导出 .doc(默认样式) |
|
|
|
18
|
+| 阶段 1 | 样式管理、模板管理、导出 DOCX |
|
|
19
|
19
|
| 阶段 2 | 编辑会话(Token)、Webhook |
|
|
20
|
20
|
| 阶段 3 | PDF 导出、版本管理 |
|
|
21
|
21
|
|
|
22
|
|
-### 1.3 通用响应格式
|
|
|
22
|
+### 1.3 样式与模板的区别
|
|
|
23
|
+
|
|
|
24
|
+这是两个独立功能,用户可以按需使用其中一个或两个都不用:
|
|
|
25
|
+
|
|
|
26
|
+| | 样式(Style) | 模板(Template) |
|
|
|
27
|
+|---|---|---|
|
|
|
28
|
+| 用途 | 控制输出文件的字体、颜色、标题层级等视觉格式 | 定义文档结构,内容填入占位符位置 |
|
|
|
29
|
+| 上传内容 | 任意 Word 文档,后端提取其中的样式文件 | 带占位符(`{{名称}}`)的 Word 文档 |
|
|
|
30
|
+| 导出方式 | 导出 .doc 时选择样式,不选用系统默认 | 导出 DOCX 时指定模板,内容按标题匹配占位符 |
|
|
|
31
|
+| 是否必须 | 否,有默认样式兜底 | 否,不使用模板则走样式导出流程 |
|
|
|
32
|
+
|
|
|
33
|
+### 1.4 通用响应格式
|
|
23
|
34
|
|
|
24
|
35
|
```json
|
|
25
|
36
|
{
|
|
|
@@ -53,8 +64,7 @@ class CreateDocumentRequest(BaseModel):
|
|
53
|
64
|
content: str # 文档内容(Markdown),最大 200KB
|
|
54
|
65
|
format: Literal["markdown"] = "markdown" # 内容格式,默认 markdown
|
|
55
|
66
|
session_id: Optional[str] = None # 关联的聊天会话 ID
|
|
56
|
|
- template_id: Optional[str] = None # 关联 Word 模板 ID(阶段 1,工作流文档必填)
|
|
57
|
|
- source: Literal["chat", "workflow"] = "chat" # 来源,默认 chat
|
|
|
67
|
+ template_id: Optional[str] = None # 关联 Word 模板 ID(阶段 1 引入)
|
|
58
|
68
|
|
|
59
|
69
|
# 更新文档请求(全量或局部块)
|
|
60
|
70
|
class UpdateDocumentRequest(BaseModel):
|
|
|
@@ -70,7 +80,6 @@ class DocumentResponse(BaseModel):
|
|
70
|
80
|
format: str
|
|
71
|
81
|
session_id: Optional[str] = None
|
|
72
|
82
|
template_id: Optional[str] = None
|
|
73
|
|
- source: Literal["chat", "workflow"]
|
|
74
|
83
|
created_by: str
|
|
75
|
84
|
created_at: datetime
|
|
76
|
85
|
updated_at: datetime
|
|
|
@@ -79,7 +88,6 @@ class DocumentResponse(BaseModel):
|
|
79
|
88
|
class DocumentListItem(BaseModel):
|
|
80
|
89
|
id: str
|
|
81
|
90
|
title: str
|
|
82
|
|
- source: Literal["chat", "workflow"]
|
|
83
|
91
|
template_id: Optional[str] = None
|
|
84
|
92
|
created_at: datetime
|
|
85
|
93
|
updated_at: datetime
|
|
|
@@ -107,8 +115,7 @@ class Pagination(BaseModel):
|
|
107
|
115
|
"content": "# 标题\n\n这是文档内容...",
|
|
108
|
116
|
"format": "markdown",
|
|
109
|
117
|
"sessionId": "chat-session-123",
|
|
110
|
|
- "templateId": "tpl-001",
|
|
111
|
|
- "source": "chat"
|
|
|
118
|
+ "templateId": "tpl-001"
|
|
112
|
119
|
}
|
|
113
|
120
|
```
|
|
114
|
121
|
|
|
|
@@ -118,8 +125,7 @@ class Pagination(BaseModel):
|
|
118
|
125
|
| content | string | 是 | 文档内容,最大 200KB |
|
|
119
|
126
|
| format | string | 否 | 默认 `markdown` |
|
|
120
|
127
|
| sessionId | string | 否 | 关联聊天会话 ID |
|
|
121
|
|
-| templateId | string | 否 | 关联 Word 模板 ID(阶段 1 引入,工作流文档必填) |
|
|
122
|
|
-| source | string | 否 | `chat` / `workflow`,默认 `chat` |
|
|
|
128
|
+| templateId | string | 否 | 关联 Word 模板 ID(阶段 1 引入) |
|
|
123
|
129
|
|
|
124
|
130
|
**响应示例**:
|
|
125
|
131
|
```json
|
|
|
@@ -154,7 +160,6 @@ class Pagination(BaseModel):
|
|
154
|
160
|
"format": "markdown",
|
|
155
|
161
|
"sessionId": "chat-session-123",
|
|
156
|
162
|
"templateId": "tpl-001",
|
|
157
|
|
- "source": "workflow",
|
|
158
|
163
|
"createdBy": "user-xyz",
|
|
159
|
164
|
"createdAt": 1680000000000,
|
|
160
|
165
|
"updatedAt": 1680000100000
|
|
|
@@ -243,7 +248,6 @@ class Pagination(BaseModel):
|
|
243
|
248
|
| page | integer | 否 | 页码,默认 1 |
|
|
244
|
249
|
| pageSize | integer | 否 | 每页数量,默认 20,最大 100 |
|
|
245
|
250
|
| sessionId | string | 否 | 按聊天会话过滤 |
|
|
246
|
|
-| source | string | 否 | `chat` / `workflow` |
|
|
247
|
251
|
| sortBy | string | 否 | `createdAt` / `updatedAt`,默认 `updatedAt` |
|
|
248
|
252
|
| sortOrder | string | 否 | `asc` / `desc`,默认 `desc` |
|
|
249
|
253
|
|
|
|
@@ -256,7 +260,6 @@ class Pagination(BaseModel):
|
|
256
|
260
|
{
|
|
257
|
261
|
"id": "doc-abc123",
|
|
258
|
262
|
"title": "我的文档",
|
|
259
|
|
- "source": "workflow",
|
|
260
|
263
|
"templateId": "tpl-001",
|
|
261
|
264
|
"createdAt": 1680000000000,
|
|
262
|
265
|
"updatedAt": 1680000100000
|
|
|
@@ -276,6 +279,8 @@ class Pagination(BaseModel):
|
|
276
|
279
|
|
|
277
|
280
|
## 3. 导出 API(阶段 0)
|
|
278
|
281
|
|
|
|
282
|
+**本节说明**:阶段 0 导出不依赖样式库和模板,使用系统内置默认样式将 Markdown 内容转换为 .doc 文件。阶段 1 引入样式管理后,本接口扩展支持用户选择自定义样式(通过 `styleId` 参数),接口结构不变。
|
|
|
283
|
+
|
|
279
|
284
|
### 数据结构
|
|
280
|
285
|
|
|
281
|
286
|
```python
|
|
|
@@ -284,22 +289,24 @@ from typing import Literal, Optional
|
|
284
|
289
|
|
|
285
|
290
|
# 导出 .doc 请求
|
|
286
|
291
|
class ExportDocRequest(BaseModel):
|
|
287
|
|
- file_name: str # 文件名(不含扩展名),最大 255 字符
|
|
288
|
|
- format: Literal["doc"] # 阶段 0 固定为 doc
|
|
289
|
|
- content: str # 文档当前内容(Markdown)
|
|
|
292
|
+ file_name: str # 文件名(不含扩展名),最大 255 字符
|
|
|
293
|
+ format: Literal["doc"] # 阶段 0 固定为 doc
|
|
|
294
|
+ content: str # 文档当前内容(Markdown)
|
|
290
|
295
|
document_id: Optional[str] = None # 关联文档 ID,传入时后端同步更新草稿记录
|
|
|
296
|
+ style_id: Optional[str] = None # 样式 ID;不传时使用系统默认样式;阶段 1 起支持用户自定义样式
|
|
291
|
297
|
|
|
292
|
298
|
# 导出响应
|
|
293
|
299
|
class ExportDocResponse(BaseModel):
|
|
294
|
300
|
download_url: str # 临时下载链接,有效期 1 小时
|
|
295
|
301
|
file_name: str # 含扩展名的完整文件名,如 季度报告_2026Q2.doc
|
|
296
|
302
|
expires_at: int # 链接过期时间,Unix 毫秒时间戳
|
|
|
303
|
+ style_id: str # 实际使用的样式 ID
|
|
297
|
304
|
```
|
|
298
|
305
|
|
|
299
|
306
|
### 3.1 导出 .doc 并下载
|
|
300
|
307
|
|
|
301
|
308
|
**触发时机**:用户点击编辑器"保存"按钮,在弹出对话框中填写文件名、选择格式并确认后触发。
|
|
302
|
|
-**目的**:根据用户填写的文件名、格式和当前文档内容,生成对应格式的文件,返回临时下载链接,前端自动触发浏览器下载。
|
|
|
309
|
+**目的**:将 Markdown 内容按指定样式渲染生成 .doc 文件,返回临时下载链接。输出字体、标题层级、段落间距等均由样式文件控制。
|
|
303
|
310
|
**注意**:此接口不操作数据库文档记录,仅负责文件生成与下载链接的返回。如需同时更新草稿,可传入 `documentId`,后端会先更新一次记录再生成文件。
|
|
304
|
311
|
|
|
305
|
312
|
**接口地址**: `POST /api/v1/export/doc`
|
|
|
@@ -310,7 +317,8 @@ class ExportDocResponse(BaseModel):
|
|
310
|
317
|
"fileName": "季度报告_2026Q2",
|
|
311
|
318
|
"format": "doc",
|
|
312
|
319
|
"content": "# 标题\n\n这是文档内容...",
|
|
313
|
|
- "documentId": "doc-abc123"
|
|
|
320
|
+ "documentId": "doc-abc123",
|
|
|
321
|
+ "styleId": "style-001"
|
|
314
|
322
|
}
|
|
315
|
323
|
```
|
|
316
|
324
|
|
|
|
@@ -319,7 +327,8 @@ class ExportDocResponse(BaseModel):
|
|
319
|
327
|
| fileName | string | 是 | 用户填写的文件名(不含扩展名),最大 255 字符 |
|
|
320
|
328
|
| format | string | 是 | 文件格式,阶段 0 固定为 `doc` |
|
|
321
|
329
|
| content | string | 是 | 文档当前内容(Markdown) |
|
|
322
|
|
-| documentId | string | 否 | 关联的文档 ID,用于更新自动保存记录 |
|
|
|
330
|
+| documentId | string | 否 | 关联的文档 ID,用于同步更新自动保存记录 |
|
|
|
331
|
+| styleId | string | 否 | 样式 ID;不传时使用系统默认样式;阶段 1 起可传用户上传的自定义样式 ID |
|
|
323
|
332
|
|
|
324
|
333
|
**响应示例**:
|
|
325
|
334
|
```json
|
|
|
@@ -328,7 +337,8 @@ class ExportDocResponse(BaseModel):
|
|
328
|
337
|
"data": {
|
|
329
|
338
|
"downloadUrl": "https://api.axonix.com/files/download/季度报告_2026Q2.doc?token=xxx",
|
|
330
|
339
|
"fileName": "季度报告_2026Q2.doc",
|
|
331
|
|
- "expiresAt": 1680003600000
|
|
|
340
|
+ "expiresAt": 1680003600000,
|
|
|
341
|
+ "styleId": "default"
|
|
332
|
342
|
}
|
|
333
|
343
|
}
|
|
334
|
344
|
```
|
|
|
@@ -337,7 +347,15 @@ class ExportDocResponse(BaseModel):
|
|
337
|
347
|
|
|
338
|
348
|
---
|
|
339
|
349
|
|
|
340
|
|
-## 4. Word 模板管理 API(阶段 1)
|
|
|
350
|
+## 4. 样式管理 API(阶段 1)
|
|
|
351
|
+
|
|
|
352
|
+用户上传任意 Word 文档,后端自动提取其中**所有样式的完整 XML 定义**,生成与原文档同名的样式文件并持久化存储,加入用户的样式缓存列表,导出 .doc 时可从列表中选择使用。
|
|
|
353
|
+
|
|
|
354
|
+### 功能说明
|
|
|
355
|
+
|
|
|
356
|
+- 上传文档后,后端遍历文档中的所有样式(段落样式、字符样式、表格样式、列表样式等),完整保留每个样式的原始 XML 结构(含所有属性、子元素和命名空间),不做任何简化裁剪。
|
|
|
357
|
+- 样式文件以上传文档的原始文件名命名(去掉扩展名),存入用户的样式库缓存。
|
|
|
358
|
+- 每次导出 .doc 时,用户可从缓存列表中选择一个样式应用到输出文件;不选则使用系统默认样式。
|
|
341
|
359
|
|
|
342
|
360
|
### 数据结构
|
|
343
|
361
|
|
|
|
@@ -346,45 +364,308 @@ from pydantic import BaseModel
|
|
346
|
364
|
from typing import Optional
|
|
347
|
365
|
from datetime import datetime
|
|
348
|
366
|
|
|
349
|
|
-# 标题样式
|
|
350
|
|
-class HeadingStyle(BaseModel):
|
|
351
|
|
- level: int # 标题等级 1-6
|
|
352
|
|
- font: str # 字体名称,如 "宋体"
|
|
353
|
|
- size: int # 字号(半磅单位,22 = 11pt)
|
|
354
|
|
- bold: bool
|
|
355
|
|
- color: Optional[str] = None # 十六进制颜色,如 "#000000"
|
|
356
|
|
-
|
|
357
|
|
-# 页边距
|
|
358
|
|
-class PageMargins(BaseModel):
|
|
359
|
|
- top: float # 单位:磅
|
|
360
|
|
- bottom: float
|
|
361
|
|
- left: float
|
|
362
|
|
- right: float
|
|
363
|
|
-
|
|
364
|
|
-# 模板样式元数据
|
|
365
|
|
-class TemplateStyles(BaseModel):
|
|
366
|
|
- headings: list[HeadingStyle]
|
|
367
|
|
- default_font: str
|
|
368
|
|
- default_size: int
|
|
369
|
|
- page_margins: Optional[PageMargins] = None
|
|
370
|
|
- has_header: bool
|
|
371
|
|
- has_footer: bool
|
|
|
367
|
+# 单个样式的完整定义
|
|
|
368
|
+class StyleDefinition(BaseModel):
|
|
|
369
|
+ name: str # 样式名称,如 "标题 1"
|
|
|
370
|
+ style_id: str # 样式 ID,如 "1"
|
|
|
371
|
+ type: str # 样式类型:paragraph / character / table / numbering
|
|
|
372
|
+ builtin: bool # 是否为内置样式
|
|
|
373
|
+ hidden: bool # 是否隐藏
|
|
|
374
|
+ quick_style: bool # 是否显示在快速样式库
|
|
|
375
|
+ priority: Optional[int] # 显示优先级
|
|
|
376
|
+ base_style: Optional[str] # 基础样式名称
|
|
|
377
|
+ next_paragraph_style: Optional[str] # 下一段落样式名称
|
|
|
378
|
+ font_summary: Optional[dict] # 字体摘要(name, size_pt, bold, italic 等)
|
|
|
379
|
+ paragraph_format_summary: Optional[dict] # 段落格式摘要(alignment, indent, spacing 等)
|
|
|
380
|
+ full_xml_definition: dict # 完整原始 XML(转换为嵌套字典,保留所有属性和子元素)
|
|
|
381
|
+
|
|
|
382
|
+# 样式文件摘要(列表展示用)
|
|
|
383
|
+class StyleFileSummary(BaseModel):
|
|
|
384
|
+ default_font: str # 正文默认字体,如 "宋体"
|
|
|
385
|
+ default_size_pt: float # 正文默认字号(磅),如 12.0
|
|
|
386
|
+ heading_fonts: list[str] # 各级标题字体列表(H1 到 H6)
|
|
|
387
|
+ total_styles: int # 提取到的样式总数
|
|
|
388
|
+ style_types: dict[str, int] # 各类型样式数量,如 {"paragraph": 120, "character": 40}
|
|
|
389
|
+
|
|
|
390
|
+# 样式文件完整信息(响应)
|
|
|
391
|
+class StyleFileResponse(BaseModel):
|
|
|
392
|
+ style_id: str # 样式文件唯一 ID
|
|
|
393
|
+ name: str # 样式文件名(源文档文件名去扩展名)
|
|
|
394
|
+ source_file: str # 原始上传文件名(含扩展名)
|
|
|
395
|
+ summary: StyleFileSummary # 摘要信息,用于列表展示
|
|
|
396
|
+ is_default: bool # 是否为系统默认样式
|
|
|
397
|
+ created_at: datetime
|
|
|
398
|
+
|
|
|
399
|
+# 样式文件列表项(不含完整样式定义,减少传输量)
|
|
|
400
|
+class StyleFileListItem(BaseModel):
|
|
|
401
|
+ style_id: str
|
|
|
402
|
+ name: str
|
|
|
403
|
+ source_file: str
|
|
|
404
|
+ summary: StyleFileSummary
|
|
|
405
|
+ is_default: bool
|
|
|
406
|
+ created_at: datetime
|
|
|
407
|
+```
|
|
|
408
|
+
|
|
|
409
|
+### 后端提取流程
|
|
|
410
|
+
|
|
|
411
|
+上传文档后,后端执行以下步骤:
|
|
|
412
|
+
|
|
|
413
|
+1. 使用 `python-docx` 打开上传的 Word 文档(.doc / .docx)
|
|
|
414
|
+2. 遍历文档 `doc.styles` 中的所有样式对象
|
|
|
415
|
+3. 对每个样式提取:
|
|
|
416
|
+ - 基本属性(`name`、`style_id`、`type`、`builtin`、`hidden` 等)
|
|
|
417
|
+ - 字体摘要(通过 `style.font` API 读取 `name`、`size_pt`、`bold`、`italic`、`color_rgb` 等)
|
|
|
418
|
+ - 段落格式摘要(通过 `style.paragraph_format` API 读取 `alignment`、`indent`、`spacing` 等)
|
|
|
419
|
+ - **完整 XML 定义**(对 `style.element` 递归转换为嵌套字典,保留所有属性、子元素和文本节点)
|
|
|
420
|
+4. 以上传文件名(去扩展名)命名,序列化为 JSON 保存到存储层
|
|
|
421
|
+5. 写入数据库样式缓存记录,返回摘要信息
|
|
|
422
|
+
|
|
|
423
|
+### 4.1 上传样式(从 Word 文档提取全量样式 XML)
|
|
|
424
|
+
|
|
|
425
|
+**目的**:用户上传任意 Word 文档,后端提取其中所有样式的完整 XML 定义,生成同名样式文件存入缓存列表,供后续导出时选用。
|
|
|
426
|
+
|
|
|
427
|
+**接口地址**: `POST /api/v1/styles`
|
|
|
428
|
+
|
|
|
429
|
+**请求格式**: `multipart/form-data`
|
|
|
430
|
+
|
|
|
431
|
+| 参数 | 类型 | 必填 | 说明 |
|
|
|
432
|
+|------|------|------|------|
|
|
|
433
|
+| file | File | 是 | Word 文档(.doc / .docx),最大 20MB |
|
|
|
434
|
+| name | string | 否 | 自定义样式名称;不传时默认使用上传文件名(去扩展名) |
|
|
|
435
|
+
|
|
|
436
|
+**后端处理说明**:
|
|
|
437
|
+
|
|
|
438
|
+- 样式文件名默认取自上传文件名(去扩展名),例如上传 `季报模板_2026Q2.docx`,生成样式文件名为 `季报模板_2026Q2`
|
|
|
439
|
+- 提取结果以 JSON 格式持久化,字段 `full_xml_definition` 包含每个样式的完整原始 XML,转换为嵌套字典结构,保留所有命名空间属性(`w:`、`w14:` 等)和子元素
|
|
|
440
|
+
|
|
|
441
|
+**响应示例**:
|
|
|
442
|
+```json
|
|
|
443
|
+{
|
|
|
444
|
+ "code": 0,
|
|
|
445
|
+ "data": {
|
|
|
446
|
+ "styleId": "style-001",
|
|
|
447
|
+ "name": "季报模板_2026Q2",
|
|
|
448
|
+ "sourceFile": "季报模板_2026Q2.docx",
|
|
|
449
|
+ "summary": {
|
|
|
450
|
+ "defaultFont": "宋体",
|
|
|
451
|
+ "defaultSizePt": 12.0,
|
|
|
452
|
+ "headingFonts": ["黑体", "黑体", "宋体", "宋体", "宋体", "宋体"],
|
|
|
453
|
+ "totalStyles": 164,
|
|
|
454
|
+ "styleTypes": {
|
|
|
455
|
+ "paragraph": 120,
|
|
|
456
|
+ "character": 40,
|
|
|
457
|
+ "table": 3,
|
|
|
458
|
+ "numbering": 1
|
|
|
459
|
+ }
|
|
|
460
|
+ },
|
|
|
461
|
+ "isDefault": false,
|
|
|
462
|
+ "createdAt": 1680000000000
|
|
|
463
|
+ }
|
|
|
464
|
+}
|
|
|
465
|
+```
|
|
|
466
|
+
|
|
|
467
|
+**错误情况**:
|
|
|
468
|
+
|
|
|
469
|
+| HTTP 状态码 | 错误码 | 说明 |
|
|
|
470
|
+|------------|--------|------|
|
|
|
471
|
+| 400 | 4001 | 文件格式不支持(非 .doc / .docx) |
|
|
|
472
|
+| 413 | 4002 | 文件超过 20MB 限制 |
|
|
|
473
|
+| 422 | 4003 | 文档无法解析(损坏或加密) |
|
|
|
474
|
+| 409 | 4004 | 同名样式文件已存在(可用 `?overwrite=true` 强制覆盖) |
|
|
|
475
|
+
|
|
|
476
|
+---
|
|
|
477
|
+
|
|
|
478
|
+### 4.2 获取样式列表(样式缓存)
|
|
|
479
|
+
|
|
|
480
|
+**目的**:返回当前用户的样式缓存列表,包含系统默认样式,供前端展示样式选择器。列表按创建时间倒序排列,每次导出时用户从此列表中选择应用哪个样式。
|
|
|
481
|
+
|
|
|
482
|
+**接口地址**: `GET /api/v1/styles`
|
|
|
483
|
+
|
|
|
484
|
+| 参数 | 类型 | 必填 | 说明 |
|
|
|
485
|
+|------|------|------|------|
|
|
|
486
|
+| page | integer | 否 | 页码,默认 1 |
|
|
|
487
|
+| pageSize | integer | 否 | 每页数量,默认 20,最大 100 |
|
|
|
488
|
+
|
|
|
489
|
+**响应示例**:
|
|
|
490
|
+```json
|
|
|
491
|
+{
|
|
|
492
|
+ "code": 0,
|
|
|
493
|
+ "data": {
|
|
|
494
|
+ "styles": [
|
|
|
495
|
+ {
|
|
|
496
|
+ "styleId": "default",
|
|
|
497
|
+ "name": "系统默认样式",
|
|
|
498
|
+ "sourceFile": null,
|
|
|
499
|
+ "summary": {
|
|
|
500
|
+ "defaultFont": "宋体",
|
|
|
501
|
+ "defaultSizePt": 12.0,
|
|
|
502
|
+ "headingFonts": ["黑体", "黑体", "宋体", "宋体", "宋体", "宋体"],
|
|
|
503
|
+ "totalStyles": 20,
|
|
|
504
|
+ "styleTypes": { "paragraph": 15, "character": 5, "table": 0, "numbering": 0 }
|
|
|
505
|
+ },
|
|
|
506
|
+ "isDefault": true,
|
|
|
507
|
+ "createdAt": 1680000000000
|
|
|
508
|
+ },
|
|
|
509
|
+ {
|
|
|
510
|
+ "styleId": "style-001",
|
|
|
511
|
+ "name": "季报模板_2026Q2",
|
|
|
512
|
+ "sourceFile": "季报模板_2026Q2.docx",
|
|
|
513
|
+ "summary": {
|
|
|
514
|
+ "defaultFont": "宋体",
|
|
|
515
|
+ "defaultSizePt": 12.0,
|
|
|
516
|
+ "headingFonts": ["黑体", "黑体", "宋体", "宋体", "宋体", "宋体"],
|
|
|
517
|
+ "totalStyles": 164,
|
|
|
518
|
+ "styleTypes": { "paragraph": 120, "character": 40, "table": 3, "numbering": 1 }
|
|
|
519
|
+ },
|
|
|
520
|
+ "isDefault": false,
|
|
|
521
|
+ "createdAt": 1680000000000
|
|
|
522
|
+ }
|
|
|
523
|
+ ],
|
|
|
524
|
+ "pagination": {
|
|
|
525
|
+ "page": 1,
|
|
|
526
|
+ "pageSize": 20,
|
|
|
527
|
+ "total": 2,
|
|
|
528
|
+ "totalPages": 1
|
|
|
529
|
+ }
|
|
|
530
|
+ }
|
|
|
531
|
+}
|
|
|
532
|
+```
|
|
|
533
|
+
|
|
|
534
|
+---
|
|
|
535
|
+
|
|
|
536
|
+### 4.3 获取样式详情(含完整 XML 定义)
|
|
|
537
|
+
|
|
|
538
|
+**目的**:返回指定样式文件的完整信息,包含所有样式的完整 XML 定义,供调试或样式预览使用。
|
|
|
539
|
+
|
|
|
540
|
+**接口地址**: `GET /api/v1/styles/{styleId}`
|
|
|
541
|
+
|
|
|
542
|
+**响应示例**(`styles` 数组内每条记录结构):
|
|
|
543
|
+```json
|
|
|
544
|
+{
|
|
|
545
|
+ "code": 0,
|
|
|
546
|
+ "data": {
|
|
|
547
|
+ "styleId": "style-001",
|
|
|
548
|
+ "name": "季报模板_2026Q2",
|
|
|
549
|
+ "sourceFile": "季报模板_2026Q2.docx",
|
|
|
550
|
+ "summary": {
|
|
|
551
|
+ "defaultFont": "宋体",
|
|
|
552
|
+ "defaultSizePt": 12.0,
|
|
|
553
|
+ "headingFonts": ["黑体", "黑体", "宋体", "宋体", "宋体", "宋体"],
|
|
|
554
|
+ "totalStyles": 164,
|
|
|
555
|
+ "styleTypes": { "paragraph": 120, "character": 40, "table": 3, "numbering": 1 }
|
|
|
556
|
+ },
|
|
|
557
|
+ "isDefault": false,
|
|
|
558
|
+ "createdAt": 1680000000000,
|
|
|
559
|
+ "styles": [
|
|
|
560
|
+ {
|
|
|
561
|
+ "name": "标题 1",
|
|
|
562
|
+ "styleId": "1",
|
|
|
563
|
+ "type": "paragraph",
|
|
|
564
|
+ "builtin": true,
|
|
|
565
|
+ "hidden": false,
|
|
|
566
|
+ "quickStyle": true,
|
|
|
567
|
+ "priority": 9,
|
|
|
568
|
+ "baseStyle": "正文",
|
|
|
569
|
+ "nextParagraphStyle": "正文",
|
|
|
570
|
+ "fontSummary": {
|
|
|
571
|
+ "name": "黑体",
|
|
|
572
|
+ "sizePt": 16.0,
|
|
|
573
|
+ "bold": true,
|
|
|
574
|
+ "italic": false,
|
|
|
575
|
+ "underline": false,
|
|
|
576
|
+ "colorRgb": "000000",
|
|
|
577
|
+ "strike": false,
|
|
|
578
|
+ "allCaps": false,
|
|
|
579
|
+ "smallCaps": false
|
|
|
580
|
+ },
|
|
|
581
|
+ "paragraphFormatSummary": {
|
|
|
582
|
+ "alignment": "LEFT",
|
|
|
583
|
+ "leftIndentPt": null,
|
|
|
584
|
+ "rightIndentPt": null,
|
|
|
585
|
+ "firstLineIndentPt": null,
|
|
|
586
|
+ "spaceBeforePt": 12.0,
|
|
|
587
|
+ "spaceAfterPt": 6.0,
|
|
|
588
|
+ "lineSpacing": 1.5,
|
|
|
589
|
+ "keepTogether": false,
|
|
|
590
|
+ "keepWithNext": true,
|
|
|
591
|
+ "pageBreakBefore": false
|
|
|
592
|
+ },
|
|
|
593
|
+ "fullXmlDefinition": {
|
|
|
594
|
+ "@tag": "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}style",
|
|
|
595
|
+ "@attrib": {
|
|
|
596
|
+ "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}type": "paragraph",
|
|
|
597
|
+ "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}styleId": "1"
|
|
|
598
|
+ },
|
|
|
599
|
+ "@children": {
|
|
|
600
|
+ "{...}name": { "@tag": "...", "@attrib": { "{...}val": "heading 1" } },
|
|
|
601
|
+ "{...}rPr": { "...": "完整字符属性 XML" },
|
|
|
602
|
+ "{...}pPr": { "...": "完整段落属性 XML" }
|
|
|
603
|
+ }
|
|
|
604
|
+ }
|
|
|
605
|
+ }
|
|
|
606
|
+ ]
|
|
|
607
|
+ }
|
|
|
608
|
+}
|
|
|
609
|
+```
|
|
|
610
|
+
|
|
|
611
|
+> `fullXmlDefinition` 字段为嵌套字典格式,`@tag` 为完整 Clark 表示法标签名(含命名空间),`@attrib` 为属性字典,`@children` 为子元素字典(同名子元素自动合并为数组)。
|
|
|
612
|
+
|
|
|
613
|
+---
|
|
|
614
|
+
|
|
|
615
|
+### 4.4 删除样式
|
|
|
616
|
+
|
|
|
617
|
+**接口地址**: `DELETE /api/v1/styles/{styleId}`
|
|
|
618
|
+
|
|
|
619
|
+> 系统默认样式(`styleId: "default"`)不可删除,返回 403。
|
|
|
620
|
+> 若该样式正在被某个文档引用,返回 409,需先解除引用再删除。
|
|
|
621
|
+
|
|
|
622
|
+**响应示例**:
|
|
|
623
|
+```json
|
|
|
624
|
+{
|
|
|
625
|
+ "code": 0,
|
|
|
626
|
+ "message": "Style deleted successfully"
|
|
|
627
|
+}
|
|
|
628
|
+```
|
|
|
629
|
+
|
|
|
630
|
+---
|
|
|
631
|
+
|
|
|
632
|
+## 5. 模板管理 API(阶段 1)
|
|
|
633
|
+
|
|
|
634
|
+用户上传带占位符的 Word 文档作为模板,占位符格式为 `{{名称}}`。导出时后端根据文档内容按标题名称匹配占位符,替换后生成 DOCX。
|
|
|
635
|
+
|
|
|
636
|
+### 占位符匹配规则
|
|
|
637
|
+
|
|
|
638
|
+- 占位符名称与 Markdown 文档中的**标题名称完全一致**时匹配,替换为该标题下的完整内容块(含子标题)
|
|
|
639
|
+- 匹配不上的占位符**清空**(替换为空字符串)
|
|
|
640
|
+- 示例:模板含 `{{一季度回顾}}`,文档中有 `## 一季度回顾`,则该标题及其下文内容替换占位符
|
|
|
641
|
+
|
|
|
642
|
+### 数据结构
|
|
|
643
|
+
|
|
|
644
|
+```python
|
|
|
645
|
+from pydantic import BaseModel
|
|
|
646
|
+from typing import Optional
|
|
|
647
|
+from datetime import datetime
|
|
372
|
648
|
|
|
373
|
649
|
# 模板完整信息(响应)
|
|
374
|
|
-class DocumentTemplateResponse(BaseModel):
|
|
|
650
|
+class TemplateResponse(BaseModel):
|
|
375
|
651
|
template_id: str
|
|
376
|
652
|
name: str
|
|
377
|
|
- styles: TemplateStyles
|
|
|
653
|
+ placeholders: list[str] # 模板中所有占位符名称列表,如 ["一季度回顾", "二季度展望"]
|
|
|
654
|
+ has_header: bool # 是否包含页眉
|
|
|
655
|
+ has_footer: bool # 是否包含页脚
|
|
378
|
656
|
created_at: datetime
|
|
379
|
657
|
|
|
380
|
658
|
# 模板列表项
|
|
381
|
659
|
class TemplateListItem(BaseModel):
|
|
382
|
660
|
template_id: str
|
|
383
|
661
|
name: str
|
|
|
662
|
+ placeholders: list[str]
|
|
384
|
663
|
created_at: datetime
|
|
385
|
664
|
```
|
|
386
|
665
|
|
|
387
|
|
-### 4.1 上传 Word 模板
|
|
|
666
|
+### 5.1 上传模板
|
|
|
667
|
+
|
|
|
668
|
+**目的**:用户上传带占位符的 Word 文档,后端解析出所有 `{{名称}}` 占位符列表并返回,供用户确认模板结构。
|
|
388
|
669
|
|
|
389
|
670
|
**接口地址**: `POST /api/v1/templates`
|
|
390
|
671
|
|
|
|
@@ -392,7 +673,7 @@ class TemplateListItem(BaseModel):
|
|
392
|
673
|
|
|
393
|
674
|
| 参数 | 类型 | 必填 | 说明 |
|
|
394
|
675
|
|------|------|------|------|
|
|
395
|
|
-| file | File | 是 | Word 模板文件(.docx),最大 20MB |
|
|
|
676
|
+| file | File | 是 | Word 文档(.docx),最大 20MB,需包含 `{{名称}}` 格式占位符 |
|
|
396
|
677
|
| name | string | 是 | 模板名称 |
|
|
397
|
678
|
|
|
398
|
679
|
**响应示例**:
|
|
|
@@ -401,17 +682,10 @@ class TemplateListItem(BaseModel):
|
|
401
|
682
|
"code": 0,
|
|
402
|
683
|
"data": {
|
|
403
|
684
|
"templateId": "tpl-001",
|
|
404
|
|
- "name": "标准报告模板",
|
|
405
|
|
- "styles": {
|
|
406
|
|
- "headings": [
|
|
407
|
|
- { "level": 1, "font": "宋体", "size": 22, "bold": true },
|
|
408
|
|
- { "level": 2, "font": "宋体", "size": 18, "bold": true }
|
|
409
|
|
- ],
|
|
410
|
|
- "defaultFont": "宋体",
|
|
411
|
|
- "defaultSize": 12,
|
|
412
|
|
- "hasHeader": true,
|
|
413
|
|
- "hasFooter": true
|
|
414
|
|
- },
|
|
|
685
|
+ "name": "季度报告模板",
|
|
|
686
|
+ "placeholders": ["报告摘要", "一季度回顾", "二季度展望", "风险提示"],
|
|
|
687
|
+ "hasHeader": true,
|
|
|
688
|
+ "hasFooter": true,
|
|
415
|
689
|
"createdAt": 1680000000000
|
|
416
|
690
|
}
|
|
417
|
691
|
}
|
|
|
@@ -419,7 +693,7 @@ class TemplateListItem(BaseModel):
|
|
419
|
693
|
|
|
420
|
694
|
---
|
|
421
|
695
|
|
|
422
|
|
-### 4.2 获取模板信息
|
|
|
696
|
+### 5.2 获取模板信息
|
|
423
|
697
|
|
|
424
|
698
|
**接口地址**: `GET /api/v1/templates/{templateId}`
|
|
425
|
699
|
|
|
|
@@ -429,8 +703,10 @@ class TemplateListItem(BaseModel):
|
|
429
|
703
|
"code": 0,
|
|
430
|
704
|
"data": {
|
|
431
|
705
|
"templateId": "tpl-001",
|
|
432
|
|
- "name": "标准报告模板",
|
|
433
|
|
- "styles": { ... },
|
|
|
706
|
+ "name": "季度报告模板",
|
|
|
707
|
+ "placeholders": ["报告摘要", "一季度回顾", "二季度展望", "风险提示"],
|
|
|
708
|
+ "hasHeader": true,
|
|
|
709
|
+ "hasFooter": true,
|
|
434
|
710
|
"createdAt": 1680000000000
|
|
435
|
711
|
}
|
|
436
|
712
|
}
|
|
|
@@ -438,7 +714,7 @@ class TemplateListItem(BaseModel):
|
|
438
|
714
|
|
|
439
|
715
|
---
|
|
440
|
716
|
|
|
441
|
|
-### 4.3 获取模板列表
|
|
|
717
|
+### 5.3 获取模板列表
|
|
442
|
718
|
|
|
443
|
719
|
**接口地址**: `GET /api/v1/templates`
|
|
444
|
720
|
|
|
|
@@ -450,7 +726,8 @@ class TemplateListItem(BaseModel):
|
|
450
|
726
|
"templates": [
|
|
451
|
727
|
{
|
|
452
|
728
|
"templateId": "tpl-001",
|
|
453
|
|
- "name": "标准报告模板",
|
|
|
729
|
+ "name": "季度报告模板",
|
|
|
730
|
+ "placeholders": ["报告摘要", "一季度回顾", "二季度展望", "风险提示"],
|
|
454
|
731
|
"createdAt": 1680000000000
|
|
455
|
732
|
}
|
|
456
|
733
|
]
|
|
|
@@ -460,55 +737,81 @@ class TemplateListItem(BaseModel):
|
|
460
|
737
|
|
|
461
|
738
|
---
|
|
462
|
739
|
|
|
463
|
|
-## 5. 导出 API(阶段 1)
|
|
|
740
|
+### 5.4 删除模板
|
|
|
741
|
+
|
|
|
742
|
+**接口地址**: `DELETE /api/v1/templates/{templateId}`
|
|
|
743
|
+
|
|
|
744
|
+**响应示例**:
|
|
|
745
|
+```json
|
|
|
746
|
+{
|
|
|
747
|
+ "code": 0,
|
|
|
748
|
+ "message": "Template deleted successfully"
|
|
|
749
|
+}
|
|
|
750
|
+```
|
|
|
751
|
+
|
|
|
752
|
+---
|
|
|
753
|
+
|
|
|
754
|
+## 6. 导出 DOCX API(阶段 1)
|
|
464
|
755
|
|
|
465
|
756
|
### 数据结构
|
|
466
|
757
|
|
|
467
|
758
|
```python
|
|
468
|
759
|
from pydantic import BaseModel
|
|
469
|
760
|
|
|
470
|
|
-# 导出 DOCX(保持模板格式)请求
|
|
|
761
|
+# 导出 DOCX(模板填充)请求
|
|
471
|
762
|
class ExportDocxRequest(BaseModel):
|
|
472
|
|
- document_id: str # 文档 ID,需有关联 template_id
|
|
|
763
|
+ document_id: str # 文档 ID,后端查文档内容并按标题匹配占位符
|
|
|
764
|
+ template_id: str # 模板 ID,必须指定
|
|
473
|
765
|
|
|
474
|
766
|
# 响应为文件流,HTTP Header 如下:
|
|
475
|
767
|
# Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
|
476
|
768
|
# Content-Disposition: attachment; filename="{title}.docx"
|
|
477
|
769
|
```
|
|
478
|
770
|
|
|
479
|
|
-### 5.1 下载 DOCX(保持模板格式)
|
|
|
771
|
+### 6.1 导出 DOCX(模板填充)
|
|
|
772
|
+
|
|
|
773
|
+**触发时机**:用户在编辑器中选择了模板并完成编辑后,点击"下载"按钮时触发。
|
|
|
774
|
+**目的**:后端以指定模板为基础,解析文档 Markdown 内容按标题拆分为内容块,按标题名称匹配模板中的 `{{占位符}}`,替换后生成 DOCX。输出文件的字体、样式、页眉页脚完全继承模板。
|
|
480
|
775
|
|
|
481
|
|
-**触发时机**:工作流文档编辑完成后,用户点击"下载"按钮时触发。
|
|
482
|
|
-**目的**:将编辑器中的最新内容与原始 Word 模板合并,生成 DOCX 文件并直接返回文件流,前端触发下载。下载的文件字体、标题样式、页眉页脚与原模板完全一致。
|
|
483
|
|
-**与阶段 0 导出的区别**:阶段 0 导出不依赖模板,直接将 Markdown 转为 .doc;本接口需要关联模板,目的是保证格式与模板一致。
|
|
|
776
|
+**后端处理流程**:
|
|
|
777
|
+1. 根据 `documentId` 查文档内容(Markdown)
|
|
|
778
|
+2. 根据 `templateId` 加载模板文件和占位符列表
|
|
|
779
|
+3. 将 Markdown 按标题拆分为内容块(标题名 → 内容)
|
|
|
780
|
+4. 遍历占位符,标题名称匹配则替换为对应内容,匹配不上则清空
|
|
|
781
|
+5. 生成 DOCX 文件流返回
|
|
484
|
782
|
|
|
485
|
783
|
**接口地址**: `POST /api/v1/export/docx`
|
|
486
|
784
|
|
|
487
|
785
|
**请求体**:
|
|
488
|
786
|
```json
|
|
489
|
787
|
{
|
|
490
|
|
- "documentId": "doc-abc123"
|
|
|
788
|
+ "documentId": "doc-abc123",
|
|
|
789
|
+ "templateId": "tpl-001"
|
|
491
|
790
|
}
|
|
492
|
791
|
```
|
|
493
|
792
|
|
|
494
|
793
|
| 参数 | 类型 | 必填 | 说明 |
|
|
495
|
794
|
|------|------|------|------|
|
|
496
|
|
-| documentId | string | 是 | 文档 ID,需有关联 templateId |
|
|
497
|
|
-
|
|
498
|
|
-**响应**:
|
|
|
795
|
+| documentId | string | 是 | 文档 ID,后端据此获取内容并拆分内容块 |
|
|
|
796
|
+| templateId | string | 是 | 模板 ID,决定输出文件的结构和样式 |
|
|
499
|
797
|
|
|
500
|
|
-直接返回 DOCX 文件流,前端触发浏览器下载。
|
|
|
798
|
+**响应**:直接返回 DOCX 文件流,前端触发浏览器下载。
|
|
501
|
799
|
|
|
502
|
800
|
```
|
|
503
|
801
|
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
|
504
|
|
-Content-Disposition: attachment; filename="document.docx"
|
|
|
802
|
+Content-Disposition: attachment; filename="{title}.docx"
|
|
505
|
803
|
```
|
|
506
|
804
|
|
|
507
|
|
-> 若文档无关联模板,则以默认样式生成 DOCX。
|
|
|
805
|
+**错误情况**:
|
|
|
806
|
+
|
|
|
807
|
+| 错误码 | 说明 |
|
|
|
808
|
+|--------|------|
|
|
|
809
|
+| 404 | documentId 或 templateId 不存在 |
|
|
|
810
|
+| 422 | 文档内容为空,无法生成 |
|
|
508
|
811
|
|
|
509
|
812
|
---
|
|
510
|
813
|
|
|
511
|
|
-## 6. 编辑会话 API(阶段 2)
|
|
|
814
|
+## 7. 编辑会话 API(阶段 2)
|
|
512
|
815
|
|
|
513
|
816
|
### 数据结构
|
|
514
|
817
|
|
|
|
@@ -552,7 +855,7 @@ class SessionDocumentResponse(BaseModel):
|
|
552
|
855
|
session_info: SessionInfo
|
|
553
|
856
|
```
|
|
554
|
857
|
|
|
555
|
|
-### 6.1 创建编辑会话
|
|
|
858
|
+### 7.1 创建编辑会话
|
|
556
|
859
|
|
|
557
|
860
|
**触发时机**:oil-agent 需要让用户编辑某份文档时,由 oil-agent 后端调用此接口。
|
|
558
|
861
|
**目的**:生成一个与指定文档绑定的临时 Token 和编辑器 URL,供 oil-agent 将 URL 传给用户打开,实现免登录访问编辑器。Token 与文档 ID 强绑定,无法访问其他文档。
|
|
|
@@ -591,7 +894,7 @@ class SessionDocumentResponse(BaseModel):
|
|
591
|
894
|
|
|
592
|
895
|
---
|
|
593
|
896
|
|
|
594
|
|
-### 6.2 凭 Token 获取文档
|
|
|
897
|
+### 7.2 凭 Token 获取文档
|
|
595
|
898
|
|
|
596
|
899
|
**触发时机**:编辑器页面加载时,用 URL 中的 Token 换取文档内容。
|
|
597
|
900
|
**目的**:校验 Token 有效性,返回对应文档内容和权限信息,完成免登录鉴权。
|
|
|
@@ -624,7 +927,7 @@ class SessionDocumentResponse(BaseModel):
|
|
624
|
927
|
|
|
625
|
928
|
---
|
|
626
|
929
|
|
|
627
|
|
-### 6.3 关闭编辑会话
|
|
|
930
|
+### 7.3 关闭编辑会话
|
|
628
|
931
|
|
|
629
|
932
|
**触发时机**:用户关闭编辑器或 oil-agent 主动撤回访问权限时。
|
|
630
|
933
|
**目的**:立即撤销 Token,使该链接失效,防止 Token 被复用。
|
|
|
@@ -643,7 +946,7 @@ class SessionDocumentResponse(BaseModel):
|
|
643
|
946
|
|
|
644
|
947
|
---
|
|
645
|
948
|
|
|
646
|
|
-## 7. Webhook 通知(阶段 2)
|
|
|
949
|
+## 8. Webhook 通知(阶段 2)
|
|
647
|
950
|
|
|
648
|
951
|
### 数据结构
|
|
649
|
952
|
|
|
|
@@ -671,7 +974,7 @@ class SessionClosedData(BaseModel):
|
|
671
|
974
|
duration: int # 会话持续时长(秒)
|
|
672
|
975
|
```
|
|
673
|
976
|
|
|
674
|
|
-### 7.1 配置 Webhook
|
|
|
977
|
+### 8.1 配置 Webhook
|
|
675
|
978
|
|
|
676
|
979
|
**接口地址**: `POST /api/v1/webhooks`
|
|
677
|
980
|
|
|
|
@@ -684,7 +987,7 @@ class SessionClosedData(BaseModel):
|
|
684
|
987
|
}
|
|
685
|
988
|
```
|
|
686
|
989
|
|
|
687
|
|
-### 7.2 Webhook 事件格式
|
|
|
990
|
+### 8.2 Webhook 事件格式
|
|
688
|
991
|
|
|
689
|
992
|
#### document.updated
|
|
690
|
993
|
```json
|
|
|
@@ -713,7 +1016,7 @@ class SessionClosedData(BaseModel):
|
|
713
|
1016
|
}
|
|
714
|
1017
|
```
|
|
715
|
1018
|
|
|
716
|
|
-### 7.3 签名验证
|
|
|
1019
|
+### 8.3 签名验证
|
|
717
|
1020
|
|
|
718
|
1021
|
请求头: `X-Axonix-Signature: sha256=<hmac_hex>`
|
|
719
|
1022
|
|
|
|
@@ -727,7 +1030,7 @@ def verify_webhook(payload: bytes, signature: str, secret: str) -> bool:
|
|
727
|
1030
|
|
|
728
|
1031
|
---
|
|
729
|
1032
|
|
|
730
|
|
-## 8. 导出扩展 API(阶段 3)
|
|
|
1033
|
+## 9. 导出扩展 API(阶段 3)
|
|
731
|
1034
|
|
|
732
|
1035
|
### 数据结构
|
|
733
|
1036
|
|
|
|
@@ -751,7 +1054,7 @@ class ExportPdfRequest(BaseModel):
|
|
751
|
1054
|
# Content-Disposition: attachment; filename="{title}.pdf"
|
|
752
|
1055
|
```
|
|
753
|
1056
|
|
|
754
|
|
-### 8.1 导出为 PDF
|
|
|
1057
|
+### 9.1 导出为 PDF
|
|
755
|
1058
|
|
|
756
|
1059
|
**接口地址**: `POST /api/v1/export/pdf`
|
|
757
|
1060
|
|
|
|
@@ -777,7 +1080,7 @@ Content-Disposition: attachment; filename="document.pdf"
|
|
777
|
1080
|
|
|
778
|
1081
|
---
|
|
779
|
1082
|
|
|
780
|
|
-## 9. 版本管理 API(阶段 3)
|
|
|
1083
|
+## 10. 版本管理 API(阶段 3)
|
|
781
|
1084
|
|
|
782
|
1085
|
### 数据结构
|
|
783
|
1086
|
|
|
|
@@ -809,7 +1112,7 @@ class RestoreVersionResponse(BaseModel):
|
|
809
|
1112
|
updated_at: datetime
|
|
810
|
1113
|
```
|
|
811
|
1114
|
|
|
812
|
|
-### 9.1 获取版本历史
|
|
|
1115
|
+### 10.1 获取版本历史
|
|
813
|
1116
|
|
|
814
|
1117
|
**接口地址**: `GET /api/v1/documents/{documentId}/versions`
|
|
815
|
1118
|
|
|
|
@@ -830,7 +1133,7 @@ class RestoreVersionResponse(BaseModel):
|
|
830
|
1133
|
}
|
|
831
|
1134
|
```
|
|
832
|
1135
|
|
|
833
|
|
-### 9.2 回滚版本
|
|
|
1136
|
+### 10.2 回滚版本
|
|
834
|
1137
|
|
|
835
|
1138
|
**接口地址**: `POST /api/v1/documents/{documentId}/versions/{versionId}/restore`
|
|
836
|
1139
|
|
|
|
@@ -846,7 +1149,7 @@ class RestoreVersionResponse(BaseModel):
|
|
846
|
1149
|
}
|
|
847
|
1150
|
```
|
|
848
|
1151
|
|
|
849
|
|
-### 9.3 版本对比
|
|
|
1152
|
+### 10.3 版本对比
|
|
850
|
1153
|
|
|
851
|
1154
|
**接口地址**: `GET /api/v1/documents/{documentId}/versions/diff?from={versionId}&to={versionId}`
|
|
852
|
1155
|
|
|
|
@@ -866,7 +1169,7 @@ class RestoreVersionResponse(BaseModel):
|
|
866
|
1169
|
|
|
867
|
1170
|
---
|
|
868
|
1171
|
|
|
869
|
|
-## 10. 限流与配额
|
|
|
1172
|
+## 11. 限流与配额
|
|
870
|
1173
|
|
|
871
|
1174
|
| 接口类型 | 限制 | 窗口期 |
|
|
872
|
1175
|
|---------|------|--------|
|
|
|
@@ -879,7 +1182,7 @@ class RestoreVersionResponse(BaseModel):
|
|
879
|
1182
|
|
|
880
|
1183
|
---
|
|
881
|
1184
|
|
|
882
|
|
-## 11. 测试环境
|
|
|
1185
|
+## 12. 测试环境
|
|
883
|
1186
|
|
|
884
|
1187
|
- **Base URL**: `https://api-dev.axonix.com`
|
|
885
|
1188
|
- **测试文档 ID**: `test-doc-001`
|