43 lines
3.4 KiB
Markdown
43 lines
3.4 KiB
Markdown
# 需求分析 — 2026-04-18-00-23-14
|
||
|
||
## 原始需求摘要
|
||
|
||
用户提出 3 个关于富文本编辑器(ReportEditor / TemplateManage)的优化需求:
|
||
|
||
1. **拖拽关键帧后占位符边框残留**:通过拖拽将视频关键帧放入 `.image-placeholder` 后,占位符原有的虚线框和背景色未完全清除,视觉兼容性差。
|
||
2. **废弃原生 `prompt()`,改为居中 UI 弹窗**:点击「插入表格」和「插入图片占位符」时,当前使用浏览器原生 `prompt()` 弹窗,希望改为屏幕中央的自定义 React 弹窗,以确认表格行列数或占位符最大长宽。
|
||
3. **占位符图片来源隔离与保护**:创建图片占位符时,可选择允许的图片来源类型(关键帧图片 / 本地上传/签名/素材),从而保护签名等特定区域不被误拖入术中截图。
|
||
|
||
## 需求拆解
|
||
|
||
### 功能点
|
||
|
||
- **F1**:修复 `fillPlaceholder`(拖拽填充)未清除内联 `border` 和 `background` 的问题,使图片完全撑满占位符。
|
||
- **F2**:修复 `autoCaptureFrames` 中自动插入关键帧时同样未清除内联样式的问题。
|
||
- **F3**:在 `ReportEditor.tsx` 和 `TemplateManage.tsx` 中,将 `insertTable` 的原生 `prompt()` 替换为自定义居中弹窗(输入行数、列数)。
|
||
- **F4**:在 `ReportEditor.tsx` 和 `TemplateManage.tsx` 中,将 `insertImage` 的原生 `prompt()` 替换为自定义居中弹窗(输入宽度、高度;表格内自动隐藏尺寸输入)。
|
||
- **F5**:在弹窗中增加「图片来源限制」下拉选项(所有来源 / 仅限关键帧 / 仅限本地上传/签名/素材),生成占位符时写入 `data-allow-source` 属性。
|
||
- **F6**:在 `handleDrop`(拖拽关键帧)中拦截:若占位符限制为 `upload`,拒绝拖入并提示。
|
||
- **F7**:在 `handleEditorClick`(点击空占位符)中拦截:若占位符限制为 `frame`,拒绝打开图片选择器并提示。
|
||
- **F8**:在 `insertFrameToPlaceholder`(一键插入关键帧)中拦截:若目标占位符限制为 `upload`,拒绝插入并提示。
|
||
- **F9**:在 `autoCaptureFrames` 的自动帧插入 `setTimeout` 中拦截:若第一个空置占位符限制为 `upload`,跳过该帧不插入。
|
||
|
||
### 非功能点
|
||
|
||
- 向后兼容:未设置 `data-allow-source` 的旧占位符默认行为不变(视为 `all`)。
|
||
- 焦点管理:打开弹窗前保存当前 Selection/Range,确认后恢复光标位置再执行 `insertHTML`,确保插入位置正确。
|
||
- 视觉一致性:弹窗样式与现有 `imagePickerOpen` 弹窗保持一致(固定遮罩 + 白色圆角卡片 + 居中布局)。
|
||
- 零新依赖:不引入第三方 UI 库,继续使用原生 React state + Tailwind CSS 实现。
|
||
|
||
## 影响范围
|
||
|
||
| 模块 | 影响程度 | 说明 |
|
||
|------|---------|------|
|
||
| `src/pages/ReportEditor.tsx` | 高 | 修改 `fillPlaceholder`、`insertTable`、`insertImage`、`handleDrop`、`handleEditorClick`、`insertFrameToPlaceholder`、`autoCaptureFrames`;新增弹窗 state 与 JSX。 |
|
||
| `src/pages/TemplateManage.tsx` | 高 | 修改 `insertTable`、`insertImage`;新增弹窗 state 与 JSX;复用 `savedRangeRef` 做光标恢复。 |
|
||
| `src/index.css` | 低 | 无需修改,`.image-placeholder.has-image` 的 Tailwind 样式已正确,只需在 JS 中清除内联样式。 |
|
||
|
||
## 待确认问题
|
||
|
||
无。用户已明确要求本次不经过人工二次确认直接执行。
|