package router import ( "bindbox-game/internal/alert" activityapi "bindbox-game/internal/api/activity" "bindbox-game/internal/api/admin" appapi "bindbox-game/internal/api/app" commonapi "bindbox-game/internal/api/common" guildapi "bindbox-game/internal/api/guild" payapi "bindbox-game/internal/api/pay" userapi "bindbox-game/internal/api/user" "bindbox-game/internal/dblogger" "bindbox-game/internal/pkg/core" "bindbox-game/internal/pkg/logger" "bindbox-game/internal/repository/mysql" "bindbox-game/internal/router/interceptor" "github.com/pkg/errors" ) func NewHTTPMux(logger logger.CustomLogger, db mysql.Repo) (core.Mux, error) { if logger == nil { return nil, errors.New("logger required") } if db == nil { return nil, errors.New("db required") } mux, err := core.New(logger, core.WithEnableCors(), core.WithEnableSwagger(), core.WithEnablePProf(), core.WithAlertNotify(alert.NotifyHandler()), core.WithRequestLogger(dblogger.LoggerHandler(db)), ) if err != nil { panic(err) } // 实例化拦截器 adminHandler := admin.New(logger, db) activityHandler := activityapi.New(logger, db) guildHandler := guildapi.New(logger, db) userHandler := userapi.New(logger, db) commonHandler := commonapi.New(logger, db) payHandler := payapi.New(logger, db) intc := interceptor.New(logger, db) // 管理端非认证接口路由组 adminNonAuthApiRouter := mux.Group("/api/admin") { adminNonAuthApiRouter.POST("/login", adminHandler.Login()) } // 管理端认证接口路由组 adminAuthApiRouter := mux.Group("/api/admin", core.WrapAuthHandler(intc.AdminTokenAuthVerify), intc.RequireAdminRole()) // 系统管理接口(为前端模板路径兼容,挂载到 /api) systemApiRouter := mux.Group("/api", core.WrapAuthHandler(intc.AdminTokenAuthVerify), intc.RequireAdminRole()) { // 管理员账号维护接口移除(未被前端使用) adminAuthApiRouter.GET("/activity_categories", adminHandler.ListActivityCategories()) // 工作台 adminAuthApiRouter.GET("/dashboard/cards", adminHandler.DashboardCards()) adminAuthApiRouter.GET("/dashboard/user_trend", adminHandler.DashboardUserTrend()) adminAuthApiRouter.GET("/dashboard/draw_trend", adminHandler.DashboardDrawTrend()) adminAuthApiRouter.GET("/dashboard/new_users", adminHandler.DashboardNewUsers()) adminAuthApiRouter.GET("/dashboard/draw_stream", adminHandler.DashboardDrawStream()) adminAuthApiRouter.GET("/dashboard/todos", adminHandler.DashboardTodos()) adminAuthApiRouter.GET("/dashboard/order_funnel", adminHandler.DashboardOrderFunnel()) adminAuthApiRouter.GET("/dashboard/activities", adminHandler.DashboardActivities()) adminAuthApiRouter.GET("/dashboard/activity_prize_analysis", adminHandler.DashboardActivityPrizeAnalysis()) adminAuthApiRouter.GET("/dashboard/user_overview", adminHandler.DashboardUserOverview()) adminAuthApiRouter.POST("/activities", adminHandler.CreateActivity()) adminAuthApiRouter.PUT("/activities/:activity_id", adminHandler.ModifyActivity()) adminAuthApiRouter.DELETE("/activities/:activity_id", adminHandler.DeleteActivity()) adminAuthApiRouter.GET("/activities/:activity_id", adminHandler.GetActivityDetail()) adminAuthApiRouter.GET("/activities/:activity_id/issues", adminHandler.ListActivityIssues()) adminAuthApiRouter.POST("/activities/:activity_id/issues", adminHandler.CreateActivityIssue()) adminAuthApiRouter.PUT("/activities/:activity_id/issues/:issue_id", adminHandler.ModifyActivityIssue()) adminAuthApiRouter.DELETE("/activities/:activity_id/issues/:issue_id", adminHandler.DeleteActivityIssue()) adminAuthApiRouter.POST("/activities/:activity_id/issues/:issue_id/rewards", adminHandler.CreateIssueRewards()) adminAuthApiRouter.GET("/activities/:activity_id/issues/:issue_id/rewards", adminHandler.ListIssueRewards()) adminAuthApiRouter.PUT("/activities/:activity_id/issues/:issue_id/rewards/:reward_id", adminHandler.ModifyIssueReward()) adminAuthApiRouter.DELETE("/activities/:activity_id/issues/:issue_id/rewards/:reward_id", adminHandler.DeleteIssueReward()) adminAuthApiRouter.POST("/activities/:activity_id/issues/:issue_id/commit_random", adminHandler.CommitIssueRandom()) adminAuthApiRouter.GET("/activities/:activity_id/issues/:issue_id/commit_random", adminHandler.GetIssueRandomCommit()) adminAuthApiRouter.GET("/activities/:activity_id/issues/:issue_id/commit_random/history", adminHandler.GetIssueRandomCommitHistory()) adminAuthApiRouter.POST("/activities/:activity_id/issues/:issue_id/simulate_draw", adminHandler.SimulateIssueDraw()) adminAuthApiRouter.POST("/activities/:activity_id/issues/:issue_id/batch_draw", adminHandler.BatchDrawForUsers()) adminAuthApiRouter.POST("/activities/:activity_id/issues/:issue_id/verify_draw", adminHandler.VerifyDrawReceipt()) adminAuthApiRouter.GET("/draw_receipts/:draw_id", adminHandler.GetDrawReceipt()) adminAuthApiRouter.GET("/draw_receipts/log/:log_id", adminHandler.GetDrawReceiptByLogID()) adminAuthApiRouter.POST("/batch_users", adminHandler.BatchCreateUsers()) adminAuthApiRouter.DELETE("/batch_users", adminHandler.BatchDeleteUsers()) adminAuthApiRouter.POST("/guilds", intc.RequireAdminAction("guild:create"), adminHandler.CreateGuild()) adminAuthApiRouter.PUT("/guilds/:guild_id", intc.RequireAdminAction("guild:modify"), adminHandler.ModifyGuild()) adminAuthApiRouter.DELETE("/guilds/:guild_id", intc.RequireAdminAction("guild:delete"), adminHandler.DeleteGuild()) adminAuthApiRouter.GET("/guilds/:guild_id", intc.RequireAdminAction("guild:view"), adminHandler.GetGuildDetail()) adminAuthApiRouter.GET("/guilds/:guild_id/members", intc.RequireAdminAction("guild:view"), adminHandler.ListGuildMembers()) adminAuthApiRouter.GET("/guilds/:guild_id/applications", intc.RequireAdminAction("guild:view"), adminHandler.ListGuildApplications()) adminAuthApiRouter.POST("/guilds/:guild_id/applications/:member_id/approve", intc.RequireAdminAction("guild:member:approve"), adminHandler.ApproveGuildApplication()) adminAuthApiRouter.POST("/guilds/:guild_id/applications/:member_id/reject", intc.RequireAdminAction("guild:member:reject"), adminHandler.RejectGuildApplication()) adminAuthApiRouter.DELETE("/guilds/:guild_id/members/:user_id", intc.RequireAdminAction("guild:member:delete"), adminHandler.DeleteGuildMember()) // 商品管理:分类与商品 adminAuthApiRouter.POST("/product_categories", adminHandler.CreateProductCategory()) adminAuthApiRouter.PUT("/product_categories/:category_id", adminHandler.ModifyProductCategory()) adminAuthApiRouter.DELETE("/product_categories/:category_id", adminHandler.DeleteProductCategory()) adminAuthApiRouter.GET("/product_categories", adminHandler.ListProductCategories()) adminAuthApiRouter.POST("/products", intc.RequireAdminAction("product:create"), adminHandler.CreateProduct()) adminAuthApiRouter.PUT("/products/:product_id", intc.RequireAdminAction("product:modify"), adminHandler.ModifyProduct()) adminAuthApiRouter.PUT("/products/batch", intc.RequireAdminAction("product:batch:modify"), adminHandler.BatchUpdateProducts()) adminAuthApiRouter.DELETE("/products/:product_id", intc.RequireAdminAction("product:delete"), adminHandler.DeleteProduct()) adminAuthApiRouter.GET("/products", intc.RequireAdminAction("product:view"), adminHandler.ListProducts()) adminAuthApiRouter.POST("/auth/refresh", adminHandler.RefreshToken()) // 轮播图管理 adminAuthApiRouter.POST("/banners", intc.RequireAdminAction("banner:create"), adminHandler.CreateBanner()) adminAuthApiRouter.PUT("/banners/:banner_id", intc.RequireAdminAction("banner:modify"), adminHandler.ModifyBanner()) adminAuthApiRouter.DELETE("/banners/:banner_id", intc.RequireAdminAction("banner:delete"), adminHandler.DeleteBanner()) adminAuthApiRouter.GET("/banners", intc.RequireAdminAction("banner:view"), adminHandler.ListBanners()) // 用户管理 adminAuthApiRouter.GET("/users", adminHandler.ListAppUsers()) adminAuthApiRouter.GET("/users/:user_id/invites", adminHandler.ListUserInvites()) adminAuthApiRouter.GET("/users/:user_id/orders", adminHandler.ListUserOrders()) adminAuthApiRouter.GET("/users/:user_id/coupons", adminHandler.ListUserCoupons()) adminAuthApiRouter.GET("/users/:user_id/points", adminHandler.ListUserPoints()) adminAuthApiRouter.GET("/users/:user_id/points/balance", adminHandler.GetUserPointsBalance()) adminAuthApiRouter.POST("/users/:user_id/points/add", adminHandler.AddUserPoints()) adminAuthApiRouter.POST("/users/:user_id/coupons/add", adminHandler.AddUserCoupon()) adminAuthApiRouter.POST("/users/:user_id/rewards/grant", adminHandler.GrantReward()) adminAuthApiRouter.GET("/users/:user_id/titles", adminHandler.ListUserTitles()) adminAuthApiRouter.POST("/users/batch/points/add", adminHandler.BatchAddUserPoints()) adminAuthApiRouter.POST("/users/batch/coupons/add", adminHandler.BatchAddUserCoupons()) adminAuthApiRouter.POST("/users/batch/rewards/grant", adminHandler.BatchGrantUserRewards()) adminAuthApiRouter.GET("/users/:user_id/inventory", adminHandler.ListUserInventory()) adminAuthApiRouter.GET("/users/:user_id/item_cards", adminHandler.ListUserItemCards()) // 系统称号与分配 adminAuthApiRouter.GET("/system_titles", intc.RequireAdminAction("title:view"), adminHandler.ListSystemTitles()) adminAuthApiRouter.POST("/users/:user_id/titles", intc.RequireAdminAction("title:assign"), adminHandler.AssignUserTitle()) adminAuthApiRouter.POST("/system_titles", intc.RequireAdminAction("title:create"), adminHandler.CreateSystemTitle()) adminAuthApiRouter.PUT("/system_titles/:title_id", intc.RequireAdminAction("title:modify"), adminHandler.ModifySystemTitle()) adminAuthApiRouter.DELETE("/system_titles/:title_id", intc.RequireAdminAction("title:delete"), adminHandler.DeleteSystemTitle()) adminAuthApiRouter.GET("/system_titles/:title_id/effects", intc.RequireAdminAction("title:view"), adminHandler.ListSystemTitleEffects()) adminAuthApiRouter.POST("/system_titles/:title_id/effects", intc.RequireAdminAction("title:effect:create"), adminHandler.CreateSystemTitleEffect()) adminAuthApiRouter.PUT("/system_titles/:title_id/effects/:effect_id", intc.RequireAdminAction("title:effect:modify"), adminHandler.ModifySystemTitleEffect()) adminAuthApiRouter.DELETE("/system_titles/:title_id/effects/:effect_id", intc.RequireAdminAction("title:effect:delete"), adminHandler.DeleteSystemTitleEffect()) // 小程序二维码生成 adminAuthApiRouter.POST("/miniapp/qrcode", adminHandler.GenerateMiniAppQRCode()) // 道具卡管理 adminAuthApiRouter.POST("/system_item_cards", intc.RequireAdminAction("itemcard:create"), adminHandler.CreateSystemItemCard()) adminAuthApiRouter.PUT("/system_item_cards/:item_card_id", intc.RequireAdminAction("itemcard:modify"), adminHandler.ModifySystemItemCard()) adminAuthApiRouter.DELETE("/system_item_cards/:item_card_id", intc.RequireAdminAction("itemcard:delete"), adminHandler.DeleteSystemItemCard()) adminAuthApiRouter.GET("/system_item_cards", intc.RequireAdminAction("itemcard:view"), adminHandler.ListSystemItemCards()) // 优惠券管理 adminAuthApiRouter.POST("/system_coupons", intc.RequireAdminAction("coupon:create"), adminHandler.CreateSystemCoupon()) adminAuthApiRouter.PUT("/system_coupons/:coupon_id", intc.RequireAdminAction("coupon:modify"), adminHandler.ModifySystemCoupon()) adminAuthApiRouter.DELETE("/system_coupons/:coupon_id", intc.RequireAdminAction("coupon:delete"), adminHandler.DeleteSystemCoupon()) adminAuthApiRouter.GET("/system_coupons", intc.RequireAdminAction("coupon:view"), adminHandler.ListSystemCoupons()) adminAuthApiRouter.POST("/users/:user_id/item_cards", adminHandler.AssignUserItemCard()) // 发货统计 adminAuthApiRouter.GET("/ops_shipping_stats", intc.RequireAdminAction("ops:shipping:view"), adminHandler.ListShippingStats()) adminAuthApiRouter.GET("/ops_shipping_stats/:id", intc.RequireAdminAction("ops:shipping:view"), adminHandler.GetShippingStat()) adminAuthApiRouter.POST("/ops_shipping_stats", intc.RequireAdminAction("ops:shipping:write"), adminHandler.CreateShippingStat()) adminAuthApiRouter.PUT("/ops_shipping_stats/:id", intc.RequireAdminAction("ops:shipping:write"), adminHandler.ModifyShippingStat()) adminAuthApiRouter.DELETE("/ops_shipping_stats/:id", intc.RequireAdminAction("ops:shipping:write"), adminHandler.DeleteShippingStat()) adminAuthApiRouter.POST("/pay/refunds", intc.RequireAdminAction("refund:create"), adminHandler.CreateRefund()) adminAuthApiRouter.GET("/pay/refunds", intc.RequireAdminAction("refund:view"), adminHandler.ListRefunds()) adminAuthApiRouter.GET("/pay/refunds/:refund_no", intc.RequireAdminAction("refund:view"), adminHandler.GetRefundDetail()) adminAuthApiRouter.POST("/pay/bills/import", adminHandler.ImportPaymentBill()) adminAuthApiRouter.GET("/pay/bills/diff", adminHandler.ListPaymentBillDiff()) adminAuthApiRouter.GET("/pay/orders", intc.RequireAdminAction("order:view"), adminHandler.ListPayOrders()) adminAuthApiRouter.GET("/pay/orders/:order_no", intc.RequireAdminAction("order:view"), adminHandler.GetPayOrderDetail()) adminAuthApiRouter.PUT("/pay/orders/:order_no/remark", intc.RequireAdminAction("order:modify"), adminHandler.UpdateOrderRemark()) adminAuthApiRouter.POST("/pay/orders/:order_no/cancel", intc.RequireAdminAction("order:cancel"), adminHandler.CancelOrder()) adminAuthApiRouter.PUT("/pay/orders/:order_no/consume", intc.RequireAdminAction("order:consume"), adminHandler.ConsumeOrder()) adminAuthApiRouter.GET("/pay/orders/export", intc.RequireAdminAction("order:export"), adminHandler.ExportPayOrders()) // 通用上传 systemApiRouter.POST("/common/upload/wangeditor", commonHandler.UploadWangEditorImage()) systemApiRouter.POST("/menu/ensure_titles", adminHandler.EnsureTitlesMenu()) } // 系统管理:用户/角色/菜单 { systemApiRouter.GET("/user/list", adminHandler.ListUsers()) systemApiRouter.GET("/role/list", adminHandler.ListRoles()) systemApiRouter.GET("/v3/system/menus/simple", adminHandler.ListSimpleMenus()) systemApiRouter.POST("/role", adminHandler.CreateRole()) systemApiRouter.PUT("/role/:role_id", adminHandler.ModifyRole()) systemApiRouter.DELETE("/role/:role_id", adminHandler.DeleteRole()) systemApiRouter.POST("/role/:role_id/users", adminHandler.AssignRoleUsers()) systemApiRouter.GET("/role/:role_id/users", adminHandler.ListRoleUsers()) systemApiRouter.DELETE("/role/:role_id/users/:admin_id", adminHandler.RemoveRoleUser()) systemApiRouter.POST("/menu", adminHandler.CreateMenu()) systemApiRouter.PUT("/menu/:menu_id", adminHandler.ModifyMenu()) systemApiRouter.DELETE("/menu/:menu_id", adminHandler.DeleteMenu()) systemApiRouter.GET("/menu/:menu_id/actions", adminHandler.ListMenuActions()) systemApiRouter.POST("/menu/:menu_id/actions", adminHandler.CreateMenuActions()) systemApiRouter.DELETE("/menu/:menu_id/actions/:action_id", adminHandler.DeleteMenuAction()) systemApiRouter.POST("/role/:role_id/menus", adminHandler.AssignRoleMenus()) systemApiRouter.POST("/role/:role_id/actions", adminHandler.AssignRoleActions()) systemApiRouter.GET("/system/recycle", adminHandler.ListRecycle()) systemApiRouter.POST("/system/recycle/restore", adminHandler.RestoreRecycle()) systemApiRouter.DELETE("/system/recycle", adminHandler.ForceDeleteRecycle()) } // APP 端公开接口路由组 appPublicApiRouter := mux.Group("/api/app") { appPublicApiRouter.GET("/activities", activityHandler.ListActivities()) appPublicApiRouter.GET("/activities/:activity_id", activityHandler.GetActivityDetail()) appPublicApiRouter.GET("/activities/:activity_id/issues", activityHandler.ListActivityIssues()) appPublicApiRouter.GET("/activities/:activity_id/issues/:issue_id/rewards", activityHandler.ListIssueRewards()) appPublicApiRouter.GET("/activities/:activity_id/issues/:issue_id/draw_logs", activityHandler.ListDrawLogs()) appPublicApiRouter.GET("/guilds", guildHandler.ListGuilds()) appPublicApiRouter.GET("/guilds/:guild_id", guildHandler.GetGuildDetail()) appPublicApiRouter.POST("/guilds/:guild_id/members", guildHandler.JoinGuild()) appPublicApiRouter.DELETE("/guilds/:guild_id/members/:user_id", guildHandler.LeaveGuild()) appPublicApiRouter.GET("/guilds/:guild_id/members", guildHandler.ListGuildMembers()) // APP 端轮播图 appPublicApiRouter.GET("/banners", appapi.NewBanner(logger, db).ListBannersForApp()) // 登录保持公开 appPublicApiRouter.POST("/users/weixin/login", userHandler.WeixinLogin()) } // APP 端认证接口路由组 appAuthApiRouter := mux.Group("/api/app", core.WrapAuthHandler(intc.AppTokenAuthVerify)) { appAuthApiRouter.GET("/guilds/:guild_id/members/me", guildHandler.GetMyGuildMembership()) appAuthApiRouter.PUT("/users/:user_id", userHandler.ModifyUser()) appAuthApiRouter.GET("/users/:user_id/orders", userHandler.ListUserOrders()) appAuthApiRouter.GET("/users/:user_id/coupons", userHandler.ListUserCoupons()) appAuthApiRouter.GET("/users/:user_id/points", userHandler.ListUserPoints()) appAuthApiRouter.GET("/users/:user_id/points/balance", userHandler.GetUserPointsBalance()) appAuthApiRouter.GET("/users/:user_id/stats", userHandler.GetUserStats()) appAuthApiRouter.POST("/users/:user_id/phone/bind", userHandler.BindPhone()) appAuthApiRouter.GET("/users/:user_id/invites", userHandler.ListUserInvites()) appAuthApiRouter.GET("/users/:user_id/item_cards", userHandler.ListUserItemCards()) appAuthApiRouter.GET("/users/:user_id/item_cards/uses", userHandler.ListUserItemCardUses()) appAuthApiRouter.POST("/users/:user_id/addresses", userHandler.AddUserAddress()) appAuthApiRouter.GET("/users/:user_id/addresses", userHandler.ListUserAddresses()) appAuthApiRouter.PUT("/users/:user_id/addresses/:address_id/default", userHandler.SetDefaultUserAddress()) appAuthApiRouter.DELETE("/users/:user_id/addresses/:address_id", userHandler.DeleteUserAddress()) appAuthApiRouter.POST("/activities/:activity_id/issues/:issue_id/draw", activityHandler.ExecuteDraw()) appAuthApiRouter.POST("/pay/wechat/jsapi/preorder", userHandler.WechatJSAPIPreorder()) appAuthApiRouter.POST("/orders/test/create", userHandler.CreateTestOrder()) } // 微信支付平台回调(无需鉴权) mux.Group("/api/pay").POST("/wechat/notify", payHandler.WechatNotify()) return mux, nil }