mirror of
https://github.com/linshenkx/prompt-optimizer.git
synced 2026-05-13 00:55:59 +08:00
- 添加模板管理故障排除清单,以帮助用户解决模板管理中遇到的常见问题。 - 统一服务注入逻辑,移除不必要的props定义,增强错误处理机制。 - 优化模板管理,统一服务注入与存储键管理。 - 更新 `TemplateSelect.vue`,移除 `services` prop,改用 `inject` 注入服务。 - 整合 `useTemplateManager`,统一模板选择保存逻辑及存储键管理。 - 新增 `storage-keys.ts`,集中管理存储键常量,避免重复定义,便于维护与遍历。 - 更新相关组件以适配新的模板管理方式,确保模板选择状态正确保存和恢复。 - 修正了模板类型错误的问题,确保在管理界面切换分类后添加的模板类型与当前显示的分类一致。 - 修复了模板管理器打开位置错误的问题,确保从不同入口打开模板管理器时,定位到正确的分类。 - 优化了模板保存和导入逻辑,增加了错误处理和提示。 - 确保所有异步模板操作都使用了 `await` 关键字,避免潜在的时序问题。 - 移除了 `usePromptOptimizer` 中 `selectedOptimizationMode` 的默认值,强制传入该参数。 - 优化了 `TemplateSelect` 组件中 `optimizationMode` prop 的处理,设为 `required`。
5.9 KiB
5.9 KiB
TestPanel.vue 组件升级改造文档
1. 目标
将 TestPanel.vue 组件中用于显示"原始提示词结果"和"优化后提示词结果"的 OutputPanelUI 组件,全面升级为功能更强大、体验更统一的 OutputDisplay 组件。
2. 核心原则
本次改造将遵循与 PromptPanel.vue 中 OutputDisplay 用法一致的架构模式,确保代码库风格的统一性和可维护性。核心原则如下:
- 父组件拥有状态:
TestPanel.vue将作为数据的所有者,全权负责管理测试结果的流式接收、内容存储和加载状态。 - 单向数据流:所有状态(如内容和加载状态)将通过
props的形式单向传递给子组件OutputDisplay。 - 关注点分离:
TestPanel.vue关注业务逻辑(如何获取数据),而OutputDisplay关注视图呈现(如何展示数据)。
3. 改造范围
- 文件:
packages/ui/src/components/TestPanel.vue
4. 详细实施步骤
4.1. 模板 (<template>) 修改
-
移除 Markdown 切换按钮:
- 在模板中,找到并彻底删除用于切换 Markdown 渲染的两个
<button>元素及其相关的enableMarkdown逻辑。OutputDisplay自带视图切换功能,外部控制已不再需要。
- 在模板中,找到并彻底删除用于切换 Markdown 渲染的两个
-
替换 "原始提示词测试结果" 面板:
- 找到
v-show="isCompareMode"的div。 - 删除内部的
<OutputPanelUI ... />组件。 - 在原位置添加以下新结构:
<h3 class="text-lg font-semibold theme-text truncate mb-3">{{ t('test.originalResult') }}</h3> <OutputDisplay :content="originalTestResult" :streaming="isTestingOriginal" mode="readonly" class="flex-1 h-full" />
- 找到
-
替换 "优化后提示词测试结果" 面板:
- 找到显示优化结果的
div。 - 删除内部的
<OutputPanelUI ... />组件。 - 在原位置添加以下新结构:
<h3 class="text-lg font-semibold theme-text truncate mb-3"> {{ isCompareMode ? t('test.optimizedResult') : t('test.testResult') }} </h3> <OutputDisplay :content="optimizedTestResult" :streaming="isTestingOptimized" mode="readonly" class="flex-1 h-full" />
- 找到显示优化结果的
-
移除
ref属性:- 从模板中删除
ref="originalOutputPanelRef"和ref="optimizedOutputPanelRef"属性,它们将不再被使用。
- 从模板中删除
4.2. 脚本 (<script setup>) 修改
-
更新导入:
- 从
'./OutputPanel.vue'的导入语句中移除OutputPanelUI。 - 添加从
'./OutputDisplay.vue'导入OutputDisplay。 - 确保已从
'../composables/useToast'导入useToast并初始化const toast = useToast()。
- 从
-
移除废弃的状态:
- 删除以下
ref定义:const originalOutputPanelRef = ref(null) const optimizedOutputPanelRef = ref(null) const enableMarkdown = ref(true); // 如果存在
- 删除以下
-
重构
testOriginalPrompt函数:- 此函数将从委托模式重构为主动管理模式。
- 修改后的完整逻辑应如下:
const testOriginalPrompt = async () => { if (!props.originalPrompt) return isTestingOriginal.value = true originalTestResult.value = '' originalTestError.value = '' // 可选,主要用于调试 await nextTick(); // 确保状态更新和DOM清空完成 try { const streamHandler = { onToken: (token) => { originalTestResult.value += token }, onComplete: () => { /* 流结束后不再需要设置 isTesting, 由 finally 处理 */ }, onError: (err) => { const errorMessage = err.message || t('test.error.failed') originalTestError.value = errorMessage toast.error(errorMessage) } } // ... 此处构建 systemPrompt 和 userPrompt 的逻辑保持不变 ... await props.promptService.testPromptStream( systemPrompt, userPrompt, selectedTestModel.value, streamHandler ) } catch (error) { console.error('[TestPanel] Original prompt test failed:', error); // 增加详细错误日志 const errorMessage = error.message || t('test.error.failed') originalTestError.value = errorMessage toast.error(errorMessage) originalTestResult.value = '' } finally { // 确保无论成功或失败,加载状态最终都会被关闭 isTestingOriginal.value = false } }
-
重构
testOptimizedPrompt函数:- 应用与
testOriginalPrompt完全相同的重构逻辑,但操作对象是optimized相关的状态 (props.optimizedPrompt,isTestingOptimized,optimizedTestResult,optimizedTestError)。 - 关键增强点: 同样需要在这里的
try-catch-finally结构中加入await nextTick()和console.error日志。
- 应用与
-
移除
defineExpose:- 由于不再需要从外部引用组件内部的
ref或方法,请删除整个defineExpose代码块。
- 由于不再需要从外部引用组件内部的
5. 预期结果
TestPanel.vue不再依赖OutputPanel.vue,而是完全使用OutputDisplay.vue。- 测试结果区域拥有了与主优化面板一致的外观和交互(如视图切换、全屏等),但被限制为只读模式。
- 流式数据显示逻辑被正确地移至
TestPanel.vue的<script>部分,代码结构更清晰,状态管理更可靠。 - 项目减少了一个仅用于特定场景的
OutputPanel.vue组件,提高了代码的复用性和一致性。