From 2289802dac7214befcb1657e9af82d4e27a71512 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Wed, 6 May 2026 14:00:16 +0800 Subject: [PATCH] feat: lazy-load device resource status via AJAX --- internal/web/ui.go | 28 +++++- internal/web/ui/templates/resources.html | 112 ++++++++++++++--------- 2 files changed, 92 insertions(+), 48 deletions(-) diff --git a/internal/web/ui.go b/internal/web/ui.go index be451c8..a896621 100644 --- a/internal/web/ui.go +++ b/internal/web/ui.go @@ -610,6 +610,7 @@ func (u *UI) Routes() (chi.Router, error) { r.Get("/system", u.pageSystem) r.Get("/system/db-backup", u.pageSystemDBBackup) r.Get("/resources", u.pageResources) + r.Get("/api/resources/device-status", u.apiResourceDeviceStatus) r.Post("/system/db-restore", u.actionSystemDBRestore) r.Get("/api/graph-node-types", u.apiGraphNodeTypes) r.Get("/device-config", u.pageDeviceConfig) @@ -1418,14 +1419,31 @@ func (u *UI) pageResources(w http.ResponseWriter, r *http.Request) { data.OnlineCount++ } } - board := service.ResourceStatusBoard{} if strings.TrimSpace(u.dbPath) != "" { if store, err := storage.OpenSQLite(u.dbPath); err == nil { resourcesRepo := storage.NewResourcesRepo(store.DB()) if items, err := resourcesRepo.List(); err == nil { data.StandardResources = items + } + _ = store.Close() + } + } + u.render(w, r, "resources", data) +} + +func (u *UI) apiResourceDeviceStatus(w http.ResponseWriter, r *http.Request) { + u.ensureDevicesLoaded() + devices := u.registry.GetDevices() + board := service.ResourceStatusBoard{ + Summary: service.ResourceStatusSummary{Devices: len(devices)}, + } + if strings.TrimSpace(u.dbPath) != "" { + if store, err := storage.OpenSQLite(u.dbPath); err == nil { + resourcesRepo := storage.NewResourcesRepo(store.DB()) + if items, err := resourcesRepo.List(); err == nil { + board.Summary.StandardResources = len(items) installed := map[string][]service.InstalledResourceStatus{} - for _, device := range data.Devices { + for _, device := range devices { if device == nil || !device.Online { continue } @@ -1434,13 +1452,13 @@ func (u *UI) pageResources(w http.ResponseWriter, r *http.Request) { installed[device.DeviceID] = items } } - board = service.BuildResourceStatusBoard(data.StandardResources, data.Devices, installed) + board = service.BuildResourceStatusBoard(items, devices, installed) } _ = store.Close() } } - data.ResourceStatusBoard = &board - u.render(w, r, "resources", data) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(board) } func (u *UI) actionResourceSync(w http.ResponseWriter, r *http.Request) { diff --git a/internal/web/ui/templates/resources.html b/internal/web/ui/templates/resources.html index 81258f0..a3772b7 100644 --- a/internal/web/ui/templates/resources.html +++ b/internal/web/ui/templates/resources.html @@ -1,5 +1,4 @@ {{define "resources"}} -{{$board := .ResourceStatusBoard}}
@@ -7,7 +6,7 @@
统一维护标准资源,设备侧通过任务同步。当前支持人脸库等资源类型。
-
+ {{range .Devices}}{{if .Online}}{{end}}{{end}} @@ -17,7 +16,7 @@
{{icon "template"}}标准资源总数
-
{{if $board}}{{$board.Summary.StandardResources}}{{else}}0{{end}}
+
{{len .StandardResources}}
{{icon "devices"}}在线设备数
@@ -25,15 +24,15 @@
{{icon "assets"}}完整设备数
-
{{if $board}}{{$board.Summary.CompleteDevices}}{{else}}0{{end}}
+
-
{{icon "warn"}}缺失设备数
-
{{if $board}}{{$board.Summary.MissingDevices}}{{else}}0{{end}}
+
-
{{icon "service"}}不一致设备数
-
{{if $board}}{{$board.Summary.MismatchDevices}}{{else}}0{{end}}
+
-
@@ -67,15 +66,15 @@
-
+

{{icon "devices"}}设备资源状态

-
按标准资源逐项比对设备已安装状态,缺失和不一致会直接标出。
+
按标准资源逐项比对设备已安装状态,缺失和不一致会直接标出。
- +
@@ -83,42 +82,69 @@ - - {{if and $board (gt (len $board.Rows) 0)}} - {{range $board.Rows}} - - - {{range .Cells}} - - {{end}} - - - {{end}} - {{else}} - - {{end}} + +
设备非标资源
-
{{.DeviceName}}
-
{{.DeviceID}}
-
- {{if eq .Status "ok"}}一致 - {{else if eq .Status "mismatch"}}不一致 - {{else}}缺失{{end}} - - {{if gt .ExtraCount 0}} -
- {{.ExtraCount}} 个 · 更多 -
- {{range .ExtraResources}} -
{{.Name}}
- {{end}} -
-
- {{else}} - 0 - {{end}} -
暂无设备资源状态。请先确保设备在线且 agent 实现了 GET /v1/resources/status 端点。
正在加载设备资源状态…
+ + {{end}}