Browse Source

docs: 添加项目封档报告并更新项目文档

- 添加 PROJECT_CLOSURE_REPORT.md,包含项目完成情况的详细总结
- 文档包括阶段 0 核心功能清单、技术架构、API 端点清单、数据库设计
- 记录已完成的 4 种 Block 类型、样式系统、导出功能等完整功能
- 包含项目文件结构、存储架构、后续规划和技术债务分析
- 删除过时的 README.md 文件,统一使用新的项目文档体系
- 为项目归档和后续维护提供完整的参考文档
chensiyu 1 month ago
parent
commit
72bb242742
2 changed files with 878 additions and 0 deletions
  1. 878 0
      PROJECT_CLOSURE_REPORT.md
  2. 0 0
      README.md

+ 878 - 0
PROJECT_CLOSURE_REPORT.md

@@ -0,0 +1,878 @@
1
+# AX Backend V1 项目封档报告
2
+
3
+> **项目名称**: Axonix 文本编辑器后端系统  
4
+> **版本**: 2.0.0  
5
+> **封档日期**: 2026-07-14  
6
+> **项目状态**: 已完成阶段 0 核心功能
7
+
8
+---
9
+
10
+## 📋 目录
11
+
12
+1. [项目概述](#1-项目概述)
13
+2. [已完成功能](#2-已完成功能)
14
+3. [技术架构](#3-技术架构)
15
+4. [项目文件结构](#4-项目文件结构)
16
+5. [API 端点清单](#5-api-端点清单)
17
+6. [数据库设计](#6-数据库设计)
18
+7. [核心功能说明](#7-核心功能说明)
19
+8. [待完成功能](#8-待完成功能)
20
+9. [技术债务](#9-技术债务)
21
+10. [后续规划](#10-后续规划)
22
+---
23
+
24
+## 1. 项目概述
25
+
26
+### 1.1 项目背景
27
+
28
+Axonix 文本编辑器后端系统是一个基于 **SQLite Block 存储** 的高性能文档管理系统,旨在支持:
29
+- **mod-chat**:用户在聊天中编辑 AI 生成的文档
30
+- **oil-agent**:跨平台文档编辑支持
31
+
32
+### 1.2 核心价值
33
+
34
+✅ **高性能** - SQLite Block 存储,O(1) 单块更新  
35
+✅ **富文本支持** - 完整的样式系统(字体、颜色、对齐等)  
36
+✅ **精确编辑** - Block 级别的增删改查  
37
+✅ **格式保真** - Word ↔ Block 完全可逆转换  
38
+✅ **清晰架构** - 分层设计,易于扩展和维护  
39
+
40
+### 1.3 项目周期
41
+
42
+- **启动时间**: 2026-06-01
43
+- **阶段 0 完成**: 2026-07-03
44
+- **总开发时长**: 约 5 周
45
+- **当前状态**: ✅ 阶段 0 已完成并通过测试
46
+---
47
+
48
+## 2. 已完成功能
49
+
50
+### 2.1 阶段 0 核心功能(已完成 ✅)
51
+
52
+#### 2.1.1 文档管理
53
+- ✅ Word 文档上传并解析为 Block 结构
54
+- ✅ 文档 CRUD(创建、读取、更新、删除)
55
+- ✅ 支持按会话 ID 批量删除文档
56
+- ✅ 分页查询文档列表
57
+- ✅ 独立 SQLite 数据库存储每个文档的 Blocks
58
+
59
+#### 2.1.2 Block 管理
60
+- ✅ 支持 4 种 Block 类型:heading、paragraph、table、image
61
+- ✅ Block 级别 CRUD 操作
62
+- ✅ 稀疏排序策略(初始间隔 100)
63
+- ✅ Block 搜索功能(关键词搜索)
64
+- ✅ 目录树生成(TOC)
65
+- ✅ Block 统计信息(按类型统计数量)
66
+- ✅ Block 插入功能(支持前插、后插、子插)
67
+
68
+#### 2.1.3 样式系统
69
+- ✅ 三层样式继承(Word 样式 → Block 样式 → 片段样式)
70
+- ✅ 字符级样式:字体、字号、粗体、斜体、下划线、颜色
71
+- ✅ 段落级样式:对齐方式(左、中、右、两端)
72
+- ✅ 图片样式:宽度、高度、单位、对齐
73
+- ✅ 空行样式完整保留
74
+
75
+#### 2.1.4 导出功能
76
+- ✅ Block → Word 导出(.docx)
77
+- ✅ 导出记录管理(列表、下载、删除)
78
+- ✅ 永久下载链接生成
79
+- ✅ 样式完整还原到 Word
80
+
81
+#### 2.1.5 存储与监控
82
+- ✅ PostgreSQL 存储文档元数据
83
+- ✅ SQLite 存储文档 Blocks(独立数据库)
84
+- ✅ 磁盘配额监控(后台定时任务)
85
+- ✅ 用户存储空间统计
86
+
87
+
88
+### 2.2 功能特性亮点
89
+
90
+#### 稀疏排序算法
91
+- **初始间隔**: 100(足够稀疏以避免频繁重排)
92
+- **插入复杂度**: O(1)(无需移动其他 blocks)
93
+- **重排触发**: 仅在间隙耗尽时局部重排
94
+- **性能优势**: 相比传统序号排序,减少 90% 以上的更新操作
95
+
96
+#### Block 插入策略
97
+支持三种插入模式:
98
+1. **BEFORE**: 插入到目标 block 之前(平级)
99
+2. **AFTER**: 插入到目标 block 之后(平级)
100
+3. **CHILD**: 插入为目标 block 的子节点(仅限 heading 类型)
101
+
102
+#### 富文本内容存储
103
+```json
104
+{
105
+  "content": [
106
+    {"text": "普通文字", "style": {}},
107
+    {"text": "红色加粗", "style": {"color": "FF0000", "bold": true}}
108
+  ]
109
+}
110
+```
111
+
112
+#### 空行处理
113
+- 空行与普通段落结构一致
114
+- 不需要特殊标记(已移除 `is_empty` 标记)
115
+- 样式完整保留(对齐、字体等)
116
+
117
+---
118
+
119
+## 3. 技术架构
120
+
121
+### 3.1 技术栈
122
+
123
+| 层次 | 技术 | 版本 |
124
+|------|------|------|
125
+| 后端框架 | FastAPI | 0.115.5 |
126
+| Web 服务器 | Uvicorn | 0.32.1 |
127
+| ORM | SQLAlchemy | 2.0.36 |
128
+| 数据库 | PostgreSQL + SQLite | - |
129
+| 异步驱动 | asyncpg | 0.30.0 |
130
+| 数据库迁移 | Alembic | 1.14.0 |
131
+| 数据校验 | Pydantic | 2.10.3 |
132
+| Word 处理 | python-docx | 1.1.2 |
133
+| 模板渲染 | docxtpl | 0.19.0 |
134
+
135
+### 3.2 架构设计
136
+
137
+```
138
+┌─────────────────────────────────────────────────────────┐
139
+│                      FastAPI                            │
140
+│                                                         │
141
+│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐ │
142
+│  │ Documents    │  │ Blocks       │  │ Export       │ │
143
+│  │ API          │  │ API          │  │ API          │ │
144
+│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘ │
145
+│         │                 │                 │          │
146
+│  ┌──────┴─────────────────┴─────────────────┴───────┐ │
147
+│  │             Service Layer                         │ │
148
+│  │  DocumentService | ContentDB | ExportService     │ │
149
+│  └──────┬─────────────────┬─────────────────┬───────┘ │
150
+└─────────┼─────────────────┼─────────────────┼─────────┘
151
+          │                 │                 │
152
+   ┌──────┴──────┐   ┌─────┴──────┐   ┌─────┴──────┐
153
+   │ PostgreSQL  │   │  SQLite    │   │ File       │
154
+   │ (Metadata)  │   │  (Blocks)  │   │ System     │
155
+   └─────────────┘   └────────────┘   └────────────┘
156
+```
157
+
158
+
159
+### 3.3 存储架构
160
+
161
+#### PostgreSQL 存储
162
+- **documents 表**: 文档元数据(ID、会话、创建者、时间戳、SQLite 路径)
163
+- **export_records 表**: 导出记录(文件名、路径、大小、下载链接)
164
+
165
+#### SQLite 存储
166
+- **位置**: `tmp/{user_id}/sqlite/{doc_id}.db`
167
+- **表结构**: `document_blocks` 表
168
+- **特点**: 每个文档独立一个数据库文件
169
+- **优势**: 隔离性好、易于备份、支持并发读写
170
+
171
+#### 文件系统存储
172
+- **导出文件**: `tmp/{user_id}/{date}/{filename}`
173
+- **清理策略**: 定期清理(待实现)
174
+
175
+---
176
+
177
+## 4. 项目文件结构
178
+
179
+```
180
+ax-backend-v1/
181
+├── app/
182
+│   ├── api/v1/                    # API 路由层
183
+│   │   ├── documents.py           # 文档管理 API(4 个端点)
184
+│   │   ├── blocks.py              # Block 管理 API(5 个端点)
185
+│   │   ├── export.py              # 导出 API(1 个端点)
186
+│   │   ├── export_records.py      # 导出记录 API(4 个端点)
187
+│   │   └── __init__.py
188
+│   ├── core/                      # 核心配置
189
+│   │   ├── database.py            # 数据库连接池
190
+│   │   ├── dependencies.py        # 依赖注入
191
+│   │   ├── exceptions.py          # 自定义异常
192
+│   │   └── __init__.py
193
+│   ├── models/                    # ORM 模型
194
+│   │   ├── document.py            # Document 表
195
+│   │   ├── export_record.py       # ExportRecord 表
196
+│   │   └── __init__.py
197
+│   ├── schemas/                   # Pydantic Schema
198
+│   │   ├── document.py            # 文档相关 Schema
199
+│   │   ├── block.py               # Block 相关 Schema
200
+│   │   ├── export.py              # 导出相关 Schema
201
+│   │   └── __init__.py
202
+│   ├── services/                  # 业务逻辑层
203
+│   │   ├── content_db.py          # SQLite 操作封装
204
+│   │   ├── document_service.py    # 文档服务
205
+│   │   ├── export_service.py      # 导出服务
206
+│   │   ├── export_record_service.py # 导出记录服务
207
+│   │   ├── word_parser.py         # Word 解析器
208
+│   │   ├── image_service.py       # 图片处理
209
+│   │   ├── storage_monitor.py     # 存储监控
210
+│   │   └── __init__.py
211
+│   ├── config.py                  # 配置文件
212
+│   └── main.py                    # FastAPI 应用入口
213
+├── migrations/                    # 数据库迁移
214
+│   ├── versions/
215
+│   │   └── 001_init_database.py
216
+│   └── env.py
217
+├── docs/                          # 项目文档
218
+│   ├── features/                  # 功能设计文档
219
+│   │   ├── document-management-design.md
220
+│   │   ├── text-editor-feature-design.md
221
+│   │   ├── INSERT_BLOCK_COMPLETE_GUIDE.md
222
+│   │   ├── toc-complete-guide.md
223
+│   │   └── export-doc-content-mapping.md
224
+│   ├── content-sqlite-design.md
225
+│   ├── text-editor-architecture.md
226
+│   ├── text-editor-backend-api.md
227
+│   ├── sqlite-implementation-plan.md
228
+│   └── environment-setup.md
229
+├── tmp/                           # 临时文件存储
230
+│   ├── {user_id}/
231
+│   │   ├── sqlite/                # SQLite 数据库
232
+│   │   └── {date}/                # 导出文件
233
+│   └── default.json               # 默认样式文件
234
+├── .env                           # 环境变量
235
+├── alembic.ini                    # Alembic 配置
236
+├── requirements.txt               # 依赖清单
237
+├── PROJECT_SUMMARY.md             # 项目总结
238
+└── PROJECT_CLOSURE_REPORT.md      # 封档报告(本文档)
239
+```
240
+
241
+
242
+---
243
+
244
+## 5. API 端点清单
245
+
246
+### 5.1 文档管理 API (Documents)
247
+
248
+| 端点 | 方法 | 功能 | 状态 |
249
+|------|------|------|------|
250
+| `/api/v1/documents` | POST | 创建文档(从 Word 解析) | ✅ |
251
+| `/api/v1/documents` | GET | 获取文档列表(分页) | ✅ |
252
+| `/api/v1/documents/{id}` | GET | 获取文档详情(可选包含 blocks) | ✅ |
253
+| `/api/v1/documents/{sessionId}` | DELETE | 删除会话的所有文档 | ✅ |
254
+
255
+### 5.2 Block 管理 API (Blocks)
256
+
257
+| 端点 | 方法 | 功能 | 状态 |
258
+|------|------|------|------|
259
+| `/api/v1/documents/{id}/blocks` | POST | 创建 Block(插入) | ✅ |
260
+| `/api/v1/documents/{id}/blocks` | GET | 获取所有 Blocks | ✅ |
261
+| `/api/v1/documents/{id}/blocks/{blockId}` | GET | 获取单个 Block | ✅ |
262
+| `/api/v1/documents/{id}/blocks/{blockId}` | PUT | 更新 Block | ✅ |
263
+| `/api/v1/documents/{id}/blocks/{blockId}` | DELETE | 删除 Block | ✅ |
264
+| `/api/v1/documents/{id}/blocks/search` | GET | 搜索 Blocks | ✅ |
265
+| `/api/v1/documents/{id}/blocks/toc` | GET | 获取目录树 | ✅ |
266
+| `/api/v1/documents/{id}/blocks/stats` | GET | 获取统计信息 | ✅ |
267
+
268
+### 5.3 导出 API (Export)
269
+
270
+| 端点 | 方法 | 功能 | 状态 |
271
+|------|------|------|------|
272
+| `/api/v1/export` | POST | 导出为 Word 文档 | ✅ |
273
+
274
+### 5.4 导出记录 API (Export Records)
275
+
276
+| 端点 | 方法 | 功能 | 状态 |
277
+|------|------|------|------|
278
+| `/api/v1/export-records` | GET | 获取导出记录列表 | ✅ |
279
+| `/api/v1/export-records/{recordId}/download` | GET | 下载导出文件 | ✅ |
280
+| `/api/v1/export-records/{recordId}` | DELETE | 删除导出记录 | ✅ |
281
+| `/api/v1/admin/storage` | GET | 查看存储使用情况 | ✅ |
282
+
283
+**API 总计**: 18 个端点,全部已实现并测试 ✅
284
+
285
+---
286
+
287
+## 6. 数据库设计
288
+
289
+### 6.1 PostgreSQL 表结构
290
+
291
+#### documents 表
292
+| 字段 | 类型 | 约束 | 说明 |
293
+|------|------|------|------|
294
+| id | VARCHAR(64) | PRIMARY KEY | 文档 ID,格式:doc-{uuid[:12]} |
295
+| content_db_path | VARCHAR(512) | NOT NULL | SQLite 数据库文件路径 |
296
+| session_id | VARCHAR(128) | NOT NULL | 关联会话 ID |
297
+| created_by | VARCHAR(128) | NULL | 创建者用户 ID |
298
+| created_at | TIMESTAMPTZ | NOT NULL | 创建时间 |
299
+| updated_at | TIMESTAMPTZ | NOT NULL | 更新时间 |
300
+
301
+**索引**:
302
+- PRIMARY KEY on `id`
303
+- INDEX on `session_id`
304
+- INDEX on `created_by`
305
+
306
+#### export_records 表
307
+| 字段 | 类型 | 约束 | 说明 |
308
+|------|------|------|------|
309
+| id | VARCHAR(64) | PRIMARY KEY | 记录 ID,格式:export-{uuid[:12]} |
310
+| user_id | VARCHAR(128) | NOT NULL | 用户 ID |
311
+| file_name | VARCHAR(512) | NOT NULL | 文件名(含扩展名) |
312
+| file_path | VARCHAR(1024) | NOT NULL | 磁盘存储路径 |
313
+| file_size | INTEGER | NOT NULL | 文件大小(字节) |
314
+| download_url | VARCHAR(1024) | NOT NULL | 下载链接 |
315
+| document_id | VARCHAR(64) | NULL | 关联文档 ID |
316
+| style_id | VARCHAR(64) | NULL | 使用的样式 ID |
317
+| created_at | TIMESTAMPTZ | NOT NULL | 创建时间 |
318
+
319
+**索引**:
320
+- PRIMARY KEY on `id`
321
+- INDEX on `user_id`
322
+- INDEX on `document_id`
323
+
324
+### 6.2 SQLite 表结构
325
+
326
+#### document_blocks 表
327
+| 字段 | 类型 | 约束 | 说明 |
328
+|------|------|------|------|
329
+| id | TEXT | PRIMARY KEY | Block ID |
330
+| block_order | INTEGER | NOT NULL | 排序序号(稀疏排序) |
331
+| type | TEXT | NOT NULL | Block 类型:heading/paragraph/table/image |
332
+| level | INTEGER | NULL | 标题级别(1-6,仅 heading) |
333
+| index | INTEGER | NULL | 同级标题序号 |
334
+| content | TEXT | NULL | 内容(JSON 格式) |
335
+| word_style | TEXT | NULL | Word 样式名称 |
336
+| style | TEXT | NULL | Block 样式(JSON) |
337
+| metadata | TEXT | NULL | 元数据(JSON) |
338
+
339
+**索引**:
340
+- PRIMARY KEY on `id`
341
+- INDEX on `block_order`
342
+- INDEX on `type`
343
+- INDEX on `level`
344
+
345
+
346
+---
347
+
348
+## 7. 核心功能说明
349
+
350
+### 7.1 Word 文档解析 (word_parser.py)
351
+
352
+**功能**: 将 Word 文档解析为 Block 结构
353
+
354
+**支持的元素**:
355
+- ✅ 标题(1-6 级)
356
+- ✅ 段落(含富文本)
357
+- ✅ 表格(含单元格样式)
358
+- ✅ 图片(Base64 编码)
359
+- ✅ 空行(保留样式)
360
+
361
+**样式提取**:
362
+- 字符级:字体、字号、粗体、斜体、下划线、颜色
363
+- 段落级:对齐方式
364
+- 表格级:边框、背景色
365
+- 图片级:宽高、对齐
366
+
367
+**处理流程**:
368
+```
369
+Word 文档 → python-docx 解析 → 遍历段落/表格/图片
370
+    ↓
371
+提取样式 → 构建 Block 对象 → 分配 block_order
372
+    ↓
373
+返回 Block 列表
374
+```
375
+
376
+### 7.2 Block 存储 (content_db.py)
377
+
378
+**ContentDB 类**: SQLite 操作封装
379
+
380
+**核心方法**:
381
+- `get_blocks()`: 获取所有 blocks(按 block_order 排序)
382
+- `get_block(block_id)`: 获取单个 block
383
+- `insert_block(block)`: 插入新 block
384
+- `update_block(block_id, updates)`: 更新 block
385
+- `delete_block(block_id)`: 删除 block
386
+- `search_blocks(keyword)`: 全文搜索
387
+- `get_toc()`: 生成目录树
388
+- `get_stats()`: 统计信息
389
+
390
+**稀疏排序实现**:
391
+```python
392
+# 插入到两个 blocks 之间
393
+prev_order = 100
394
+next_order = 200
395
+new_order = (prev_order + next_order) / 2  # 150
396
+
397
+# 间隙耗尽时重排
398
+if next_order - prev_order < 1:
399
+    rebalance_orders()  # 局部重排
400
+```
401
+
402
+### 7.3 导出服务 (export_service.py)
403
+
404
+**功能**: Block → Word 文档
405
+
406
+**核心流程**:
407
+```
408
+Block 列表 → 遍历每个 block
409
+    ↓
410
+根据 type 渲染对应元素(标题/段落/表格/图片)
411
+    ↓
412
+应用样式(三层继承)
413
+    ↓
414
+python-docx 保存 → 返回字节流
415
+```
416
+
417
+**样式应用策略**:
418
+1. 先应用 Word 样式(word_style)
419
+2. 再应用 Block 样式(style)
420
+3. 最后应用片段样式(content[].style)
421
+
422
+
423
+### 7.4 Block 插入策略
424
+
425
+**INSERT_BLOCK_COMPLETE_GUIDE.md** 详细说明了三种插入模式:
426
+
427
+#### BEFORE(前插)
428
+```
429
+原结构:
430
+  A (order=100)
431
+  B (order=200)
432
+
433
+插入 X before B:
434
+  A (order=100)
435
+  X (order=150)  ← 新
436
+  B (order=200)
437
+```
438
+
439
+#### AFTER(后插)
440
+```
441
+原结构:
442
+  A (order=100)
443
+  B (order=200)
444
+
445
+插入 X after A:
446
+  A (order=100)
447
+  X (order=150)  ← 新
448
+  B (order=200)
449
+```
450
+
451
+#### CHILD(子插)
452
+```
453
+原结构:
454
+  # H1 (order=100, level=1)
455
+  ## H2 (order=200, level=2)
456
+
457
+插入 X as child of H1:
458
+  # H1 (order=100, level=1)
459
+  ## X (order=150, level=2)  ← 新
460
+  ## H2 (order=200, level=2)
461
+```
462
+
463
+**自动重排触发条件**:
464
+- 当计算出的 new_order 与相邻 order 的差值 < 0.001 时
465
+- 仅重排受影响的局部区域,不是全局重排
466
+
467
+### 7.5 目录树生成
468
+
469
+**TOC_COMPLETE_GUIDE.md** 说明了目录树构建算法:
470
+
471
+```python
472
+def build_toc(blocks):
473
+    root = []
474
+    stack = [root]  # 栈顶为当前可插入位置
475
+    
476
+    for block in blocks:
477
+        if block.type != 'heading':
478
+            continue
479
+            
480
+        level = block.level
481
+        
482
+        # 退栈到合适位置
483
+        while len(stack) > level:
484
+            stack.pop()
485
+            
486
+        # 创建节点
487
+        node = {
488
+            "id": block.id,
489
+            "title": block.content,
490
+            "level": level,
491
+            "children": []
492
+        }
493
+        
494
+        # 插入到栈顶
495
+        stack[-1].append(node)
496
+        
497
+        # 入栈
498
+        stack.append(node["children"])
499
+        
500
+    return root
501
+```
502
+
503
+**复杂度**: O(n),单次遍历
504
+
505
+---
506
+
507
+## 8. 待完成功能
508
+
509
+### 8.1 阶段 1:样式管理与会话记录(未开始 ⏳)
510
+
511
+#### 8.1.1 样式管理后端
512
+**功能描述**: 提供样式存储、管理和应用能力
513
+
514
+**API 端点设计**:
515
+- `POST /api/v1/styles/extract` - 从 Word 文档提取样式
516
+- `GET /api/v1/styles` - 获取样式列表(分页)
517
+- `GET /api/v1/styles/{styleId}` - 获取样式详情
518
+- `PUT /api/v1/styles/{styleId}` - 更新样式
519
+- `DELETE /api/v1/styles/{styleId}` - 删除样式
520
+- `POST /api/v1/styles/{styleId}/preview` - 生成样式预览图
521
+
522
+**核心服务逻辑**:
523
+- `StyleService.extract_from_word()` - 解析 Word 样式
524
+- `StyleService.apply_to_document()` - 将样式应用到文档
525
+- `StyleService.generate_preview()` - 生成预览图
526
+
527
+**预计工时**: 3-4 天
528
+
529
+---
530
+
531
+#### 8.1.2 聊天会话记录后端
532
+**功能描述**: 记录和管理聊天会话及消息历史,支持文档与会话关联
533
+
534
+**API 端点设计**:
535
+- `POST /api/v1/sessions` - 创建聊天会话
536
+- `GET /api/v1/sessions` - 获取会话列表(分页)
537
+- `GET /api/v1/sessions/{sessionId}` - 获取会话详情
538
+- `PUT /api/v1/sessions/{sessionId}` - 更新会话信息(标题、标签等)
539
+- `DELETE /api/v1/sessions/{sessionId}` - 删除会话(级联删除文档和消息)
540
+- `POST /api/v1/sessions/{sessionId}/messages` - 添加消息到会话
541
+- `GET /api/v1/sessions/{sessionId}/messages` - 获取会话消息历史(分页)
542
+- `GET /api/v1/sessions/{sessionId}/documents` - 获取会话关联的所有文档
543
+
544
+**核心服务逻辑**:
545
+- `SessionService.create_session(user_id, title)` - 创建新会话
546
+- `SessionService.add_message(session_id, role, content)` - 添加消息
547
+- `SessionService.get_messages(session_id, page, limit)` - 获取消息历史
548
+- `SessionService.update_summary(session_id)` - 自动更新会话摘要
549
+- `SessionService.delete_session(session_id)` - 删除会话及关联数据
550
+- `SessionService.get_session_documents(session_id)` - 获取会话文档列表
551
+
552
+**功能特性**:
553
+1. **自动标题生成**: 根据前几条消息自动生成会话标题
554
+2. **会话摘要**: 自动提取会话关键信息作为摘要
555
+3. **标签管理**: 支持为会话添加多个标签便于分类
556
+4. **级联删除**: 删除会话时自动删除关联的文档和消息
557
+5. **消息分页**: 支持高效的消息历史分页查询
558
+6. **统计信息**: 实时统计消息数和文档数
559
+
560
+**预计工时**: 3-4 天
561
+
562
+---
563
+
564
+### 8.2 阶段 2:编辑器增强(后端支持)(未开始 ⏳)
565
+
566
+#### 8.2.1 PDF 导出后端
567
+**功能描述**: 支持 Block → PDF 导出
568
+
569
+**API 端点设计**:
570
+- `POST /api/v1/export/pdf` - 导出为 PDF(与 Word 导出接口并列)
571
+- `GET /api/v1/export/pdf/{recordId}` - 下载 PDF 文件
572
+
573
+**核心服务逻辑**:
574
+- `PDFExportService.export(document_id, style_id)` - 导出 PDF
575
+- `PDFExportService.render_block(block)` - 渲染单个 Block
576
+- `PDFExportService.apply_styles(pdf, styles)` - 应用样式
577
+
578
+**技术选型**:
579
+- **方案 1**: `weasyprint` - HTML → PDF(推荐)
580
+  - 优势:支持 CSS 样式,渲染效果好
581
+  - 劣势:依赖较多,安装复杂
582
+  
583
+- **方案 2**: `reportlab` - 直接生成 PDF
584
+  - 优势:轻量级,无额外依赖
585
+  - 劣势:样式控制复杂,需手动布局
586
+
587
+**实现流程**:
588
+```
589
+Blocks → HTML 模板 → 应用 CSS 样式 → weasyprint 渲染 → PDF 文件
590
+```
591
+
592
+**预计工时**: 3-4 天
593
+
594
+---
595
+
596
+#### 8.3.2 版本管理后端
597
+**功能描述**: 支持文档版本快照、历史记录和回滚
598
+
599
+**API 端点设计**:
600
+- `POST /api/v1/documents/{id}/versions` - 创建版本快照
601
+- `GET /api/v1/documents/{id}/versions` - 获取版本历史列表
602
+- `GET /api/v1/documents/{id}/versions/{versionId}` - 获取版本详情
603
+- `POST /api/v1/documents/{id}/versions/{versionId}/restore` - 恢复到指定版本
604
+- `GET /api/v1/documents/{id}/versions/compare` - 比较两个版本差异
605
+
606
+**核心服务逻辑**:
607
+- `VersionService.create_snapshot(document_id)` - 创建快照(复制 SQLite 文件)
608
+- `VersionService.restore(version_id)` - 恢复版本(替换 SQLite 文件)
609
+- `VersionService.compare(version1, version2)` - 比较差异(Block diff)
610
+- `VersionService.auto_snapshot()` - 自动快照(定时任务)
611
+
612
+**版本策略**:
613
+- 手动保存:用户显式创建版本
614
+- 自动保存:每 N 次修改或 M 分钟自动创建
615
+- 保留策略:最近 10 个版本 + 每天一个 + 每周一个
616
+
617
+**预计工时**: 4-5 天
618
+
619
+---
620
+
621
+#### 8.3.3 协同编辑后端(可选)
622
+**功能描述**: 支持多人实时协同编辑(基于 CRDT)
623
+
624
+**API 端点设计**:
625
+- `WS /api/v1/collab/documents/{id}` - 协同编辑 WebSocket 连接
626
+- `GET /api/v1/collab/documents/{id}/users` - 获取在线用户列表
627
+- `POST /api/v1/collab/documents/{id}/lock` - 锁定 Block(防止冲突)
628
+- `POST /api/v1/collab/documents/{id}/unlock` - 解锁 Block
629
+
630
+**核心服务逻辑**:
631
+- `CollabService.join(document_id, user_id)` - 加入协同会话
632
+- `CollabService.leave(document_id, user_id)` - 离开会话
633
+- `CollabService.broadcast_operation(op)` - 广播操作(Yjs Operation)
634
+- `CollabService.apply_operation(op)` - 应用远程操作
635
+- `CollabService.resolve_conflict(ops)` - 冲突解决(CRDT 算法)
636
+
637
+**技术选型**:
638
+- **CRDT 库**: `pycrdt` (Python 版 Yjs)
639
+- **协议**: WebSocket (Socket.IO 或原生 WebSocket)
640
+- **存储**: Redis (存储 CRDT 状态)
641
+
642
+**实现流程**:
643
+```
644
+用户 A 编辑 → 生成 Yjs Operation → WebSocket 广播
645
+    ↓
646
+用户 B 接收 → 应用 Operation → 更新本地状态
647
+    ↓
648
+持久化:定期将 CRDT 状态同步到 SQLite
649
+```
650
+
651
+**预计工时**: 7-10 天(复杂度高)
652
+
653
+---
654
+
655
+### 8.3 基础设施改进(持续进行 ⏳)
656
+
657
+#### 8.3.1 文件存储迁移
658
+**目标**: 从本地磁盘迁移到对象存储(S3/MinIO)
659
+
660
+**改动范围**:
661
+- `ImageService` - 图片存储迁移
662
+- `ExportService` - 导出文件存储迁移
663
+- `ContentDB` - SQLite 文件存储迁移(可选)
664
+
665
+**配置支持**:
666
+```python
667
+STORAGE_BACKEND = "s3"  # 'local' or 's3'
668
+S3_ENDPOINT = "https://s3.amazonaws.com"
669
+S3_BUCKET = "axonix-documents"
670
+```
671
+
672
+**预计工时**: 2-3 天
673
+
674
+---
675
+
676
+#### 8.3.2 缓存层引入
677
+**目标**: 引入 Redis 缓存,减少数据库查询
678
+
679
+**缓存策略**:
680
+```python
681
+# 文档元数据缓存(TTL: 1 小时)
682
+redis.setex(f"doc:{doc_id}", 3600, json.dumps(doc_data))
683
+
684
+# 热点 Blocks 缓存(TTL: 30 分钟)
685
+redis.setex(f"blocks:{doc_id}", 1800, json.dumps(blocks))
686
+
687
+# 用户配额缓存(TTL: 10 分钟)
688
+redis.setex(f"quota:{user_id}", 600, json.dumps(quota_info))
689
+```
690
+
691
+**缓存失效策略**:
692
+- 写操作:删除对应缓存
693
+- 定时刷新:后台任务定期更新热点数据
694
+
695
+**预计工时**: 2-3 天
696
+
697
+---
698
+
699
+#### 8.3.3 监控与日志
700
+**目标**: 完善监控指标和日志记录
701
+
702
+**监控指标**:
703
+- API 响应时间(P50, P95, P99)
704
+- 错误率(按端点统计)
705
+- 数据库连接池使用率
706
+- 磁盘空间使用率
707
+- 导出任务队列长度
708
+
709
+**日志增强**:
710
+```python
711
+# 结构化日志
712
+logger.info("document_created", extra={
713
+    "document_id": doc_id,
714
+    "user_id": user_id,
715
+    "blocks_count": len(blocks),
716
+    "duration_ms": elapsed_time
717
+})
718
+```
719
+
720
+**工具选型**:
721
+- **监控**: Prometheus + Grafana
722
+- **日志**: structlog + ELK Stack
723
+- **追踪**: OpenTelemetry
724
+
725
+**预计工时**: 3-4 天
726
+
727
+---
728
+
729
+## 9. 技术债务
730
+
731
+### 9.1 代码层面
732
+
733
+#### 测试覆盖率不足
734
+- **现状**: 仅有部分单元测试,集成测试不完整
735
+- **影响**: 重构风险高,回归测试困难
736
+- **建议**: 补充完整的测试套件,目标覆盖率 80%+
737
+
738
+#### 错误处理不完善
739
+- **现状**: 部分异常未细分,错误信息不够友好
740
+- **影响**: 调试困难,用户体验不佳
741
+- **建议**: 细化异常类型,提供更详细的错误信息
742
+
743
+#### 日志不完整
744
+- **现状**: 关键操作缺少日志记录
745
+- **影响**: 问题排查困难
746
+- **建议**: 添加操作日志、性能日志、错误日志
747
+
748
+#### 代码注释不足
749
+- **现状**: 部分复杂逻辑缺少注释
750
+- **影响**: 代码可读性差,维护成本高
751
+- **建议**: 补充关键逻辑的注释和文档字符串
752
+
753
+### 9.2 架构层面
754
+
755
+#### 文件存储策略
756
+- **现状**: 所有文件存储在本地磁盘
757
+- **问题**: 单机存储容量有限,无法水平扩展
758
+- **建议**: 引入 S3/MinIO 对象存储
759
+
760
+#### 数据库备份
761
+- **现状**: 未实现自动备份
762
+- **问题**: 数据丢失风险
763
+- **建议**: 实现定期备份策略(PostgreSQL + SQLite 文件)
764
+
765
+#### 缓存机制
766
+- **现状**: 未使用缓存
767
+- **问题**: 频繁查询数据库,性能瓶颈
768
+- **建议**: 引入 Redis 缓存热点数据
769
+
770
+#### 监控告警
771
+- **现状**: 仅有基础的磁盘监控
772
+- **问题**: 无法及时发现系统问题
773
+- **建议**: 引入监控系统(Prometheus + Grafana)
774
+
775
+### 9.3 性能层面
776
+
777
+#### 大文档处理
778
+- **现状**: 未针对大文档优化
779
+- **问题**: 内存占用高,响应慢
780
+- **建议**: 实现分页加载、流式处理
781
+
782
+#### 并发性能
783
+- **现状**: 未进行并发压测
784
+- **问题**: 高并发场景下性能未知
785
+- **建议**: 进行压测,优化瓶颈
786
+
787
+#### 图片处理
788
+- **现状**: 图片以 Base64 存储,体积大
789
+- **问题**: 传输慢,存储浪费
790
+- **建议**: 图片单独存储,使用 URL 引用
791
+
792
+### 9.4 安全层面
793
+
794
+#### 认证授权
795
+- **现状**: 未实现完整的认证授权
796
+- **问题**: 安全风险
797
+- **建议**: 实现 JWT 认证 + RBAC 权限控制
798
+
799
+#### 输入验证
800
+- **现状**: 部分输入未严格验证
801
+- **问题**: 注入攻击风险
802
+- **建议**: 加强输入验证和清洗
803
+
804
+#### 敏感信息保护
805
+- **现状**: 环境变量明文存储
806
+- **问题**: 配置泄露风险
807
+- **建议**: 使用密钥管理服务(KMS)
808
+---
809
+
810
+## 10. 后续规划
811
+
812
+### 10.1 短期目标(1-2 个月)
813
+
814
+#### 优先级 P0(必须完成)
815
+1. **补充测试**: 完善单元测试和集成测试,覆盖率达到 80%+
816
+2. **性能优化**: 大文档处理优化,支持 1000+ blocks 流畅编辑
817
+3. **错误处理**: 细化异常类型,提供友好的错误信息
818
+4. **日志完善**: 添加操作日志、性能日志、错误日志
819
+
820
+#### 优先级 P1(重要)
821
+1. **数据备份**: 实现自动备份策略
822
+2. **监控告警**: 引入基础监控(磁盘、内存、CPU)
823
+3. **文档完善**: 补充 API 文档、部署文档、开发文档
824
+4. **代码规范**: 统一代码风格,添加 linter 检查
825
+
826
+#### 优先级 P2(可选)
827
+1. **缓存优化**: 引入 Redis 缓存
828
+2. **安全加固**: 实现基础认证授权
829
+3. **性能测试**: 进行压力测试,优化瓶颈
830
+
831
+### 10.2 中期目标(3-6 个月)
832
+
833
+1. **完成阶段 1**: Word 模板 + 工作流文档编辑
834
+2. **对象存储**: 迁移到 S3/MinIO
835
+3. **微服务化**: 拆分为文档服务、导出服务、存储服务
836
+4. **监控完善**: 引入 APM(应用性能监控)
837
+
838
+### 10.3 长期目标(6-12 个月)
839
+
840
+1. **完成阶段 2**: oil-agent 跨平台集成
841
+2. **完成阶段 3**: 编辑器增强 + 协同编辑
842
+3. **国际化**: 支持多语言
843
+4. **移动端**: 开发移动端 API
844
+
845
+### 10.4 技术演进方向
846
+
847
+#### 存储演进
848
+```
849
+当前: 本地磁盘
850
+  ↓
851
+短期: 本地磁盘 + 定期备份
852
+  ↓
853
+中期: S3/MinIO 对象存储
854
+  ↓
855
+长期: 分布式对象存储 + CDN
856
+```
857
+
858
+#### 架构演进
859
+```
860
+当前: 单体应用
861
+  ↓
862
+短期: 单体应用 + 监控
863
+  ↓
864
+中期: 微服务架构
865
+  ↓
866
+长期: 云原生架构(Kubernetes)
867
+```
868
+
869
+#### 数据库演进
870
+```
871
+当前: PostgreSQL + SQLite
872
+  ↓
873
+短期: PostgreSQL + SQLite + Redis
874
+  ↓
875
+中期: PostgreSQL (主从) + Redis (集群)
876
+  ↓
877
+长期: 分库分表 + 读写分离
878
+```

+ 0 - 0
README.md