Appearance
Feature: 文本节点
一句话目标
用户在文本节点中编写和编辑富文本内容,并可通过 AI 生成文本填充到编辑器。
行为约束
约束 1:富文本编辑
前置条件: 文本节点已创建 行为: 用户在富文本编辑器中输入和格式化文本(标题、加粗、斜体、列表、删除线) 后置条件: 内容防抖回写到节点数据
约束 2:AI 文本生成
前置条件: 用户已输入 prompt,节点状态为 idle 行为: 用户点击生成按钮,调用 generateText API 后置条件: 生成结果填充到编辑器内容区,节点状态变为 done
约束 3:生成失败保持用户输入
前置条件: AI 生成请求失败(网络错误或 API 错误) 行为: 节点状态变为 error,显示 toast 错误提示 后置条件: prompt 和现有编辑器内容保持不变
约束 4:变体选择
前置条件: 文本节点已创建 行为: 用户可选择变体数量(1/2/4),作为生成参数传递 后置条件: 生成请求携带 variations 参数
约束 5:模型选择
前置条件: 模型列表已加载 行为: 用户可在下拉菜单中切换文本生成模型 后置条件: 后续生成使用新选择的模型
状态机
idle ──[点击生成]-→ generating ──[成功]-→ done
└──[失败]-→ error
done ──[修改 prompt/模型]-→ idle
error ──[修改重试]-→ idle| 状态 | 编辑器 | 生成按钮 | Prompt |
|---|---|---|---|
| idle | 可编辑 | 可用 | 可编辑 |
| generating | 只读 | 禁用 | 只读 |
| done | 显示结果,可继续编辑 | 可用 | 可编辑 |
| error | 保持原内容 | 可用 | 保持原输入 |
Acceptance Criteria
- [x] AC-01:富文本编辑器支持标题、加粗、斜体、列表、删除线格式
- [x] AC-02:编辑内容防抖回写到节点数据(300ms)
- [x] AC-03:点击生成后,节点进入 generating 状态,按钮禁用
- [x] AC-04:生成成功后,结果填充到编辑器,状态变为 done
- [x] AC-05:生成失败后,prompt 和内容不丢失,状态变为 error
- [x] AC-06:可选择变体数量 1/2/4
- [x] AC-07:可切换文本生成模型
- [x] AC-08:组件卸载时 abort 进行中的请求
BDD Scenarios
gherkin
Feature: 文本节点
Scenario: 使用富文本工具栏格式化文本
Given 一个文本节点已创建
When 用户输入文字并点击加粗按钮
Then 选中文字变为加粗样式
And 内容以 HTML 保存到节点数据
Scenario: AI 生成文本并填充
Given 一个文本节点处于 idle 状态
And 已输入 prompt "写一段产品介绍"
When 用户点击生成按钮
Then 节点状态变为 generating
And 生成按钮变为禁用
When AI 生成成功返回
Then 编辑器内容被替换为生成结果
And 节点状态变为 done
Scenario: 生成失败时保持用户输入
Given 一个文本节点已输入 prompt "测试文本"
And 编辑器中有已编辑的内容
When AI 生成请求失败
Then 节点状态变为 error
And 编辑器内容保持不变
And prompt 输入保持 "测试文本"TDD 单元测试要点
针对 useTextEditor composable:
- [x] 初始化后 editor 实例存在
- [x] 输入内容后 300ms 调用 onUpdate 回调
- [x] 外部内容更新时同步到编辑器(不触发循环更新)
Out of Scope
- 复制全部内容按钮(延后)
- 全屏编辑模式(延后)
- 上游节点内容作为生成上下文(P0,待实现,见 data-flow spec)