first commit

This commit is contained in:
2026-10-25 20:27:59 +08:00
commit 332b7dcd08
27 changed files with 1708 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
// 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"
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"
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))
// 新增小程序时,在此依次注册 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))
}
return r
}
func parseTTL(s string) time.Duration {
if d, err := time.ParseDuration(s); err == nil {
return d
}
return 24 * time.Hour
}