11 KiB
11 KiB
AI 写作助手前端开发任务清单
1. 文档目标
本文档用于把《AI 写作助手右侧编辑器升级需求文档》进一步拆成前端可直接执行的任务清单。
目标是让前端团队按模块并行推进,最终完成:
- 保留左侧聊天区
- 右侧升级为
Tiptap写作编辑器 - 支持选区浮层
- 支持润色 / 扩写 / 缩写 / 改语气
- 支持替换 / 插入
- 支持标题 / 列表 / 引用 / 代码块工具条
- UI 参考豆包 + Novel + open-canvas
2. 本轮前端改造范围
2.1 保留不动
- 左侧聊天主链路
- 现有线程消息流
- 现有模型选择器
- 现有输入框的
writing_mode总入口
2.2 重点改造
- 右侧 Artifact 面板承载方式
- 新增独立写作工作区
- 富文本编辑器内核
- 选区浮层
- AI 改写结果预览
- 文档级工具条
3. 推荐目录结构
建议新增独立模块目录:
frontend-web/src/open-canvas-writing/
routes/
WritingRoutes.tsx
pages/
WritingWorkspacePage.tsx
components/
WritingShell.tsx
WritingHeader.tsx
WritingToolbar.tsx
WritingEditorPane.tsx
WritingBubbleMenu.tsx
WritingAiMenu.tsx
WritingRewritePreview.tsx
WritingStatusBar.tsx
WritingEmptyState.tsx
editor/
TiptapEditor.tsx
TiptapExtensions.ts
commands.ts
selection.ts
context/
WritingEditorContext.tsx
hooks/
useWritingEditor.ts
useWritingSelection.ts
useWritingRewrite.ts
useWritingToolbar.ts
api/
rewrite.ts
documents.ts
types/
document.ts
rewrite.ts
utils/
apply-rewrite.ts
markdown.ts
editor-style.ts
4. 现有代码落点
4.1 需要接入的现有文件
-
frontend-web/src/pages/PageRoutes.tsx- 增加新写作路由入口
-
frontend-web/src/components/workspace/chats/chat-box.tsx- 当前双栏布局参考来源
- 后续决定是否复用布局容器,或在新页面中重建双栏
-
frontend-web/src/components/workspace/input-box.tsx- 保留
writing_mode - 后续可在切换写作模式时跳转到新写作页面
- 保留
-
frontend-web/src/components/workspace/artifacts/context.tsx- 仅保留给旧 Artifact 逻辑
- 不要继续承载写作编辑器状态
4.2 不建议继续沿用的方式
- 不要把编辑器主状态存成
string[] artifacts - 不要把右侧主体验继续建在
artifact-file-detail.tsx上 - 不要让 AI 改写结果先回聊天,再由用户手动复制
5. 任务分阶段拆解
阶段 A:路由与页面壳
目标
先把新的写作工作区页面立起来,让后续编辑器与交互都有落点。
任务
- 新增
WritingRoutes.tsx - 新增
WritingWorkspacePage.tsx - 在
PageRoutes.tsx中挂入page/writing/* - 确认新页面进入方式
- 确定是:
- 通过左侧聊天上下文进入
- 通过
writing_mode入口进入 - 或二者都支持
交付物
- 新写作页面能被路由访问
- 页面有基础左右布局和空态
验收
- 打开
page/writing能进入工作区 - 页面不报错
阶段 B:编辑器底座
目标
把右侧正式替换成富文本编辑器。
任务
- 安装 Tiptap 依赖
- 建立
TiptapEditor.tsx - 建立
TiptapExtensions.ts - 配置节点:
- paragraph
- heading
- bulletList
- orderedList
- listItem
- blockquote
- codeBlock
- hardBreak
- 配置 marks:
- bold
- italic
- underline
- strike
- code
- 建立编辑器初始化逻辑
- 建立编辑器销毁逻辑
- 定义最小文档状态
交付物
- 可编辑正文区域
- 初始文档可加载
- 内容可读可写
验收
- 可以直接输入正文
- 可以换行、加标题、切换列表
- 不出现内容错位和明显闪烁
阶段 C:主工具栏
目标
右侧具备正式写作工具栏。
任务
- 新增
WritingToolbar.tsx - 新增
useWritingToolbar.ts - 实现按钮:
- 正文
- H1
- H2
- H3
- 有序列表
- 无序列表
- 引用
- 代码块
- 加粗
- 斜体
- 下划线
- 删除线
- 处理 active 状态
- 处理不可用状态
- 处理光标块状态联动
交付物
- 主工具栏可用
验收
- 工具条按钮能正确反映当前块状态
- 操作后编辑器内容正确变化
阶段 D:选区状态与浮层
目标
实现豆包式选区浮层基础能力。
任务
- 新增
useWritingSelection.ts - 新增
selection.ts - 新增
WritingBubbleMenu.tsx - 基于 Tiptap 监听 selection 变化
- 过滤掉空选区
- 处理多段连续选区
- 浮层按钮:
- AI 改写
- 加粗
- 斜体
- 标题
- 复制
- 处理滚动定位
- 处理窗口尺寸变化
交付物
- 选中内容后出现浮层
验收
- 单段可触发
- 多段可触发
- 浮层位置稳定
阶段 E:AI 改写菜单
目标
把选区浮层接到 AI 改写工作流。
任务
- 新增
WritingAiMenu.tsx - 新增
useWritingRewrite.ts - 新增
api/rewrite.ts - 实现一级动作:
- 润色
- 扩写
- 缩写
- 改语气
- 实现改语气二级菜单:
- 更专业
- 更口语化
- 更易读
- 更学术
- 更有文采
- 封装请求入参
- 增加 loading 态
- 增加 error 态
- 增加 retry 入口
交付物
- AI 改写菜单和请求链路
验收
- 4 个动作都能发请求
- 改语气的二级菜单可正常展开
- 请求失败时有反馈
阶段 F:候选结果预览
目标
把 AI 结果变成“可预览、可决策、可回退”的候选内容。
任务
- 新增
WritingRewritePreview.tsx - 新增
apply-rewrite.ts - 显示原文与候选内容
- 提供按钮:
- 替换
- 插入
- 重试
- 取消
- 用 transaction 应用结果
- 处理应用成功后的焦点与滚动
交付物
- 改写结果预览卡片或面板
验收
- 替换准确
- 插入准确
- 取消后文档保持原样
阶段 G:文档状态与容器体验
目标
补齐正式产品的壳层体验。
任务
- 新增
WritingShell.tsx - 新增
WritingHeader.tsx - 新增
WritingStatusBar.tsx - 新增
WritingEmptyState.tsx - 补充文档标题区域
- 补充文档状态提示
- 补充空态和加载态
交付物
- 页面完整壳层
验收
- 页面不是裸编辑器
- 有完整的文档工作区感
阶段 H:视觉打磨
目标
让整体观感接近成熟产品。
任务
- 调整右侧阅读宽度
- 调整字体大小和行高
- 调整段距和标题层级
- 调整工具栏阴影、边框、圆角
- 调整浮层动效
- 调整 AI 预览卡片质感
- 优化深浅色模式兼容
交付物
- 完整视觉优化
验收
- 明显优于当前版本
- 有豆包 / Novel 风格的编辑器质感
6. 组件级开发清单
6.1 WritingWorkspacePage.tsx
职责:
- 页面级容器
- 获取线程 / 文档上下文
- 组织左右布局
必须完成:
- 页面初始化
- 与左侧聊天协同
- 右侧编辑区挂载
6.2 WritingShell.tsx
职责:
- 写作工作区总壳层
- 布局标题区、工具栏、正文区、状态区
必须完成:
- 自适应布局
- 桌面端优先
- 窄屏降级
6.3 TiptapEditor.tsx
职责:
- 包装 Tiptap EditorContent
- 负责 editor 实例初始化
必须完成:
onUpdateonSelectionUpdate- 内容同步
6.4 WritingToolbar.tsx
职责:
- 顶部主工具栏
必须完成:
- 所有基础格式化命令
- 当前状态高亮
6.5 WritingBubbleMenu.tsx
职责:
- 选区浮层
必须完成:
- 跟随选区
- 基础快捷操作
- AI 改写入口
6.6 WritingAiMenu.tsx
职责:
- AI 改写动作菜单
必须完成:
- 一级菜单
- 改语气二级菜单
- 动作触发
6.7 WritingRewritePreview.tsx
职责:
- 展示候选内容
必须完成:
- 替换
- 插入
- 重试
- 取消
7. Hook 级开发清单
7.1 useWritingEditor.ts
负责:
- editor 生命周期
- 初始内容装载
- 内容变更同步
7.2 useWritingSelection.ts
负责:
- 当前选区抽取
- 选区文本缓存
- 多段落纯文本拼接
7.3 useWritingRewrite.ts
负责:
- 改写请求
- loading / success / error
- 结果缓存
- 重试
7.4 useWritingToolbar.ts
负责:
- toolbar active 状态
- editor command 映射
8. API 对接清单
前端需向后端约定以下接口能力:
POST /api/writing/rewrite
前端请求内容至少包括:
threadIddocumentIdselection.fromselection.toselection.textactiontonesurroundingContext.beforesurroundingContext.after
前端需处理的返回字段:
outputoriginalSelectionmetadata
9. 状态管理建议
建议新增独立 Context:
WritingEditorContext.tsx
建议持有:
- 当前文档内容
- 当前 editor 实例
- 当前选区
- 当前改写请求状态
- 当前候选结果
- 当前 UI 面板状态
不建议继续复用旧 Artifact Context 的原因:
- 旧 Context 关注文件列表和文件路径
- 新编辑器关注选区、结构、候选结果、应用动作
- 关注点完全不同
10. 前端联调检查点
10.1 与后端联调前
- 先用 mock 数据打通浮层和预览
- 先验证替换 / 插入逻辑
10.2 与后端联调时
- 检查多段落选区拼接结果
- 检查 AI 返回内容是否带说明性前缀
- 检查替换后位置是否准确
10.3 联调后
- 验证大段文本性能
- 验证撤销 / 重做
- 验证快速连续触发是否会状态错乱
11. 前端测试清单
11.1 功能测试
- 输入正文
- 插入标题
- 切换列表
- 插入引用
- 插入代码块
- 加粗 / 斜体 / 下划线 / 删除线
- 选区浮层显示
- 选区浮层隐藏
- AI 改写菜单打开
- 改语气二级菜单打开
- 改写结果替换
- 改写结果插入
- 改写结果取消
11.2 场景测试
- 单段短文本润色
- 多段文本润色
- 多段文本扩写
- 多段文本缩写
- 多段文本改语气
- 连续两次改写同一段
- 快速切换线程后重新进入
11.3 回归测试
- 左侧聊天是否正常
- 模型切换是否正常
writing_mode是否正常- 原有 artifact 模块是否仍可使用
12. 任务优先级
P0
- 路由与页面壳
- Tiptap 接入
- 主工具栏
- 选区浮层
- 改写菜单
- 替换 / 插入
P1
- 页面头部与状态
- 优雅 loading / error / retry
- 多段落稳定性
- UI 打磨
P2
- 空态优化
- 动效优化
- 快捷键支持
13. 建议分工
前端 1 号
负责:
- 路由与页面壳
- Tiptap 接入
- 主工具栏
前端 2 号
负责:
- 选区状态
- BubbleMenu
- AI 菜单
前端 3 号
负责:
- 候选结果预览
- 替换 / 插入
- 状态栏与页面体验
联调负责人
负责:
- 前后端请求协议
- 错误态规范
- 多段落测试和回归
14. 前端完成定义
满足以下条件可视为前端完成:
- 右侧能作为正式编辑器独立使用
- 选区后可直接发起 AI 改写
- 改写后可替换或插入
- 视觉上明显优于当前版本
- 左侧聊天和现有系统不被破坏
15. 下一步建议
前端团队可以按以下顺序开工:
- 先起页面和路由
- 再接 Tiptap 与主工具栏
- 再做选区浮层
- 再接 AI 菜单和结果预览
- 最后做视觉打磨
这个顺序风险最小,也最容易在中途验收。