1. 页面概览

时间轴是 LightGotham 的事件时间序列分析页,路由 /gotham/timeline,对应源码 action/web/src/views/GothamTimelinePage.vue。页面围绕事件(Event)提供四块能力:时间范围查询(start/end/type → /timeline/events/range,事件列表)、时间桶聚合(day/week/month/year → /timeline/aggregate,柱状图)、新增/编辑事件POST/PUT /timeline/events)、时序分析增强(预测/周期/对比三个 Tab,ECharts 渲染)。

事件类型枚举 incident / movement / meeting / transaction / registration,严重度枚举 low / medium / high / critical(另有 none 兜底徽标)。时间范围默认取相对窗口(近 30 天,按本地日期计算)并提供「近 7/30/90 天」快捷档位,不再写死固定日期。事件列表支持双数据源:按时间范围(/timeline/events/range,仅 limit、无翻页)与「全部事件」(/timeline/events,limit+offset 真分页)。一句话总结:时间轴是"事件查询 + 时间桶统计 + 时序算法"的事件情报分析台。

2. 访问入口

3. 界面布局

+-------------------------------------------------------------+
| 页头:Gotham 时间轴  [刷新查询]   alert                       |
+-------------------------------------------------------------+
| 时间范围查询(card):[近7天][近30天][近90天] 自定义 起 至 类型▾ [查询]|
|   时间桶聚合:按日|按周|按月|按年                              |
|   柱状图(桶高按最大计数归一化)+ 桶计数 + 桶标签(旋转-30°)     |
+-------------------------------------------------------------+
| 新增/编辑事件(card):标题* 时间* 类型 严重度 位置 关联实体 描述 |
|                 属性JSON [新增事件|保存修改]                   |
+-------------------------------------------------------------+
| 事件列表(card):数据源[按时间范围|全部事件(真分页)]           |
|   范围模式:取回条数▾(100/200/500/1000)                        |
|   全部模式:每页条数▾(20/50/100) [上一页] 第 n 页 [下一页]      |
|   表格:时间|标题|类型|严重度|位置|关联实体|操作(编辑/删除)      |
+-------------------------------------------------------------+
| 时序分析(card)Tab:[预测][周期][对比]                        |
|   预测→实际/MA/SES 折线;周期→自相关柱状图+周期表;对比→多实体折线|
+-------------------------------------------------------------+

各板块职责:

4. 交互元素

控件位置含义与作用
快捷档位「近 7 / 30 / 90 天」时间范围查询按本地日期算出窗口并回填起止,同时把数据源切回「按时间范围」;当前档位高亮
自定义起止日期时间范围查询手填 date 输入,改动即把档位切为「自定义」(不再高亮任何快捷档)
刷新查询 / 查询按钮时间范围查询GET /timeline/events/range 拉事件列表并连带刷新聚合
类型下拉时间范围查询「全部类型」或 eventTypes 枚举,作为 range/aggregate 的 type
时间桶切换时间桶聚合「按日 / 按周 / 按月 / 按年」(默认 week),切换即 doAggregate
新增/编辑事件表单新增/编辑事件标题*(如 玄武集团高管会晤)、时间*、类型、严重度(low/medium/high/critical)、位置、关联实体(entity_id)、描述、属性 JSON;编辑态复用
数据源切换事件列表「按时间范围」/「全部事件(真分页)」两按钮,切换即重拉列表
取回条数下拉事件列表(范围模式)100/200/500/1000 作为 /timeline/events/rangelimit(后端限 1~1000)
每页条数 + 上一页/下一页事件列表(全部模式)每页 20/50/100;limit+offset 真分页,无 total 时下一页按「本页满页」启发式启用
行内「编辑」「删除」事件列表编辑进入编辑态;删除经确认后 DELETE /timeline/events/:id
预测 Tab时序分析类型 + 桶(含年)+ MA 窗口(默认 3)+ 预测期(默认 5),GET /timeline/forecast 画三线图
周期 Tab时序分析类型 + 「检测周期」,GET /timeline/periods(bucket 固定 day,界面已标注)画自相关图与周期表
对比 Tab时序分析实体 ID 逗号分隔(默认 graph:org:xuanwu,graph:org:tianhe)+ 桶(含年),「对比」画多实体折线

5. 后端关联

API 客户端gothamClient.jsaxios.create({ baseURL: '/gotham-api/v1', timeout: 30000 });请求拦截器注入 Bearer token,响应 401 自动 refresh 重放。

端点表

方法路径用途
GET/timeline/events事件列表(真分页),params limit(默认 100)/ offset(默认 0)/ event_type不接受 start/end
POST/timeline/events新增事件 {title, description, event_time, event_type, severity, location, entity_id, properties}
GET/timeline/events/:id事件详情
PUT/timeline/events/:id更新事件
DELETE/timeline/events/:id删除事件
GET/timeline/events/range时间范围查询,params start/end/type/limit(limit 1~1000,无 offset
GET/timeline/aggregate时间桶聚合,params start/end/bucket/type
GET/timeline/forecast趋势预测,params event_type/bucket/window/horizon,返回 {time, actual, ma, ses}
GET/timeline/periods周期检测,params event_type/bucket=day(固定 day),返回 {period_days, correlation}
GET/timeline/compare多实体对比,params entity_ids/bucket,返回 {entity_id, points: [{time, count}]}

端点与参数依据:server/server.go:571-580handlers_timeline.go:19-34(list 默认 limit=100/offset=0)、:156-167(periods 默认 bucket=day)、timeline/service.go:63-68(bucket 常量)、:74(MaxQueryLimit=1000)、period.go:43-45(periods 非 day 返回 400)。

关键机制

6. 权限与安全

7. 常见问题与排错

问题 1:点「查询」提示「请填写起止时间」

现象:未出列表即被前端拦截。

原因rangeForm.startend 为空(一般发生在清空了自定义日期后)。

处理:点「近 30 天」等快捷档位回填,或手动补齐起止日期;默认已按本地日期预填近 30 天。

问题 2:预测/对比图表空白提示「暂无预测数据」

现象:接口 200 但 data 为空。

原因:该事件类型无历史事件,或对比实体无数据。

处理:先做时间范围查询确认有事件,再换有数据的事件类型/实体 ID。

问题 3:时间桶柱状图不刷新或报「聚合查询失败」

现象:切桶后柱子不变或红色 alert。

原因doAggregate 复用 rangeForm 起止为空时报错;或接口异常。

处理:先成功执行一次「查询」再切桶;查看 Network 中 /gotham-api/v1/timeline/aggregate 响应。

问题 4:新增事件后列表没立刻出现

现象:提示「事件创建成功(id=N)」但当前页列表仍旧。

原因:写操作后按当前数据源与页码刷新;范围模式下事件时间若超出 start/end 则不显示;全部模式下按 event_time ASC, id ASC 排序,新事件排在末页,当前页看不到。

处理:确认 event_time 在范围模式查询范围内;全部模式下翻到末页查找;或点「刷新查询」。

问题 5:「下一页」翻到底后显示空列表

现象:末页恰好满页时点「下一页」得到空表。

原因:响应无 total,下一页可用性按「本页满页」启发式估计(本页满 = 认为可能还有下一页)。

处理:点「上一页」返回;如需精确总数需后端补 total(当前不支持)。

8. 已知缺陷与边界

说明
范围端点无 offset/timeline/events/range 只有 limit(1~1000),范围模式无翻页;真分页须切「全部事件」走 /timeline/events
全部模式无 total/timeline/events 不分页元数据(无 total),下一页按「本页满页」启发式,末页恰满会多一次空翻
两种模式不叠加「全部事件」端点不接受 start/end,故该模式列表不套用上方时间范围过滤
周期检测固定按日/timeline/periods 后端固定 bucket=day(其他粒度返回 400),界面不提供桶选择(已标注)
时区偏移风险datetime-local 本地时间转 ISO,跨时区查看有偏移
聚合柱状图无缩放桶多时横向滚动,无数据缩放交互

注:事件编辑/删除 UI 已于 2026-09-06 修复(行内编辑/删除,调用后端 PUT/DELETE)。

注:2026-09-13 三处修订——(1) 默认时间范围由写死的 2026-07-01 ~ 2026-08-31 改为相对窗口(近 30 天,本地日期)并加「近 7/30/90 天」快捷档位;(2) 时间桶聚合与预测/对比桶选择补 year(后端 bucket 常量含 day/week/month/year,timeline/service.go:63-68);/timeline/periods 仍固定 day 并在界面标注;(3) 事件列表新增「全部事件(真分页)」数据源,走 GET /timeline/eventshandlers_timeline.go:19-34 默认 limit=100/offset=0)实现 limit+offset 真分页,范围模式保留并标注「仅 limit、无翻页」。