From ea561c974a9d0e10fc7ab4b6c001491901005989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Tue, 15 Sep 2026 21:05:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E8=AE=BF=E5=AE=A2=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E8=B7=A8=E5=A4=A9=E6=97=B6=E9=97=B4=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 覆写 detail.vue 占位:档案卡(ID/在线/地理/IP/语言时区/设备/首触来源 utm 标签/ 落地页截断 tooltip)+ 统计 4 项 + 轨迹/会话 Tab - 轨迹 Tab:按日倒序分组(日期头含会话数)、会话块(时间·来源·active_ms 求和停留)、 el-timeline 事件行(page_view/page_stay 独立条目/sdk_loaded 图标区分)、 7/30/90 天切换(reqSeq 守卫)、truncated 提示条、空态 - 会话 Tab:全量会话表,行点击开抽屉看单会话事件序列(getSession) - keepAlive:onMounted/onActivated/query-watch 三入口统一 ensureLoad, loadedVid 去重(query 清空时重置令牌),切访客必刷新 - 顺车 Minor:formatStay 注释与代码对齐;useTable 背对背 if 改 if/else Co-Authored-By: Claude Code --- admin/src/hooks/core/useTable.ts | 9 +- admin/src/utils/tracker/index.ts | 2 +- admin/src/views/tracker/visitor/detail.vue | 617 ++++++++++++++++++++- 3 files changed, 618 insertions(+), 10 deletions(-) diff --git a/admin/src/hooks/core/useTable.ts b/admin/src/hooks/core/useTable.ts index 3506519..c29c402 100644 --- a/admin/src/hooks/core/useTable.ts +++ b/admin/src/hooks/core/useTable.ts @@ -404,14 +404,13 @@ function useTableImpl Promise>( return { records: [], total: 0, current: 1, size: 10 } } - if (!superseded) { - // 状态机:请求失败,进入 error 状态 - loadingState.value = 'error' - data.value = [] - } if (superseded) { // 旧请求的失败交给新请求兜底,不触发错误回调 throw err instanceof Error ? err : new Error(String(err)) + } else { + // 状态机:请求失败,进入 error 状态 + loadingState.value = 'error' + data.value = [] } const tableError = handleError(err, '获取表格数据失败') throw tableError diff --git a/admin/src/utils/tracker/index.ts b/admin/src/utils/tracker/index.ts index a56a957..d9d1800 100644 --- a/admin/src/utils/tracker/index.ts +++ b/admin/src/utils/tracker/index.ts @@ -51,7 +51,7 @@ export const formatStay = (ms?: number | null): string => { if (days) parts.push(`${days}天`) if (hours) parts.push(`${hours}小时`) if (minutes) parts.push(`${minutes}分`) - // 秒恒显示(含 0),避免"0秒/不足 1 秒"整行变空 + // 仅当非零或无更高单位时显示秒(与下方条件表达式语义一致) if (seconds || !parts.length) parts.push(`${seconds}秒`) return parts.join('') } diff --git a/admin/src/views/tracker/visitor/detail.vue b/admin/src/views/tracker/visitor/detail.vue index fc96909..e7608bd 100644 --- a/admin/src/views/tracker/visitor/detail.vue +++ b/admin/src/views/tracker/visitor/detail.vue @@ -1,10 +1,619 @@ + + + +