safesight-control/docs/superpowers/specs/2026-04-20-profile-editor-design.md

8.4 KiB
Raw Blame History

Profile 配置编辑页设计方案

背景

当前后台已经具备模板、Profile、Overlay 资产浏览能力,但 Profile 页面仍然是只读详情页,无法承载“以设备独有属性为中心”的配置管理流程。

这与当前项目的配置方向不一致:

  • 模板负责共享能力与公共服务接入
  • Profile 负责单台设备的独有属性
  • Overlay 负责测试、调优、生产安静模式等附加差异

因此,后台需要把 Profile 从“资产查看页”升级为“设备独有配置编辑入口”。

目标

本次设计只解决一个核心问题:

让运维人员能够在后台中,以清晰、低冗余的方式查看和编辑 Profile 中真正属于单台设备的配置。

本次不试图一次性完成所有配置管理问题,重点只放在:

  1. 明确 Profile 的字段边界
  2. 设计可编辑的 Profile 页面结构
  3. 设计与现有“生成预览 / 上传候选配置”流程的衔接方式

设计原则

1. Profile 只放设备独有属性

Profile 的职责是表达“这台设备是谁、接什么视频、向哪里输出”。

因此,下面这类内容应归属于 Profile

  • 设备显示名
  • 实例名
  • 站点名
  • 设备编号
  • 视频源地址
  • HLS / RTSP 输出信息
  • 通道号
  • 少量单设备调试项

2. 模板继续负责共享服务接入

下面这类共享服务配置不应出现在 Profile 编辑页中:

  • MinIO
  • 外部告警接口
  • token 接口
  • 租户编码

这些内容继续由模板负责,并在模板资产页面中管理。

3. 内部默认值不向用户暴露

已经确认应内收进程序默认值或模板默认值的内容,不应进入 Profile 编辑页,例如:

  • face_gallery_path
  • 纯内部含义、易误配的底层参数

如果某些少量调试项暂时仍需保留,也必须进入“高级设置”,并默认折叠。

4. 页面围绕运维任务组织,不平铺 JSON

Profile 编辑页不是原始 JSON 的表单化翻译,而是围绕运维任务组织:

  • 先认识这台设备
  • 再看它接什么视频
  • 再看它往哪里输出
  • 最后才是少量高级参数

原始 JSON 只作为参考内容收起展示,不参与默认工作流。

Profile 字段边界

应展示的核心字段

基础信息

  • Profile 名称
  • 实例名 name
  • 设备显示名 display_name
  • 设备编号 device_code
  • 站点名 site_name
  • 通道号 channel_no

视频源

  • 视频源地址 rtsp_url

输出流

  • HLS 输出路径 publish_hls_path
  • RTSP 输出端口 publish_rtsp_port
  • RTSP 输出路径 publish_rtsp_path

Profile 级队列设置

  • queue.size
  • queue.strategy

这部分虽然不是“设备身份信息”,但仍属于当前 Profile 文件本身,且对单设备运行行为有影响,因此保留在编辑页中,但应作为次级信息展示,不放在第一视觉层。

放入高级设置的字段

凡是仍存在于 instance.params 中,但不属于日常运维主流程的字段,统一归入“高级设置”,默认折叠。

高级设置必须满足两个前提:

  1. 确实还有业务意义
  2. 用户误改后不会轻易破坏系统关键行为

如果某个字段既不常改、又容易出错,则不应继续停留在 Profile 中,而应在后续迭代中内收。

不展示的字段

以下内容不应在 Profile 编辑页直接展示:

  • 模板共享服务参数
  • 纯内部默认值
  • 原始路径类技术字段
  • 不面向运维用户的底层算法开关

页面结构

Profile 编辑页采用“四个 tab + 底部统一动作区”的结构。

Tab 1基础信息

作用:定义这台设备“是谁”。

字段:

  • Profile 名称
  • 实例名
  • 设备显示名
  • 设备编号
  • 站点名
  • 通道号

默认要求:

  • 这一页应是用户最常进入的页签
  • 设备显示名是最重要的人类可读字段
  • 不显示主机名、device_id 等运行态信息

Tab 2视频源

作用:定义这台设备“从哪里取流”。

字段:

  • RTSP 地址

表现要求:

  • 使用大一点的单行输入框,便于复制粘贴和检查
  • 技术格式提示尽量弱化,不写成长段说明

Tab 3输出流

作用:定义这台设备“向哪里发布”。

字段:

  • HLS 输出路径
  • RTSP 输出端口
  • RTSP 输出路径

表现要求:

  • HLS 与 RTSP 分组展示
  • 输出相关字段使用等宽字体输入框,方便检查路径和端口

Tab 4高级设置

作用:承载少量仍保留在 Profile 中的非主流程参数。

表现要求:

  • 默认折叠
  • 不出现大量解释性说明
  • 如果当前 Profile 没有高级字段,则展示为空状态,不额外制造占位噪音

操作区设计

页面底部只保留 3 个核心动作:

  1. 保存
  2. 生成预览
  3. 上传为候选配置

不增加多余的跳转按钮、说明按钮、查看原始 JSON 按钮。

保存

作用:

  • 仅保存当前 Profile 资产内容
  • 不直接影响设备运行态

生成预览

作用:

  • 使用当前编辑中的 Profile
  • 结合选定模板与 Overlay
  • 生成预览摘要与渲染结果

上传为候选配置

作用:

  • 将当前预览结果上传到目标设备 agent
  • 不直接等同于立即应用

这与现有“候选配置 -> 应用候选配置”的流程保持一致。

与现有页面关系

配置资产总页

Profile tab 继续保留为资产入口,但点击某个 Profile 后,进入的不再是只读详情,而是编辑页。

设备页

设备页仍然负责展示当前运行配置摘要,不承担 Profile 资产编辑职责。

也就是说:

  • “现在设备跑的是什么” 去设备页看
  • “这个 Profile 本身如何定义” 去配置资产页编辑

这样可以避免运行态信息与资产定义混在一起。

数据结构改动

后台内部需要把现有只读 ConfigProfileAsset 扩展为“适合编辑表单”的视图模型,但不改变底层 Profile JSON 的存储格式。

建议拆成两层:

  1. 资产读取层
    继续负责从 configs/profiles/*.json 读取原始结构

  2. 表单视图层
    提供页面渲染和提交时需要的扁平字段

这样能避免模板层、资产层、提交层混成一个数据结构。

提交流程

本次只设计最短主流程,不增加复杂版本控制。

读取

  1. 打开 Profile 编辑页
  2. 后台读取目标 Profile JSON
  3. 解析为编辑表单模型

保存

  1. 用户修改字段
  2. 提交表单
  3. 后台校验必填字段
  4. 重建 Profile JSON
  5. 回写到 configs/profiles/<name>.json

生成预览

  1. 读取当前表单值
  2. 与所选模板、Overlay 组合
  3. 走现有渲染逻辑
  4. 在页面中展示预览摘要

上传候选配置

  1. 复用当前预览结果
  2. 调用现有 agent 上传接口
  3. 返回候选配置结果摘要

校验规则

首轮只做最必要的输入校验:

  • Profile 名称不能为空
  • 实例名不能为空
  • 设备显示名不能为空
  • RTSP 地址不能为空
  • RTSP 端口如果填写,必须是合法数字

其余更强约束可以后续再加,不在本次首轮中扩展。

错误处理

错误展示分三层:

  1. 表单校验错误
    直接挂在对应字段旁边

  2. 保存 / 预览 / 上传失败
    在操作区上方显示一条明确错误消息

  3. 原始技术细节
    收纳在可折叠技术信息区,不默认展开

测试策略

本次优先做后台本地可验证部分:

  1. Profile 资产读取与表单映射测试
  2. Profile 表单提交后的 JSON 重建测试
  3. Profile 页面渲染测试
  4. 现有预览/上传链路的回归测试

RK3588 真机验证仍然由现有设备侧配置下发流程完成,不在本地伪装硬件验证。

实施顺序

建议按下面顺序推进:

  1. 补充 Profile 编辑页设计文档
  2. 后台数据结构增加表单视图模型
  3. 将 Profile 详情页替换为四个 tab 的编辑页
  4. 接入保存逻辑
  5. 接入生成预览逻辑
  6. 接入上传为候选配置逻辑
  7. 跑本地 UI 与服务测试
  8. 再由设备侧验证实际下发与应用链路

结论

Profile 编辑页应成为“单设备独有属性”的权威编辑入口,而不是继续做成原始 JSON 的浏览页。

它的边界必须非常明确:

  • 共享服务归模板
  • 单设备属性归 Profile
  • 差异调优归 Overlay

只有这样,后续“设备命名、视频源、输出流、候选配置下发”这条主线才会真正清晰,后台的配置管理也才不会重新退回到信息混杂、入口重复的状态。