Files
portal-mini-go/internal/router/router.go
T
2026-10-25 21:00:08 +08:00

80 lines
2.6 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 装配 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
}