assets.go 936 B

12345678910111213141516171819202122232425262728293031323334
  1. package main
  2. import (
  3. "embed"
  4. "io/fs"
  5. "net/http"
  6. )
  7. // 静态页面独立放在 web/ 目录, 用 embed.FS 打进 exe 的资源区 ——
  8. // 编译产物自带 UI: 不再依赖运行目录, 也不会把工作目录里的其它文件顺带暴露出去。
  9. //
  10. //go:embed web
  11. var webFS embed.FS
  12. // webRoot 返回 web/ 子文件系统 (去掉 "web" 这一层前缀)。
  13. func webRoot() fs.FS {
  14. sub, err := fs.Sub(webFS, "web")
  15. if err != nil {
  16. return webFS
  17. }
  18. return sub
  19. }
  20. // homeH 返回单页应用首页。页面已烧进二进制, 直接读 embed 即可。
  21. func homeH(w http.ResponseWriter, r *http.Request) {
  22. b, err := fs.ReadFile(webFS, "web/index.html")
  23. if err != nil {
  24. http.Error(w, "web/index.html 未嵌入: "+err.Error(), http.StatusInternalServerError)
  25. return
  26. }
  27. w.Header().Set("Content-Type", "text/html; charset=utf-8")
  28. w.Header().Set("Cache-Control", "no-store, no-cache, must-revalidate")
  29. _, _ = w.Write(b)
  30. }