1. 页面概览
多视图联动是 LightGotham 的跨视图筛选联动演示页,路由 /gotham/views,对应源码 action/web/src/views/GothamViewsPage.vue。页面围绕视图会话(Session)与联动关系(Link)提供四块能力:创建视图会话(POST /views/sessions,类型 graph/map/timeline/list/entity)、会话列表(GET /views/sessions)、联动演示(对会话应用筛选 POST /views/sessions/:id/filter 并广播,展示 target_count 与 map/graph 联动结果 GET /views/sessions/:id/linked)、联动关系管理(POST /views/links,源 → 目标会话的 cross_filter 关系)。
核心语义:把一次筛选应用到源会话,沿启用的联动关系广播给目标会话,再由目标会话按同一条件联动过滤出命中数据(图节点 / 地图记录)。一句话总结:多视图联动是"会话化筛选 + cross_filter 广播 + 跨视图命中回显"的联动演示工作台。
2. 访问入口
- 路由与菜单:
/gotham布局子路由path: 'views',nameGothamViews,标题「Gotham 多视图联动」,requiresAuth: true;侧边栏第四项「多视图联动」({ path: '/gotham/views', label: '多视图联动' })。 - 认证与权限:请求经
gothamClient.js(baseURL/gotham-api/v1)附aip_token,401 自动 refresh 重放;/views/*在 protected 组,无 admin 角色限制。 - 端口与 API 前缀:Gotham 后端 18083,前端前缀
/gotham-api。
3. 界面布局
+-------------------------------------------------------------+
| 页头:Gotham 多视图联动 [刷新] alert |
+-------------------------------------------------------------+
| 创建视图会话(card):名称* 类型▾(graph/map/timeline/list/ |
| entity) 描述 [创建] |
+-------------------------------------------------------------+
| 视图会话列表(card):ID|名称|视图类型|当前筛选|创建人|操作 |
| 操作:[联动操作][联动地图][联动图] |
+-------------------------------------------------------------+
| 联动演示(card) |
| 会话▾ field op▾(eq/ne/gt/gte/lt/lte/contains) value |
| [应用筛选并广播] |
| 状态面板:会话/视图类型/广播联动目标 target_count/生效筛选 |
| 联动结果(图 graph)与(地图 map):target_type/命中/节点或记录|
+-------------------------------------------------------------+
| 联动关系管理(card):源会话▾ → 目标会话▾ [建立联动关系] |
| 关系表:ID|源会话|目标会话|类型|启用 |
+-------------------------------------------------------------+
各板块职责:
- 创建视图会话:名称必填 + 视图类型 + 描述,创建后自动刷新列表。
- 视图会话列表:展示各会话当前生效筛选(
fmtFilters渲染为field op value AND ...)与创建人,行内三个联动入口。 - 联动演示:选会话后填 field/op/value,「应用筛选并广播」写筛选并返回
target_count(广播联动到的目标会话数);下方两面板展示图/地图目标命中。 - 联动关系管理:建立源 → 目标的
cross_filter关系并列表展示(含 enabled)。
4. 交互元素
| 控件 | 位置 | 含义与作用 |
|---|---|---|
| 刷新按钮 | 页头 | 并行重拉 /views/sessions 与 /views/links |
| 创建会话表单 | 创建视图会话 | 名称必填;类型下拉(graph/map/timeline/list/entity);成功提示「会话创建成功(id=N)」 |
| 联动操作按钮 | 会话列表行 | 选中会话到联动演示并清空旧状态,提示可应用筛选 |
| 联动地图 / 联动图按钮 | 会话列表行 | loadLinked(s, 'map'/'graph') 按当前筛选查目标命中 |
| 应用筛选并广播按钮 | 联动演示 | 会话必选、field 与 value 必填;body {exprs: [{field, op, value}], source: 'frontend', publish: true},返回 target_count |
| 建立联动关系按钮 | 联动关系管理 | 源/目标会话必选;POST /views/links,link_type: 'cross_filter'、enabled: true |
5. 后端关联
API 客户端:gothamClient.js,axios.create({ baseURL: '/gotham-api/v1', timeout: 30000 });请求拦截器注入 Bearer token,响应 401 自动 refresh 重放。
端点表:
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /views/sessions | 视图会话列表 |
| POST | /views/sessions | 创建会话 {name, view_type, description} |
| POST | /views/sessions/:id/filter | 应用并广播筛选 {exprs: [{field, op, value}], source, publish},返回 ViewState{session_id, view_type, filters, target_count} |
| GET | /views/sessions/:id/linked | 联动命中查询,params target=graph|map,返回 {target_type, count, nodes/records} |
| GET | /views/links | 联动关系列表 |
| POST | /views/links | 建立联动关系 {source_session_id, target_session_id, link_type: 'cross_filter', enabled: true} |
关键机制:
- cross_filter 广播:
applyFilter带publish: true,后端沿 enabled 的 cross_filter 关系向目标会话发布cross_filter事件(eventbus),target_count即联动到的目标会话数;未建启用关系时为 0。 - 联动查询(QueryLinked):
GET /views/sessions/:id/linked?target=...按会话当前 filters 过滤目标数据——graph 返回命中节点nodes,map 返回命中记录records。 - 筛选展示(fmtFilters):把 filters(JSON 字符串或数组)解析渲染为
field op value AND ...,失败回退「(空)」。 - 会话操作流:创建/建关系成功后重新
loadAll(并行拉 sessions + links);selectSession仅选中,applyFilter覆盖并回显新viewState。
6. 权限与安全
- 认证:全部请求走
aip_tokenBearer,401 自动 refresh 换发重放;刷新失效清 token 跳/login。 - 角色限制:
/views/*全部在 protected 组,无 admin 细分。 - 数据持久化与防呆:会话/筛选/联动关系均后端持久化;前端校验会话名称、field/value、源/目标必填;筛选表达式由后端合并写入。
7. 常见问题与排错
问题 1:点「应用筛选并广播」提示「请选择会话」
现象:被前端拦截。
原因:filterForm.sessionId 为空。
处理:先点会话行「联动操作」选中,或在下拉选会话后重试。
问题 2:广播成功但「广播联动目标」为 0
现象:target_count 显示 0。
原因:当前会话没有 enabled 的 cross_filter 联动关系。
处理:在「联动关系管理」建立源 → 目标关系后重新应用筛选。
问题 3:联动结果提示「无命中节点 / 无命中记录」
现象:GET /views/sessions/:id/linked 返回 count=0。
原因:当前筛选在目标数据中无命中。
处理:放宽 field/op/value 重新广播;或新建空筛选会话再查。
问题 4:提示「联动查询失败」
现象:点「联动地图 / 联动图」后红色 alert。
原因:/views/sessions/:id/linked 报错(会话无效、target 非法、后端未启动)。
处理:确认会话存在、target 传 map 或 graph;检查 Network 状态码。
8. 已知缺陷与边界
| 项 | 说明 |
|---|---|
| 仅暴露两个联动目标 | 前端只支持 target=map|graph,后端 entity/list/timeline 未暴露 |
| 单条件筛选 | 前端一次只发一条 exprs,多条件需接口层扩展 |
| 无广播感知 | 页面未订阅 gotham:ws,其他端广播不实时刷新 |
| 会话无编辑 UI | 更新接口存在但未暴露(删除按钮已补) |
注:会话与联动的删除按钮已补齐,已于 2026-09-06 修复(调用后端 DELETE 接口)。