# 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` 覆盖所有构建产物
