package main import ( "backend/config" "backend/database" "backend/router" "context" "log" "net/http" "os" "os/signal" "syscall" "time" ) func main() { // 加载配置 // Logan.Li cfg := config.Load() // 初始化数据库 // Logan.Li db, err := database.Init(cfg) if err != nil { log.Fatal("数据库初始化失败:", err) } // 初始化路由 // Logan.Li r := router.SetupRouter(db, cfg) // 单二进制构建时提供嵌入的 Vue 前端;开发模式会自动跳过。 // Logan.Li setupEmbeddedFrontend(r) // 启动服务器 // Logan.Li addr := ":" + cfg.Port srv := &http.Server{ Addr: addr, Handler: r, } // 优雅关机: 在独立 goroutine 中启动服务器 // Logan.Li go func() { log.Printf("服务器启动在 %s", addr) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatal("服务器启动失败:", err) } }() // 等待中断信号 // Logan.Li quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("正在关闭服务器...") // 设置 5 秒超时来关闭服务器 // Logan.Li ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { log.Fatal("服务器强制关闭:", err) } log.Println("服务器已优雅关闭") }