package main import ( "log" "os" "path/filepath" "affiliate_dash/internal/config" "affiliate_dash/internal/handler" "affiliate_dash/internal/model" "affiliate_dash/internal/pkg/jwt" "affiliate_dash/internal/router" "affiliate_dash/internal/service" "github.com/gin-gonic/gin" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func main() { cfg := config.Load() gin.SetMode(cfg.Mode) if err := os.MkdirAll(filepath.Dir(cfg.DBPath), 0o755); err != nil { log.Fatalf("create data dir: %v", err) } db, err := gorm.Open(sqlite.Open(cfg.DBPath), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }) if err != nil { log.Fatalf("open db: %v", err) } if err := db.AutoMigrate(&model.User{}, &model.Skin{}, &model.Order{}, &model.ShipLog{}); err != nil { log.Fatalf("migrate: %v", err) } jm := jwt.NewManager(cfg.JWTSecret) authSvc := service.NewAuthService(db, jm) skinSvc := service.NewSkinService(db) orderSvc := service.NewOrderService(db) userSvc := service.NewUserService(db) if err := authSvc.EnsureAdmin(); err != nil { log.Fatalf("ensure admin: %v", err) } if err := skinSvc.SeedCatalog(); err != nil { log.Printf("seed skins: %v", err) } h := &router.Handlers{ Auth: handler.NewAuthHandler(authSvc), Skin: handler.NewSkinHandler(skinSvc), Order: handler.NewOrderHandler(orderSvc), User: handler.NewUserHandler(userSvc), Open: handler.NewOpenHandler(orderSvc), JWT: jm, OpenAPIKey: cfg.OpenAPIKey, OpenAPISecret: cfg.OpenAPISecret, OpenSignSkew: cfg.OpenSignSkew, } r := router.Setup(h) addr := ":" + cfg.Port log.Printf("游戏皮肤分销系统 API 启动: http://localhost%s", addr) log.Printf("默认管理员: admin / admin123") log.Printf("开放接口鉴权: X-Api-Key + X-Timestamp + X-Nonce + X-Sign (HMAC-SHA256)") if err := r.Run(addr); err != nil { log.Fatalf("server: %v", err) } }