Files
photowall/go/cmd/server/main.go
T

86 lines
2.4 KiB
Go

package main
import (
"log"
"photowall/internal/config"
"photowall/internal/database"
"photowall/internal/handler"
"photowall/internal/router"
"photowall/internal/scheduler"
"photowall/internal/service"
"photowall/pkg/jwt"
"photowall/pkg/redis"
"photowall/pkg/sensitive"
"github.com/gin-gonic/gin"
)
func main() {
// 1. 加载配置
cfg := config.Load()
log.Printf("[config] port=%s db=%s@%s:%s/%s", cfg.Port, cfg.DBUser, cfg.DBHost, cfg.DBPort, cfg.DBName)
// 2. 初始化数据库(连接 + 自动迁移 + 管理员 + 种子数据)
if err := database.Init(); err != nil {
log.Fatalf("[database] init failed: %v", err)
}
// 2.1 初始化 Redis(连接失败自动降级内存模式)
redis.Init(redis.Config{
Host: cfg.RedisHost,
Port: cfg.RedisPort,
Password: cfg.RedisPassword,
DB: cfg.RedisDB,
})
// 3. JWT
jm := jwt.New(cfg.JWTSecret, cfg.JWTExpireHrs)
// 4. 初始化 Service
configSvc := service.NewConfigService(database.DB)
// 初始化系统默认配置
if err := configSvc.InitDefaults(); err != nil {
log.Printf("[config] init defaults failed: %v", err)
}
authSvc := service.NewAuthService(database.DB, jm, configSvc)
userSvc := service.NewUserService(database.DB)
regionSvc := service.NewRegionService(database.DB)
schoolSvc := service.NewSchoolService(database.DB)
classSvc := service.NewClassService(database.DB, configSvc)
adminSvc := service.NewAdminService(database.DB)
menuSvc := service.NewMenuService(database.DB)
// 初始化默认菜单
if err := menuSvc.InitDefaults(); err != nil {
log.Printf("[menu] init defaults failed: %v", err)
}
// 初始化敏感词过滤器
sensitive.Init(database.DB)
// 5. 初始化 Handler
deps := &router.Deps{
Auth: handler.NewAuthHandler(authSvc),
User: handler.NewUserHandler(userSvc),
Region: handler.NewRegionHandler(regionSvc),
School: handler.NewSchoolHandler(schoolSvc),
Class: handler.NewClassHandler(classSvc),
Admin: handler.NewAdminHandler(adminSvc),
Upload: handler.NewUploadHandler(database.DB),
Config: handler.NewConfigHandler(configSvc),
Menu: handler.NewMenuHandler(menuSvc),
}
// 6. 启动定时清理任务
scheduler.StartCleanup(adminSvc)
// 7. 启动 HTTP 服务
gin.SetMode(gin.ReleaseMode)
r := gin.Default()
router.Register(r, jm, deps)
log.Printf("[server] photowall API listening on :%s", cfg.Port)
if err := r.Run(":" + cfg.Port); err != nil {
log.Fatalf("[server] failed: %v", err)
}
}