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