重构: 前端DRY(style全局沉淀 + ts/js公共沉淀)

style-dry:
- 新增 src/styles/components.css: .info-item*/.panel/.panel-header/.tech-tag/.card-tags 全局
- main.ts 注册 import
- 删重复: ProjectDetail/TaskDetail/TaskOutputCard/ProjectCard/Projects(scoped删重复, 全局对子组件生效)
- 未使用清理: Projects .card-progress dead(1处保守核对)

tsjs-dry:
- aiShared.ts: resolveAiLang(合并useAiSend.resolveLang + useAiContext.resolveLanguage)
- stores/knowledge.ts: kindText/kindLabel/kindIcon/knowledgeStatusLabel/knowledgeConfidenceLabel(5公共)
- 删重复: useAiSend/useAiContext(resolveLang) + Knowledge/KnowledgeDetail(4+5 helper) + ActiveProjectsPanel(formatLastActivity→formatRelativeZh复用)

strategy: DRY收口, 公共沉淀(utils/store/shared); relativeTime非纯重复保留; .btn/.empty-hint局部override WATCH未动
This commit is contained in:
2026-06-19 12:11:19 +08:00
parent 64ece1d3a0
commit 7748e3ecbc
14 changed files with 177 additions and 212 deletions

View File

@@ -145,7 +145,14 @@
<script setup lang="ts">
import { ref, computed, onMounted, onUnmounted, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { useKnowledgeStore, KNOWLEDGE_KINDS } from '@/stores/knowledge'
import {
useKnowledgeStore,
KNOWLEDGE_KINDS,
kindText,
kindLabel,
knowledgeStatusLabel as statusLabel,
knowledgeConfidenceLabel as confidenceLabel,
} from '@/stores/knowledge'
import { useRendered } from '@/composables/useMarkdown'
import { stripMd } from '@/utils/markdown'
import KnowledgeDetail from '@/components/knowledge/KnowledgeDetail.vue'
@@ -165,10 +172,6 @@ const categories = [
function catLabel(key: string): string {
return key === 'all' ? t('knowledge.categoryAll') : kindText(key)
}
// 纯类型文案(无 icon),用于下拉/分类
function kindText(key: string): string {
return t(`knowledge.kind.${key}`)
}
const activeKind = ref('all')
const searchQuery = ref('')
let searchTimer: ReturnType<typeof setTimeout> | null = null
@@ -331,20 +334,7 @@ async function submitCreate() {
}
// ===== 列表卡片标签辅助(详情相关 label/时间解析已迁移至 KnowledgeDetail 子组件)=====
function kindLabel(key: string): string {
const k = KNOWLEDGE_KINDS.find(c => c.key === key)
return k ? `${k.icon} ${kindText(key)}` : key
}
function statusLabel(status: string): string {
const key = `knowledge.status.${status}`
const msg = t(key)
return msg === key ? status : msg
}
function confidenceLabel(c: string): string {
const key = `knowledge.confidence.${c}`
const msg = t(key)
return msg === key ? c : msg
}
// kindText/kindLabel/statusLabel/confidenceLabel 由 @/stores/knowledge 提供(列表/详情共用,单一来源)
onMounted(() => {
ensureLoaded() // 后台预热 Markdown 渲染器(模块单例,与 AiChat/TaskDetail 共享),不阻塞