package main import ( "context" "embed" "io/fs" "net/http" "time" ) //go:embed web/* var webRootFS embed.FS type WebUI struct { fs fs.FS mux *http.ServeMux server *http.Server } func NewWebUI(addr string) (*WebUI, error) { sub, err := fs.Sub(webRootFS, "web") if err != nil { return nil, err } mux := http.NewServeMux() static := http.FileServer(http.FS(sub)) mux.Handle( "/static/", static, ) registerRoutes(mux) return &WebUI{ fs: sub, mux: mux, server: &http.Server{ Addr: addr, Handler: mux, }, }, nil } func (ui *WebUI) Start() error { startSessionCleaner() // session过期自动回收 ui.mux.HandleFunc("/", ui.rootHandler) return ui.server.ListenAndServe() } func (ui *WebUI) Stop() error { if ui.server == nil { return nil } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := ui.server.Shutdown(ctx); err != nil { ui.server.Close() return err } return nil }