// Package router 装配 gin 引擎与各模块路由。 // 路由分层:/api/ma(小程序,靠请求头 app_id 鉴权)、/api/admin(后台)。 package router import ( "time" "github.com/gin-gonic/gin" "gorm.io/gorm" adminhdl "portal-mini-go/internal/handler/admin" miniapphdl "portal-mini-go/internal/handler/admin/miniapp" userhdl "portal-mini-go/internal/handler/admin/user" app1hdl "portal-mini-go/internal/handler/miniapp/app1" "portal-mini-go/internal/middleware" "portal-mini-go/internal/pkg/config" "portal-mini-go/internal/pkg/response" "portal-mini-go/internal/pkg/session" "portal-mini-go/internal/pkg/wechat" miniapprepo "portal-mini-go/internal/repository/miniapp" "portal-mini-go/internal/repository/user" miniappsvc "portal-mini-go/internal/service/admin/miniapp" usersvc "portal-mini-go/internal/service/admin/user" app1svc "portal-mini-go/internal/service/miniapp/app1" ) // New 构造并装配整个 HTTP 服务。 func New(cfg *config.Config, db *gorm.DB, store session.Store) *gin.Engine { if cfg.Server.Mode == "release" { gin.SetMode(gin.ReleaseMode) } r := gin.New() r.Use(middleware.Recovery(), middleware.Trace(), middleware.ErrorHandler()) r.GET("/healthz", func(c *gin.Context) { response.OK(c, gin.H{"status": "ok"}) }) // 共享基础设施:微信客户端、用户仓储、小程序仓储。 wx := wechat.NewClient() userRepo := user.New(db) miniRepo := miniapprepo.New(db) // 小程序分组:先校验请求头 app_id 身份,再挂载各小程序业务路由。 ma := r.Group("/api/ma") ma.Use(middleware.MiniAppAuth(miniRepo)) { app1Svc := app1svc.New(userRepo, miniRepo, wx, store) app1hdl.Register(ma, app1hdl.NewHandler(app1Svc), middleware.MiniUserAuth(store)) // 新增小程序时,在此依次注册 app2..app10: // app2Svc := app2svc.New(userRepo, miniRepo, wx, store) // app2hdl.Register(ma, app2hdl.NewHandler(app2Svc)) } // 后台管理分组:JWT 鉴权。 ad := r.Group("/api/admin") ad.Use(middleware.AdminAuth(cfg.Admin.JWTSecret)) { adminhdl.Register(ad, adminhdl.NewHandler(cfg.Admin.JWTSecret, parseTTL(cfg.Admin.TokenTTL))) // 小程序管理:被后台纳管的微信小程序配置(增删改查)。 miniSvc := miniappsvc.New(miniRepo) miniapphdl.Register(ad, miniapphdl.NewHandler(miniSvc)) // 用户管理:各小程序端用户(列表、详情、编辑、禁用/启用)。 userSvc := usersvc.New(userRepo) userhdl.Register(ad, userhdl.NewHandler(userSvc)) } return r } func parseTTL(s string) time.Duration { if d, err := time.ParseDuration(s); err == nil { return d } return 24 * time.Hour }