|
|
@@ -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
|
+```
|