diff --git a/docs/superpowers/plans/2026-09-18-visitor-detail-tabs.md b/docs/superpowers/plans/2026-09-18-visitor-detail-tabs.md new file mode 100644 index 0000000..76409a8 --- /dev/null +++ b/docs/superpowers/plans/2026-09-18-visitor-detail-tabs.md @@ -0,0 +1,170 @@ +# 访客详情页三栏 Tab 化 — 实现计划 + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** 访客详情页重组为三栏布局——左栏 ElTabs(访问时间线默认/会话/原始数据),中栏 2×2 统计卡+来源证据,右栏访问环境;含三级响应式降级。 + +**Architecture:** 单文件(admin/src/views/tracker/visitor/detail.vue,1479 行)纯模板+样式重组,逻辑/API/抽屉零改动。 + +**Tech Stack:** Vue3 + Element Plus(ElTabs/ElTabPane)+ SCSS。 + +**Spec:** docs/superpowers/specs/2026-09-18-visitor-detail-tabs-design.md + +**现状锚点(实现者必读)**: +- 模板:62-75 行 4 统计卡横排(`div.vd-stats`);77-228 行 `div.vd-main` 双栏(78-227 左=时间线卡 `vd-timeline-card`;167-227 右=`div.vd-side` 含来源证据+访问环境);230-370 行 `div.vd-bottom-card`(ElTabs:sessions/raw 两 pane) +- 状态:695 行 `const activeTab = ref<'sessions' | 'raw'>('sessions')`;811 行附近 `watch(activeTab, ...)` 只匹配 `'raw'`(懒加载 rawBatches,**无需改动**) +- 样式:1093-1099 `.vd-main`(`minmax(0,1fr) 340px`);1101-1106 `.vd-side`;1409-1412 `.vd-bottom-card`;1463-1478 旧媒体查询(1200px 单栏 + 900px stats 两列) +- 统计卡数据:`statTiles` computed(模板 v-for),**不改动** + +--- + +### Task 1: 模板重组 + activeTab 扩展 + +**Files:** +- Modify: `admin/src/views/tracker/visitor/detail.vue`(模板 62-370 区段 + 695 行状态) + +- [ ] **Step 1: activeTab 扩展**(695 行): + +```ts +const activeTab = ref<'timeline' | 'sessions' | 'raw'>('timeline') +``` + +(TS 会强制模板 v-model 类型吻合;`watch(activeTab)` 只匹配 'raw' 不动。) + +- [ ] **Step 2: 模板重组**(62-370 行区段重排,结构如下): + +``` +删除:div.vd-stats(62-75 全宽横排区)——statTiles v-for 块移入中栏 +删除:div.vd-bottom-card 外壳(230-231 与 369-370 的开闭标签)——两个 ElTabPane 内容保留 + +新的主体结构(替换现 77-370): +