优化: 所有剩余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:
+59
-6
@@ -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 断点对齐) */
|
||||
|
||||
Reference in New Issue
Block a user