package router import ( "net/http" "time" "gotest/internal/config" "gotest/internal/database" "gotest/internal/handler" "gotest/internal/middleware" "github.com/gin-gonic/gin" ) // Setup 初始化路由和中间件,返回 Gin 引擎 func Setup( cfg *config.Config, db *database.DB, authH *handler.AuthHandler, userH *handler.UserHandler, adminH *handler.AdminHandler, uploadH *handler.UploadHandler, enterpriseH *handler.EnterpriseHandler, shopH *handler.ShopHandler, foodH *handler.FoodHandler, gameH *handler.GameHandler, appH *handler.AppHandler, musicH *handler.MusicHandler, dashboardH *handler.DashboardHandler, ) *gin.Engine { if cfg.Env.Name == "prod" { gin.SetMode(gin.ReleaseMode) } r := gin.New() // 全局中间件链(顺序:RequestID → Recover → Logger → CORS → RateLimit) r.Use(middleware.RequestID()) r.Use(middleware.Recover()) r.Use(middleware.Logger()) r.Use(middleware.CORS(&cfg.CORS)) r.Use(middleware.RateLimit(&cfg.RateLimit)) // 健康检查(含数据库就绪探针) r.GET("/api/health", func(c *gin.Context) { dbStatus := "up" if err := db.HealthCheck(); err != nil { dbStatus = "down: " + err.Error() } status := http.StatusOK if dbStatus != "up" { status = http.StatusServiceUnavailable } c.JSON(status, gin.H{ "code": 0, "message": "ok", "data": gin.H{ "status": dbStatus, "time": time.Now().Format(time.RFC3339), "env": cfg.Env.Name, "database": cfg.Database.Driver, }, }) }) // API v1 路由组 api := r.Group("/api/v1") { // 认证(公开) auth := api.Group("/auth") { auth.POST("/login", authH.Login) } // 管理员检查与初始化(公开) adminPub := api.Group("/admin") { adminPub.GET("/check", adminH.CheckAdmin) adminPub.POST("/init", adminH.InitAdmin) } // 企业数据 API(公开,3 套企业官网共用) enterprise := api.Group("/enterprise") { enterprise.GET("/all", enterpriseH.GetAllData) enterprise.GET("/company", enterpriseH.GetCompany) enterprise.GET("/services", enterpriseH.ListServices) enterprise.GET("/news", enterpriseH.ListNews) enterprise.GET("/news/:id", enterpriseH.GetNews) enterprise.GET("/team", enterpriseH.ListTeam) } // 电商数据 API(公开,跨境电商网站使用) shop := api.Group("/shop") { shop.GET("/home", shopH.GetHomeData) shop.GET("/categories", shopH.ListCategories) shop.GET("/products", shopH.ListProducts) shop.GET("/products/:id", shopH.GetProduct) shop.GET("/featured", shopH.ListFeatured) } // 外卖数据 API(公开,3 套外卖网站共用) food := api.Group("/food") { food.GET("/home", foodH.GetHomeData) food.GET("/categories", foodH.ListCategories) food.GET("/restaurants", foodH.ListRestaurants) food.GET("/restaurants/:id", foodH.GetRestaurant) food.GET("/restaurants/:id/menu", foodH.GetRestaurantMenu) food.GET("/featured", foodH.ListFeatured) } // 游戏数据 API(公开,3 套游戏网站共用) game := api.Group("/game") { game.GET("/home", gameH.GetHomeData) game.GET("/categories", gameH.ListCategories) game.GET("/games", gameH.ListGames) game.GET("/games/:id", gameH.GetGame) game.GET("/hot", gameH.ListHot) game.GET("/new", gameH.ListNew) } // 应用数据 API(公开,3 套应用网站共用) app := api.Group("/app") { app.GET("/home", appH.GetHomeData) app.GET("/categories", appH.ListCategories) app.GET("/apps", appH.ListApps) app.GET("/apps/:id", appH.GetApp) app.GET("/featured", appH.ListFeatured) app.GET("/new", appH.ListNew) } // 音乐数据 API(公开,3 套音乐网站共用) music := api.Group("/music") { music.GET("/home", musicH.GetHomeData) music.GET("/categories", musicH.ListCategories) music.GET("/songs", musicH.ListSongs) music.GET("/songs/:id", musicH.GetSong) music.GET("/hot", musicH.ListHot) music.GET("/new", musicH.ListNew) } // 需要登录的路由 authed := api.Group("") authed.Use(middleware.JWTAuth(cfg.JWT.Secret)) { // 用户资料 user := authed.Group("/user") { user.GET("/profile", userH.GetProfile) user.PUT("/profile", userH.UpdateProfile) user.PUT("/password", userH.ChangePassword) } // 文件上传 authed.POST("/upload", uploadH.Upload) } // 管理端路由(需要登录 + admin 角色) admin := api.Group("/admin") admin.Use(middleware.JWTAuth(cfg.JWT.Secret), requireAdmin()) { admin.GET("/users", userH.ListUsers) admin.POST("/users", userH.CreateUser) admin.PUT("/users/:id", userH.UpdateUser) admin.DELETE("/users/:id", userH.DeleteUser) // 仪表盘 & 内容管理(通用 CRUD) admin.GET("/dashboard/stats", dashboardH.GetStats) admin.GET("/dashboard/:table", dashboardH.ListItems) admin.POST("/dashboard/:table", dashboardH.CreateItem) admin.PUT("/dashboard/:table/:id", dashboardH.UpdateItem) admin.DELETE("/dashboard/:table/:id", dashboardH.DeleteItem) } } return r } // requireAdmin 管理员权限校验中间件 func requireAdmin() gin.HandlerFunc { return func(c *gin.Context) { if middleware.GetRole(c) != "admin" { c.AbortWithStatusJSON(http.StatusForbidden, gin.H{ "code": 1, "message": "权限不足", "data": nil, }) return } c.Next() } }