@@ -4,7 +4,10 @@
< div v-if = "showPromptDebug && currentPage === 'writer'" class="absolute inset-0 bg-slate-950/95 z-20 p-8 overflow-auto backdrop-blur-sm" >
< div class = "max-w-5xl mx-auto" >
< div class = "flex justify-between items-center mb-4" >
< h3 class = "text-lg font-bold text-yellow-500" > 🔧 构建的 Prompt 结构预览 < / h3 >
< h3 class = "text-lg font-bold text-yellow-500 flex items-center gap-2" >
< IconLibrary name = "gear" :size = "20" / >
构建的 Prompt 结构预览
< / h3 >
< button @click ="showPromptDebug = false" class = "text-sm text-slate-400 hover:text-white" > 关闭预览 < / button >
< / div >
< div class = "bg-black/50 p-6 rounded-lg border border-slate-700 font-mono text-sm text-green-400 whitespace-pre-wrap leading-relaxed shadow-inner" >
@@ -25,11 +28,13 @@
字数 : { { generatedContent . length } } { { isGenerating ? '(生成中...)' : '' } }
< / span >
< div class = "flex gap-3" >
< button @click ="copyContent" class = "text-xs text-slate-400 hover:text-white flex items-center gap-1 transition" >
📋 复制 Markdown
< button @click ="copyContent" class = "text-xs text-slate-400 hover:text-white flex items-center gap-1.5 transition" >
< IconLibrary name = "copy" :size = "14" / >
< span > 复制 Markdown < / span >
< / button >
< button @click ="clearContent" class = "text-xs text-slate-400 hover:text-red-400 flex items-center gap-1 transition" >
🗑 ️ 清空
< button @click ="clearContent" class = "text-xs text-slate-400 hover:text-red-400 flex items-center gap-1.5 transition" >
< IconLibrary name = "trash" :size = "14" / >
< span > 清空 < / span >
< / button >
< / div >
< / div >
@@ -39,11 +44,13 @@
字数 : { { documentContent . length } }
< / span >
< div class = "flex gap-3" >
< button @click ="saveDocument" class = "text-xs text-green-400 hover:text-green-300 flex items-center gap-1 transition" >
💾 保存
< button @click ="saveDocument" class = "text-xs text-green-400 hover:text-green-300 flex items-center gap-1.5 transition" >
< IconLibrary name = "save" :size = "14" / >
< span > 保存 < / span >
< / button >
< button @click ="copyDocContent" class = "text-xs text-slate-400 hover:text-white flex items-center gap-1 transition" >
📋 复制
< button @click ="copyDocContent" class = "text-xs text-slate-400 hover:text-white flex items-center gap-1.5 transition" >
< IconLibrary name = "copy" :size = "14" / >
< span > 复制 < / span >
< / button >
< / div >
< / div >
@@ -55,7 +62,9 @@
<!-- 写作页面内容 -- >
< div v-if = "currentPage === 'writer'" >
< div v-if = "!generatedContent && !isGenerating" class="h-full flex flex-col items-center justify-center text-slate-700 mt-20" >
< span class = "text-6xl mb-4 opacity-2 0" > ⌨ ️ < / span >
< div class = "w-20 h-20 flex items-center justify-center rounded-2xl bg-slate-800/50 border border-slate-700 mb-4 opacity-4 0" >
< IconLibrary name = "keyboard" :size = "48" / >
< / div >
< p > 在左侧配置参数 , 点击生成开始写作 < / p >
< / div >
@@ -67,7 +76,7 @@
class = "w-full px-4 py-3 flex items-center justify-between text-left hover:bg-indigo-900/20 transition"
>
< div class = "flex items-center gap-2" >
< span class = "text-indigo-400" > 🧠 < / span >
< IconLibrary name = "sparkles" :size = "16" class = "text-indigo-400" / >
< span class = "text-sm font-medium text-indigo-300" > AI 思考路径 < / span >
< span v-if = "generationStage === 'thinking'" class="text-xs px-2 py-0.5 rounded bg-indigo-500/20 text-indigo-400 animate-pulse" >
分析中...
@@ -89,7 +98,7 @@
< div v-if = "qualityReport" class="bg-slate-800/50 rounded-lg border border-slate-600 overflow-hidden" >
< div class = "px-4 py-3 border-b border-slate-700 flex items-center justify-between" >
< div class = "flex items-center gap-2" >
< span class = "text-lg" > 🔍 < / span >
< IconLibrary name = "search" :size = "18" / >
< span class = "text-sm font-medium text-slate-200" > 质检报告 < / span >
< span
class = "text-xs px-2 py-0.5 rounded"
@@ -117,9 +126,9 @@
class = "flex items-start gap-3 text-sm"
>
< span class = "shrink-0 mt-0.5" >
< span v-if = "check.status === 'pass'" class="text-green-400" > ✅ < / span >
< span v-else-if = "check.status === 'warning'" class="text-yellow-400" > ⚠ ️ < / span >
< span v-else class = "text-red-400" > ❌ < / span >
< IconLibrary v-if = "check.status === 'pass'" name="check" :size="14" class="text-green-400" / >
< IconLibrary v-else-if = "check.status === 'warning'" name="warning" :size="14" class="text-yellow-400" / >
< IconLibrary v-else name = "error" :size = "14" class= "text-red-400" / >
< / span >
< div >
< span class = "font-medium" : class = "{
@@ -131,8 +140,9 @@
< / div >
< / div >
< div v-if = "qualityReport.summary" class="pt-3 border-t border-slate-700" >
< p class = "text-xs text-slate-400 italic" > 📝 { { qualityReport . summary } } < / p >
< div v-if = "qualityReport.summary" class="pt-3 border-t border-slate-700 flex items-start gap-2 " >
< IconLibrary name = "edit" :size = "12" class = "text-slate-400 mt-0.5" / >
< p class = "text-xs text-slate-400 italic" > { { qualityReport . summary } } < / p >
< / div >
< / div >
< / div >
@@ -160,7 +170,9 @@
< ! - - 文稿编辑页面内容 - - >
< div v-else-if = "currentPage === 'documents'" class="h-full" >
< div v-if = "!currentDocument" class="h-full flex flex-col items-center justify-center text-slate-700 mt-20" >
< span class = "text-6xl mb-4 opacity-2 0" > 📄 < / span >
< div class = "w-20 h-20 flex items-center justify-center rounded-2xl bg-slate-800/50 border border-slate-700 mb-4 opacity-4 0" >
< IconLibrary name = "document" :size = "48" / >
< / div >
< p > 在左侧选择文稿进行编辑 < / p >
< / div >
@@ -216,7 +228,9 @@
<!-- 范式写作页面内容 -- >
< div v-else-if = "currentPage === 'paradigmWriter'" class="h-full flex flex-col" >
< div v-if = "!totalGeneratedContent" class="h-full flex flex-col items-center justify-center text-slate-700 mt-20" >
< span class = "text-6xl mb-4 opacity-2 0" > ✨ < / span >
< div class = "w-20 h-20 flex items-center justify-center rounded-2xl bg-slate-800/50 border border-slate-700 mb-4 opacity-4 0" >
< IconLibrary name = "sparkles" :size = "48" / >
< / div >
< p > 生成的内容将在这里实时预览 < / p >
< p class = "text-xs text-slate-500 mt-2" > 选择章节并点击 「 生成本节 」 开始 < / p >
< / div >
@@ -245,11 +259,13 @@
< ! - - 操作按钮 - - >
< div class = "flex gap-3 pt-4 border-t border-slate-700" >
< button @click ="copyParadigmContent" class = "text-xs px-4 py-2 bg-slate-700 hover:bg-slate-600 text-white rounded transition" >
📋 复制全文
< button @click ="copyParadigmContent" class = "text-xs px-4 py-2 bg-slate-700 hover:bg-slate-600 text-white rounded transition flex items-center gap-2 " >
< IconLibrary name = "copy" :size = "14" / >
< span > 复制全文 < / span >
< / button >
< button @click ="exportParadigmToWord" class = "text-xs px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white rounded transition" >
📥 导出 Word
< button @click ="exportParadigmToWord" class = "text-xs px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white rounded transition flex items-center gap-2 " >
< IconLibrary name = "download" :size = "14" / >
< span > 导出 Word < / span >
< / button >
< / div >
< / div >
@@ -260,14 +276,15 @@
< ! - - 范式编辑表单 - - >
< div v-if = "paradigmEditState.isEditing" class="bg-slate-900 rounded-lg border border-slate-700 overflow-hidden" >
< div class = "px-6 py-4 border-b border-slate-700 flex items-center justify-between" >
< h3 class = "text-lg font-bold text-white" >
{ { paradigmEditState. isAddMode ? '➕ 新增写作范式' : '✏️ 编辑写作范式' } }
< h3 class = "text-lg font-bold text-white flex items-center gap-2 " >
< IconLibrary : name = " paradigmEditState. isAddMode ? 'add' : 'edit'" :size = "20" / >
{ { paradigmEditState . isAddMode ? '新增写作范式' : '编辑写作范式' } }
< / h3 >
< button
< button
@click ="closeParadigmEdit"
class = "text-slate-400 hover:text-white transition"
>
✕
< IconLibrary name = "close" :size = "18" / >
< / button >
< / div >
@@ -351,7 +368,8 @@
<!-- ⭐ 核心字段 : 完整 Prompt -- >
< div >
< label class = "block text-sm text-slate-400 mb-2 flex items-center gap-2" >
< span > ✨ < / span > 完整 Prompt ( 核心字段 )
< IconLibrary name = "sparkles" :size = "14" class = "text-yellow-400" / >
< span > 完整 Prompt ( 核心字段 ) < / span >
< span class = "text-xs text-slate-500" > 粘贴您的完整提示词 < / span >
< / label >
< textarea
@@ -360,8 +378,9 @@
class = "w-full px-4 py-3 bg-slate-800 border border-slate-600 rounded-lg text-white outline-none focus:border-blue-500 resize-y font-mono text-sm leading-relaxed"
placeholder = "在此粘贴您的完整 Prompt..."
> < / textarea >
< p class = "text-xs text-slate-500 mt-2" >
💡 提示 : 这是 AI 调用时的核心指令 。 完整的 Prompt 应包含角色 、 目标 、 步骤和输出格式 。
< p class = "text-xs text-slate-500 mt-2 flex items-start gap-1.5 " >
< IconLibrary name = "info" :size = "12" class = "mt-0.5" / >
< span > 提示 : 这是 AI 调用时的核心指令 。 完整的 Prompt 应包含角色 、 目标 、 步骤和输出格式 。 < / span >
< / p >
< / div >
< / div >
@@ -386,7 +405,9 @@
<!-- 默认显示或分析结果 -- >
< template v-else >
< div v-if = "!analysisResult" class="h-full flex flex-col items-center justify-center text-slate-700 mt-20" >
< span class = "text-6xl mb-4 opacity-2 0" > 📊 < / span >
< div class = "w-20 h-20 flex items-center justify-center rounded-2xl bg-slate-800/50 border border-slate-700 mb-4 opacity-4 0" >
< IconLibrary name = "chart" :size = "48" / >
< / div >
< p > 选择左侧的写作范式或使用分析工具 < / p >
< / div >
@@ -413,17 +434,19 @@
< ! - - 操作按钮 - - >
< div class = "mt-6 flex gap-3" >
< button
< button
@click ="copyAnalysis"
class = "text-xs px-4 py-2 bg-slate-700 hover:bg-slate-600 text-white rounded transition"
class = "text-xs px-4 py-2 bg-slate-700 hover:bg-slate-600 text-white rounded transition flex items-center gap-2 "
>
📋 复制分析结果
< IconLibrary name = "copy" :size = "14" / >
< span > 复制分析结果 < / span >
< / button >
< button
< button
@click ="applyToWriting"
class = "text-xs px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white rounded transition"
class = "text-xs px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white rounded transition flex items-center gap-2 "
>
✍ ️ 应用到写作
< IconLibrary name = "edit" :size = "14" / >
< span > 应用到写作 < / span >
< / button >
< / div >
< / div >
@@ -457,7 +480,9 @@
<!-- 其他页面默认内容 -- >
< div v-else class = "h-full flex flex-col items-center justify-center text-slate-700 mt-20" >
< span class = "text-6xl mb-4 opacity-2 0" > 📄 < / span >
< div class = "w-20 h-20 flex items-center justify-center rounded-2xl bg-slate-800/50 border border-slate-700 mb-4 opacity-4 0" >
< IconLibrary name = "document" :size = "48" / >
< / div >
< p > 选择左侧面板查看内容 < / p >
< / div >
< / div >
@@ -471,6 +496,7 @@ import { storeToRefs } from 'pinia'
import { useAppStore } from '../stores/app'
import { buildPrompt } from '../utils/promptBuilder.js'
import { marked } from 'marked'
import IconLibrary from './icons/IconLibrary.vue'
const appStore = useAppStore ( )
const {
@@ -558,7 +584,7 @@ const exportParadigmToWord = async () => {
}
}
// 图标选项
// 图标选项 (TODO: 后续优化为 IconLibrary 图标网格选择器)
const iconOptions = [ '📝' , '📄' , '📊' , '📈' , '📉' , '🏛️' , '🍂' , '💻' , '📌' , '💡' ]
// 颜色选项
@@ -785,11 +811,11 @@ const renderedThinking = computed(() => {
// 生成阶段标签
const stageLabel = computed ( ( ) => {
const labels = {
'thinking' : '🧠 风格解构 & 大纲规划中...' ,
'draft' : '✍️ 正在撰写初稿...' ,
'inspect' : '🔍 正在进行质量检查...' ,
'critique' : '💡 AI 深度反思中...' ,
'refine' : '✨ 深度润色中...'
'thinking' : '风格解构 & 大纲规划中...' ,
'draft' : '正在撰写初稿...' ,
'inspect' : '正在进行质量检查...' ,
'critique' : 'AI 深度反思中...' ,
'refine' : '深度润色中...'
}
return labels [ generationStage . value ] || ''
} )