- 切换模板时同步清空 chatMessages/chatInput/aiUploadedImages/aiSelectedFrames - 修复stripHtml双换行导致diff modal原始版本段落间距过大 - API密钥input改为ref非受控组件, DOM中不再出现value=sk-xxx属性 - 默认模型名改为 moonshot-v1-32k-vision-preview
59 lines
2.3 KiB
Markdown
59 lines
2.3 KiB
Markdown
# 功能变更需求文档(20260419_2344)
|
||
|
||
## 需求 1:切换模板时重置 AI 对话内容
|
||
|
||
### 问题背景
|
||
当前在顶部下拉框切换模板时,代码只替换了编辑器内容和 reportData,但右侧 AI 聊天面板中的历史对话(chatMessages)和输入框内容(chatInput)仍然残留,与新模板不匹配。
|
||
|
||
### 需求描述
|
||
在 `ReportEditor.tsx` 模板切换的 `useEffect` 中,同步清空 AI 相关状态:
|
||
- `setChatMessages([])`
|
||
- `setChatInput('')`
|
||
- `setAiUploadedImages([])`
|
||
- `setAiSelectedFrames([])`
|
||
|
||
---
|
||
|
||
## 需求 2:修复"AI 修改确认"弹窗原始版本段落间距过大
|
||
|
||
### 问题背景
|
||
Diff 弹窗左侧"原始版本"中,段落之间的间距明显过大(截图显示有大段空白),而右侧"AI 提议版本"间距正常。
|
||
|
||
### 根因分析
|
||
`stripHtml` 函数中手动在每个 `</p>` 后插入 `\n`:
|
||
```ts
|
||
tmp.innerHTML = html.replace(/<\/p>/gi, '</p>\n').replace(/<br\s*\/?>/gi, '\n');
|
||
```
|
||
而浏览器 `innerText` 本身就会在块级 `<p>` 元素之间自动插入换行。两者叠加导致双换行 → `computeDiffHtml` 将 `\n` 转为 `<br>` → 左侧显示双 `<br>` 间距。
|
||
|
||
### 需求描述
|
||
移除 `stripHtml` 中 `</p>\n` 的手动插入,仅保留 `<br>` 转 `\n` 的逻辑,让 `innerText` 自然处理段落间距。
|
||
|
||
---
|
||
|
||
## 需求 3:修复 API 密钥在 DOM 源码中暴露
|
||
|
||
### 问题背景
|
||
即使 `type="password"`,浏览器的 Elements 面板中仍可直接看到 `<input value="sk-2IAFn8ORoSdUcCxYX6DmXJWbH7BxftSSA8kN88mD1KUDTmkv">` 的完整明文。
|
||
|
||
### 需求描述
|
||
将 API Key 输入框从 React 受控组件(`value={...}`)改为 ref 控制的非受控组件:
|
||
- JSX 中不写 `value` / `defaultValue` prop
|
||
- 通过 `useEffect` + `useRef` 在 JavaScript 层面设置 DOM 的 `value` property(非 HTML attribute)
|
||
- 当 provider 切换或 apiKey 变化时,ref 同步更新 input 值
|
||
- 添加安全检查:仅当 ref 当前值与目标值不同时才设置,避免覆盖用户正在输入的字符
|
||
|
||
---
|
||
|
||
## 需求 4:默认模型名改为 moonshot-v1-32k-vision-preview
|
||
|
||
### 需求描述
|
||
将 Kimi 默认模型从 `moonshot-v1-auto` 改为 `moonshot-v1-32k-vision-preview`,支持视觉输入。
|
||
|
||
---
|
||
|
||
## 影响范围
|
||
- `src/pages/ReportEditor.tsx`
|
||
- `src/pages/SystemSettings.tsx`
|
||
- `src/types.ts`
|