mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-25 11:28:08 +00:00
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:
@ -21,7 +21,7 @@ import (
|
||||
// 本文件是 WebUI 的骨架:嵌入式前端资源、Handler 结构、构造、路由表、
|
||||
// 鉴权/会话/日志中间件与静态页。各资源的具体 handler 见同包 handler_*.go。
|
||||
|
||||
//go:embed dashboard.html mascot.webp logo.svg
|
||||
//go:embed dashboard.html dashboard.css dashboard.js mascot.webp logo.svg
|
||||
var dashboardFS embed.FS
|
||||
|
||||
var dashboardHTML string
|
||||
@ -56,11 +56,30 @@ document.getElementById('login-form').addEventListener('submit',async(e)=>{e.pre
|
||||
document.getElementById('password').addEventListener('keydown',function(e){if(e.key==='Enter')document.getElementById('login-form').dispatchEvent(new Event('submit'))});
|
||||
</script></body></html>`
|
||||
|
||||
// dashboardHTML 是组装好的控制台页面:dashboard.html 外壳 + dashboard.css + dashboard.js。
|
||||
//
|
||||
// 前端刻意没有构建链,所以拆分的办法是:外壳里留 {{DASHBOARD_CSS}} / {{DASHBOARD_JS}}
|
||||
// 两个占位符,启动时把两个资产原样填回去——**发出的 HTML 与拆分前逐字节一致**,
|
||||
// 但 6637 行的单文件变成「外壳 + 样式 + 脚本」三份,便于编辑与评审。
|
||||
func init() {
|
||||
data, err := dashboardFS.ReadFile("dashboard.html")
|
||||
if err == nil {
|
||||
dashboardHTML = string(data)
|
||||
html, err := dashboardFS.ReadFile("dashboard.html")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
out := string(html)
|
||||
for _, a := range []struct{ placeholder, file string }{
|
||||
{"{{DASHBOARD_CSS}}", "dashboard.css"},
|
||||
{"{{DASHBOARD_JS}}", "dashboard.js"},
|
||||
} {
|
||||
body, err := dashboardFS.ReadFile(a.file)
|
||||
if err != nil {
|
||||
log.Printf("[webui] 读取前端资产 %s 失败: %v", a.file, err)
|
||||
continue
|
||||
}
|
||||
// 资产文件末尾的换行由占位符所在行自己的换行承担,避免多出空行。
|
||||
out = strings.Replace(out, a.placeholder, strings.TrimRight(string(body), "\n"), 1)
|
||||
}
|
||||
dashboardHTML = out
|
||||
}
|
||||
|
||||
type Handler struct {
|
||||
|
||||
Reference in New Issue
Block a user