feat: 实现范式库到工作台的数据流转机制

- 新增 src/config/paradigms.js:范式配置库,包含专家指令和评价量表
- 实现范式预设填充:点击卡片自动注入参考案例、标签、约束
- WriterPanel.vue:新增「专家指令」只读展示区(金色高亮)
- AnalysisPanel.vue:使用统一的范式配置,调用 loadParadigmPreset
- appStore.js:新增 activeParadigm、expertGuidelines、qualityReport 状态
- 支持民主生活会对照检查等6种范式的完整专家标准
This commit is contained in:
empty
2026-01-08 11:49:29 +08:00
parent d02848d1e1
commit 67758a7fff
4 changed files with 407 additions and 77 deletions

View File

@@ -25,17 +25,17 @@
<div class="space-y-3">
<div
v-for="paradigm in paradigms"
:key="paradigm.type"
:key="paradigm.id"
@click="selectParadigm(paradigm)"
:class="['bg-slate-700/50 rounded-lg p-4 border transition cursor-pointer',
selectedParadigm?.type === paradigm.type
selectedParadigm?.id === paradigm.id
? 'border-blue-500 bg-blue-900/20'
: 'border-slate-600 hover:border-blue-500']"
>
<div class="flex justify-between items-start mb-2">
<h4 class="font-medium text-white">{{ paradigm.icon }} {{ paradigm.name }}</h4>
<button
v-if="selectedParadigm?.type === paradigm.type"
v-if="selectedParadigm?.id === paradigm.id"
@click.stop="applyParadigm(paradigm)"
class="text-xs px-2 py-1 bg-blue-600 text-white rounded hover:bg-blue-500 transition"
>
@@ -108,9 +108,10 @@ import { ref, onMounted } from 'vue'
import { storeToRefs } from 'pinia'
import { useAppStore } from '../stores/app'
import DeepSeekAPI from '../api/deepseek.js'
import { getParadigmList } from '../config/paradigms.js'
const appStore = useAppStore()
const { analysisText, isAnalyzing, selectedTags, inputTask } = storeToRefs(appStore)
const { analysisText, isAnalyzing } = storeToRefs(appStore)
// 选中的范式
const selectedParadigm = ref(null)
@@ -118,84 +119,17 @@ const selectedParadigm = ref(null)
// 分析历史
const analysisHistory = ref([])
const paradigms = [
{
type: 'tech',
name: '技术博客范式',
icon: '📝',
description: '适用于技术分享、教程类文章',
tags: ['问题引入', '解决方案', '代码示例', '总结'],
tagClass: 'bg-blue-900/30 text-blue-300',
prompt: '请按照技术博客的范式写作包含1) 问题背景引入 2) 具体解决方案 3) 代码示例说明 4) 总结与最佳实践',
constraints: ['Markdown格式', '总分总结构', '数据支撑']
},
{
type: 'business',
name: '商业分析范式',
icon: '📊',
description: '适用于行业分析、市场报告',
tags: ['背景介绍', '数据支撑', '趋势分析', '建议'],
tagClass: 'bg-green-900/30 text-green-300',
prompt: '请按照商业分析的范式写作包含1) 行业背景介绍 2) 数据分析与支撑 3) 趋势预测 4) 战略建议',
constraints: ['Markdown格式', '数据支撑', '引用权威来源']
},
{
type: 'marketing',
name: '产品文案范式',
icon: '🎯',
description: '适用于产品介绍、营销文案',
tags: ['痛点切入', '价值主张', '功能亮点', '行动号召'],
tagClass: 'bg-purple-900/30 text-purple-300',
prompt: '请按照产品文案的范式写作包含1) 用户痛点切入 2) 核心价值主张 3) 产品功能亮点 4) 明确的行动号召',
constraints: ['语气幽默', '严禁被动语态']
},
{
type: 'academic',
name: '学术论文范式',
icon: '📖',
description: '适用于学术写作、研究报告',
tags: ['摘要', '引言', '文献综述', '方法论', '结果'],
tagClass: 'bg-orange-900/30 text-orange-300',
prompt: '请按照学术论文的范式写作包含1) 摘要 2) 引言 3) 文献综述 4) 研究方法论 5) 结果与讨论 6) 结论',
constraints: ['引用权威来源', '严禁被动语态']
},
{
type: 'party-review',
name: '民主生活会对照检查',
icon: '🏛️',
description: '适用于党政机关民主生活会个人对照检查材料',
tags: ['开篇引言', '对照查摆', '根源剖析', '整改措施', '表态'],
tagClass: 'bg-red-900/30 text-red-300',
prompt: '请按照民主生活会对照检查材料的范式写作包含1) 开篇说明会议主题和学习依据 2) 对照查摆存在的主要问题(按要求逐条分析) 3) 问题产生的根源剖析 4) 下一步整改措施 5) 结尾总结表态。语言要规范使用政治术语,体现自我批评精神,问题剖析要深入,整改措施要具体可行。',
constraints: ['总分总结构', '引用权威来源']
},
{
type: 'gov-report',
name: '政府工作报告',
icon: '📋',
description: '适用于政府工作总结、述职报告',
tags: ['工作回顾', '成绩总结', '问题分析', '下步计划'],
tagClass: 'bg-cyan-900/30 text-cyan-300',
prompt: '请按照政府工作报告的范式写作包含1) 过去工作回顾 2) 主要成绩和亮点 3) 存在问题和不足 4) 下一步工作计划和目标。语言要严谨规范,数据要准确,措施要具体。',
constraints: ['Markdown格式', '数据支撑', '总分总结构']
}
]
// 从配置文件获取范式列表
const paradigms = getParadigmList()
// 选择范式
const selectParadigm = (paradigm) => {
selectedParadigm.value = paradigm
}
// 应用范式到写作
// 应用范式到写作(使用新的 loadParadigmPreset 方法)
const applyParadigm = (paradigm) => {
// 更新写作任务
inputTask.value = paradigm.prompt
// 更新选中的约束标签
selectedTags.value = [...paradigm.constraints]
// 切换到写作页面
appStore.switchPage('writer')
appStore.loadParadigmPreset(paradigm.id)
// 显示提示
alert(`已应用"${paradigm.name}"到写作任务`)

View File

@@ -99,6 +99,40 @@
</div>
</section>
<!-- 专家指令范式预设时显示 -->
<section v-if="activeParadigm">
<div class="flex justify-between items-center mb-2">
<label class="text-sm font-medium text-amber-400 flex items-center gap-1">
专家指令 (Expert Guidelines)
</label>
<button
@click="clearParadigm"
class="text-[10px] text-slate-500 hover:text-red-400 transition"
>
清除范式
</button>
</div>
<div class="bg-amber-950/20 border border-amber-500/30 rounded-lg p-3 space-y-2">
<div class="flex items-center gap-2 mb-2">
<span class="text-amber-400">{{ activeParadigm.icon }}</span>
<span class="text-xs font-medium text-amber-300">已加载{{ activeParadigm.name }}专家标准</span>
</div>
<div class="space-y-1.5">
<div
v-for="(guideline, idx) in expertGuidelines"
:key="idx"
class="text-[11px] text-slate-400 flex items-start gap-2"
>
<span class="text-amber-500/70 shrink-0">{{ idx + 1 }}.</span>
<div>
<span class="text-amber-300/80 font-medium">{{ guideline.title }}</span>
<span class="text-slate-500">{{ guideline.description }}</span>
</div>
</div>
</div>
</div>
</section>
<!-- 输出规范 -->
<section>
<label class="block text-sm font-medium text-slate-400 mb-2">3. 输出规范 (Constraints)</label>
@@ -194,6 +228,8 @@ const {
newRefContent,
selectedTags,
customConstraint,
activeParadigm,
expertGuidelines,
isGenerating,
showPromptDebug,
apiUrl,
@@ -203,7 +239,7 @@ const {
outlinePoints
} = storeToRefs(appStore)
const { switchPage } = appStore
const { switchPage, clearParadigm } = appStore
const presetTags = ['Markdown格式', '总分总结构', '数据支撑', '语气幽默', '严禁被动语态', '引用权威来源']