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

2.3 KiB
Raw Blame History

功能变更需求文档20260419_2344

需求 1切换模板时重置 AI 对话内容

问题背景

当前在顶部下拉框切换模板时,代码只替换了编辑器内容和 reportData但右侧 AI 聊天面板中的历史对话chatMessages和输入框内容chatInput仍然残留与新模板不匹配。

需求描述

ReportEditor.tsx 模板切换的 useEffect 中,同步清空 AI 相关状态:

  • setChatMessages([])
  • setChatInput('')
  • setAiUploadedImages([])
  • setAiSelectedFrames([])

需求 2修复"AI 修改确认"弹窗原始版本段落间距过大

问题背景

Diff 弹窗左侧"原始版本"中,段落之间的间距明显过大(截图显示有大段空白),而右侧"AI 提议版本"间距正常。

根因分析

stripHtml 函数中手动在每个 </p> 后插入 \n

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