// Command server 是 portal-mini-go 的统一服务入口, // 承载 10 个小程序与后台管理。 package main import ( "log/slog" "os" "strconv" "time" "gorm.io/driver/mysql" "gorm.io/gorm" "portal-mini-go/internal/pkg/config" "portal-mini-go/internal/pkg/session" "portal-mini-go/internal/router" ) func main() { cfg, err := config.Load("") if err != nil { slog.Error("load config", slog.Any("err", err)) os.Exit(1) } setupLogger(cfg.Logging) db, err := gorm.Open(mysql.Open(cfg.MySQL.DSN()), &gorm.Config{}) if err != nil { slog.Error("open db", slog.Any("err", err)) os.Exit(1) } sqlDB, err := db.DB() if err != nil { slog.Error("get sql.DB", slog.Any("err", err)) os.Exit(1) } sqlDB.SetMaxIdleConns(cfg.MySQL.MaxIdleConns) sqlDB.SetMaxOpenConns(cfg.MySQL.MaxOpenConns) sqlDB.SetConnMaxLifetime(time.Duration(cfg.MySQL.ConnMaxLifetime) * time.Second) store := session.NewMemoryStore() r := router.New(cfg, db, store) addr := ":" + strconv.Itoa(cfg.Server.Port) slog.Info("server starting", slog.String("addr", addr)) if err := r.Run(addr); err != nil { slog.Error("server run", slog.Any("err", err)) os.Exit(1) } } func setupLogger(lc config.LoggingConfig) { var level slog.Level switch lc.Level { case "info": level = slog.LevelInfo case "warn": level = slog.LevelWarn case "error": level = slog.LevelError default: level = slog.LevelDebug } var handler slog.Handler opts := &slog.HandlerOptions{Level: level} if lc.Format == "json" { handler = slog.NewJSONHandler(os.Stdout, opts) } else { handler = slog.NewTextHandler(os.Stdout, opts) } slog.SetDefault(slog.New(handler)) }