web_ui.go 991 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package main
  2. import (
  3. "context"
  4. "embed"
  5. "io/fs"
  6. "net/http"
  7. "time"
  8. )
  9. //go:embed web/*
  10. var webRootFS embed.FS
  11. type WebUI struct {
  12. fs fs.FS
  13. mux *http.ServeMux
  14. server *http.Server
  15. }
  16. func NewWebUI(addr string) (*WebUI, error) {
  17. sub, err := fs.Sub(webRootFS, "web")
  18. if err != nil {
  19. return nil, err
  20. }
  21. mux := http.NewServeMux()
  22. static := http.FileServer(http.FS(sub))
  23. mux.Handle(
  24. "/static/",
  25. static,
  26. )
  27. registerRoutes(mux)
  28. return &WebUI{
  29. fs: sub,
  30. mux: mux,
  31. server: &http.Server{
  32. Addr: addr,
  33. Handler: mux,
  34. },
  35. }, nil
  36. }
  37. func (ui *WebUI) Start() error {
  38. startSessionCleaner() // session过期自动回收
  39. ui.mux.HandleFunc("/", ui.rootHandler)
  40. return ui.server.ListenAndServe()
  41. }
  42. func (ui *WebUI) Stop() error {
  43. if ui.server == nil {
  44. return nil
  45. }
  46. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  47. defer cancel()
  48. if err := ui.server.Shutdown(ctx); err != nil {
  49. ui.server.Close()
  50. return err
  51. }
  52. return nil
  53. }