优化: 所有剩余UI/UX待办一批完成(持久化+AuditLog+解耦+total+原12大改+P2)

持久化(P1-c):新建 usePersistedRef composable,Tasks/AuditLog/ProjectDetail 等接入 localStorage

AuditLog(P1-d):后端 list_tool_executions 加 WHERE 筛选+返 {items,total,has_more},前端对接+长列折叠+筛选持久化

数据源解耦(P1-g):ProjectDetail projectTasks 按 project_id 独立加载 + ChatInput @项目联想独立加载(不读 store.tasks 当前页)

GitChanges(12a):后端 get_module_commits 加 git rev-list --count 返 total,前端显真实总数

原12大改:Dashboard 统计卡压底行(1)/Projects 列表卡片视图(2)/project_event 埋点排序(3)/TaskDetail 重设计(4)/IdeaDetail 重设计(5)/KnowledgeDetail 重设计(6)/界面持久化+侧栏Ctrl+B+审批数字键(7)/ProjectDetail 三栏改两栏(10)

P2打磨:文件浏览器(FileTree去重/FilePreview行号.md Diff/selectedFilePath归位)/settings反馈(假保存/端口校验)/AI会话(try-catch/scrollIntoView)/后端计数(move_queue事件/timeline total/workflow分页/import_batch分块)/杂项(TopBar/ConfirmDialog键盘/CIStatus i18n/ToolResultBody/ModuleNode/ApprovalDialog全选)
This commit is contained in:
lxy
2026-08-02 13:11:06 +08:00
parent caaabf0c15
commit f736f435bc
70 changed files with 2645 additions and 576 deletions
+59 -6
View File
@@ -24,9 +24,6 @@
<button class="error-dismiss" @click="errorMsg = ''"></button>
</div>
<!-- Stat Cards -->
<StatCardRow />
<!-- Main Grid -->
<div class="dash-grid">
<!-- Left: Active Projects -->
@@ -38,17 +35,36 @@
<IdeasPanel />
</div>
</div>
<!-- 统计概要(底部一行小字,原独立统计卡已下沉) -->
<div class="dash-stats-inline">
<span class="dash-stats-item clickable" @click="go('/ideas')" :title="$t('dashboard.viewAll')">
<span class="dash-stats-num">{{ store.stats.ideas }}</span>{{ $t('dashboard.stats.ideas') }}
</span>
<span class="dash-stats-sep">·</span>
<span class="dash-stats-item clickable" @click="go('/projects')" :title="$t('dashboard.viewAll')">
<span class="dash-stats-num">{{ store.stats.projects }}</span>{{ $t('dashboard.stats.projects') }}
</span>
<span class="dash-stats-sep">·</span>
<span class="dash-stats-item clickable" @click="go('/tasks')" :title="$t('dashboard.viewAll')">
<span class="dash-stats-num">{{ store.stats.activeTasks }}</span>{{ $t('dashboard.stats.activeTasks') }}
</span>
<span class="dash-stats-sep">·</span>
<span class="dash-stats-item">
<span class="dash-stats-num">{{ store.stats.drafts }}</span>{{ $t('dashboard.stats.drafts') }}
</span>
</div>
</div>
</template>
<script setup lang="ts">
// 仪表盘页壳 — 仅保留:Header(refresh/quickCapture) + 错误条 + 布局栅格 + 加载编排(loadAll)
// 统计卡/项目面板/灵感面板已抽至 components/dashboard/ 子组件,各自共享 project store(全局单例),无需 props
// 仪表盘页壳 — 仅保留:Header(refresh/quickCapture) + 错误条 + 布局栅格 + 加载编排(loadAll) +
// 底部统计概要行(原独立统计卡 StatCardRow 已下沉为底部一行小字,空间让给项目/灵感面板)
// 项目面板/灵感面板已抽至 components/dashboard/ 子组件,各自共享 project store(全局单例),无需 props。
import { onMounted, ref } from 'vue'
import { useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { useProjectStore } from '@/stores/project'
import StatCardRow from '@/components/dashboard/StatCardRow.vue'
import ActiveProjectsPanel from '@/components/dashboard/ActiveProjectsPanel.vue'
import IdeasPanel from '@/components/dashboard/IdeasPanel.vue'
@@ -89,6 +105,11 @@ function quickCapture() {
router.push('/ideas')
}
// 底部统计概要项点击跳转(可点击项:ideas/projects/tasks;drafts 不可点)
function go(link: string) {
router.push(link)
}
onMounted(() => {
loadAll()
})
@@ -143,6 +164,38 @@ onMounted(() => {
}
.dash-right { display: flex; flex-direction: column; gap: 12px; }
/* ═══ 底部统计概要(一行小字,原独立统计卡下沉) ═══ */
.dash-stats-inline {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 6px;
margin-top: 14px;
padding-top: 10px;
border-top: 0.5px solid var(--df-border);
font-size: 11px;
color: var(--df-text-dim);
line-height: 1.4;
}
.dash-stats-item {
display: inline-flex;
align-items: center;
gap: 4px;
font-weight: 450;
}
.dash-stats-item.clickable {
cursor: pointer;
transition: color 0.15s var(--df-ease);
}
.dash-stats-item.clickable:hover { color: var(--df-accent); }
.dash-stats-num {
font-size: 13px;
font-weight: 600;
color: var(--df-text);
letter-spacing: -0.3px;
}
.dash-stats-sep { color: var(--df-text-dim); opacity: 0.6; }
/* ═══ Responsive ═══ */
/* 窄窗口:单栏(与 AppLayout 768px 断点对齐) */