refactor(webui): dashboard.html 6637 行拆成「外壳 + 样式 + 脚本」

前端刻意没有构建链(纯 CSS + Vanilla JS,go:embed 进二进制),所以拆法是:
外壳 dashboard.html 留 {{DASHBOARD_CSS}} / {{DASHBOARD_JS}} 两个占位符,
init() 启动时把两份资产原样填回去 —— **发出的 HTML 与拆分前逐字节一致**,
但 6637 行的单文件变成三份,便于编辑与评审。

  dashboard.html   168 行   外壳(head/body 结构 + 两个占位符)
  dashboard.css   2099 行   样式
  dashboard.js    4371 行   脚本

逐字节校验(三重):
  * 组装结果 sha256 == git HEAD 里拆分前的 dashboard.html;
  * 真实实例 GET /(带 API key)返回体 sha256 同上:0ef14b49…c053;
  * 新增 TestDashboardAssetsSplit:占位符必须存在、样式/脚本不得再内联回外壳、
    组装结果不得残留占位符且必须含样式与脚本特征串。

按行号切片时踩过一次坑并已修正:`</style>`/`</script>` 两个闭合标签被切掉
(正好少 27 字节)——正是因为当时少了逐字节校验,现在把它固化成断言。
This commit is contained in:
HomeAgent Agent
2026-09-14 07:17:23 +08:00
parent 4cbfdc970c
commit 764939ed90
5 changed files with 6535 additions and 6474 deletions

View File

@ -1292,3 +1292,43 @@ func TestChatPersistenceIsThrottled(t *testing.T) {
// Close 幂等
h.Close()
}
// TestDashboardAssetsSplit 钉住前端的拆分方式:
// 外壳 dashboard.html 只留两个占位符,样式与脚本分别在 dashboard.css / dashboard.js
// 启动时组装回**与拆分前逐字节一致**的页面(拆分当日已用 git 里的原文件比对通过)。
func TestDashboardAssetsSplit(t *testing.T) {
shell, err := dashboardFS.ReadFile("dashboard.html")
if err != nil {
t.Fatalf("读 dashboard.html: %v", err)
}
for _, ph := range []string{"{{DASHBOARD_CSS}}", "{{DASHBOARD_JS}}"} {
if !strings.Contains(string(shell), ph) {
t.Fatalf("外壳里应保留占位符 %s", ph)
}
}
// 样式/脚本不能又塞回外壳(否则拆分名存实亡)
if strings.Contains(string(shell), "--sakura-300") {
t.Fatal("dashboard.html 里仍内联着样式,拆分未生效")
}
if strings.Contains(string(shell), "function saveSetting") {
t.Fatal("dashboard.html 里仍内联着脚本,拆分未生效")
}
css, err := dashboardFS.ReadFile("dashboard.css")
if err != nil || len(css) == 0 {
t.Fatalf("读 dashboard.css: %v (%d 字节)", err, len(css))
}
js, err := dashboardFS.ReadFile("dashboard.js")
if err != nil || len(js) == 0 {
t.Fatalf("读 dashboard.js: %v (%d 字节)", err, len(js))
}
// 组装结果:占位符必须都被替换掉,且样式/脚本内容都在里面
if strings.Contains(dashboardHTML, "{{DASHBOARD_") {
t.Fatal("组装后的页面仍残留占位符")
}
if !strings.Contains(dashboardHTML, "--sakura-300") {
t.Fatal("组装后的页面缺样式")
}
if !strings.Contains(dashboardHTML, "function saveSetting") {
t.Fatal("组装后的页面缺脚本")
}
}