性能优化: 项目页/看板/DAG/知识库/交付 加载提速

- /api/tasks 列表接口改用轻量序列化,去掉 output_text/error 大字段
  (300KB -> 6KB, 详情接口 /api/tasks/<id> 仍返回完整数据)
- /api/tasks/trash 与 /api/projects/<id>/dag 同步轻量化
- 前端同一项目内切换 tab 不再重复拉取项目/任务/Worker/事件,
  复用 projCtx 缓存; 离开项目页时自动清缓存
- /api/projects/<id>/events 各来源加 LIMIT, 避免全表加载
This commit is contained in:
2026-08-16 19:26:13 +08:00
parent 7c4cbf8994
commit e5d664fb98
3 changed files with 31 additions and 7 deletions
+12 -1
View File
@@ -100,6 +100,8 @@ function router() {
const hash = location.hash.replace(/^#\//, '') || 'dashboard';
const parts = hash.split('/');
const name = parts[0];
// 离开项目页时丢弃项目缓存,避免下次进入用旧数据
if (name !== 'project') projCtx = null;
const fn = routes[name] || pageDashboard;
const navMap = {project:'projects', api:'api', settings:'settings', alerts:'alerts'};
$$('#sidebar nav a').forEach(a => a.classList.toggle('active', a.dataset.route === (navMap[name] || name)));
@@ -274,11 +276,20 @@ let projCtx = null; // {pid, p, tasks, workers, tab, autoLogs}
let projAutoTimer = null;
async function pageProject([pid, tab]) {
tab = tab || 'kanban';
// 同一项目内切 tab:复用已加载的数据,不再重新拉项目/任务/Worker/事件
if (projCtx && String(projCtx.pid) === String(pid)) {
projCtx.tab = tab;
renderProjectShell();
renderActiveTab();
startProjAutoPoll(); // 重启轮询(router 已清掉定时器)
return;
}
const p = (await api(`/api/projects/${pid}`)).data;
const tasks = (await api(`/api/tasks?project_id=${pid}`)).data;
const workers = (await api('/api/workers')).data;
const events = (await api(`/api/projects/${pid}/events`)).data;
projCtx = {pid, p, tasks, workers, tab: tab || 'kanban', events};
projCtx = {pid, p, tasks, workers, tab, events};
renderProjectShell();
renderActiveTab();
startProjAutoPoll();