# 模型管理 & 人脸库管理 改进实施方案 > 关联文档:[产品化改进计划](./产品化改进计划.md) → P2-14 / P2-15 > 跟踪状态:[实施跟踪](./实施跟踪.md) ## 改造原则 最小侵入,最大复用。人脸库的核心问题是"基建已就绪但没接上",不重写已有逻辑,而是**连通断点**。 --- ## 一、人脸库管理(P2-15) ### 问题回顾 | 现有能力 | 问题 | |----------|------| | 人员 CRUD、照片管理 | ✅ 正常 | | Python Build 脚本生成 face_gallery.db | ✅ 正常 | | 产出落到 `resources/standard_resources/face_gallery/` | ✅ 已就位 | | Resource Task 系统(`resource_sync_all`/`resource_sync_one`) | ✅ 已就位 | | ResourceStatusBoard 对比矩阵 | ✅ 已就位 | | 从人脸库页面触发批量同步 | ❌ 缺失 | | 查看设备上人脸库版本/状态 | ❌ 缺失 | | 搜索过滤人员 | ❌ 缺失 | ### 改动清单 #### 1.1 人脸库页面增加"同步到设备"区域 **文件**: `internal/web/ui/templates/face_gallery.html` 在人脸库页面底部新增一个卡片区域: - 显示当前 `face_gallery.db` 构建状态(最后构建时间、人数、照片数) - 显示设备同步状态矩阵(复用 `ResourceStatusBoard`,筛选 `resource_type=face_gallery`) - "同步到全部设备"按钮 → 创建 `resource_sync_all` 任务 - 单设备"同步"按钮 → 创建 `resource_sync_one` 任务 **后端改动**: - `pageFaceGallery` handler 增加:查询 `standard_resources` 中 `resource_type=face_gallery` 的记录、构建 `ResourceStatusBoard` - 新增 `actionFaceGallerySync` handler:接收 `device_id[]`,调用 `taskSvc.CreateTask("resource_sync_all", deviceIDs, payload)` #### 1.2 Build 后自动注册为标准资源 **文件**: `internal/web/ui.go` - `actionFaceGalleryBuild` 现有 Build 后只返回消息,需要增加: 1. Build 成功后扫描 `resources/standard_resources/face_gallery/` 目录 2. 调用 `resourceSvc.SyncStandardResourcesFromDirectory()` 或其局部逻辑 3. 将 `face_gallery.db` 的 SHA256/hash/size 写入 `standard_resources` 表 这样 Build 完后,Resource 分发系统就能自动感知到新版本。 **实现要点**: ```go // actionFaceGalleryBuild 中,build 成功后: hash, size := hashFile(outputDB) resourcesRepo.Save(StandardResourceRecord{ Name: "face_gallery", ResourceType: "face_gallery", SHA256: hash, SizeBytes: size, FilePath: outputDB, }) ``` #### 1.3 人员搜索与过滤 **文件**: `internal/storage/face_gallery_repo.go` + `face_gallery.html` - `FaceGalleryRepo` 新增 `SearchPersons(keyword string) ([]PersonRecord, error)` - 模板增加搜索框,输入关键词实时过滤人员列表(前端 JS 过滤即可,数据量小) #### 1.4 人脸质量评分展示 **文件**: `internal/service/face_gallery_builder.go` + `face_gallery.html` - Build 脚本的输出中解析每张照片的 quality score(如果 build_gallery.py 有输出的话) - 在人员详情编辑弹窗中,每张照片旁显示质量标签(高/中/低) 如果 `build_gallery.py` 当前不输出质量分,则作为可选项推迟。 --- ## 二、模型管理(P2-14) ### 问题回顾 | 现有能力 | 问题 | |----------|------| | 目录扫描同步到 DB | ✅ 正常 | | ModelStatusBoard 对比矩阵 | ✅ 正常 | | Task 系统批量同步 | ✅ 正常 | | "更新全部模型"按钮 | ✅ 已就位 | | **上传新模型** UI | ❌ 按钮存在但无功能 | | 模型版本管理 | ❌ 版本字段固定为 "auto" | | 设备兼容性检查 | ❌ 不做区分,所有模型对所有设备 | ### 改动清单 #### 2.1 "上传新模型"功能实现 **文件**: `internal/web/ui/templates/models.html` + `internal/web/ui.go` - 点击"上传新模型"弹出模态框 - 表单:模型名、模型类型(下拉选择)、描述、文件选择(.rknn) - 上传后: 1. 保存文件到 `models/standard_models/{filename}` 2. 计算 SHA256 3. 写入 `standard_models` 表 4. 可选:立即分发到所有在线设备(checkbox) **新增 handler**: `POST /ui/models/upload` ```go func (u *UI) actionModelUpload(w http.ResponseWriter, r *http.Request) { // multipart form: name, model_type, description, file // 1. Save file to models/standard_models/ // 2. Hash + save to standard_models table // 3. Optional: create model_sync_all task } ``` **路由注册**: 在 `Routes()` 中添加 `r.Post("/models/upload", u.actionModelUpload)` #### 2.2 模型版本管理 **文件**: `internal/storage/models_repo.go` + `internal/service/model_management.go` + `models.html` - `StandardModelRecord.Version` 字段从固定 "auto" 改为基于文件修改时间的语义化版本(如 `2026-07-17-v1`) - 上传时允许用户指定版本号(可留空自动生成) - 模板中已有版本列,展示即可 #### 2.3 设备兼容性矩阵 **文件**: `internal/service/model_management.go` + `models.html` 当前 `ModelStatusBoard` 对所有设备检查所有模型。改进: - `BuildModelStatusBoard` 接收可选的设备 capability 信息 - 如果设备不支持人脸识别(没有 face_recognition capability),则 `face_recognition` 类型的模型标记为 "N/A" 而非 "缺失" - 矩阵中增加灰色 "N/A" pill,区别于红色的 "缺失" **实现要点**: - 在 `pageModels` 中查询设备 `/v1/capabilities`,缓存到 map - 传给 `BuildModelStatusBoard` 一个新参数 `deviceCapabilities map[string][]string` - Cell 增加第三种状态 `"na"` → 灰色 pill "不适用" #### 2.4 "更新全部模型"增强 当前已有此功能,只做小优化: - 改为只更新需要更新的设备(缺失或不一致的),而不是全量推送 - 这在前端层面做过滤:只提交 `status != "ok"` 的设备 ID --- ## 三、实施顺序 ``` 第1步:人脸库 - Build后自动注册为标准资源 (1.2) ← ✅ 已完成 第2步:人脸库 - 同步到设备区域 (1.1) ← 页面UI接入Task系统 第3步:人脸库 - 人员搜索过滤 (1.3) ← 交互优化 第4步:模型管理 - 上传新模型功能 (2.1) ← 补全核心功能 第5步:模型管理 - 设备兼容性矩阵 (2.3) ← 展示优化 第6步:模型管理 - 版本管理 (2.2) ← 锦上添花 第7步:人脸库 - 质量评分展示 (1.4) ← 可选 ``` ## 四、涉及文件一览 | 文件 | 改动类型 | |------|----------| | `internal/web/ui.go` | 新增/修改 handlers,增加 face gallery sync + model upload | | `internal/web/ui/templates/face_gallery.html` | 增加同步区域、搜索框、质量展示 | | `internal/web/ui/templates/models.html` | 实现上传模态框、兼容性显示 | | `internal/storage/face_gallery_repo.go` | 新增 `SearchPersons` | | `internal/service/model_management.go` | `BuildModelStatusBoard` 支持 capability 过滤 | | `internal/service/face_gallery_builder.go` | 可选:解析质量分 |