邹方成 2a89a1ab9d
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
feat(admin): 更新前端资源文件及修复相关功能
refactor(service): 修改banner和guild删除逻辑为软删除
fix(service): 修复删除操作使用软删除而非物理删除

build: 添加SQLite测试仓库实现
docs: 新增奖励管理字段拆分和批量抽奖UI改造文档

ci: 更新CI忽略文件
style: 清理无用资源文件
2025-11-19 01:35:55 +08:00

267 lines
18 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}