docs/archives/106-template-management/troubleshooting.md
症状:
TemplateError: Template not found: template-xxx 错误index.js:1683 行抛出原因:
await 关键字deleteTemplate 和 loadTemplates 并发执行解决方案:
确保所有异步模板操作都使用 await:
// ❌ 错误
getTemplateManager.value.deleteTemplate(templateId)
await loadTemplates()
// ✅ 正确
await getTemplateManager.value.deleteTemplate(templateId)
await loadTemplates()
检查以下函数中的异步调用:
confirmDelete()handleSubmit()handleFileImport()applyMigration()症状:
原因:
getCurrentTemplateType() 函数返回固定的 props.templateType,不会随用户在管理界面内的分类切换而改变重要概念澄清:
templateType: 'optimize')templateType: 'userOptimize')templateType: 'iterate')解决方案:
修正 getCurrentTemplateType() 函数,让它根据当前分类而不是props来决定:
// ❌ 错误:使用固定的props值
function getCurrentTemplateType() {
return props.templateType
}
// ✅ 正确:根据当前分类决定
function getCurrentTemplateType() {
switch (currentCategory.value) {
case 'system-optimize': return 'optimize'
case 'user-optimize': return 'userOptimize'
case 'iterate': return 'iterate'
default: return 'optimize'
}
}
确保分类切换按钮正确更新 currentCategory:
@click="currentCategory = 'user-optimize'"
验证添加模板时使用正确的模板类型:
templateType: getCurrentTemplateType() // 现在会根据当前分类返回正确的类型
症状:
原因:
currentCategory 只在组件初始化时设置,不会响应 props.templateType 的变化解决方案:
添加对 props.templateType 变化的监听:
// 监听 props.templateType 变化,更新当前分类
watch(() => props.templateType, (newTemplateType) => {
currentCategory.value = getCategoryFromProps()
}, { immediate: true })
修正导航栏打开的默认逻辑:
// ❌ 错误:根据当前优化模式决定
const openTemplateManager = (templateType?: string) => {
currentTemplateManagerType.value = templateType || (selectedOptimizationMode.value === 'system' ? 'optimize' : 'userOptimize')
}
// ✅ 正确:默认为系统优化提示词
const openTemplateManager = (templateType?: string) => {
currentTemplateManagerType.value = templateType || 'optimize'
}
确保正确的定位规则:
症状:
检查项:
saveTemplate() 调用是否使用了 awaitloadTemplates() 调用是否使用了 await症状:
检查项:
importTemplate() 调用是否使用了 awaitloadTemplates() 调用是否使用了 await服务依赖注入:
StorageFactory.createDefault()错误处理:
异步操作:
await模板管理相关代码审查时检查:
templateManager 方法调用是否正确使用 awaitasync单元测试:
集成测试:
症状:
根本原因:
App.vue → TemplateSelectUI(直接引用)App.vue → PromptPanelUI → TemplateSelect(间接引用)详细分析:
主界面正常的原因:
templateSelectRef?.refresh?.()迭代页面异常的原因:
解决方案:
建立事件传播链:
// TemplateManager.vue - 发出语言变化事件
const handleLanguageChanged = async (newLanguage: string) => {
// ... 现有逻辑 ...
// 发出语言变化事件,通知父组件
emit('languageChanged', newLanguage)
}
App.vue处理事件并传播:
// 处理模板语言变化
const handleTemplateLanguageChanged = (newLanguage: string) => {
// 刷新主界面的模板选择组件
if (templateSelectRef.value?.refresh) {
templateSelectRef.value.refresh()
}
// 刷新迭代页面的模板选择组件
if (promptPanelRef.value?.refreshIterateTemplateSelect) {
promptPanelRef.value.refreshIterateTemplateSelect()
}
}
PromptPanel暴露刷新方法:
// PromptPanel.vue - 暴露刷新迭代模板的方法
const refreshIterateTemplateSelect = () => {
if (iterateTemplateSelectRef.value?.refresh) {
iterateTemplateSelectRef.value.refresh()
}
}
defineExpose({
refreshIterateTemplateSelect
})
修复验证:
经验总结:
日志记录:
调试技巧:
代码规范:
awaitasync架构原则:
测试覆盖:
代码审查: