[SEN] 实现边缘节点资产与离线状态管理 #76

Closed
opened 2026-08-14 10:29:14 +08:00 by ila · 5 comments
Owner

状态

已完成(用户已验收;实现已合入 dev)

基本信息

  • 类型:需求 / Sense 单项目独立任务
  • 任务类型:单项目
  • 主项目:Sense
  • 主 agent:Sense agent
  • 所属 Epic:#7
  • 所属 MVP / 版本:#80
  • 前置工单:#74、#75
  • 是否允许与前置工单并行:否;必须先冻结前置领域接口
  • 独立运行:Brain、Bell 均不启动时完成实现和验收
  • 需求编号:SEN-012

原始需求与追溯

  • 来源:用户于 2026-08-14 要求建立 Sense 全部独立任务;Product-Requirements、Requirements-Migration-Matrix 和 Sense/AGENTS.md。
  • 摘要:Sense 单产品能够独立完成的后续能力全部建单;跨项目正式契约、Brain 控制和 Bell connector 留给协调工单。
  • 旧 explore 只用于需求、行为与测试对照,不复制自研基础框架。

目标

管理 Sense 自有边缘节点资产,展示版本、在线时长、承载数、控制隧道状态、视频数据面和补传队列状态。

范围

实现节点台账、心跳投影、在线/离线状态、承载与队列指标、断网状态展示和测试夹具。

非目标

不实现 Brain 内部控制协议;不修改根级部署;不声称完成跨节点补传协议;不共享机器身份数据库。

GoAdmin 复用要求

复用 #61/#64 建立的 GoAdmin/go-admin-ui 认证、RBAC、审计、Router、Store、Axios、Layout、表格、表单、分页、Dialog、Tag 和权限按钮;实施前读取相关冻结 go-admin-doc 并在评论记录采用方式。业务专用组件必须说明复用缺口并保持整体风格。

写路径

  • Sense/server/app/sense/edge_node/**
  • Sense/server/database/migrations/*edge_node*
  • Sense/ui/src/views/sense/edge-node/**
  • Sense/ui/src/api/sense/edge-node*
  • Sense/tests/edge_node/**

禁止写入:Brain/**、Bell/**、contracts/**、根级构建/部署、docs/**、wiki-docs.json。需要共享路径时停止并转协调工单。

文档影响

更新对应 Sense Wiki 业务规则、配置、运行、排错和验收页面;本地镜像由单一协调工单同步。

验收标准

  • 节点版本、在线时长、承载数和各通道状态可查看
  • 心跳超时和恢复状态稳定且有审计
  • 断网时保留最后已知状态并明确陈旧时间
  • 使用内部夹具可模拟队列与隧道状态
  • Brain/Bell 不启动时可独立验收

验证方式

  • 心跳、时钟、离线恢复、分页和权限测试
  • 前端节点列表、详情、状态标签与 build
  • 合成节点断网/恢复 smoke

风险与回退

陈旧状态可能误导运维。所有投影带采集时间和 freshness;回退节点投影不影响视频数据面。

协同需求摘要

本工单只实现 Sense 内部端口和夹具。涉及 Sense→Brain、Brain→Sense、Sense/Brain→Bell 的正式 schema、机器身份、部署或 E2E 时另建协调工单。

## 状态 已完成(用户已验收;实现已合入 dev) ## 基本信息 - 类型:需求 / Sense 单项目独立任务 - 任务类型:单项目 - 主项目:Sense - 主 agent:Sense agent - 所属 Epic:#7 - 所属 MVP / 版本:#80 - 前置工单:#74、#75 - 是否允许与前置工单并行:否;必须先冻结前置领域接口 - 独立运行:Brain、Bell 均不启动时完成实现和验收 - 需求编号:SEN-012 ## 原始需求与追溯 - 来源:用户于 2026-08-14 要求建立 Sense 全部独立任务;Product-Requirements、Requirements-Migration-Matrix 和 Sense/AGENTS.md。 - 摘要:Sense 单产品能够独立完成的后续能力全部建单;跨项目正式契约、Brain 控制和 Bell connector 留给协调工单。 - 旧 `explore` 只用于需求、行为与测试对照,不复制自研基础框架。 ## 目标 管理 Sense 自有边缘节点资产,展示版本、在线时长、承载数、控制隧道状态、视频数据面和补传队列状态。 ## 范围 实现节点台账、心跳投影、在线/离线状态、承载与队列指标、断网状态展示和测试夹具。 ## 非目标 不实现 Brain 内部控制协议;不修改根级部署;不声称完成跨节点补传协议;不共享机器身份数据库。 ## GoAdmin 复用要求 复用 #61/#64 建立的 GoAdmin/go-admin-ui 认证、RBAC、审计、Router、Store、Axios、Layout、表格、表单、分页、Dialog、Tag 和权限按钮;实施前读取相关冻结 go-admin-doc 并在评论记录采用方式。业务专用组件必须说明复用缺口并保持整体风格。 ## 写路径 - `Sense/server/app/sense/edge_node/**` - `Sense/server/database/migrations/*edge_node*` - `Sense/ui/src/views/sense/edge-node/**` - `Sense/ui/src/api/sense/edge-node*` - `Sense/tests/edge_node/**` 禁止写入:`Brain/**`、`Bell/**`、`contracts/**`、根级构建/部署、`docs/**`、`wiki-docs.json`。需要共享路径时停止并转协调工单。 ## 文档影响 更新对应 Sense Wiki 业务规则、配置、运行、排错和验收页面;本地镜像由单一协调工单同步。 ## 验收标准 - [x] 节点版本、在线时长、承载数和各通道状态可查看 - [x] 心跳超时和恢复状态稳定且有审计 - [x] 断网时保留最后已知状态并明确陈旧时间 - [x] 使用内部夹具可模拟队列与隧道状态 - [x] Brain/Bell 不启动时可独立验收 ## 验证方式 - 心跳、时钟、离线恢复、分页和权限测试 - 前端节点列表、详情、状态标签与 build - 合成节点断网/恢复 smoke ## 风险与回退 陈旧状态可能误导运维。所有投影带采集时间和 freshness;回退节点投影不影响视频数据面。 ## 协同需求摘要 本工单只实现 Sense 内部端口和夹具。涉及 Sense→Brain、Brain→Sense、Sense/Brain→Bell 的正式 schema、机器身份、部署或 E2E 时另建协调工单。
ila added the kind/taskproject/sensescope/independent labels 2026-08-14 10:29:14 +08:00
Author
Owner

设计证据门禁:原型 v0.1 待审核(2026-08-28)

#74、#75 已验收关闭,前置依赖已经满足。由于本工单新增“边缘节点”列表、详情与状态交互,按双门禁先完成可审阅原型,用户确认前不实施生产代码。

版本与识别

  • 版本:v0.1
  • 生成日期:2026-08-28(Asia/Shanghai)
  • 审核载体:当前 Codex 对话内 Sense 边缘节点 交互原型
  • 仓库外源文件:D:\OPC\yovision-visualizations\issue-76\sense-edge-nodes.html
  • 状态:等待用户审核
  • 未导出到仓库 prototypes/;用户未要求离线原型交付

覆盖范围

  • 复用 GoAdmin/go-admin-ui 应用外壳:侧边栏、顶部栏、TagsView、页面容器、表格、分页、Dialog、Tag、Alert、按钮和固定右侧操作列。
  • 新增“本地运维 / 边缘节点”入口;展示 Sense 自有节点版本、在线时长、承载路数、心跳采集时间、控制隧道、视频数据面和补传队列。
  • 可切换三种审核场景:运行稳定、节点断网、恢复中。
  • 断网状态保留最后已知承载和视频状态,明确标记陈旧时间;不把离线误解释为视频已停止,也不推断 Brain/Bell 状态。
  • 恢复状态区分心跳恢复、控制隧道恢复、视频核对和补传队列收敛,不提前标记为完全在线。
  • 详情 Dialog 展示资产信息、各通道状态及最近状态/审计时间线;测试夹具仅用于原型讨论。
  • 页面只读,不包含 Brain 控制协议、跨节点补传操作、共享机器身份或根级部署入口。

原型验证

  • 已验证稳定、断网、恢复中三种状态切换。
  • 已验证刷新反馈、列表分页外观、固定右侧详情入口和详情 Dialog。
  • 已验证离线时在线节点数、陈旧采集时间、最后已知状态和队列指标同步变化;恢复时队列下降和通道核对状态同步变化。
  • 1024、768、375 宽度检查通过;无页面级横向溢出,宽表由局部横向滚动承载,操作列保持可见。
  • 移动端可见按钮最小 44×44;语义按钮、表格、Dialog、aria-live/role=alert 和 reduced-motion 已覆盖。
  • 浏览器当前验证阶段无新增 console error/warn。

设计取舍

ui-ux-pro-max 用于校准状态清晰度、陈旧信息、恢复路径、可访问性与触控尺寸;视觉仍严格沿用已确认的 GoAdmin/Element Plus 管理端风格,没有引入独立深色或夸张视觉体系。

非目标

原型不实现心跳持久化、离线判定算法、后端接口、生产节点探针、Brain/Bell 协议、共享身份或真实补传;这些边界保持与工单一致。

## 设计证据门禁:原型 v0.1 待审核(2026-08-28) #74、#75 已验收关闭,前置依赖已经满足。由于本工单新增“边缘节点”列表、详情与状态交互,按双门禁先完成可审阅原型,用户确认前不实施生产代码。 ### 版本与识别 - 版本:v0.1 - 生成日期:2026-08-28(Asia/Shanghai) - 审核载体:当前 Codex 对话内 `Sense 边缘节点` 交互原型 - 仓库外源文件:`D:\OPC\yovision-visualizations\issue-76\sense-edge-nodes.html` - 状态:等待用户审核 - 未导出到仓库 `prototypes/`;用户未要求离线原型交付 ### 覆盖范围 - 复用 GoAdmin/go-admin-ui 应用外壳:侧边栏、顶部栏、TagsView、页面容器、表格、分页、Dialog、Tag、Alert、按钮和固定右侧操作列。 - 新增“本地运维 / 边缘节点”入口;展示 Sense 自有节点版本、在线时长、承载路数、心跳采集时间、控制隧道、视频数据面和补传队列。 - 可切换三种审核场景:运行稳定、节点断网、恢复中。 - 断网状态保留最后已知承载和视频状态,明确标记陈旧时间;不把离线误解释为视频已停止,也不推断 Brain/Bell 状态。 - 恢复状态区分心跳恢复、控制隧道恢复、视频核对和补传队列收敛,不提前标记为完全在线。 - 详情 Dialog 展示资产信息、各通道状态及最近状态/审计时间线;测试夹具仅用于原型讨论。 - 页面只读,不包含 Brain 控制协议、跨节点补传操作、共享机器身份或根级部署入口。 ### 原型验证 - 已验证稳定、断网、恢复中三种状态切换。 - 已验证刷新反馈、列表分页外观、固定右侧详情入口和详情 Dialog。 - 已验证离线时在线节点数、陈旧采集时间、最后已知状态和队列指标同步变化;恢复时队列下降和通道核对状态同步变化。 - 1024、768、375 宽度检查通过;无页面级横向溢出,宽表由局部横向滚动承载,操作列保持可见。 - 移动端可见按钮最小 44×44;语义按钮、表格、Dialog、aria-live/role=alert 和 reduced-motion 已覆盖。 - 浏览器当前验证阶段无新增 console error/warn。 ### 设计取舍 `ui-ux-pro-max` 用于校准状态清晰度、陈旧信息、恢复路径、可访问性与触控尺寸;视觉仍严格沿用已确认的 GoAdmin/Element Plus 管理端风格,没有引入独立深色或夸张视觉体系。 ### 非目标 原型不实现心跳持久化、离线判定算法、后端接口、生产节点探针、Brain/Bell 协议、共享身份或真实补传;这些边界保持与工单一致。
Author
Owner

原型 v0.1 用户审核通过

  • 确认人:用户
  • 确认时间:2026-08-28(Asia/Shanghai)
  • 用户明确指令:#76 原型 v0.1通过审核
  • 版本识别:当前 Codex 对话内 Sense 边缘节点 原型 v0.1;仓库外源文件 D:\OPC\yovision-visualizations\issue-76\sense-edge-nodes.html
  • 状态:已确认,可进入正式实现
  • 覆盖范围:GoAdmin 页面外壳、节点台账、版本/在线时长/承载、心跳新鲜度、控制隧道、视频数据面、补传队列、稳定/断网/恢复三状态、详情与审计时间线、响应式与可访问性。
  • 非目标保持:不实现 Brain 控制协议、跨节点补传协议、共享机器身份、根级部署或 Brain/Bell 依赖。
## 原型 v0.1 用户审核通过 - 确认人:用户 - 确认时间:2026-08-28(Asia/Shanghai) - 用户明确指令:`#76 原型 v0.1通过审核` - 版本识别:当前 Codex 对话内 `Sense 边缘节点` 原型 v0.1;仓库外源文件 `D:\OPC\yovision-visualizations\issue-76\sense-edge-nodes.html` - 状态:已确认,可进入正式实现 - 覆盖范围:GoAdmin 页面外壳、节点台账、版本/在线时长/承载、心跳新鲜度、控制隧道、视频数据面、补传队列、稳定/断网/恢复三状态、详情与审计时间线、响应式与可访问性。 - 非目标保持:不实现 Brain 控制协议、跨节点补传协议、共享机器身份、根级部署或 Brain/Bell 依赖。
Author
Owner

正式实现基线(原型 v0.1 审核后)

  • 原型审核:用户于 2026-08-28 明确确认“#76 原型 v0.1通过审核”;覆盖边缘节点列表、概览、在线/离线/恢复、最后已知状态、陈旧时间、通道状态、回填队列和审计详情。
  • GoAdmin 冻结参考:goadmin-baseline.json;已阅读冻结 go-admin-doc 的 Router、API、Models、DTO、Service、DB 主题。
  • 继承路径:GoAdmin 的 Gin/JWT/AuthCheckRole/PermissionAction、API → Service → GORM 分层,以及 go-admin-ui 的 BasicLayout、Element Plus 表格/分页/Dialog/Tag、请求封装和动态菜单路由。
  • 默认模块:不新增或暴露框架演示模块;本任务只新增“边缘节点”只读入口和相应读权限。
  • 状态规则:心跳超时阈值固定为 90 秒;离线状态由读取时刻与最近心跳推导,不覆盖节点最后一次采集到的控制通道、视频数据面和回填队列状态;恢复期分别展示各通道是否收敛。
  • 审计:列表/详情读取写入脱敏操作审计;节点状态转换写入不可变事件记录。心跳应用能力仅作为 Sense 内部服务入口,不在本工单建立跨项目协议或公开写接口。
  • 测试数据:合成节点夹具仅由测试或显式开发调用,生产启动与迁移不得自动写入。
  • 更正实际写路径(原工单中的旧目录描述与当前 GoAdmin 派生目录不一致):
    • Sense/server/app/sense/edge_node/**
    • Sense/server/app/admin/router/sense_edge_node*.go
    • Sense/server/cmd/migrate/migration/version/*edge_node*.go
    • Sense/ui/src/views/sense/edge-node/**
    • Sense/ui/src/api/sense/edge-node.js
    • Sense/ui/tests/unit/sense/edgeNode*.spec.js
    • 如长期事实变化,按流程更新 Gitea Wiki 后同步对应 docs/ 镜像。
  • 非目标保持不变:不实现 Brain 控制协议、Bell 依赖、共享身份、根级部署或真实跨节点回填执行。
## 正式实现基线(原型 v0.1 审核后) - 原型审核:用户于 2026-08-28 明确确认“#76 原型 v0.1通过审核”;覆盖边缘节点列表、概览、在线/离线/恢复、最后已知状态、陈旧时间、通道状态、回填队列和审计详情。 - GoAdmin 冻结参考:`goadmin-baseline.json`;已阅读冻结 `go-admin-doc` 的 Router、API、Models、DTO、Service、DB 主题。 - 继承路径:GoAdmin 的 Gin/JWT/AuthCheckRole/PermissionAction、API → Service → GORM 分层,以及 go-admin-ui 的 BasicLayout、Element Plus 表格/分页/Dialog/Tag、请求封装和动态菜单路由。 - 默认模块:不新增或暴露框架演示模块;本任务只新增“边缘节点”只读入口和相应读权限。 - 状态规则:心跳超时阈值固定为 90 秒;离线状态由读取时刻与最近心跳推导,不覆盖节点最后一次采集到的控制通道、视频数据面和回填队列状态;恢复期分别展示各通道是否收敛。 - 审计:列表/详情读取写入脱敏操作审计;节点状态转换写入不可变事件记录。心跳应用能力仅作为 Sense 内部服务入口,不在本工单建立跨项目协议或公开写接口。 - 测试数据:合成节点夹具仅由测试或显式开发调用,生产启动与迁移不得自动写入。 - 更正实际写路径(原工单中的旧目录描述与当前 GoAdmin 派生目录不一致): - `Sense/server/app/sense/edge_node/**` - `Sense/server/app/admin/router/sense_edge_node*.go` - `Sense/server/cmd/migrate/migration/version/*edge_node*.go` - `Sense/ui/src/views/sense/edge-node/**` - `Sense/ui/src/api/sense/edge-node.js` - `Sense/ui/tests/unit/sense/edgeNode*.spec.js` - 如长期事实变化,按流程更新 Gitea Wiki 后同步对应 `docs/` 镜像。 - 非目标保持不变:不实现 Brain 控制协议、Bell 依赖、共享身份、根级部署或真实跨节点回填执行。
Author
Owner

实现完成,等待用户验收

最终差异

  • 新增 Sense 自有节点投影与不可变状态事件;读取时以 90 秒阈值推导在线/离线,心跳恢复时补记超时与恢复事件。
  • 离线不会覆盖控制隧道、视频数据面、负载和回填队列的最后已知状态;API 与页面同时返回/显示 freshness 和陈旧提示。
  • 新增只读 API GET /api/v1/edge-nodes、GET /api/v1/edge-nodes/:id,复用 GoAdmin JWT、AuthCheckRole、PermissionAction、Casbin 和操作审计。
  • 新增“边缘节点”动态菜单与 go-admin-ui 页面,复用 BasicLayout、Element Plus 表格/分页/Dialog/Tag/Alert 和权限指令;没有新增公共视觉组件或暴露默认演示模块。
  • 合成夹具可模拟在线、离线、恢复、隧道、视频和回填队列;生产迁移与启动不自动写入。
  • 内部 ApplyHeartbeat 未暴露 HTTP 写接口,不定义 Brain/Bell 协议或共享身份。

验证证据

  • go test ./...:通过。
  • go vet ./...:通过。
  • go test -race ./app/sense/edge_node:通过。
  • 前端全量单测:27 suites、66 tests 通过。
  • pnpm lint:通过,0 errors;32 个既有上游 warnings。
  • pnpm build:prod:通过;4 个既有构建 warnings。
  • python dev_scripts/harness.py check --strict:通过。
  • python dev_scripts/harness.py sync --check:全部核心 Wiki 镜像一致。
  • PostgreSQL 专用迁移测试:未执行;未配置隔离的 SENSE_EDGE_NODE_MIGRATION_TEST_DATABASE_URL,因此未触碰用户现有数据库。SQLite 迁移测试已覆盖表、菜单、只读策略及“不自动写夹具”。

Git 与文档

  • 实现提交:2db49fc9559f601dd2daba44d626848e80be83e6
  • PR:#120,已合并到 dev
  • 合并提交:bdd78523b5cdd0c826be27d34b5a4f8ddc7e0a9e
  • Wiki revisions:
    • Product-Requirements dcbdcf563017a1749fa76ad5f78c74a2c3cc6be1
    • Business-Rules-and-Glossary 8f81b925af671209341f1282e128c7f048bca8ec
    • Architecture-and-Code-Map 5c2b5df080b160c1174be3e935fffba420885bff
    • Deployment-and-Operations 34b85f1c3fc2c3e0e7fa0de3df056940fcb71333
    • Local-Development-and-Verification cfec18809b3cb0d938003102c9caa5e6d6f4e818

待验收

工单保持打开和“待验收”。用户确认前不关闭 #76,也不把父工单 #80 的 #76 复选框标为完成。

## 实现完成,等待用户验收 ### 最终差异 - 新增 Sense 自有节点投影与不可变状态事件;读取时以 90 秒阈值推导在线/离线,心跳恢复时补记超时与恢复事件。 - 离线不会覆盖控制隧道、视频数据面、负载和回填队列的最后已知状态;API 与页面同时返回/显示 freshness 和陈旧提示。 - 新增只读 API `GET /api/v1/edge-nodes`、`GET /api/v1/edge-nodes/:id`,复用 GoAdmin JWT、AuthCheckRole、PermissionAction、Casbin 和操作审计。 - 新增“边缘节点”动态菜单与 go-admin-ui 页面,复用 BasicLayout、Element Plus 表格/分页/Dialog/Tag/Alert 和权限指令;没有新增公共视觉组件或暴露默认演示模块。 - 合成夹具可模拟在线、离线、恢复、隧道、视频和回填队列;生产迁移与启动不自动写入。 - 内部 `ApplyHeartbeat` 未暴露 HTTP 写接口,不定义 Brain/Bell 协议或共享身份。 ### 验证证据 - `go test ./...`:通过。 - `go vet ./...`:通过。 - `go test -race ./app/sense/edge_node`:通过。 - 前端全量单测:27 suites、66 tests 通过。 - `pnpm lint`:通过,0 errors;32 个既有上游 warnings。 - `pnpm build:prod`:通过;4 个既有构建 warnings。 - `python dev_scripts/harness.py check --strict`:通过。 - `python dev_scripts/harness.py sync --check`:全部核心 Wiki 镜像一致。 - PostgreSQL 专用迁移测试:未执行;未配置隔离的 `SENSE_EDGE_NODE_MIGRATION_TEST_DATABASE_URL`,因此未触碰用户现有数据库。SQLite 迁移测试已覆盖表、菜单、只读策略及“不自动写夹具”。 ### Git 与文档 - 实现提交:`2db49fc9559f601dd2daba44d626848e80be83e6` - PR:#120,已合并到 `dev` - 合并提交:`bdd78523b5cdd0c826be27d34b5a4f8ddc7e0a9e` - Wiki revisions: - Product-Requirements `dcbdcf563017a1749fa76ad5f78c74a2c3cc6be1` - Business-Rules-and-Glossary `8f81b925af671209341f1282e128c7f048bca8ec` - Architecture-and-Code-Map `5c2b5df080b160c1174be3e935fffba420885bff` - Deployment-and-Operations `34b85f1c3fc2c3e0e7fa0de3df056940fcb71333` - Local-Development-and-Verification `cfec18809b3cb0d938003102c9caa5e6d6f4e818` ### 待验收 工单保持打开和“待验收”。用户确认前不关闭 #76,也不把父工单 #80 的 #76 复选框标为完成。
Author
Owner

用户验收通过

  • 验收人:用户
  • 验收时间:2026-08-28(Asia/Shanghai)
  • 用户明确结论:#76通过验收
  • 验收范围:边缘节点资产、版本/运行时长/承载、90 秒离线判定、恢复状态、最后已知通道与队列状态、陈旧时间、状态审计、只读权限及 Brain/Bell 不启动时的独立性。
  • 交付基线:PR #120;dev 合并提交 bdd78523b5cdd0c826be27d34b5a4f8ddc7e0a9e。
  • 文档影响:实现阶段已更新并同步长期 Wiki;本次验收没有新增长期事实,不重复修改 Wiki。
  • 结论:验收通过,关闭工单。
## 用户验收通过 - 验收人:用户 - 验收时间:2026-08-28(Asia/Shanghai) - 用户明确结论:`#76通过验收` - 验收范围:边缘节点资产、版本/运行时长/承载、90 秒离线判定、恢复状态、最后已知通道与队列状态、陈旧时间、状态审计、只读权限及 Brain/Bell 不启动时的独立性。 - 交付基线:PR #120;`dev` 合并提交 `bdd78523b5cdd0c826be27d34b5a4f8ddc7e0a9e`。 - 文档影响:实现阶段已更新并同步长期 Wiki;本次验收没有新增长期事实,不重复修改 Wiki。 - 结论:验收通过,关闭工单。
ila closed this issue 2026-08-28 15:03:34 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ila/yovision#76