// Package router 注册全部 HTTP 路由与 WebSocket 入口 package router import ( "github.com/gin-gonic/gin" "nl-game-api-gin/internal/handler" "nl-game-api-gin/internal/middleware" "nl-game-api-gin/internal/room" ) // Setup 创建 Gin 引擎并挂载全部路由 func Setup() *gin.Engine { r := gin.Default() r.Use(middleware.CORS()) // 安装包可达 ~100MB+,提高 multipart 内存阈值(超出部分写临时文件) r.MaxMultipartMemory = 256 << 20 // 桌面安装包静态下载:后台上传到 data/releases,对外路径 /download/xxx.exe r.Static("/download", handler.ReleaseDir()) // WebSocket 对战入口(?token= 鉴权,内部自行校验) hub := room.NewHub() r.GET("/ws", hub.HandleWS) api := r.Group("/api") { // 公开接口:注册、登录、站点配置(主题) api.POST("/auth/register", handler.Register) api.POST("/auth/login", handler.Login) api.GET("/config", handler.SiteConfigPublic) // 公开接口:桌面端检查最新版本(无需登录) api.GET("/version/latest", handler.VersionLatest) // 登录后接口 auth := api.Group("", middleware.Auth()) { // 个人中心 auth.GET("/user/profile", handler.Profile) auth.PUT("/user/profile", handler.UpdateProfile) auth.GET("/user/points", handler.PointRecords) auth.GET("/user/logins", handler.LoginLogs) auth.GET("/user/records", handler.GameRecords) auth.GET("/user/battles", handler.BattleRecords) auth.GET("/user/props", handler.UserProps) auth.GET("/user/games", handler.UserGames) auth.GET("/user/mygames", handler.UserMyGames) // 游戏 auth.GET("/games", handler.GameList) auth.GET("/games/:code", handler.GameDetail) auth.POST("/games/:code/score", handler.SubmitScore) // 关卡进度(带关卡的游戏:查我的+好友进度 / 过关上报) auth.GET("/games/:code/progress", handler.GameProgressGet) auth.POST("/games/:code/progress", handler.GameProgressSave) // 游戏存档(支持存档的游戏:读档/覆盖保存/删档) auth.GET("/games/:code/save", handler.GameSaveGet) auth.POST("/games/:code/save", handler.GameSaveSet) auth.DELETE("/games/:code/save", handler.GameSaveDelete) // 游戏皮肤(更衣室:皮肤列表 / 积分购买) auth.GET("/games/:code/skins", handler.GameSkins) auth.POST("/games/:code/skins/buy", handler.GameSkinBuy) auth.POST("/props/use", handler.UseProp) // 签到 auth.GET("/signin/status", handler.SignInStatus) auth.POST("/signin", handler.DoSignIn) // VIP会员(等级权益、周免批次、开通续费) auth.GET("/vip/info", handler.VipInfo) auth.POST("/vip/buy", handler.VipBuy) // 商城(游戏+道具+购物车+订单) auth.GET("/shop/props", handler.PropList) auth.GET("/shop/cart", handler.CartList) auth.POST("/shop/cart", handler.AddCart) auth.DELETE("/shop/cart/:id", handler.RemoveCart) auth.POST("/shop/checkout", handler.Checkout) auth.POST("/shop/buy", handler.BuyNow) auth.GET("/shop/orders", handler.OrderList) // 排行榜 auth.GET("/rank/points", handler.PointsRank) auth.GET("/rank/game/:code", handler.GameRank) // 好友(申请/同意/列表/搜索/删除) auth.GET("/friends", handler.FriendList) auth.GET("/friends/requests", handler.FriendRequests) auth.GET("/friends/search", handler.FriendSearch) auth.POST("/friends/request", handler.FriendRequest) auth.POST("/friends/respond", handler.FriendRespond) auth.DELETE("/friends/:uid", handler.FriendDelete) // 私聊(会话列表/聊天记录/发送/已读/未读数) auth.GET("/chat/conversations", handler.ChatConversations) auth.GET("/chat/messages", handler.ChatMessages) auth.POST("/chat/send", handler.ChatSend) auth.POST("/chat/read", handler.ChatRead) auth.GET("/chat/unread", handler.ChatUnread) // 后台管理(仅超管) admin := auth.Group("/admin", middleware.AdminOnly()) { admin.GET("/stats", handler.AdminStats) admin.GET("/analytics", handler.AdminAnalytics) admin.GET("/themes", handler.AdminThemes) admin.POST("/theme", handler.AdminSwitchTheme) admin.PUT("/site", handler.AdminUpdateSite) admin.GET("/users", handler.AdminUsers) admin.PUT("/users/:id", handler.AdminUpdateUser) admin.GET("/users/:id/points", handler.AdminUserPoints) admin.GET("/games", handler.AdminGames) admin.PUT("/games/:id", handler.AdminUpdateGame) admin.GET("/orders", handler.AdminOrders) // VIP等级配置 admin.GET("/vip/levels", handler.AdminVipLevels) admin.PUT("/vip/levels/:id", handler.AdminUpdateVipLevel) // AI大模型接入配置(查看/保存/连通性测试) admin.GET("/ai", handler.AdminAIConfig) admin.PUT("/ai", handler.AdminSaveAIConfig) admin.POST("/ai/test", handler.AdminTestAI) // 桌面端版本:列表 / 上传安装包 / 改说明 / 删除 admin.GET("/version", handler.AdminVersionGet) admin.PUT("/version", handler.AdminVersionSave) admin.POST("/version/upload", handler.AdminVersionUpload) admin.DELETE("/version/:filename", handler.AdminVersionDelete) } } } return r }