// 平台核心 API 的启动入口。 package main import ( "context" "errors" "log/slog" "net/http" "os" "os/signal" "syscall" "time" "git.apinb.com/heqiapp/platforms/backend/internal/config" "git.apinb.com/heqiapp/platforms/backend/internal/database" platformhttp "git.apinb.com/heqiapp/platforms/backend/internal/http" ) func main() { appConfig := config.Load() logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) pool, err := database.Connect(context.Background(), appConfig.DatabaseURL) if err != nil { logger.Error("连接 PostgreSQL 失败", "error", err) os.Exit(1) } defer pool.Close() if err := database.MigrateAndSeed(context.Background(), pool); err != nil { logger.Error("初始化数据库失败", "error", err) os.Exit(1) } server := &http.Server{ Addr: ":" + appConfig.Port, Handler: platformhttp.NewRouter(pool, logger), ReadHeaderTimeout: 5 * time.Second, } go func() { logger.Info("平台核心 API 已启动", "address", server.Addr) if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { logger.Error("HTTP 服务异常退出", "error", err) os.Exit(1) } }() stop := make(chan os.Signal, 1) signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM) <-stop shutdownContext, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := server.Shutdown(shutdownContext); err != nil { logger.Error("HTTP 服务停止失败", "error", err) } }