Files
Mdeical_Sur_Report/工程分析/20260419_2344/功能变更实现方案文档.md
admin e549419a4c feat: 模板切换重置AI对话+Diff间距修复+API密钥DOM安全+模型切换(20260419_2344)
- 切换模板时同步清空 chatMessages/chatInput/aiUploadedImages/aiSelectedFrames
- 修复stripHtml双换行导致diff modal原始版本段落间距过大
- API密钥input改为ref非受控组件, DOM中不再出现value=sk-xxx属性
- 默认模型名改为 moonshot-v1-32k-vision-preview
2026-04-19 23:50:51 +08:00

99 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 功能变更实现方案文档20260419_2344
## 实现方案 A切换模板时重置 AI 对话
### 变更点
`ReportEditor.tsx` line 1240-1251模板应用 useEffect 中)。
### 具体实现
`setCapturedFrames([])` 之后、`updatePageHeight()` 之前,添加:
```tsx
setChatMessages([]);
setChatInput('');
setAiUploadedImages([]);
setAiSelectedFrames([]);
stateRef.current = {
...stateRef.current,
chatMessages: [],
chatInput: '',
videos: [],
capturedFrames: []
};
```
同时更新 `stateRef.current`,确保草稿保存时不会残留旧 AI 数据。
---
## 实现方案 B修复 diff modal 段落间距
### 变更点
`ReportEditor.tsx` line 835-838 的 `stripHtml` 函数。
### 具体实现
从:
```ts
tmp.innerHTML = html.replace(/<\/p>/gi, '</p>\n').replace(/<br\s*\/?>/gi, '\n');
```
改为:
```ts
tmp.innerHTML = html.replace(/<br\s*\/?>/gi, '\n');
```
`innerText` 本身会在块级 `<p>` 元素之间自动插入换行,无需手动添加。去掉手动插入后,段落间距恢复正常。
---
## 实现方案 CAPI 密钥 DOM 暴露修复
### 变更点
`src/pages/SystemSettings.tsx` line 362-377 的 API Key input。
### 具体实现
1. 导入 `useRef`
2. 创建 `apiKeyInputRef = useRef<HTMLInputElement>(null)`
3. 使用 `useEffect` 在 apiKey 变化时通过 ref 设置 DOM value
```tsx
const apiKeyInputRef = useRef<HTMLInputElement>(null);
useEffect(() => {
if (apiKeyInputRef.current) {
const targetValue = settings.aiProviders[settings.activeAiProvider]?.apiKey || '';
if (apiKeyInputRef.current.value !== targetValue) {
apiKeyInputRef.current.value = targetValue;
}
}
}, [settings.aiProviders[settings.activeAiProvider]?.apiKey]);
```
4. input 标签移除 `value` prop
```tsx
<input
ref={apiKeyInputRef}
type="password"
onChange={...}
onCopy={(e) => e.preventDefault()}
onCut={(e) => e.preventDefault()}
placeholder="sk-xxxxxxxxxxxxxxxx"
className="input-minimal"
/>
```
DOM 中不再出现 `value="sk-..."` HTML 属性。
---
## 实现方案 D默认模型名切换
### 变更点
- `src/types.ts` line 92`modelName: 'moonshot-v1-32k-vision-preview'`
- `src/pages/SystemSettings.tsx` migration fallback line 41同步修改
- `src/pages/ReportEditor.tsx` fallback line 901同步修改
---
## 依赖与兼容性
- 无新增 npm 依赖
- API Key input 改为非受控后,不影响现有 onChange 保存逻辑
- stripHtml 修改仅影响 diff modal 渲染,不影响编辑器本身