# AI 文档模板生成系统 · 可视化区块编辑器重构任务拆解清单 基线版本:当前 `master` 分支 目标:将系统从"按 Heading 解析段落"升级为"Word 富文本渲染 + 可视化框选区块 + 精确写回"的文档生成系统,类似腾讯文档的交互体验。 总工期估算:6-8 周(两人并行:前端 + 后端) ## 第一阶段:Word → HTML 渲染引擎(第 1-2 周) ### 后端:Word 转 HTML 服务(5-7 天) - [x] 新建 `services/word_to_html.py`,将 docx 转为保留样式的 HTML - [x] 段落渲染:字体(font-family / font-size / color / bold / italic)、对齐、行距、段前段后间距、首行缩进 - [x] 表格渲染:完整保留边框样式(内外边框、线宽、颜色)、单元格背景色/底纹、合并单元格(rowspan/colspan)、列宽 - [ ] 图片处理:提取 docx 内嵌图片,上传到 MinIO 并生成 URL - [x] 列表项渲染:有序/无序列表及缩进层级(检测 w:numPr,支持 bullet/ordered,CSS ::before 标记) - [ ] 页眉页脚渲染(可选,标记为 `data-region="header"` / `data-region="footer"`) - [x] 为每个渲染元素标记 `data-block-index`(对应原始 docx XML 元素序号),作为后续写回锚点 - [x] 输出完整的独立 HTML 文档字符串(内联样式,可直接在 iframe 中渲染) ### 后端:解析器升级 — 块级结构输出(3-4 天) - [x] 新增 `parse_template_v2()` 函数,输出 `list[TemplateBlock]` 而非 `list[ParsedParagraph]` - [x] 每个块记录:`block_index`(XML 元素序号)、`block_type`(heading/text/table/image)、`html_snippet`、`style_json` - [x] 保留旧 `parse_template()` 兼容现有流程 - [x] 上传模板时同时生成 HTML 快照并存入 MinIO(或数据库 TEXT 字段) ### 前端:文档渲染组件(3-4 天) - [x] 新建 `components/DocRenderer.vue`,用 iframe 渲染后端返回的 HTML - [x] 适配 A4 纸张宽度(794px),支持缩放 - [x] 鼠标 hover 时高亮当前 block(通过 `data-block-index` 定位) - [x] 支持文本选择(保留浏览器原生 Selection API) ## 第二阶段:可视化框选与区块定义(第 2-3 周) ### 前端:框选交互层(4-5 天) - [x] 在 DocRenderer 上实现拖拽框选交互(mousedown → mousemove → mouseup) - [x] 绘制半透明选区矩形(overlay div) - [x] 计算选区覆盖的 `data-block-index` 范围(start → end) - [x] 选区边界自动吸附到完整块边界(IntersectionRect 检测 + 按 data-block-index 全块选中) - [x] 选中后弹出浮动工具栏:设为 AI 块 / 设为固定块 / 取消选择 - [x] 已定义的块在文档上显示彩色边框 + 标签(AI 块紫色 / 固定块灰色 / 变量块绿色) - [x] 支持多选区(Ctrl+框选 追加选区) - [x] 支持点击已有块查看/编辑配置 ### 前端:左右面板联动升级(3-4 天) - [ ] 左侧块列表改为树形结构(支持父子嵌套) - [x] 块列表项显示:块类型图标 + 标题 + 所属区域标签 - [x] 点击块列表 ↔ 画布中块高亮滚动联动 - [x] 右侧配置面板根据 `block_type` 动态切换表单项: - AI 块:模型选择 / 提示词 / 输出格式 / 是否需要参考文件 - 固定块:只读信息 / 转为 AI 块按钮 - 变量块:变量名 / 默认值 / 必填标记 - [x] 拖拽排序(dragstart/dragover/drop 事件,排序后自动保存块配置) ### 前端:编辑模式切换(2-3 天) - [x] 顶部工具栏新增模式切换:「预览模式」「框选模式」「编辑模式」 - [x] 预览模式:只读查看文档渲染效果 - [x] 框选模式:可拖拽选择区域定义为块(默认模式) - [ ] 编辑模式(后续迭代):contenteditable 直接修改文档内容 ## 第三阶段:块级数据持久化与模板保存(第 3-4 周) ### 后端:块存储 API(2-3 天) - [x] 新建/修改 `routers/templates.py` 中的块保存接口 `PUT /api/v1/templates/{id}/blocks` - [x] 接口接收 `list[TemplateBlock]`,批量 upsert(新增/更新/删除) - [x] 旧 `paragraphs` 接口保留兼容,内部转换到新块结构 - [x] 模板详情返回时优先返回 blocks,fallback 到 paragraphs ### 后端:模板快照管理(2-3 天) - [x] 上传模板时生成 HTML 快照存入 `template_snapshots` 表或 MinIO - [x] 每次保存块配置时同步更新快照中的块标记(html_snippet 注入 block-ai/block-fixed CSS class) - [x] 加载模板时直接返回带块标记的 HTML,前端无需二次计算 ### 数据库增量变更(1-2 天) - [x] 确认 `template_blocks` 表字段完整性(已有,需检查) - [x] 如需新增字段:`anchor_start_index`、`anchor_end_index`、`html_snippet` - [x] 新增 `template_snapshots` 表:HTML 快照改为存储在 `template_blocks.html_snippet` 字段(无需独立表) - [x] 输出增量 SQL 脚本(已在 database.py 中通过 init_db 自动迁移) ## 第四阶段:生成链路适配(第 4-5 周) ### 后端:块级 AI 生成调度(4-5 天) - [x] 重构 `generation_runtime.py`:生成单元从 Paragraph 切换为 TemplateBlock - [x] 只对 `edit_mode='ai'` 的块调用 AI - [x] 固定块的内容直接作为上下文传递给相邻 AI 块 - [ ] 变量块按变量值直接替换,不经过 AI - [ ] 并发控制:按模板全局 Semaphore 限流 - [x] SSE 进度推送单位改为块(`done/total` 按块计数) ### 后端:AI 提示词上下文增强(2-3 天) - [x] 构建 AI 请求时,自动附带同一锚点下相邻固定块的内容作为上下文 - [ ] 文件附件绑定改为块级别(`block_id` 替代 `paragraph_id`) - [ ] 文件摘要按块关联传入 AI ### 前端:生成页适配(2-3 天) - [x] 生成页支持段落/块模式切换(RadioButton 切换 genMode) - [x] 块模式显示 AI 块列表(替代段落文件配置) - [x] 块模式调用 generateFullV2 接口 - [ ] 生成页左侧模板预览改为渲染 HTML 快照 + 块标记 - [ ] 文件上传区按 AI 块分列展示 - [ ] 进度展示与块列表联动(当前正在生成哪个块) ## 第五阶段:导出引擎重构(第 5-6 周) ### 后端:基于块索引的精确写回(5-7 天) - [x] 重构 `document_export.py`,基于 `block_index` 定位而非 `anchor_title` 文本匹配 - [x] 导出流程: 1. 从 MinIO 拉取原始模板 docx 2. 按块索引定位到原始 XML 元素 3. 固定块:保留原始内容不变 4. AI 块:用生成结果替换(文本块替换 ``,表格块替换整个 ``) 5. 变量块:替换为变量值 - [x] 支持块顺序调整后的正确写回(按 sort_index 重排文档元素,gap 元素保持原位置) - [x] 保留未选中区域(没有被任何 Block 覆盖的文档部分)原样保留 - [ ] 表格样式继承:AI 生成的表格复用同一文档中最近的表格样式 ### 后端:导出正确性验证(2-3 天) - [ ] 单块替换正确性验证 - [ ] 多块顺序写回正确性验证 - [ ] 固定块 + AI 块混合导出验证 - [ ] 封面区域(非标题内容)导出验证 - [ ] 表格块导出样式一致性验证 ## 第六阶段:预览编辑与结果管理(第 5-6 周) ### 前端:预览编辑页升级(3-4 天) - [x] 预览页面改为渲染带块标记的 HTML 文档(DocRenderer + 模板 HTML 快照) - [x] AI 块紫色边框标注(左侧紫色边框 + 标签) - [x] 支持单块重新生成(块列表中的重新生成按钮 + regenerateBlock API) - [x] 支持恢复到模板默认内容(resetBlock API + 确认弹窗) - [x] 导出按钮支持块级导出(Word / Word v2 / PDF) - [x] 块/段落双模式自动切换(根据 has_blocks 标志自动选择视图) ### 前端:历史记录页增强(2-3 天) - [ ] 历史列表卡片展示文档缩略图(HTML 快照截图) - [ ] 按模板、按状态筛选 - [ ] 对比模式:并排展示原始模板 vs 生成结果 ## 第七阶段:联调、修边与验收(第 7-8 周) - [ ] 真实复杂模板全流程联调(含封面 / 摘要 / 多级标题 / 复杂表格 / 图片) - [ ] 框选交互边界测试(跨页选区、嵌套表格选区、空选区) - [ ] 不同浏览器兼容性测试(Chrome / Edge / Safari) - [ ] 大文档性能测试(50 页+ Word 文档渲染性能) - [ ] 导出结果与原 Word 样式一致性验收 - [ ] 旧数据(基于 Paragraph 的历史记录)兼容性验证 - [ ] 错误提示完善、加载状态/骨架屏补充 - [ ] 操作日志与使用说明整理 ## 阶段交付物 | 阶段 | 交付物 | |------|--------| | 第 1-2 周 | Word→HTML 渲染引擎、块级解析器、文档渲染组件 | | 第 2-3 周 | 可视化框选交互、块配置面板、模式切换 | | 第 3-4 周 | 块存储 API、模板快照管理、数据库增量变更 | | 第 4-5 周 | 块级 AI 生成调度、生成页适配 | | 第 5-6 周 | 基于块索引的精确写回引擎、预览编辑页升级 | | 第 7-8 周 | 全流程联调、兼容性测试、验收交付 | ## 与现有改造任务的关系 | 现有任务 | 本方案处理方式 | |---------|-------------| | 04-后续迭代(占位体系) | 变量块覆盖占位需求,不再需要独立占位语法 | | 05-在线编辑重构(AI选区模式) | 本方案的框选交互即为 AI 选区模式的完整实现 | | 05-模板源写回 | 合并到本方案第五阶段导出引擎重构 | | 旧 Paragraph 表 | 保留兼容,逐步由 TemplateBlock 替代 | ## 核心架构变化 ``` 【改造前】 Word 上传 → 按 Heading 切段落 → 段落列表 → 配置 → AI 生成 → 按标题文本写回 【改造后】 Word 上传 → 解析为 HTML + 块索引 → 可视化框选定义块 → 块配置 → AI 按块生成 → 按索引精确写回 ``` ## 风险与缓解 | 风险 | 等级 | 缓解措施 | |------|------|---------| | Word→HTML 样式还原度不足 | 中 | 优先保证字体/表格/对齐,复杂格式(分栏/文本框)暂不支持 | | 大文档 HTML 渲染性能 | 中 | 虚拟滚动 + 按需加载,超过 100 页的文档分页渲染 | | 块索引在多次编辑后偏移 | 高 | 每次保存时重新解析并更新索引;导出时以最新快照为准 | | 框选交互在 iframe 中的复杂性 | 中 | 备选方案为 div 直接渲染(放弃 iframe 隔离),简化事件处理 | | 旧数据兼容 | 低 | Paragraph→TemplateBlock 转换脚本,历史数据只读 |