Files
2026-10-25 20:27:59 +08:00

76 lines
1.6 KiB
Go

// 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))
}