Update application UI and functionality

This commit is contained in:
2026-07-26 16:20:36 +08:00
parent b9aff58f32
commit 97ea6fb7aa
48 changed files with 2790 additions and 628 deletions
@@ -4,6 +4,8 @@ import (
"fmt"
"os"
"path/filepath"
"regexp"
"strings"
webassets "ymhut-box/server/unified-management/web"
)
@@ -44,13 +46,47 @@ func Preflight(cfg *Config) []Check {
checkSeedFile("legacy update-info", filepath.Join(cfg.UpdatePublicDir, "update-info.json"), []byte(defaultUpdateInfoJSON)),
checkSeedFile("legacy media-types", filepath.Join(cfg.UpdatePublicDir, "media-types.json"), []byte(defaultMediaTypesJSON)),
checkNoticeIndex("version notice index", filepath.Join(cfg.UpdateNoticeDir, "total.json")),
checkWebBuild("admin web dist", cfg.AdminWebDir, "admin/dist"),
checkAdminWebBuild("admin web dist", cfg.AdminWebDir, "admin/dist"),
checkWebBuild("portal web dist", cfg.PortalWebDir, "portal/dist"),
checkWebBuild("setup web dist", cfg.SetupWebDir, "setup/dist"),
}
return checks
}
var adminPreflightAssetPattern = regexp.MustCompile(`(?:src|href)=["'](/admin/assets/[^"'?#]+)`)
func checkAdminWebBuild(name, path, embedRoot string) Check {
check := checkWebBuild(name, path, embedRoot)
if check.Status != "ok" || strings.Contains(check.Message, "embedded frontend assets") {
return check
}
index := filepath.Join(path, "index.html")
data, err := os.ReadFile(index)
if err != nil {
return check
}
matches := adminPreflightAssetPattern.FindAllSubmatch(data, -1)
if len(matches) == 0 {
return Check{Name: name, Status: "error", Path: index, Message: "index.html does not reference any /admin/assets files"}
}
for _, match := range matches {
assetPath := strings.TrimPrefix(string(match[1]), "/admin/")
if strings.Contains(assetPath, "..") || strings.ContainsAny(assetPath, `\`) {
return Check{Name: name, Status: "error", Path: index, Message: fmt.Sprintf("invalid admin asset reference %s", assetPath)}
}
info, statErr := os.Stat(filepath.Join(path, filepath.FromSlash(assetPath)))
if statErr == nil && !info.IsDir() {
continue
}
message := fmt.Sprintf("disk asset %s is missing", assetPath)
if embeddedWebBuildOK(embedRoot) {
return Check{Name: name, Status: "ok", Path: path, Message: message + "; using embedded frontend assets"}
}
return Check{Name: name, Status: "error", Path: filepath.Join(path, filepath.FromSlash(assetPath)), Message: message}
}
return check
}
func checkDir(name, path string, create bool) Check {
if create {
if err := os.MkdirAll(path, 0o750); err != nil {