# SafeSight Control 产品化改进计划 ## 目标 将后台管理从"工程师界面"改造为"安全管理员界面",让非技术用户能够独立完成: 1. 添加摄像头并部署检测场景 2. 日常查看安全违规情况 3. 处理和跟踪告警事件 ## 优先级说明 - **P0** — 不做就不可交付给普通用户 - **P1** — 严重影响日常体验 - **P2** — 锦上添花,提升满意度 --- ## P0:必须立即完成(交付底线) ### 1. 告警中心增强 **现状**:告警已持久化到 SQLite、有日期筛选分页、仪表盘有今日统计。缺的是工作流和等级。 **改什么**: - DB 迁移:`alarm_records` 表增加 `status`, `severity`, `acknowledged_at`, `acknowledged_by`, `resolved_at`, `resolved_by` 列 - 告警状态流转:未处理 → 已确认 → 已关闭,记录操作人和时间 - 严重等级:`info / warning / critical`,默认值 `warning` - 筛选增强:加设备下拉筛选、规则类型下拉筛选(现有日期筛选保留) - SSE 实时推送:新告警到达时推送浏览器 **实现要点**: - migration 用 `hasColumn` 检查列存在,`ALTER TABLE ADD COLUMN` 增量添加 - `AlarmRecord` 结构体扩展字段,`saveAlarm` 设置默认值 - API:`POST /ui/alarms/{id}/acknowledge`、`/resolve`、`/severity` - 模板:加严重等级列(蓝/橙/红 pill)、状态列、操作按钮列 - SSE:`GET /api/alarms/stream`,浏览器 EventSource 连接,为 P0-2 仪表盘打基础 ### 2. 仪表盘重做 **现状问题**:4 个数字 + 离线列表,看不到任何安全违规信息 **改什么**: - 顶部统计卡片改为:今日告警总数、未处理告警数、在线设备数、运行中检测路数 - 中部新增"最近告警"实时流(SSE 推送),卡片式展示:抓拍图 + 规则名 + 设备名 + 时间 - 底部新增"设备状态概览":在线/离线/异常卡片网格 - 点击任意告警卡片跳转到告警中心对应详情 **实现要点**: - 新增 SSE 端点 `/api/alarms/stream`,`AlarmCollector` 收到告警时广播 - 仪表盘页面 JS 连接 SSE,追加告警卡片到 DOM - 告警卡片带抓拍缩略图(/ui/hls 代理或 snapshot 直连) ### 3. 一键配置向导(场景化部署) **现状问题**:配置一台摄像头需要跨 5 个页面 9 个步骤 **改什么**: - 新增页面 `/ui/wizard`,标准模式下直接可见 - **_步骤1/3_:选择设备** — 列出在线设备,每个设备显示当前已加载的摄像头 - **_步骤2/3_:配置检测** — 显示该设备上所有视频源,每个视频源可以: - 勾选要启用的检测项(安全帽、工鞋、人脸等) - 设置告警灵敏度(高/中/低) - 预览视频画面 - **_步骤3/3_:确认并下发** — 展示配置摘要,确认后自动生成模板+Profile+识别单元→下发到设备 **实现要点**: - 后端新增 `/api/wizard/preview` 和 `/api/wizard/apply` 端点 - 内部调用现有的 `AutoConfigService` 和任务系统 - 前端用步骤条(stepper)展示进度,每步一个卡片 - "检测项"从设备 `/v1/capabilities` 获取,用直观的图标+描述展示 ### 4. 基础登录鉴权 **现状问题**:任何人都能访问 18080 端口做任何操作 **改什么**: - 内置单管理员账号,密码在 `safesightd.json` 配置 - 登录页 `/ui/login`,成功后设 session cookie - 所有 `/api/` 和 `/ui/` 路由(除 login 和静态资源)需要鉴权 - 半小时无操作自动退出 **实现要点**: - 新建 `internal/auth/` 包,提供 `Login(password) bool` + `SessionMiddleware` - 用 `crypto/bcrypt` 存密码哈希(配置中存 `password_hash`) - 用随机 token + 内存 map 做 session(不需要 Redis) ### 5. 监控页 HLS.js 本地化 **现状问题**:monitor.html 从 CDN 加载 hls.js,断网部署下无法使用 **改什么**: - 将 hls.js 引用改为本地 `/ui/assets/vendor/hls.min.js` - 与管控台页面保持一致 **实现要点**: - 1 行 templat 修改 --- ## P1:短期必须完成(严重影响体验) ### 6. 告警浏览器通知 **现状问题**:告警要手动刷新页面才能看到 **改什么**: - 告警产生时,浏览器标签页标题闪烁 `[N] SafeSight`(N 为新告警数) - 有未处理告警时,顶栏通知铃图标显示红点+数量 - 可选:支持桌面通知(`Notification API`),用户授权后弹窗 **实现要点**: - 复用 P0 的 SSE 端点 `/api/alarms/stream` - JS 监听 SSE 事件,更新顶栏通知铃和页面标题 ### 7. 设备列表服务健康指示 **现状问题**:设备列表只显示在线/离线,看不到内部服务状态 **改什么**: - 设备列表每行增加媒体服务状态指示灯(运行中/已停止/异常) - 在线但媒体服务异常的设备,行背景变淡橙色警告 - 悬停显示详细状态:CPU 使用率、内存、最后心跳时间 **实现要点**: - 后端在设备列表查询时附带最近一次 metrics 摘要 - CSS 新增 `.device-row.warn` 样式 ### 8. 操作结果提示优化 **现状问题**:成功/失败用 URL 参数传递消息,粗暴且易丢失 **改什么**: - 改用 session flash message:操作完成后在 HTTP header 设 cookie,下次页面渲染时展示 - 页面顶部显示 toast 式消息条,3 秒自动消失,绿色成功/红色失败 - 替代现有的 URL query 参数消息机制 **实现要点**: - middleware 层面处理 flash cookie - 模板 layout.html 顶部增加 toast 组件 ### 9. 术语统一 **现状问题**:同一概念在多个页面叫法不同 **改什么**: - 全局统一: - "视频通道" → "检测通道"(与视频源区分) - "场景模板" → "检测模板"(与场景管理区分) - "识别单元" → "检测通道"(与设备赋值对齐) - 菜单项和页面标题同步修改 **实现要点**: - 批量替换模板中的中文标签 - 路由不变,只改显示文本 --- ## P2:长期优化(提升满意度) ### 10. 时序图表 - 告警趋势图(按天/周/月,按规则类型分组) - 设备资源使用趋势图(CPU/内存/NPU) - 检测统计图(今日/本周识别次数、各设备负载) **实现**:使用轻量 Canvas 图表库(如 Chart.js 或 uPlot),数据从聚合查询获取 ### 11. 设备分组与标签 - 支持按车间/区域分组设备 - 设备列表增加分组筛选 - 批量操作支持按组选择 ### 12. 配置版本对比 - 查看历史配置版本列表 - 选择两个版本做 diff 对比(JSON diff) - 回滚前预览变更内容 ### 13. 报告导出 - 告警报告导出为 PDF/CSV - 设备状态报告 - 支持选择时间范围和过滤条件 ### 14. 模型管理简化 **现状**:模型通过目录扫描同步到 DB,Task 系统支持 `model_sync_all`/`model_sync_one` 批量分发,`ModelStatusBoard` 展示设备上的模型 SHA256 对比矩阵。缺的是上传入口和兼容性判断。 **架构**:管理端 `models/standard_models/` → 启动时同步到 `standard_models` 表 → UI 对比矩阵 → Task 推送到 Edge 的 `/v1/models/{name}`。架构正确,只需补全缺口。 **改什么**: - Web 页面上传新模型:文件上传 → 存盘 → 入库 → 可选自动分发 - 版本管理:版本号从固定 "auto" 改为基于时间戳自动生成 - 兼容性矩阵:设备不支持某类检测能力时(如无人脸识别),对应模型显示 "N/A" 而非 "缺失" - "更新全部"只推送给需要更新的设备(缺失或不一致),避免无效传输 ### 15. 人脸库优化 **现状**:人员 CRUD(`face_persons`/`face_photos` 表)正常,Python Build 脚本产出 `face_gallery.db` 到 `resources/standard_resources/face_gallery/`。但分发用的是设备详情页的逐台手动上传,没有利用已有的 Resource Task 分发系统。 **架构**:已有 Resource 分发基础设施(`resource_sync_all`/`resource_sync_one` Task、`ResourceStatusBoard` 对比矩阵、`/v1/resources/status` 端点),人脸库应作为 `resource_type=face_gallery` 的资源接入这套体系,而非走独立的设备上传通道。 **改什么**: - Build 产出自动注册:Build 完成后将 `face_gallery.db` 的 hash/size 自动写入 `standard_resources` 表,让 Resource 分发系统感知 - 同步到设备:人脸库页面增加设备同步状态区域(复用 `ResourceStatusBoard` 筛选 `face_gallery`),加"同步到全部设备"按钮 - 搜索过滤:人员列表增加关键词搜索 - 人脸质量评分反馈:在人员详情中展示每张照片的质量等级(依赖 build_gallery.py 输出) --- ## 实施时序 ``` 已完成:P0-5(HLS 修复) ↓ 进行中:P0-1(告警增强) → P0-2(仪表盘重做) ↓ 待开始:P0-3(配置向导) → P1(体验打磨) → P0-4(登录) → P2(长期优化) ``` ## 技术债务同步处理 在实现上述功能时,顺手清理: - 提取模板函数到独立文件(当前约 300 行挤在一个函数里) - 统一设备健康检查的 timeout 策略 - 为所有新增 API 建立测试用例 - `.gitignore` 覆盖所有构建产物