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}}
| 设备 | @@ -83,42 +82,69 @@非标资源 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
- {{.DeviceName}}
- {{.DeviceID}}
- |
- {{range .Cells}}
- - {{if eq .Status "ok"}}一致 - {{else if eq .Status "mismatch"}}不一致 - {{else}}缺失{{end}} - | - {{end}} -
- {{if gt .ExtraCount 0}}
-
-
- {{else}}
- 0
- {{end}}
- {{.ExtraCount}} 个 · 更多-
- {{range .ExtraResources}}
-
- {{.Name}}
- {{end}}
- |
- ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 暂无设备资源状态。请先确保设备在线且 agent 实现了 GET /v1/resources/status 端点。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 正在加载设备资源状态… | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||