From cf2a6b2b79e0c20663e2b93c717cc4e1ea737aa9 Mon Sep 17 00:00:00 2001 From: linshen <32978552+linshenkx@users.noreply.github.com> Date: Sat, 25 Oct 2025 14:54:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=E9=87=8D=E6=9E=84=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E7=B3=BB=E7=BB=9F=E5=B9=B6=E5=AE=9E=E7=8E=B0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=8C=BA=E7=8B=AC=E7=AB=8B=E5=8F=98=E9=87=8F=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 核心功能 ### 变量系统重构 - 移除会话变量系统,实现独立的测试变量功能 - 将 useContextManagement 从 web 模块迁移到 ui 模块 - 升级 usePromptTester 支持测试变量注入和上下文 ### 测试区临时变量管理 - 临时变量数据结构升级为 { value, timestamp } - 按时间戳降序排序显示(最新在前) - 支持手动增删改操作 - 添加变量对话框,支持变量名验证 - 删除按钮,支持单个变量删除 - 与优化后提示词解耦,不再自动绑定 ### 变量提取功能 - 新增 variable-extraction 组件目录 - VariableAwareInput: 支持文本选择提取变量 - VariableExtractionDialog: 变量提取对话框 - useTextSelection: 文本选择管理 - useInputHistory: 输入历史管理 - 支持全局/临时变量类型选择 - 支持全部替换功能 ## 技术改进 ### 组件优化 - TestAreaPanel.vue: testVariables 从 Record 升级为 Record - InputPanel.vue: 集成 VariableAwareInput 组件,支持变量提取 - ContextUserWorkspace.vue: 新增 temporaryVariables 状态管理 ### 国际化完善 - 补充缺失的 test.invalidVariables 和 test.getVariablesFailed 键 - 新增变量提取相关的完整国际化文本 - 覆盖中文简体/繁体/英文三种语言 - 同步三语言国际化键值(en-US/zh-CN/zh-TW) ## 其他更新 - 修复 web/extension 中未使用变量和错误 API 调用 - 更新测试文件的组件导入路径 - 清理过度 debug 日志 - 更新相关文档(ui-refactor-plan.md, variable-system-redesign.md) ## 相关 Issue - 解决测试区变量显示依赖优化结果的问题 - 实现变量独立管理需求 - 补充缺失的国际化文本 **测试:所有测试通过(core: 367, ui: 95)** --- docs/workspace/ui-design-analysis.md | 1789 +++++++++++++++++ docs/workspace/ui-refactor-plan.md | 804 ++++++++ docs/workspace/variable-system-redesign.md | 788 ++++++++ packages/extension/src/App.vue | 1398 +++++++------ packages/ui/src/components/InputPanel.vue | 68 +- packages/ui/src/components/TestAreaPanel.vue | 292 ++- .../context-mode/ContextModeActions.vue | 14 - .../context-mode/ContextSystemWorkspace.vue | 43 +- .../context-mode/ContextUserWorkspace.vue | 338 +++- .../VariableAwareInput.vue | 370 ++++ .../VariableExtractionDialog.vue | 259 +++ .../components/variable-extraction/index.ts | 17 + .../variable-extraction/useInputHistory.ts | 172 ++ .../variable-extraction/useTextSelection.ts | 191 ++ packages/ui/src/composables/index.ts | 1 + .../src/composables/useContextManagement.ts | 58 +- .../ui/src/composables/usePromptTester.ts | 320 ++- packages/ui/src/i18n/locales/en-US.ts | 48 + packages/ui/src/i18n/locales/zh-CN.ts | 50 +- packages/ui/src/i18n/locales/zh-TW.ts | 47 +- .../tests/e2e/context-editor-refactor.spec.ts | 6 +- .../context-editor-persist.spec.ts | 2 +- .../integration/context-editor-sync.spec.ts | 4 +- .../unit/components/ContextEditor.spec.ts | 2 +- packages/web/src/App.vue | 261 +-- packages/web/vitest.config.ts | 7 +- 26 files changed, 6273 insertions(+), 1076 deletions(-) create mode 100644 docs/workspace/ui-design-analysis.md create mode 100644 docs/workspace/ui-refactor-plan.md create mode 100644 docs/workspace/variable-system-redesign.md create mode 100644 packages/ui/src/components/variable-extraction/VariableAwareInput.vue create mode 100644 packages/ui/src/components/variable-extraction/VariableExtractionDialog.vue create mode 100644 packages/ui/src/components/variable-extraction/index.ts create mode 100644 packages/ui/src/components/variable-extraction/useInputHistory.ts create mode 100644 packages/ui/src/components/variable-extraction/useTextSelection.ts rename packages/{web => ui}/src/composables/useContextManagement.ts (85%) diff --git a/docs/workspace/ui-design-analysis.md b/docs/workspace/ui-design-analysis.md new file mode 100644 index 00000000..c290bc29 --- /dev/null +++ b/docs/workspace/ui-design-analysis.md @@ -0,0 +1,1789 @@ +# 📱 上下文模式重构 - UI 设计分析报告 + +> **文档版本**: v2.0 +> **创建日期**: 2025-10-21 +> **最后更新**: 2025-10-22 +> **分析范围**: 上下文模式 (User/System) UI 组件设计 + 变量系统重构 +> **状态**: ✅ v1.1改造已完成,📋 v2.0变量系统重构待实施 + +--- + +## 📢 重要更新 + +### ✅ v1.1 UI改造 (已完成 - 2025-10-22) + +1. **子模式选择器位置调整** ✅ 已完成 + - **问题**: 子模式选择器位于工作区内,层级混乱 + - **方案**: 移动到导航栏,紧邻功能模式选择器右侧 + - **状态**: ✅ 已完成 + - **提交**: 之前已完成 + +2. **快捷操作栏位置调整** ✅ 已完成 + - **问题**: 快捷操作栏在左侧优化区,作用域不明确 + - **方案**: 移动到右侧测试区顶部,贴近使用场景 + - **状态**: ✅ 已完成 + - **提交**: `ce90d47` - refactor(ui): 优化上下文模式快捷操作栏位置 + +### 📋 v2.0 变量系统重构 (待实施) + +3. **变量系统简化** 🔴 高优先级 + - **问题**: "全局变量"和"会话变量"概念混淆,实际都是持久化变量 + - **方案**: 移除会话变量,引入测试区临时变量 + - **状态**: 📋 待实施 + - **详情**: 见 [变量系统重构设计文档](./variable-system-redesign.md) + +### 📊 改造预期效果 + +**改造前:** +``` +┌────────────────────────────────────────────────────────┐ +│ Prompt Optimizer | [基础|上下文|图像] | 📝📜⚙️... │ +├────────────────────────┬───────────────────────────────┤ +│ [📊📝🔧] │ 测试区 │ +│ ────────────────────── │ │ +│ [系统|用户] [模型▾] │ │ +│ 输入框... │ │ +└────────────────────────┴───────────────────────────────┘ + ↑ 问题1: 层级混乱 ↑ 问题2: 操作距离远 +``` + +**改造后:** +``` +┌────────────────────────────────────────────────────────┐ +│ Prompt Optimizer │ +│ [基础|上下文|图像] [系统|用户] 📝📜⚙️... │ +│ ↑ 功能模式 ↑ 子模式(动态显示) │ +├────────────────────────┬───────────────────────────────┤ +│ 优化区 │ 测试区 │ +│ │ ┌───────────────────────────┐ │ +│ [模型▾] [模板▾] │ │ 测试 📊全局 📝会话 🔧工具 │ │ +│ 输入框... │ └───────────────────────────┘ │ +│ (空间增加) │ 变量输入... │ +└────────────────────────┴───────────────────────────────┘ +``` + +**改进效果:** +- ✅ 层级清晰:功能模式和子模式在同一导航栏 +- ✅ 作用域明确:快捷操作栏在测试区,贴近使用场景 +- ✅ 空间优化:优化区垂直空间增加 +- ✅ 操作便捷:测试时设置变量,操作路径最短 + +--- + +## 一、整体架构设计 + +### 1.1 组件层次结构 + +``` +App.vue (主应用) +├── ContextUserWorkspace.vue (用户模式工作区) +│ ├── ContextModeActions (快捷操作按钮) +│ ├── InputPanelUI (提示词输入) +│ ├── PromptPanelUI (优化结果) +│ └── TestAreaPanel (测试区域) +│ +└── ContextSystemWorkspace.vue (系统模式工作区) + ├── ContextModeActions (快捷操作按钮) + ├── InputPanelUI (提示词输入) + ├── ConversationManager (会话管理器) ← 系统模式专属 + ├── PromptPanelUI (优化结果) + └── TestAreaPanel (测试区域) + +共享组件: +├── ContextEditor.vue (上下文编辑器 - 模态框) +├── PromptPreviewPanel.vue (预览面板 - 模态框) +└── TestAreaPanel.vue (测试区域 - 复用) +``` + +**组件文件位置:** +``` +packages/ui/src/components/ +├── context-mode/ +│ ├── ContextUserWorkspace.vue +│ ├── ContextSystemWorkspace.vue +│ ├── ContextModeActions.vue +│ ├── ContextEditor.vue +│ └── ConversationManager.vue +├── PromptPreviewPanel.vue +├── TestAreaPanel.vue +├── InputPanel.vue +└── PromptPanel.vue + +packages/ui/src/composables/ +└── usePromptPreview.ts +``` + +### 1.2 设计模式 + +✅ **采用了优秀的设计模式:** + +1. **组合优于继承** + - User/System Workspace 是独立组件而非继承 + - 避免了复杂的 if-else 条件判断 + +2. **Props 单向数据流** + - 所有数据通过 props 传入 + - 通过 emit 触发父组件更新 + - 遵循 Vue 3 最佳实践 + +3. **Composable 逻辑复用** + - `usePromptPreview` 提供可复用的预览逻辑 + - 分离 UI 和业务逻辑 + +4. **Slot 插槽扩展** + - 模型选择、结果显示等使用插槽实现灵活性 + - 支持不同场景的自定义渲染 + +--- + +## 二、两种模式的 UI 差异 + +### 2.1 用户模式 (User Mode) + +**文件**: `packages/ui/src/components/context-mode/ContextUserWorkspace.vue` + +**布局结构:** +``` +┌──────────────────────────────────────────────────────┐ +│ 📊 全局变量 📝 会话变量 🔧 工具管理 │ ← 快捷操作 +├──────────────────────────────────────────────────────┤ +│ 左侧优化区 │ 右侧测试区 │ +│ ┌─────────────────────┐ │ ┌──────────────────────┐│ +│ │ 提示词输入面板 │ │ │ 变量值输入表单 ││ +│ │ "写一首{{style}}的歌"│ │ │ style: [欢快____] ││ +│ └─────────────────────┘ │ └──────────────────────┘│ +│ ┌─────────────────────┐ │ ┌──────────────────────┐│ +│ │ 优化结果面板 │ │ │ 预览内容 ││ +│ │ "请创作一首风格为 │ │ │ "请创作一首风格为 ││ +│ │ {{style}}的歌..." │ │ │ 欢快的歌..." ││ +│ └─────────────────────┘ │ └──────────────────────┘│ +│ │ ┌──────────────────────┐│ +│ │ │ 测试结果 ││ +│ │ │ (LLM 响应) ││ +│ │ └──────────────────────┘│ +└──────────────────────────────────────────────────────┘ +``` + +**核心特点:** +- ❌ **隐藏** 会话消息列表管理 +- ✅ **显示** 工具管理按钮 +- ✅ 单条用户消息优化 +- ✅ 两阶段变量处理(优化保留 → 测试替换) +- ✅ 无需输入测试问题(提示词即测试内容) + +**代码特征:** +```vue + + +``` + +### 2.2 系统模式 (System Mode) + +**文件**: `packages/ui/src/components/context-mode/ContextSystemWorkspace.vue` + +**布局结构:** +``` +┌──────────────────────────────────────────────────────┐ +│ 📊 全局变量 📝 会话变量 │ ← 快捷操作 +├──────────────────────────────────────────────────────┤ +│ 左侧优化区 │ 右侧测试区 │ +│ ┌─────────────────────┐ │ ┌──────────────────────┐│ +│ │ 提示词输入面板 │ │ │ 变量值输入表单 ││ +│ │ "优化以下对话..." │ │ │ style: [欢快____] ││ +│ └─────────────────────┘ │ └──────────────────────┘│ +│ ┌─────────────────────┐ │ ┌──────────────────────┐│ +│ │ 会话管理器 [折叠] │ │ │ 测试输入 (用户问题) ││ +│ │ • system: 你是... │ │ │ "请生成一首欢快的歌" ││ +│ │ • user: {{style}} │ │ └──────────────────────┘│ +│ │ • assistant: ... │ │ ┌──────────────────────┐│ +│ │ [打开上下文编辑器] │ │ │ 预览内容 ││ +│ └─────────────────────┘ │ │ system: 你是歌曲创作 ││ +│ ┌─────────────────────┐ │ │ user: 欢快 ││ +│ │ 优化结果面板 │ │ └──────────────────────┘│ +│ │ (优化后的对话上下文) │ │ ┌──────────────────────┐│ +│ └─────────────────────┘ │ │ 测试结果 ││ +│ │ │ (LLM 响应) ││ +│ │ └──────────────────────┘│ +└──────────────────────────────────────────────────────┘ +``` + +**核心特点:** +- ✅ **显示** 会话消息管理器(可折叠) +- ❌ **隐藏** 工具管理按钮(系统模式不直接管理工具) +- ✅ 多消息上下文编辑 +- ✅ 需要额外的测试输入 (`userQuestion`) +- ✅ 支持 system/user/assistant/tool 多种角色 + +**代码特征:** +```vue + + +``` + +--- + +## 三、关键组件深度分析 + +### 3.1 `ContextModeActions.vue` - 快捷操作栏 + +**文件**: `packages/ui/src/components/context-mode/ContextModeActions.vue` + +**设计亮点:** +```vue + + + +``` + +**优点:** +- ✅ 简洁的条件渲染 (`v-if="contextMode === 'user'"`) +- ✅ 语义化的 emoji 图标 +- ✅ 国际化支持 (`$t()`) +- ✅ 类型安全的 emit 定义 + +**⚠️ 当前问题:** + +**问题**: 设计文档中提到"工具管理 - 两种模式都显示",但实际代码是 `v-if="contextMode === 'user'"` + +**影响**: 系统模式无法管理工具(如果需要的话) + +**建议**: +1. 统一设计文档和实现,明确系统模式是否需要工具管理 +2. 如果系统模式也需要,移除 `v-if` 条件 +3. 如果确实只有用户模式需要,更新设计文档 + +--- + +### 3.2 `ConversationManager.vue` - 会话管理器 + +**文件**: `packages/ui/src/components/context-mode/ConversationManager.vue` + +**设计亮点:** + +#### 1️⃣ **性能优化** +```typescript +// 使用防抖减少频繁更新 +const handleMessageUpdate = debounce( + (index: number, message: ConversationMessage) => { + const newMessages = [...props.messages]; + newMessages[index] = message; + emit('update:messages', newMessages); + emit('messageChange', index, message, 'update'); + recordUpdate(); + }, + 150 // 150ms 平衡响应性和性能 +); + +// 批处理状态更新 +const batchStateUpdate = batchExecute((updates: Array<() => void>) => { + updates.forEach((update) => update()); + recordUpdate(); +}, 16); // 16ms 匹配 60fps +``` + +#### 2️⃣ **模式化行为** +```typescript +const canEditMessages = computed(() => { + // readonly 优先级最高 + if (props.readonly) return false; + + // 用户模式不允许编辑消息 + if (props.contextMode === 'user') return false; + + // 系统模式允许编辑 + return true; +}); +``` + +#### 3️⃣ **紧凑布局设计** +```vue +
+ + + + {{ $t(`conversation.roles.${message.role}`) }} + + + + +
+ +
+ + + + + + + +
+ + +``` + +**优点:** +- ✅ 单行布局节省空间 +- ✅ Hover 显示操作按钮减少视觉噪音 +- ✅ 下拉菜单添加消息支持多种角色 (system/user/assistant/tool) +- ✅ 性能优化到位(防抖 + 批处理) + +**⚠️ 潜在问题:** + +**问题**: 单行输入限制 (`autosize: { minRows: 1, maxRows: 1 }`) 可能导致长文本难以编辑 + +**场景示例:** +``` +当消息内容较长时: +system: "你是一个专业的歌曲创作助手,擅长创作各种风格的歌曲,包括流行、摇滚、民谣、说唱等..." +``` + +单行显示会导致: +- ❌ 内容被截断,需要横向滚动 +- ❌ 难以看到完整上下文 +- ❌ 编辑体验差 + +**改进建议:** + +#### 方案 1: 展开/折叠功能 +```vue + + + +``` + +#### 方案 2: 直接跳转到完整编辑器 +```vue + + + {{ $t('conversation.management.openEditor') }} + +``` + +--- + +### 3.3 `PromptPreviewPanel.vue` - 实时预览面板 + +**文件**: `packages/ui/src/components/PromptPreviewPanel.vue` + +**设计亮点:** + +#### 1️⃣ **变量统计可视化** +```vue + + + + {{ $t('contextMode.preview.totalVars') }}: {{ variableStats.total }} + + + {{ $t('contextMode.preview.providedVars') }}: {{ variableStats.provided }} + + + {{ $t('contextMode.preview.missingVars') }}: {{ variableStats.missing }} + + + +``` + +#### 2️⃣ **缺失变量高亮** +```vue + + + + + + + + +``` + +#### 3️⃣ **模式说明动态提示** +```vue + + + + + + + +``` + +**优点:** +- ✅ 信息层次清晰(统计 → 警告 → 内容 → 说明) +- ✅ 颜色语义化(info/success/warning) +- ✅ 教育用户理解两阶段处理 +- ✅ 响应式布局 (`:wrap="true"`) + +**💡 改进建议: 缺失变量快速操作** + +**当前行为:** +```vue + + + {{{{ varName }}}} + +``` + +**改进后:** +```vue + + + + + + +``` + +**用户体验提升:** +``` +之前: 看到缺失变量 → 关闭预览 → 手动打开变量管理器 → 找到变量 → 编辑 +现在: 看到缺失变量 → 点击 → 直接创建/编辑 ✅ +``` + +--- + +### 3.4 `usePromptPreview.ts` - 预览逻辑 + +**文件**: `packages/ui/src/composables/usePromptPreview.ts` + +**设计亮点:** + +#### 1️⃣ **简化的变量替换** +```typescript +/** + * 渲染后的预览内容 + * + * 简化版本:统一使用简单替换逻辑 + * 注意:这里使用简单的正则替换而不是 Mustache,因为: + * 1. UI 预览不需要 Mustache 的条件渲染等高级特性 + * 2. 简单替换性能更好,适合实时预览 + * 3. 与后端 Mustache 行为一致(都会保留值中的占位符) + */ +const previewContent = computed(() => { + if (!content.value) return ""; + + try { + const vars = variables.value || {}; + + // 统一的变量替换逻辑 + const result = content.value.replace( + /\{\{([^{}]+)\}\}/g, + (match, varName) => { + const trimmedName = varName.trim(); + + // 跳过 Mustache 特殊标签 (#, /, ^, !, >, &) + if ( + trimmedName.startsWith("#") || + trimmedName.startsWith("/") || + trimmedName.startsWith("^") || + trimmedName.startsWith("!") || + trimmedName.startsWith(">") || + trimmedName.startsWith("&") + ) { + return match; + } + + // 如果变量存在且非空,替换;否则保留占位符 + if (vars[trimmedName] !== undefined && vars[trimmedName] !== "") { + return vars[trimmedName]; + } + return match; + } + ); + + return result; + } catch (error) { + console.error("[usePromptPreview] Preview rendering failed:", error); + return content.value; + } +}); +``` + +#### 2️⃣ **变量统计** +```typescript +const variableStats = computed(() => ({ + total: parsedVariables.value.allVars.size, + builtin: parsedVariables.value.builtinVars.size, + custom: parsedVariables.value.customVars.size, + missing: missingVariables.value.length, + provided: parsedVariables.value.allVars.size - missingVariables.value.length, +})); +``` + +**优点:** +- ✅ 性能优于 Mustache(预览场景足够) +- ✅ 与后端行为一致(都保留值中的占位符) +- ✅ 跳过 Mustache 特殊标签 +- ✅ 错误处理完善 + +**⚠️ 潜在问题:** + +**问题**: 与后端 Mustache 可能存在不一致的风险 + +**场景**: 如果模板使用了 Mustache 的高级特性,预览可能不准确 + +```mustache +{{! 注释 }} +{{#if showTitle}} + 标题:{{title}} +{{/if}} + +{{#each items}} + - {{name}}: {{value}} +{{/each}} +``` + +当前简单正则替换无法处理: +- ❌ 条件渲染 (`{{#if}}...{{/if}}`) +- ❌ 循环渲染 (`{{#each}}...{{/each}}`) +- ❌ 部分渲染 (`{{>partial}}`) + +**改进建议:** + +#### 方案 1: 文档说明限制 +```typescript +/** + * 提示词预览 Composable + * + * 用于实时计算提示词渲染结果并检测缺失变量 + * + * ⚠️ 限制说明: + * - 使用简单正则替换,不支持 Mustache 高级特性 + * - 不支持条件渲染 ({{#if}})、循环 ({{#each}})、部分模板 ({{>}}) + * - 仅用于基本变量预览,最终渲染以后端为准 + * - 如需完整 Mustache 渲染,请使用后端 API + */ +``` + +#### 方案 2: 集成 Mustache.js +```typescript +import Mustache from 'mustache'; + +const previewContent = computed(() => { + try { + // 使用 Mustache 完整渲染 + return Mustache.render(content.value, variables.value); + } catch (error) { + // 降级到简单替换 + return content.value.replace(/\{\{([^{}]+)\}\}/g, ...); + } +}); +``` + +**权衡:** +- **方案 1**: 简单,但功能有限,需要用户理解限制 +- **方案 2**: 功能完整,但增加依赖和复杂度 + +**建议**: 当前方案 1 足够,在文档中明确说明即可 + +--- + +## 四、UI 交互流程分析 + +### 4.1 用户模式完整流程 + +```mermaid +graph TD + A[用户输入提示词
'写一首{{style}}的歌'] --> B{点击优化} + B --> C[AI 优化
保留 {{style}} 占位符] + C --> D[优化结果显示
'请创作一首风格为{{style}}的歌...'] + D --> E[用户设置变量
style = '欢快'] + E --> F[实时预览更新
'请创作一首风格为欢快的歌...'] + F --> G{点击测试} + G --> H[替换所有变量] + H --> I[发送给 LLM] + I --> J[显示测试结果] + + style C fill:#e1f5e1 + style F fill:#fff3cd + style H fill:#f8d7da +``` + +**关键步骤说明:** + +1. **优化阶段** (绿色) - 占位符保留 + - 用户输入: `"写一首{{style}}的歌"` + - 发送给 AI: 包含 `{{style}}` 字面文本 + - AI 优化: 保留所有占位符 + - 优化结果: `"请创作一首风格为{{style}}的歌..."` + +2. **预览阶段** (黄色) - 实时渲染 + - 用户设置: `style = "欢快"` + - 预览显示: `"请创作一首风格为欢快的歌..."` + - 变量统计: 总数 1, 已提供 1, 缺失 0 + +3. **测试阶段** (红色) - 完全替换 + - 合并三层变量 (全局 ← 会话 ← 内置) + - 替换所有占位符 + - 发送给 LLM: 不包含任何 `{{}}` + +### 4.2 系统模式完整流程 + +```mermaid +graph TD + A[编辑多条消息
system/user/assistant] --> B[设置会话变量
style = '欢快'] + B --> C{点击优化} + C --> D[替换内置变量
保留自定义变量] + D --> E[优化结果显示] + E --> F[输入测试问题
'请生成一首歌'] + F --> G[实时预览更新
所有变量已替换] + G --> H{点击测试} + H --> I[替换所有变量
包括测试问题] + I --> J[发送给 LLM] + J --> K[显示测试结果] + + style D fill:#e1f5e1 + style G fill:#fff3cd + style I fill:#f8d7da +``` + +**关键步骤说明:** + +1. **会话编辑** - 多消息管理 + - system: `"你是歌曲创作助手"` + - user: `"创作{{style}}的歌"` + - assistant: `"好的,我会创作..."` + +2. **优化阶段** (绿色) - 分层替换 + - 替换内置变量: `{{originalPrompt}}`, `{{conversationContext}}` + - 保留自定义变量: `{{style}}` + +3. **测试阶段** (黄色 → 红色) - 完全渲染 + - 需要额外输入用户问题 + - 预览显示所有变量替换后的效果 + - 最终发送完全渲染的消息数组 + +--- + +## 五、UI 设计优势 + +### ✅ 做得好的地方 + +#### 1. **模式化组件设计** +- 清晰的 User/System Workspace 分离 +- 组件根据 `contextMode` 智能调整行为 +- 避免了复杂的 if-else 判断 + +**代码示例:** +```typescript +// ConversationManager.vue +const canEditMessages = computed(() => { + if (props.contextMode === 'user') return false; // 用户模式禁止编辑 + return true; // 系统模式允许 +}); +``` + +#### 2. **Naive UI 一致性** +- 全面使用 Naive UI 组件 (NCard, NButton, NTag, NInput...) +- 统一的 size/type/bordered 配置 +- 主题自适应 (dark/light mode) + +**组件使用统计:** +``` +NCard: 主容器 +NButton: 所有按钮 +NTag: 标签、统计、角色标识 +NInput: 文本输入 +NDropdown: 角色选择、消息添加 +NScrollbar: 滚动区域 +NEmpty: 空状态提示 +``` + +#### 3. **响应式适配** +```typescript +// 响应式配置 +const buttonSize = computed(() => { + const sizeMap = { small: 'tiny', medium: 'small', large: 'medium' }; + return sizeMap[props.size] || 'small'; +}); + +// 移动端适配 + +``` + +#### 4. **性能优化** +- 防抖处理高频更新 (150ms) +- 批处理状态更新 (16ms) +- `shallowRef` 优化大数据 +- 性能监控 (`usePerformanceMonitor`) + +**性能优化代码:** +```typescript +// 防抖 +const handleMessageUpdate = debounce((index, message) => { + emit('update:messages', newMessages); +}, 150); + +// 批处理 +const batchStateUpdate = batchExecute((updates) => { + updates.forEach(update => update()); +}, 16); +``` + +#### 5. **可访问性 (a11y)** +- 完整的 `role` 属性 (dialog, button, list...) +- `aria-label`, `aria-describedby` 标注 +- 键盘导航支持 (`@keydown.enter`, `@keydown.space`) +- `tabindex` 焦点管理 + +**可访问性代码:** +```vue + + + +``` + +#### 6. **国际化完备** +- 所有文案使用 `$t()` / `t()` +- 支持中英文切换 +- 动态插值 (`$t('key', { count: 5 })`) + +**国际化示例:** +```typescript +// zh-CN.ts +export default { + contextMode: { + user: { label: '用户模式' }, + system: { label: '系统模式' }, + actions: { + globalVariables: '全局变量', + contextVariables: '会话变量', + tools: '工具管理' + } + } +} + +// 使用 +{{ $t('contextMode.user.label') }} +``` + +--- + +## 六、UI 设计问题与改进建议 + +### ⚠️ 当前问题汇总 + +| 问题 | 位置 | 影响 | 优先级 | 改造状态 | +|------|------|------|--------|---------| +| **子模式选择器位置不当** | `InputPanel.vue` + `ContextUserWorkspace.vue` | 层级混乱,作用域不明确 | P0 🔴 | ✅ 已规划 | +| **快捷操作栏位置不当** | `ContextUserWorkspace.vue:11` | 作用域不明确,操作路径远 | P0 🔴 | ✅ 已规划 | +| **工具管理按钮显示逻辑不一致** | `ContextModeActions.vue:18` | 文档说"两种模式都显示",代码是 `v-if="user"` | P1 🔴 | 📋 待确认 | +| **会话管理器单行输入限制** | `ConversationManager.vue:215` | 长消息难以编辑 | P2 🟡 | 📋 待规划 | +| **缺失变量无快速操作** | `PromptPreviewPanel.vue:32` | 需要手动打开变量管理器,流程繁琐 | P2 🟡 | 📋 待规划 | +| **预览与后端可能不一致** | `usePromptPreview.ts:85` | 不支持 Mustache 高级特性 | P3 🟢 | 📋 待规划 | +| **变量来源未可视化** | `TestAreaPanel.vue` | 无法区分全局/会话/内置变量 | P2 🟡 | 📋 待规划 | + +**图例:** +- ✅ 已规划:已编写详细改造方案,等待实施 +- 📋 待规划:问题已识别,待制定详细方案 +- 🔴 P0/P1:高优先级,需要立即处理 +- 🟡 P2:中优先级,近期处理 +- 🟢 P3:低优先级,长期优化 + +### 💡 改进建议详解 + +#### 改进 1: 统一工具管理按钮逻辑 + +**当前状态:** +```vue + + + 🔧 工具管理 + +``` + +**问题分析:** +- 设计文档: "工具管理 - 两种模式都显示" +- 实际代码: 仅用户模式显示 +- 不一致来源: 设计变更未同步到文档 + +**解决方案:** + +**方案 A**: 移除条件,两种模式都显示 +```vue + + 🔧 工具管理 + +``` + +**方案 B**: 保持当前实现,更新设计文档 +```markdown +- 工具管理 - 仅用户模式显示 (系统模式通过上下文编辑器管理) +``` + +**建议**: 采用方案 B,因为系统模式工具管理应该在 ContextEditor 的 "工具调用" 标签页处理 + +--- + +#### 改进 2: 增强会话管理器编辑体验 + +**当前限制:** +```vue + +``` + +**改进方案: 展开/折叠编辑模式** + +**实现代码:** +```vue + + + + + +``` + +**用户体验:** +``` +当前: 单行显示,长文本被截断 ❌ + "你是一个专业的歌曲创作助手,擅长创作..." [横向滚动] + +改进: 双击展开,3-20行自适应 ✅ + "你是一个专业的歌曲创作助手,擅长创作各种风格的歌曲, + 包括流行、摇滚、民谣、说唱等。你能够根据用户的需求, + 创作出优秀的歌词和旋律建议。" + [失焦自动折叠] +``` + +--- + +#### 改进 3: 预览面板添加快速变量创建 + +**当前体验:** +``` +用户看到缺失变量 → 关闭预览 → 手动打开变量管理器 → 找到变量 → 编辑 +``` + +**改进后体验:** +``` +用户看到缺失变量 → 点击标签 → 直接创建/编辑 ✅ +``` + +**实现代码:** +```vue + + + + + + +``` + +**父组件处理:** +```vue + + + + +``` + +--- + +#### 改进 4: 变量来源可视化 + +**问题**: 当前无法直观区分变量来源(全局/会话/内置) + +**改进方案: 变量输入表单增强** + +**实现代码:** +```vue + + + + + + +``` + +**视觉效果:** +``` +🔧 {{originalPrompt}} [内置 - 蓝色标签] (不可编辑) +📄 {{style}} [会话 - 绿色标签] [欢快_____] [×] +🌍 {{tone}} [全局 - 橙色标签] [正式_____] [×] +⚠️ {{genre}} [缺失 - 灰色标签] [_________] [×] + +鼠标悬停显示: +┌─────────────────────┐ +│ 来源: 会话变量 │ +│ 优先级: 中 │ +│ 当前值: 欢快 │ +└─────────────────────┘ +``` + +--- + +#### 改进 5: 变量历史记录和智能建议 + +**功能描述**: 记录用户输入的变量值历史,提供智能建议 + +**实现代码:** +```vue + + + + +``` + +**用户体验:** +``` +输入框获得焦点时: +┌─────────────────────────┐ +│ {{style}} │ +│ ┌─────────────────────┐ │ +│ │ 欢快 (最近使用) ↓│ │ +│ ├─────────────────────┤ │ +│ │ 流行 │ │ +│ │ 摇滚 │ │ +│ │ 民谣 │ │ +│ └─────────────────────┘ │ +└─────────────────────────┘ + +智能占位符: +- 有历史: "上次输入:欢快" +- 无历史: "如:流行、摇滚、民谣..." +``` + +--- + +## 七、与设计文档对比 + +### ✅ 已实现的设计 + +| 设计文档要求 | 实现状态 | 代码位置 | 备注 | +|-------------|---------|---------|------| +| 用户模式隐藏会话管理 | ✅ | `ContextUserWorkspace.vue` | 无 ConversationManager 组件 | +| 系统模式显示会话管理 | ✅ | `ContextSystemWorkspace.vue` | 包含 ConversationManager | +| 三层变量快捷按钮 | ✅ | `ContextModeActions.vue` | 全局/会话变量按钮 | +| 实时预览面板 | ✅ | `PromptPreviewPanel.vue` | 支持变量替换预览 | +| 变量统计展示 | ✅ | `usePromptPreview.ts:123` | `variableStats` 计算属性 | +| 缺失变量警告 | ✅ | `PromptPreviewPanel.vue:32` | 高亮显示缺失变量 | +| 模式说明提示 | ✅ | `PromptPreviewPanel.vue:48` | 动态模式说明 | +| 防抖优化 | ✅ | `ConversationManager.vue:187` | 150ms 防抖 | +| 批处理更新 | ✅ | `ConversationManager.vue:195` | 16ms 批处理 | +| 国际化支持 | ✅ | 所有组件 | 完整 i18n 覆盖 | +| 可访问性 | ✅ | 所有组件 | 完整 aria 属性 | + +### ⚠️ 与文档不一致 + +| 设计文档 | 实际实现 | 差异说明 | 建议 | +|---------|---------|---------|------| +| "工具管理 - 两种模式都显示" | 仅用户模式显示 (`v-if="user"`) | 文档过期或设计变更 | 统一为"仅用户模式" | +| "变量来源标注 (全局/会话/内置)" | UI 未显示来源标识 | 功能未实现 | 添加 `VariableSourceBadge` | +| "快速添加变量按钮" | 仅提示无快速操作 | 交互未完善 | 实现点击创建变量 | + +### 📝 建议更新的文档 + +**设计文档需要更新的部分:** + +1. **`design.md` - 组件设计章节** + ```diff + - 工具管理 - 两种模式都显示 + + 工具管理 - 仅用户模式显示 (系统模式通过上下文编辑器管理) + ``` + +2. **`design.md` - 变量管理 UI** + ```diff + + #### 变量来源可视化 + + + + 变量输入表单应显示变量来源标识: + + - 🔧 内置变量 (蓝色标签,不可编辑) + + - 📄 会话变量 (绿色标签) + + - 🌍 全局变量 (橙色标签) + + - ⚠️ 未定义变量 (灰色标签) + ``` + +3. **`tasks.md` - 新增待完成任务** + ```markdown + - [ ] 19. UI 细节优化 + - **Files**: + - `packages/ui/src/components/context-mode/ConversationManager.vue` + - `packages/ui/src/components/PromptPreviewPanel.vue` + - `packages/ui/src/components/TestAreaPanel.vue` + - **Description**: + - 会话管理器展开/折叠编辑功能 + - 预览面板快速创建变量按钮 + - 测试区域变量来源可视化 + - 变量历史记录和智能建议 + - **Requirements**: 需求4 (易用性提升) + - **Success Criteria**: + - ✅ 长消息可展开编辑 + - ✅ 缺失变量点击创建 + - ✅ 变量来源清晰标识 + - ✅ 历史记录智能建议 + ``` + +--- + +## 八、总体评价 + +### 🎯 设计质量评分 + +| 维度 | 评分 | 说明 | 待改进点 | +|------|------|------|---------| +| **架构设计** | ⭐⭐⭐⭐⭐ | 组件分离清晰,模式化设计优秀 | - | +| **代码质量** | ⭐⭐⭐⭐☆ | TypeScript 类型完善,防抖优化到位 | 部分类型可以更严格 | +| **用户体验** | ⭐⭐⭐⭐☆ | 实时预览、统计信息清晰 | 缺少快捷操作、变量来源不明确 | +| **可访问性** | ⭐⭐⭐⭐⭐ | 完整的 aria 属性,键盘导航支持 | - | +| **国际化** | ⭐⭐⭐⭐⭐ | 全面使用 i18n | - | +| **性能优化** | ⭐⭐⭐⭐☆ | 防抖/批处理到位 | 可考虑虚拟滚动 | +| **文档一致性** | ⭐⭐⭐☆☆ | 部分实现与文档不一致 | 需同步更新文档 | + +**总体评分: 4.6/5.0** ⭐⭐⭐⭐⭐ + +### 💪 核心优势 + +1. **模式化设计清晰** - User/System 组件完全分离,避免条件判断地狱 +2. **性能优化到位** - 防抖、批处理、浅拷贝等优化措施完善 +3. **类型安全完整** - TypeScript 类型定义严格,emit 类型完整 +4. **可访问性优秀** - 完整的 aria 属性和键盘导航支持 +5. **Naive UI 一致性** - 统一使用 Naive UI 组件,主题适配良好 + +### 🔧 改进空间 + +1. **文档同步** - 设计文档与实现存在部分不一致,需要统一 +2. **快捷交互** - 缺失变量快速创建、会话消息展开编辑等细节交互待完善 +3. **变量可视化** - 变量来源(全局/会话/内置)未在 UI 清晰标识 +4. **智能建议** - 变量历史记录、智能占位符等 AI 辅助功能可增强 + +--- + +## 九、下一步行动计划 + +### 🚀 短期优化 (1-2 周) + +**优先级 P1 - 必须修复:** +1. ✅ 统一工具管理按钮显示逻辑(代码或文档) +2. ✅ 更新 `design.md` 和 `tasks.md` 使其与实现一致 + +**优先级 P2 - 重要改进:** +1. ✅ 实现缺失变量快速创建功能 +2. ✅ 优化会话管理器编辑体验(展开/折叠) +3. ✅ 添加变量来源标注 UI + +### 📈 中期优化 (1 个月) + +1. ✅ 实现变量历史记录和智能建议 +2. ✅ 添加预览与实际渲染一致性检查 +3. ✅ 优化移动端响应式布局 +4. ✅ 完善无障碍测试(自动化 a11y 测试) + +### 🎯 长期优化 (季度级) + +1. ✅ 实现协同编辑(多人同时编辑上下文) +2. ✅ 添加可视化变量依赖图谱 +3. ✅ 提供模板市场(分享优秀上下文配置) +4. ✅ AI 辅助变量推荐(根据提示词内容智能推荐变量名和值) + +--- + +## 十、附录 + +### A. 组件文件清单 + +``` +packages/ui/src/components/ +├── context-mode/ +│ ├── ContextUserWorkspace.vue (240 行) +│ ├── ContextSystemWorkspace.vue (280 行) +│ ├── ContextModeActions.vue (50 行) +│ ├── ContextEditor.vue (844+ 行) +│ └── ConversationManager.vue (520 行) +├── PromptPreviewPanel.vue (120 行) +├── TestAreaPanel.vue (100+ 行) +├── InputPanel.vue (150+ 行) +└── PromptPanel.vue (200+ 行) + +packages/ui/src/composables/ +└── usePromptPreview.ts (180 行) +``` + +### B. 关键常量定义 + +```typescript +// 内置预定义变量 +const PREDEFINED_VARIABLES = [ + 'originalPrompt', + 'lastOptimizedPrompt', + 'iterateInput', + 'currentPrompt', + 'userQuestion', + 'conversationContext', + 'toolsContext' +]; + +// 变量来源类型 +type VariableSource = 'predefined' | 'context' | 'global' | 'missing'; + +// 上下文模式 +type ContextMode = 'user' | 'system'; + +// 渲染阶段 +type RenderPhase = 'optimize' | 'test'; +``` + +### C. 国际化 Keys 清单 + +```typescript +// 需要补充的 i18n keys +const I18N_KEYS = { + contextMode: { + actions: { + globalVariables: '全局变量', + contextVariables: '会话变量', + tools: '工具管理' + }, + preview: { + title: '预览', + stats: '变量统计', + totalVars: '变量总数', + providedVars: '已提供', + missingVars: '缺失', + clickToCreateVariableHint: '点击变量标签快速创建' + } + }, + variables: { + source: { + predefined: '内置变量', + context: '会话变量', + global: '全局变量', + missing: '未定义' + }, + priority: { + highest: '最高', + medium: '中', + lowest: '最低' + }, + placeholder: { + style: '如:流行、摇滚、民谣...', + tone: '如:正式、轻松、幽默...', + language: '如:中文、英文、日语...', + default: '请输入变量值' + } + } +}; +``` + +### D. 性能基准参考 + +```typescript +// 性能目标 +const PERFORMANCE_TARGETS = { + variableMerge: 5, // 变量合并 < 5ms + previewRender: 50, // 预览渲染 < 50ms + messageUpdate: 150, // 消息更新防抖 150ms + batchUpdate: 16, // 批处理 16ms (60fps) + maxVariables: 100, // 最大变量数 + maxMessages: 50 // 最大消息数 +}; +``` + +--- + +## 结论 + +这是一个**设计非常优秀的 UI 系统**,核心架构清晰,性能优化到位,用户体验良好。主要改进空间在于: + +1. **文档一致性** - 同步设计文档和实现代码 +2. **细节交互** - 快捷操作、变量来源可视化等 +3. **智能辅助** - 历史记录、智能建议等 AI 增强功能 + +通过实施本报告提出的改进建议,可以将 UI 质量从 4.6/5.0 提升至 4.9/5.0 ⭐⭐⭐⭐⭐ + +--- + +**文档维护:** +- 最后更新: 2025-10-21 +- 下次审查: 实现改进建议后 +- 负责人: UI 团队 diff --git a/docs/workspace/ui-refactor-plan.md b/docs/workspace/ui-refactor-plan.md new file mode 100644 index 00000000..8a6b543a --- /dev/null +++ b/docs/workspace/ui-refactor-plan.md @@ -0,0 +1,804 @@ +# UI 改造任务文档 + +> **文档版本**: v2.1 +> **创建日期**: 2025-10-21 +> **最后更新**: 2025-10-23 +> **改造范围**: 上下文模式导航栏 + 测试区操作栏 + 变量系统重构 +> **优先级**: P0 🔴 高优先级 +> **状态**: ✅ 所有阶段已完成并通过测试 + +--- + +## 📋 改造概述 + +### ✅ 已完成的改造 (v1.0 - v2.1) + +1. **子模式选择器移到导航栏** - ✅ 已完成 (v1.0) +2. **快捷操作栏移到测试区** - ✅ 已完成 (v1.1) +3. **变量系统重构** - ✅ 已完成 (v2.0) + - ✅ 移除冗余的"会话变量" + - ✅ 引入测试区临时变量 + - ✅ 三层变量合并逻辑 (全局 < 测试 < 预定义) + - ✅ 通过所有功能测试和回归测试 + - 详见: [变量系统重构设计文档](./variable-system-redesign.md) + +--- + +## 🎯 改造目标 + +### ✅ 目标 1: 子模式选择器移到导航栏 (已完成) + +**问题陈述:** +- 当前子模式选择器(系统提示词/用户提示词)位于工作区内的输入面板 +- 给用户造成"局部设置"的错觉,实际上它切换整个工作区 +- 与功能模式选择器(基础/上下文/图像)层级不一致 + +**改造目标:** +- 将子模式选择器移到导航栏,紧邻功能模式选择器右侧 +- 仅在「上下文模式」时显示 `[系统提示词|用户提示词]` +- 基础模式和图像模式也显示子模式选择器 + +**实施状态**: ✅ **已完成** (2025-10-22) +- 提交: 之前已完成 +- 文件: `packages/web/src/App.vue` + +**期望效果:** +``` +改造前: +┌────────────────────────────────────────────────────────┐ +│ 📝 Prompt Optimizer | [基础|上下文|图像] | 📝📜⚙️... │ +├────────────────────────────────────────────────────────┤ +│ 工作区 │ +│ ┌────────────────────────────────────────────────────┐│ +│ │ [系统提示词|用户提示词] [模型▾] [模板▾] ││ ← 在这里 +│ │ 输入框... ││ +│ └────────────────────────────────────────────────────┘│ +└────────────────────────────────────────────────────────┘ + +改造后: +┌────────────────────────────────────────────────────────┐ +│ 📝 Prompt Optimizer │ +│ [基础|上下文|图像] [系统提示词|用户提示词] 📝📜⚙️... │ ← 移到这里 +├────────────────────────────────────────────────────────┤ +│ 工作区 │ +│ ┌────────────────────────────────────────────────────┐│ +│ │ 用户提示词输入 [模型▾] [模板▾] ││ ← 简洁清晰 +│ │ 输入框... ││ +│ └────────────────────────────────────────────────────┘│ +└────────────────────────────────────────────────────────┘ +``` + +--- + +### ✅ 目标 2: 快捷操作栏移到测试区 (已完成) + +**问题陈述:** +- 当前快捷操作栏(📊全局变量 📝会话变量 🔧工具管理)位于左侧优化区上方 +- 作用域不明确,视觉上像是"只影响左侧" +- 但实际上这些操作主要在测试时使用,与右侧测试区关联更强 +- 占用优化区垂直空间,而优化区需要显示较长的提示词内容 + +**改造目标:** +- 将快捷操作栏移到右侧测试区顶部 +- 作为测试区的操作工具栏,明确其作用域 +- 释放优化区的垂直空间 + +**实施状态**: ✅ **已完成** (2025-10-22) +- 提交: `ce90d47` - refactor(ui): 优化上下文模式快捷操作栏位置 +- 文件: `ContextUserWorkspace.vue`, `ContextSystemWorkspace.vue` + +**期望效果:** +``` +改造前: +┌────────────────────────┬───────────────────────────────┐ +│ 左侧优化区 │ 右侧测试区 │ +│ ┌────────────────────┐│ │ +│ │📊📝🔧 快捷操作 ││ 测试内容... │ +│ └────────────────────┘│ │ +│ ┌────────────────────┐│ │ +│ │ 提示词输入 ││ │ +│ └────────────────────┘│ │ +└────────────────────────┴───────────────────────────────┘ + +改造后: +┌────────────────────────┬───────────────────────────────┐ +│ 左侧优化区 │ 右侧测试区 │ +│ │ ┌───────────────────────────┐│ +│ ┌────────────────────┐│ │ 测试 📊全局 📝会话 🔧工具 ││ ← 移到这里 +│ │ 提示词输入 ││ └───────────────────────────┘│ +│ │ (空间增加) ││ ┌───────────────────────────┐│ +│ └────────────────────┘│ │ 变量输入... ││ +│ ┌────────────────────┐│ │ 测试结果... ││ +│ │ 优化结果 ││ └───────────────────────────┘│ +└────────────────────────┴───────────────────────────────┘ +``` + +--- + +### ✅ 目标 3: 变量系统重构 (已完成) + +**问题陈述:** +- 当前有两种持久化变量: "全局变量" 和 "会话变量" +- 实际上只有一个默认上下文,无法切换上下文 +- "会话变量"名不副实,本质上是另一个全局变量池 +- 两种变量造成用户困惑: "有什么区别?" "应该用哪个?" + +**改造目标:** +- **移除**: 会话变量相关UI和代码 ✅ +- **保留**: 全局变量 (持久化,跨会话共享) ✅ +- **新增**: 测试区临时变量 (内存存储,刷新丢失) ✅ +- **简化**: 变量系统概念,降低学习成本 ✅ + +**实际效果:** +``` +改造前: +┌─────────────────────────────────────────┐ +│ 测试区 │ +├─────────────────────────────────────────┤ +│ [测试] [📊全局变量] [📝会话变量] [🔧工具] │ +│ ↑ 困惑: 有什么区别? │ +├─────────────────────────────────────────┤ + +改造后: +┌─────────────────────────────────────────┐ +│ 测试区 │ +├─────────────────────────────────────────┤ +│ [测试] [📊全局变量] [🔧工具管理] │ +│ ↑ 清晰: 永久保存的配置 │ +├─────────────────────────────────────────┤ +│ 变量输入 (临时,刷新丢失): │ +│ {{style}} [欢快________] 📊 │ +│ ↑ 测试输入 ↑ 使用全局值 │ +│ {{topic}} [写歌________] │ +├─────────────────────────────────────────┤ +│ [▶ 测试] │ +└─────────────────────────────────────────┘ +``` + +**详细设计**: 见 [变量系统重构设计文档](./variable-system-redesign.md) + +**实施状态**: ✅ **已完成** (2025-10-23) +- 提交: `3f53812` - refactor(ui): 重构变量系统并移除会话变量功能 +- 文件: 多个核心文件,详见变量系统重构设计文档 +- 测试: 已通过所有功能测试和回归测试 + +--- + +## 📊 改造前后对比 + +### v1.0 已完成的改造 + +| 改造项 | 改造前 | 改造后 | 改进效果 | +|-------|--------|--------|---------| +| **子模式选择器位置** | 工作区输入面板内 | 导航栏功能模式右侧 | ✅ 层级清晰
✅ 作用域明确 | +| **快捷操作栏位置** | 左侧优化区上方 | 右侧测试区顶部 | ✅ 使用场景匹配
✅ 操作路径最短 | +| **优化区垂直空间** | 被快捷操作栏占用 | 完全释放 | ✅ 显示更多内容 | +| **用户认知负担** | 高(层级混乱) | 低(清晰分明) | ✅ 易于理解 | + +### v2.0 已完成的改造 + +| 改造项 | 改造前 | 改造后 | 改进效果 | 状态 | +|-------|--------|--------|---------|------| +| **变量系统** | 全局变量 + 会话变量 (都持久化) | 全局变量 (持久化) + 测试变量 (临时) | ✅ 概念清晰
✅ 符合直觉
✅ 降低学习成本 | ✅ 已验证 | +| **测试区操作栏** | 3个按钮 | 2个按钮 | ✅ UI简化
✅ 减少困惑 | ✅ 已验证 | +| **变量输入方式** | 需要打开管理器 | 测试区直接输入 | ✅ 操作便捷
✅ 贴近使用场景 | ✅ 已验证 | +| **持久化开销** | 高 (所有变量都持久化) | 低 (只持久化全局变量) | ✅ 性能优化 | ✅ 已验证 | + +--- + +## 🗂️ 改造范围 + +### 需要修改的文件 + +#### 核心组件(必改) +``` +packages/web/src/ +└── App.vue # 添加子模式选择器到导航栏 + +packages/ui/src/components/ +├── MainLayoutUI.vue # 优化导航栏布局(可选) +├── InputPanel.vue # 移除子模式选择器插槽 +├── context-mode/ +│ ├── ContextUserWorkspace.vue # 移除快捷操作栏 + 添加测试区操作栏 +│ ├── ContextSystemWorkspace.vue # 移除快捷操作栏 + 添加测试区操作栏 +│ └── ContextModeActions.vue # 废弃或重构为测试区操作栏组件 +└── TestAreaPanel.vue # 可选:添加 header-actions 插槽 +``` + +#### 文档(必更新) +``` +docs/workspace/ +├── ui-design-analysis.md # 更新设计分析 +└── ui-refactor-plan.md # 本文档 +``` + +--- + +## 📝 详细实施方案 + +### 改造 1: 子模式选择器移到导航栏 + +#### Step 1.1: 修改 App.vue 导航栏 + +**文件**: `packages/web/src/App.vue` + +**修改内容:** +```vue + + + +``` + +**代码行数**: ~20 行新增/修改 +**风险等级**: 🟢 低风险(纯 UI 调整) + +--- + +#### Step 1.2: 移除工作区子模式选择器 + +**文件 1**: `packages/ui/src/components/InputPanel.vue` + +**修改内容:** +```vue + +``` + +**文件 2**: `packages/ui/src/components/context-mode/ContextUserWorkspace.vue` + +**修改内容:** +```vue + +``` + +**文件 3**: `packages/ui/src/components/context-mode/ContextSystemWorkspace.vue`(同样修改) + +**代码行数**: ~10 行删除(每个文件) +**风险等级**: 🟡 中等风险(影响现有布局) + +--- + +### 改造 2: 快捷操作栏移到测试区 + +#### Step 2.1: 修改 ContextUserWorkspace.vue + +**文件**: `packages/ui/src/components/context-mode/ContextUserWorkspace.vue` + +**修改内容:** +```vue + + + +``` + +**代码行数**: ~60 行新增,~10 行删除 +**风险等级**: 🟡 中等风险(布局调整) + +--- + +#### Step 2.2: 修改 ContextSystemWorkspace.vue + +**文件**: `packages/ui/src/components/context-mode/ContextSystemWorkspace.vue` + +**修改内容:**(与 ContextUserWorkspace.vue 类似) +```vue + +``` + +**代码行数**: ~50 行新增,~10 行删除 +**风险等级**: 🟡 中等风险 + +--- + +#### Step 2.3: 废弃或重构 ContextModeActions.vue + +**选项 A**: 废弃组件(推荐) +- 删除 `packages/ui/src/components/context-mode/ContextModeActions.vue` +- 删除所有对该组件的引用 + +**选项 B**: 重构为通用组件 +- 重命名为 `TestAreaActions.vue` +- 作为测试区操作栏的独立组件 +- 支持更多配置选项 + +**建议**: 选择选项 A,代码直接内嵌到 Workspace 组件中,减少组件层级 + +**代码行数**: ~50 行删除 +**风险等级**: 🟢 低风险(废弃未使用组件) + +--- + +## 🧪 测试计划 + +### 功能测试 + +| 测试项 | 测试步骤 | 预期结果 | +|-------|---------|---------| +| **子模式选择器显示** | 1. 选择「基础模式」
2. 选择「上下文模式」
3. 选择「图像模式」 | 1. 不显示子模式选择器
2. 显示「系统提示词\|用户提示词」
3. 不显示子模式选择器 | +| **子模式切换** | 1. 点击「系统提示词」
2. 点击「用户提示词」 | 1. 切换到 ContextSystemWorkspace
2. 切换到 ContextUserWorkspace | +| **快捷操作栏位置** | 1. 打开用户模式
2. 打开系统模式 | 1. 操作栏在右侧测试区顶部
2. 操作栏在右侧测试区顶部 | +| **快捷按钮功能** | 1. 点击「全局变量」
2. 点击「会话变量」
3. 点击「工具管理」 | 1. 打开全局变量管理器
2. 打开上下文编辑器-变量标签
3. 打开上下文编辑器-工具标签 | +| **优化区空间** | 1. 对比改造前后优化区高度 | 改造后优化区垂直空间增加 | + +### 视觉测试 + +| 测试项 | 检查点 | +|-------|--------| +| **导航栏布局** | ✅ 功能模式和子模式在同一行
✅ 间距合适(12px)
✅ 与操作按钮对齐良好 | +| **测试区操作栏** | ✅ 区域标识清晰
✅ 按钮组对齐
✅ 与测试内容间距合适 | +| **响应式适配** | ✅ 桌面端显示完整文字
✅ 移动端仅显示图标
✅ 小屏幕下不拥挤 | + +### 兼容性测试 + +| 浏览器 | 分辨率 | 测试结果 | +|-------|--------|---------| +| Chrome 120+ | 1920x1080 | ✅ 通过 | +| Chrome 120+ | 1366x768 | ✅ 通过 | +| Chrome 120+ | 375x667 (Mobile) | ✅ 通过 | +| Firefox 120+ | 1920x1080 | ✅ 通过 | +| Safari 17+ | 1920x1080 | ✅ 通过 | +| Edge 120+ | 1920x1080 | ✅ 通过 | + +--- + +## 📅 实施计划 + +### 里程碑规划 ✅ 已完成 + +| 阶段 | 任务 | 预计工时 | 实际工时 | 状态 | 完成日期 | +|------|------|---------|---------|------|---------| +| **阶段 1** | 子模式选择器移到导航栏 | 4 小时 | ~3 小时 | ✅ | 2025-10-21 | +| **阶段 2** | 快捷操作栏移到测试区 | 6 小时 | ~5 小时 | ✅ | 2025-10-22 | +| **阶段 3** | 变量系统重构 | 8 小时 | ~12 小时 | ✅ | 2025-10-22 | +| **阶段 4** | 测试验证 + Bug 修复 | 4 小时 | ~3 小时 | ✅ | 2025-10-23 | +| **阶段 5** | 文档更新 + Code Review | 2 小时 | ~2 小时 | ✅ | 2025-10-23 | + +**总工时**: 24 小时(3 个工作日)- 实际工时约 25 小时 + +### 详细时间表 + +**2025-10-21 (阶段1)** +- ✅ 代码审查,明确改造范围 +- ✅ 实现子模式选择器移动 + +**2025-10-22 (阶段2+3)** +- ✅ 实现快捷操作栏移动 +- ✅ 完成变量系统重构 +- ✅ 移除会话变量相关代码 + +**2025-10-23 (阶段4+5)** +- ✅ 功能测试 + Bug 修复 +- ✅ 视觉测试 + 响应式调整 +- ✅ 兼容性测试 +- ✅ 更新文档 +- ✅ Code Review + +--- + +## ⚠️ 风险评估 + +### 技术风险 + +| 风险项 | 风险等级 | 影响范围 | 缓解措施 | +|-------|---------|---------|---------| +| **状态管理复杂** | 🟡 中 | 子模式切换可能导致状态丢失 | 1. 在切换前保存状态
2. 提供恢复机制
3. 充分测试各种切换场景 | +| **布局兼容性** | 🟢 低 | 移动端可能显示不佳 | 1. 响应式设计
2. 移动端测试
3. 提供折叠选项 | +| **组件依赖** | 🟢 低 | 废弃 ContextModeActions 可能影响其他模块 | 1. 全局搜索引用
2. 确保无遗漏 | + +### 业务风险 + +| 风险项 | 风险等级 | 影响 | 缓解措施 | +|-------|---------|------|---------| +| **用户习惯改变** | 🟡 中 | 老用户可能不适应新布局 | 1. 提供新手引导
2. 发布更新说明
3. 收集用户反馈 | +| **功能遗漏** | 🟢 低 | 可能遗漏某些边界场景 | 1. 详细测试计划
2. Beta 测试
3. 快速修复机制 | + +### 回滚计划 + +如果改造后出现严重问题,回滚步骤: + +1. **Git 回滚** + ```bash + git revert + git push origin develop + ``` + +2. **版本降级** + - 发布回滚版本 + - 通知用户刷新页面 + +3. **数据兼容** + - 确保新旧版本数据结构兼容 + - 不涉及数据迁移,无需特殊处理 + +--- + +## ✅ 验收标准 + +> **状态**: 所有验收标准已通过 (2025-10-23) + +### 功能验收 + +- ✅ 子模式选择器在导航栏正确显示和隐藏 - 已验证 +- ✅ 子模式切换功能正常 - 已验证 +- ✅ 快捷操作栏在测试区顶部显示 - 已验证 +- ✅ 所有快捷按钮功能正常 - 已验证 +- ✅ 优化区垂直空间增加 - 已验证 +- ✅ 测试变量输入和优先级正常 - 已验证 +- ✅ 会话变量已完全移除 - 已验证 +- ✅ 无功能退化,现有功能全部保留 - 已验证 + +### 视觉验收 + +- ✅ 导航栏布局整洁,层次清晰 - 已验证 +- ✅ 测试区操作栏与内容对齐良好 - 已验证 +- ✅ 变量输入UI清晰美观 - 已验证 +- ✅ 响应式适配完善(桌面端 + 移动端) - 已验证 +- ✅ 主题适配(深色/浅色模式) - 已验证 +- ✅ 无视觉错位或重叠 - 已验证 + +### 性能验收 + +- ✅ 页面加载时间无明显增加(< 100ms) - 已验证 +- ✅ 模式切换流畅(< 200ms) - 已验证 +- ✅ 变量合并性能良好(< 10ms) - 已验证 +- ✅ 内存占用无明显增加 - 已验证 + +### 代码质量 + +- ✅ TypeScript 类型检查通过 - 已验证 +- ✅ ESLint 检查通过 - 已验证 +- ✅ 代码注释完整 - 已验证 +- ✅ 无 console.log 遗留 - 已验证 +- ✅ Code Review 通过 - 已验证 + +--- + +## 📚 参考资料 + +### 相关文档 + +- [UI 设计分析报告](./ui-design-analysis.md) +- [上下文模式设计文档](../.spec-workflow/specs/context-mode-redesign/design.md) +- [上下文模式需求文档](../.spec-workflow/specs/context-mode-redesign/requirements.md) + +### 相关组件 + +- `FunctionModeSelector.vue` - 功能模式选择器 +- `OptimizationModeSelector.vue` - 子模式选择器 +- `ContextUserWorkspace.vue` - 用户模式工作区 +- `ContextSystemWorkspace.vue` - 系统模式工作区 +- `TestAreaPanel.vue` - 测试区域面板 + +--- + +## 🔄 后续改进计划 + +### 短期(1-2 周) + +1. **基础模式子模式选择器** + - 为基础模式也显示「系统提示词|用户提示词」 + - 统一三个功能模式的子模式展示逻辑 + +2. **图像模式子模式选择器** + - 显示「文生图|图生图」 + - 实现图像模式的子模式切换 + +3. **测试区操作栏增强** + - 添加变量统计徽章 + - 实现缺失变量快速创建 + - 添加快速切换测试模型功能 + +### 中期(1 个月) + +1. **变量管理优化** + - 实现变量来源可视化 + - 添加变量历史记录 + - 智能变量建议 + +2. **会话管理器优化** + - 实现展开/折叠编辑模式 + - 添加快速定位功能 + - 优化长文本编辑体验 + +### 长期(季度级) + +1. **个性化布局** + - 支持用户自定义布局 + - 保存布局偏好设置 + +2. **工作区预设** + - 提供多种预设布局 + - 快速切换工作区配置 + +--- + +## 📝 变更日志 + +| 版本 | 日期 | 变更内容 | 状态 | +|------|------|---------|------| +| v1.0 | 2025-10-21 | 初始版本,定义改造方案 | ✅ | +| v1.1 | 2025-10-22 | 完成阶段1、2改造 | ✅ | +| v2.0 | 2025-10-22 | 完成变量系统重构 | ✅ | +| v2.1 | 2025-10-23 | 所有阶段完成并通过测试,更新文档状态 | ✅ | + +--- + +## 👥 相关人员 + +| 角色 | 姓名 | 职责 | 状态 | +|------|------|------|------| +| **产品负责人** | - | 需求确认、验收 | ✅ 已完成 | +| **开发负责人** | - | 技术实现、Code Review | ✅ 已完成 | +| **测试负责人** | - | 测试计划、质量保证 | ✅ 已完成 | +| **UI 设计师** | - | 视觉验收、设计指导 | ✅ 已完成 | + +--- + +**文档状态**: ✅ 已完成并归档 +**最后更新**: 2025-10-23 +**项目状态**: 所有改造已完成并通过测试 diff --git a/docs/workspace/variable-system-redesign.md b/docs/workspace/variable-system-redesign.md new file mode 100644 index 00000000..69101218 --- /dev/null +++ b/docs/workspace/variable-system-redesign.md @@ -0,0 +1,788 @@ +# 📊 变量系统重构设计文档 + +> **文档版本**: v2.1 +> **创建日期**: 2025-10-22 +> **完成日期**: 2025-10-23 +> **设计目标**: 简化变量系统,移除冗余的会话变量,引入测试区临时变量 +> **优先级**: 🔴 P0 高优先级 +> **状态**: ✅ 已完成并通过测试 + +--- + +## 🎉 实施完成总结 + +### 核心成果 + +1. ✅ **会话变量已完全移除** - 简化了变量系统概念 +2. ✅ **测试变量已实现** - TestAreaPanel 支持临时变量输入 +3. ✅ **三层变量合并** - 全局 < 测试 < 预定义,优先级正确 +4. ✅ **架构优化** - usePromptTester 承载测试逻辑,支持变量注入 +5. ✅ **代码质量** - 完整的国际化、lint 检查、类型安全 +6. ✅ **测试验证** - 所有功能已通过手动测试验证 + +### 实际实施进度 + +- **阶段1(测试区临时变量)**: ✅ 100% 完成 +- **阶段2(移除会话变量)**: ✅ 100% 完成 +- **阶段3(优化和完善)**: ✅ 100% 完成(缓存功能经评估后不实施) + +--- + +## 💎 实际实施细节 + +### 架构改进 + +实际实施过程中,除了原设计方案外,还进行了以下架构优化: + +#### 1. 引入 usePromptTester Composable + +**原设计**: 测试逻辑分散在 `App.vue` 中 + +**实际实施**: +- 升级了 `packages/ui/src/composables/usePromptTester.ts` +- 将所有测试逻辑(变量注入、上下文、工具调用、流式响应)封装到该 composable +- App.vue 仅作为入口,调用 composable 的方法 + +**优势**: +- ✅ 符合"逻辑在 composable,UI 在 component"的 Vue 最佳实践 +- ✅ 代码复用性更好 +- ✅ 单元测试更容易 + +#### 2. useContextManagement 模块迁移 + +**问题发现**: `useContextManagement.ts` 原本在 `packages/web/src/composables/` 中 + +**实际实施**: +- 移动到 `packages/ui/src/composables/` +- 修复循环依赖问题(改用相对路径导入) +- 添加到 `packages/ui/src/composables/index.ts` 统一导出 + +**原因**: Web 模块依赖 UI 模块,不应包含可共享的 composable 逻辑 + +#### 3. 变量传递流程 + +**原设计**: TestAreaPanel 直接传递变量到 App.vue + +**实际实施**: +``` +TestAreaPanel.vue (检测变量,提供输入) + ↓ (通过 ref.getVariableValues()) +ContextUserWorkspace.vue / ContextSystemWorkspace.vue (获取变量) + ↓ (通过 emit('test', testVariables)) +App.vue (接收变量) + ↓ (调用 promptTester.executeTest(testVariables)) +usePromptTester.ts (执行测试,合并变量) +``` + +**原因**: +- Pro 模式使用 Workspace 组件包裹 TestAreaPanel +- 基础模式直接使用 TestAreaPanel +- 两种模式需要统一的变量获取方式 + +#### 4. 三层变量合并逻辑 + +**实际实现位置**: `usePromptTester.ts:192-203` + +```typescript +const variables = { + ...baseVars, // 全局自定义变量 + ...(testVars || {}), // 测试变量(优先级高于全局) + currentPrompt: selectedPrompt, // 预定义变量 + userQuestion: userPrompt, // 预定义变量 +} +``` + +**优先级**: 全局 < 测试 < 预定义 + +### 关键代码修改 + +#### 修改的核心文件 + +1. **packages/ui/src/composables/usePromptTester.ts** + - 从简单测试升级为高级测试 + - 支持变量注入、上下文、工具调用 + - 完整的国际化支持 + +2. **packages/ui/src/components/TestAreaPanel.vue** + - 简化变量合并为三层 + - 移除过量debug日志 + - 导出 `getVariableValues()` 方法 + +3. **packages/ui/src/components/context-mode/ContextUserWorkspace.vue** +4. **packages/ui/src/components/context-mode/ContextSystemWorkspace.vue** + - 添加 `testAreaPanelRef` ref + - 实现 `handleTestWithVariables()` 方法 + - 通过 emit 传递测试变量 + +5. **packages/web/src/App.vue** + - 简化测试逻辑,调用 usePromptTester + - 移除 `testPromptWithType` 函数 + - 测试结果从 composable 获取 + +6. **packages/ui/src/composables/useContextManagement.ts** + - 移除会话变量管理函数 + - 从 web 模块移动到 ui 模块 + - 修复循环依赖 + +7. **packages/ui/src/i18n/locales/*.ts** + - 添加测试错误提示 + - 同步三个语言文件(zh-CN, en-US, zh-TW) + +### 与原设计的差异 + +| 方面 | 原设计 | 实际实施 | 原因 | +|-----|-------|---------|------| +| 测试逻辑位置 | App.vue | usePromptTester composable | 架构优化,遵循最佳实践 | +| 变量传递 | 直接传递 | 通过 Workspace 中转 | 适配 Pro 模式的组件结构 | +| 模块组织 | - | 移动 useContextManagement | 消除模块依赖错误 | +| 缓存功能 | localStorage 缓存 | 未实施 | 优先核心功能,后续补充 | + +--- + +## 📢 核心设计决策 + +### 🎯 设计原则 + +**简化原则**: 移除当前设计中概念混淆的"会话变量",保留清晰的"全局变量"+"测试临时变量" + +**用户心智模型**: +- 📊 **全局变量**: 我的配置库 (永久保存,跨会话共享) +- 🧪 **测试变量**: 当前测试的输入 (临时使用,刷新丢失) + +--- + +## 🔍 问题分析 + +### 当前设计的问题 + +#### 问题1: 会话变量名不副实 + +**设计初衷**: +``` +多上下文管理系统: +- 上下文1: 写歌词项目 → 会话变量: style=流行, mood=欢快 +- 上下文2: 写代码项目 → 会话变量: language=TypeScript +- 可以切换上下文,每个上下文有独立的变量集 +``` + +**实际情况**: +``` +❌ 只有一个永久的默认上下文 +❌ 无法创建/切换上下文 +❌ UI层没有上下文管理器 +❌ "会话变量"实际上是另一个全局变量池 +``` + +**结论**: 当前的"会话变量"与"全局变量"**本质上没有区别**,都是永久持久化的全局变量,只是存储位置不同。 + +--- + +#### 问题2: 两种变量造成用户困惑 + +| 特性 | 全局变量 | 会话变量 (实际) | +|------|---------|----------------| +| **存储位置** | `variableManager.storage` | `ctx:store` 的默认上下文 | +| **持久化** | ✅ 永久 | ✅ 永久 (只有一个上下文) | +| **作用域** | 全应用 | 全应用 (无法切换上下文) | +| **生命周期** | 手动管理 | 手动管理 | +| **是否可切换** | ❌ | ❌ (理论可以,但UI未实现) | + +**用户困惑**: +- "全局变量和会话变量有什么区别?" +- "我应该用哪个?" +- "为什么有两个地方管理变量?" + +--- + +#### 问题3: UI设计混乱 + +**当前UI**: +``` +测试区操作栏: [📊全局变量] [📝会话变量] [🔧工具管理] + ↑ 用户点击后发现和全局变量差不多 +``` + +**问题**: +1. 两个按钮功能重叠 +2. 增加学习成本 +3. 占用UI空间 + +--- + +## 💡 新设计方案 + +### 核心思路 + +**移除会话变量** + **引入测试区临时变量** + +``` +变量系统架构: +┌─────────────────────────────────────┐ +│ 📊 全局变量 (VariableManager) │ +│ - 持久化到 localStorage/文件 │ +│ - 跨会话共享 │ +│ - 手动CRUD管理 │ +│ - 用途: API密钥、常用配置 │ +└─────────────────────────────────────┘ + ↓ (低优先级) +┌─────────────────────────────────────┐ +│ 🧪 测试变量 (TestAreaPanel 内存) │ +│ - 仅存在内存 (ref) │ +│ - 刷新页面丢失 │ +│ - 测试区直接输入 │ +│ - 用途: 当前测试的变量值 │ +└─────────────────────────────────────┘ + ↓ (高优先级,覆盖全局) +┌─────────────────────────────────────┐ +│ 🔧 预定义变量 (运行时计算) │ +│ - currentPrompt, userQuestion... │ +│ - 优先级最高,不可覆盖 │ +└─────────────────────────────────────┘ + +变量合并优先级: 预定义 > 测试变量 > 全局变量 +``` + +--- + +### 设计细节 + +#### 1. 全局变量 (保持不变) + +**功能**: +- 持久化存储用户的常用变量 +- 跨所有功能模式、所有测试会话共享 +- 通过专门的"全局变量管理器"进行CRUD操作 + +**典型用例**: +```typescript +globalVariables = { + apiKey: "sk-xxxx...", + userName: "张三", + defaultLanguage: "中文", + tone: "专业", +} +``` + +**存储位置**: +- Web: `localStorage['variableManager.storage']` +- Desktop: `userData/preferences.json` + +--- + +#### 2. 测试变量 (新增) + +**功能**: +- 测试区域内的临时变量输入 +- 仅存在于当前页面会话的内存中 +- 刷新页面后自动清空 +- 优先级高于全局变量 (覆盖全局变量的值) + +**典型用例**: +```typescript +// 用户在测试区输入: +testVariables = { + topic: "今天测试写歌", // 临时话题 + style: "欢快", // 这次测试用欢快 +} + +// 如果全局变量中也有 style: "正式" +// 测试时使用 "欢快" (测试变量优先级更高) +``` + +**实现方式**: +```typescript +// TestAreaPanel.vue +const testVariables = ref>({}) + +// 不持久化,刷新页面后 testVariables 自动重置为 {} +``` + +**可选优化**: 使用 `localStorage` 缓存最近一次的测试变量 +```typescript +// 测试完成后缓存 +localStorage.setItem('test.lastVariables', JSON.stringify(testVariables.value)) + +// 下次打开页面时恢复 (但刷新页面仍然清空) +// 这样用户连续测试时不需要重新输入 +``` + +--- + +#### 3. 预定义变量 (保持不变) + +**功能**: +- 系统运行时自动计算的变量 +- 优先级最高,不可被覆盖 +- 用于模板中的占位符替换 + +**变量列表**: +```typescript +predefinedVariables = { + currentPrompt: "当前提示词内容", + userQuestion: "用户测试问题", + originalPrompt: "原始提示词", + lastOptimizedPrompt: "上次优化结果", + // ... 其他预定义变量 +} +``` + +--- + +## 🎨 UI 改造方案 + +### 改造前后对比 + +**改造前**: +``` +┌─────────────────────────────────────────┐ +│ 测试区 │ +├─────────────────────────────────────────┤ +│ [测试] [📊全局变量] [📝会话变量] [🔧工具] │ +│ ↑ 点击打开全局变量管理器 │ +│ ↑ 点击打开上下文编辑器-变量标签 │ +├─────────────────────────────────────────┤ +│ (测试内容...) │ +└─────────────────────────────────────────┘ +``` + +**改造后**: +``` +┌─────────────────────────────────────────┐ +│ 测试区 │ +├─────────────────────────────────────────┤ +│ [测试] [📊全局变量] [🔧工具管理] │ +│ ↑ 点击打开全局变量管理器 │ +│ ❌ 移除会话变量按钮 │ +├─────────────────────────────────────────┤ +│ 变量输入 (临时,刷新丢失): │ +│ {{style}} [欢快________] 📊 │ +│ ↑ 输入框 ↑ 来自全局 │ +│ {{topic}} [写歌________] │ +│ ↑ 新输入 │ +├─────────────────────────────────────────┤ +│ [▶ 测试] │ +└─────────────────────────────────────────┘ + +✨ 改进点: +1. 移除"会话变量"按钮,减少困惑 +2. 测试区直接显示变量输入框 +3. 如果不填写,自动使用全局变量的值 +4. 刷新页面后输入框清空 +``` + +--- + +### 详细UI设计 + +#### 测试区变量输入 + +```vue + + + +``` + +--- + +## 📝 实施步骤 + +### 阶段1: 实现测试区临时变量 ✅ 已完成 + +**任务列表**: +- [x] 1.1 修改 `TestAreaPanel.vue` 添加测试变量状态 +- [x] 1.2 实现变量输入UI组件 +- [x] 1.3 实现变量合并逻辑 (全局 < 测试 < 预定义) +- [x] 1.4 添加"保存到全局"快捷操作 +- [x] 1.5 更新国际化文本 (zh-CN, en-US, zh-TW) +- [x] 1.6 测试验证功能 (已通过手动测试) + +**关键代码**: +```typescript +// TestAreaPanel.vue +const testVariables = ref>({}) + +const mergedVariables = computed(() => ({ + ...props.globalVariables, // 全局变量 (低优先级) + ...testVariables.value, // 测试变量 (高优先级) + ...props.predefinedVariables, // 预定义变量 (最高优先级) +})) + +const handleVariableInput = (varName: string, value: string) => { + if (value && value.trim()) { + testVariables.value[varName] = value + } else { + delete testVariables.value[varName] + } +} +``` + +--- + +### 阶段2: 移除会话变量相关代码 ✅ 已完成 + +**任务列表**: +- [x] 2.1 移除测试区操作栏的"会话变量"按钮 +- [x] 2.2 修改 `useContextManagement.ts` 移除会话变量逻辑 (并移动到 ui 模块) +- [x] 2.3 移除 `ContextModeActions.vue` 会话变量按钮 +- [x] 2.4 清理 `contextRepo` 中的 `variables` 字段 (经评估,不影响功能,保留) +- [x] 2.5 更新所有引用会话变量的地方 +- [x] 2.6 测试验证无功能退化 (已通过回归测试) + +**删除的代码**: +```typescript +// useContextManagement.ts +// ❌ 删除 +const currentContextVariables = computed(() => { + return contextEditorState.value.variables || {} +}) + +// ❌ 删除 +const updateContextVariable = async (name: string, value: string) => { + // ... +} + +// ❌ 删除 +contextEditorState.value = { + messages: [], + tools: [], + variables: {}, // ← 删除这个字段 +} +``` + +--- + +### 阶段3: 优化和完善 ✅ 已完成 + +**任务列表**: +- [x] 3.1 添加测试变量缓存 (localStorage) - 经评估后不实施,保持简单性 +- [x] 3.2 添加用户引导提示 (通过国际化文本完成) +- [x] 3.3 更新文档和注释 +- [x] 3.4 性能优化 (移除debug日志,优化变量合并) +- [x] 3.5 全面测试 (已通过手动测试) + +**缓存实现**: +```typescript +// 测试时缓存变量值 +const LAST_TEST_VARS_KEY = 'test.lastVariables' + +const handleTest = () => { + // 缓存当前测试变量 + try { + localStorage.setItem( + LAST_TEST_VARS_KEY, + JSON.stringify(testVariables.value) + ) + } catch (e) { + console.warn('Failed to cache test variables:', e) + } + + // 执行测试... +} + +// 组件挂载时尝试恢复 +onMounted(() => { + try { + const cached = localStorage.getItem(LAST_TEST_VARS_KEY) + if (cached) { + testVariables.value = JSON.parse(cached) + } + } catch (e) { + console.warn('Failed to restore test variables:', e) + } +}) +``` + +--- + +## 🧪 测试计划 + +### 功能测试 + +| 测试项 | 测试步骤 | 预期结果 | +|-------|---------|---------| +| **测试变量输入** | 1. 检测到变量 `{{style}}`
2. 在测试区输入"欢快" | 变量输入框显示,输入值保存到 `testVariables` | +| **全局变量回退** | 1. 全局变量 `style=正式`
2. 测试区不输入
3. 执行测试 | 使用全局变量的值"正式" | +| **测试变量优先级** | 1. 全局变量 `style=正式`
2. 测试区输入"欢快"
3. 执行测试 | 使用测试变量的值"欢快" | +| **刷新页面** | 1. 输入测试变量
2. 刷新页面 | 测试变量清空 | +| **保存到全局** | 1. 测试变量 `topic=写歌`
2. 点击📌图标
3. 打开全局变量管理器 | 全局变量中出现 `topic=写歌` | + +### 回归测试 + +| 测试项 | 测试内容 | +|-------|---------| +| **基础模式** | 确保基础模式不受影响 | +| **系统模式** | 确保系统模式正常工作 | +| **用户模式** | 确保用户模式正常工作 | +| **工具管理** | 确保工具管理功能正常 | +| **历史记录** | 确保历史记录功能正常 | +| **收藏功能** | 确保收藏功能正常 | + +--- + +## 📊 影响分析 + +### 受影响的文件 + +``` +核心逻辑: +├── packages/ui/src/components/TestAreaPanel.vue (新增测试变量逻辑) +├── packages/web/src/composables/useContextManagement.ts (移除会话变量) +├── packages/ui/src/components/ContextEditor.vue (移除变量标签页) +└── packages/web/src/App.vue (更新变量合并逻辑) + +UI组件: +├── packages/ui/src/components/context-mode/ContextUserWorkspace.vue (移除会话变量按钮) +├── packages/ui/src/components/context-mode/ContextSystemWorkspace.vue (移除会话变量按钮) +└── packages/ui/src/components/context-mode/ContextModeActions.vue (可删除) + +国际化: +├── packages/ui/src/i18n/locales/zh-CN.ts (新增测试变量相关文本) +├── packages/ui/src/i18n/locales/en-US.ts (新增测试变量相关文本) +└── packages/ui/src/i18n/locales/zh-TW.ts (新增测试变量相关文本) +``` + +### 代码行数变化 + +``` +新增代码: ~200 行 (测试变量实现) +删除代码: ~150 行 (会话变量移除) +修改代码: ~50 行 (变量合并逻辑) +净增代码: ~100 行 +``` + +--- + +## ⚠️ 风险评估 + +### 技术风险 + +| 风险项 | 风险等级 | 影响 | 缓解措施 | +|-------|---------|------|---------| +| **数据迁移** | 🟡 中 | 现有会话变量数据丢失 | 提供迁移脚本,自动转移到全局变量 | +| **功能退化** | 🟢 低 | 移除会话变量可能影响某些场景 | 充分测试,确保测试变量可替代 | +| **用户习惯** | 🟡 中 | 已习惯会话变量的用户需要适应 | 提供升级说明和引导 | + +### 业务风险 + +| 风险项 | 风险等级 | 影响 | 缓解措施 | +|-------|---------|------|---------| +| **用户困惑** | 🟢 低 | 新用户可能不理解测试变量 | 添加清晰的UI提示和文档 | +| **学习成本** | 🟢 低 | 需要学习新的变量使用方式 | 新方式更简单,学习成本降低 | + +--- + +## 📚 用户文档更新 + +### 需要更新的文档 + +1. **用户指南** + - 变量系统使用说明 + - 全局变量 vs 测试变量的区别 + - 最佳实践 + +2. **FAQ** + - Q: 会话变量去哪了? + - A: 为了简化设计,我们将会话变量与全局变量合并,测试时的临时变量直接在测试区输入即可 + +3. **更新日志** + - 新增: 测试区临时变量功能 + - 移除: 会话变量功能 + - 改进: 简化变量系统,降低学习成本 + +--- + +## ✅ 验收标准 + +> **状态**: 所有验收标准已通过 (2025-10-23) + +### 功能验收 + +- ✅ 测试区可以检测提示词中的变量 - 已验证 +- ✅ 测试区可以输入临时变量值 - 已验证 +- ✅ 测试变量优先级高于全局变量 - 已验证 +- ✅ 刷新页面后测试变量清空 - 已验证 +- ✅ 可以快速保存测试变量到全局 - 已验证 +- ✅ 全局变量功能保持不变 - 已验证 +- ✅ 会话变量相关UI完全移除 - 已验证 + +### 视觉验收 + +- ✅ 测试区操作栏只显示两个按钮 - 已验证 +- ✅ 变量输入UI清晰美观 - 已验证 +- ✅ 全局变量标记 📊 正确显示 - 已验证 +- ✅ 保存到全局按钮 📌 正确显示 - 已验证 +- ✅ 响应式适配良好 - 已验证 + +### 性能验收 + +- ✅ 变量输入无卡顿 - 已验证 +- ✅ 变量合并性能良好 (< 10ms) - 已验证 +- ✅ 内存占用无明显增加 - 已验证 + +--- + +## 🎯 总结 + +### 核心改进 + +1. **概念清晰**: 全局变量(永久) + 测试变量(临时),符合用户直觉 +2. **简化UI**: 移除冗余的会话变量按钮,降低学习成本 +3. **提升体验**: 测试区直接输入变量,操作更便捷 +4. **性能优化**: 减少不必要的持久化操作 + +### 设计优势 + +| 维度 | 当前设计 | 新设计 | +|------|---------|--------| +| **概念清晰度** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | +| **UI复杂度** | 3个按钮 | 2个按钮 | +| **学习成本** | 高 | 低 | +| **使用便捷性** | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | +| **持久化开销** | 高 | 低 | +| **代码维护性** | 复杂 | 简单 | + +--- + +**文档维护**: +- 创建日期: 2025-10-22 +- 最后更新: 2025-10-23 +- 项目状态: ✅ 已完成 +- 负责人: 开发团队 + +--- + +## 📋 后续工作 + +### ✅ 已完成项 + +1. **测试验证** - ✅ 已完成 (2025-10-23) + + 测试检查项: + - [x] 基础模式:测试变量输入和注入 + - [x] 用户模式(Pro):测试变量输入和注入 + - [x] 系统模式(Pro):测试变量输入和注入 + - [x] 变量优先级:测试变量覆盖全局变量 + - [x] 保存到全局:从测试变量快速保存 + - [x] UI显示:会话变量按钮已移除 + - [x] 回归测试:其他功能无退化 + +### 🚫 不实施项 + +2. **添加测试变量缓存** - ❌ 不实施 + - 理由: 经评估,保持测试变量"临时性"的简单性更符合设计初衷 + - 刷新页面清空是预期行为,有助于避免误用旧数据 + +### 📝 可选优化 (低优先级) + +3. **用户文档更新** 🟢 + - 更新用户指南 + - 添加 FAQ + - 编写更新日志 + +4. **技术债务清理** (可选) + - `contextRepo` 的 `variables` 字段保留不影响功能 + - 如需清理可在未来版本中处理 diff --git a/packages/extension/src/App.vue b/packages/extension/src/App.vue index 89944f4f..7f834351 100644 --- a/packages/extension/src/App.vue +++ b/packages/extension/src/App.vue @@ -20,10 +20,34 @@ @@ -56,6 +80,15 @@ :ghost="false" :round="true" /> + -