131 lines
4.6 KiB
Go
131 lines
4.6 KiB
Go
/*
|
||
Package routes 系统路由配置的主入口
|
||
|
||
该文件负责初始化和配置整个系统的路由结构,包括:
|
||
- Gin 引擎的基础配置
|
||
- 全局中间件的注册和配置
|
||
- 静态文件服务配置
|
||
- API 路由组的初始化
|
||
- Swagger 文档路由配置
|
||
|
||
路由架构说明:
|
||
1. 静态文件路由:服务前端 Vue 应用
|
||
2. API 路由组:所有后端 API 接口
|
||
3. Swagger 文档:API 文档和测试界面
|
||
|
||
中间件执行顺序:
|
||
1. 静态文件服务中间件
|
||
2. 限流中间件(令牌桶算法)
|
||
3. CORS 跨域中间件
|
||
4. 操作日志中间件
|
||
5. JWT 认证中间件(特定路由)
|
||
6. Casbin 权限中间件(特定路由)
|
||
*/
|
||
package routes
|
||
|
||
import (
|
||
"fmt"
|
||
"net/http"
|
||
"time"
|
||
|
||
"github.com/eryajf/go-ldap-admin/config"
|
||
_ "github.com/eryajf/go-ldap-admin/docs"
|
||
"github.com/eryajf/go-ldap-admin/middleware"
|
||
"github.com/eryajf/go-ldap-admin/public/common"
|
||
"github.com/eryajf/go-ldap-admin/public/static"
|
||
"github.com/gin-gonic/gin"
|
||
swaggerFiles "github.com/swaggo/files"
|
||
ginSwagger "github.com/swaggo/gin-swagger"
|
||
)
|
||
|
||
// InitRoutes 初始化系统路由
|
||
// 该函数是整个路由系统的入口点,负责:
|
||
// 1. 配置 Gin 引擎的运行模式
|
||
// 2. 注册全局中间件
|
||
// 3. 配置静态文件服务
|
||
// 4. 初始化 API 路由组
|
||
// 5. 配置 Swagger 文档路由
|
||
//
|
||
// 返回值:
|
||
// - *gin.Engine: 配置完成的 Gin 引擎实例
|
||
func InitRoutes() *gin.Engine {
|
||
// ==================== Gin 引擎配置 ====================
|
||
|
||
// 根据配置文件设置 Gin 运行模式(debug/release/test)
|
||
gin.SetMode(config.Conf.System.Mode)
|
||
|
||
// 创建 Gin 引擎实例,包含默认的日志和恢复中间件
|
||
r := gin.Default()
|
||
|
||
// 备选方案:创建不带默认中间件的引擎
|
||
// r := gin.New()
|
||
// r.Use(gin.Recovery())
|
||
|
||
// ==================== 静态文件服务配置 ====================
|
||
|
||
// 配置静态文件服务,用于提供前端 Vue 应用
|
||
r.Use(middleware.Serve("/", middleware.EmbedFolder(static.Static, "dist")))
|
||
|
||
// 配置 NoRoute 处理器,用于 SPA 路由支持
|
||
// 当请求的路由不存在时,返回 index.html,让前端路由接管
|
||
r.NoRoute(func(c *gin.Context) {
|
||
data, err := static.Static.ReadFile("dist/index.html")
|
||
if err != nil {
|
||
_ = c.AbortWithError(http.StatusInternalServerError, err)
|
||
return
|
||
}
|
||
c.Data(http.StatusOK, "text/html; charset=utf-8", data)
|
||
})
|
||
|
||
// ==================== 全局中间件配置 ====================
|
||
|
||
// 配置限流中间件(令牌桶算法)
|
||
// 根据配置文件设置令牌填充间隔和桶容量,防止 API 被恶意调用
|
||
fillInterval := time.Duration(config.Conf.RateLimit.FillInterval)
|
||
capacity := config.Conf.RateLimit.Capacity
|
||
r.Use(middleware.RateLimitMiddleware(time.Millisecond*fillInterval, capacity))
|
||
|
||
// 启用 CORS 跨域中间件
|
||
// 允许前端应用跨域访问后端 API
|
||
r.Use(middleware.CORSMiddleware())
|
||
|
||
// 启用操作日志中间件
|
||
// 记录所有 API 请求的详细信息,用于审计和问题排查
|
||
r.Use(middleware.OperationLogMiddleware())
|
||
|
||
// ==================== JWT 认证中间件初始化 ====================
|
||
|
||
// 初始化 JWT 认证中间件
|
||
authMiddleware, err := middleware.InitAuth()
|
||
if err != nil {
|
||
common.Log.Panicf("初始化 JWT 中间件失败:%v", err)
|
||
panic(fmt.Sprintf("初始化 JWT 中间件失败:%v", err))
|
||
}
|
||
|
||
// ==================== Swagger 文档路由 ====================
|
||
|
||
// 注册 Swagger API 文档路由
|
||
// 提供交互式的 API 文档和测试界面
|
||
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||
|
||
// ==================== API 路由组注册 ====================
|
||
|
||
// 创建 API 路由组,所有业务接口都在此组下
|
||
apiGroup := r.Group("/" + config.Conf.System.UrlPathPrefix)
|
||
|
||
// 注册各个功能模块的路由
|
||
// 注意:路由注册顺序会影响中间件的执行顺序
|
||
|
||
InitBaseRoutes(apiGroup, authMiddleware) // 基础路由(登录、登出等,无需认证)
|
||
InitUserRoutes(apiGroup, authMiddleware) // 用户管理路由(需要 JWT + Casbin)
|
||
InitGroupRoutes(apiGroup, authMiddleware) // 部门/组管理路由(需要 JWT + Casbin)
|
||
InitRoleRoutes(apiGroup, authMiddleware) // 角色管理路由(需要 JWT + Casbin)
|
||
InitMenuRoutes(apiGroup, authMiddleware) // 菜单管理路由(需要 JWT + Casbin)
|
||
InitApiRoutes(apiGroup, authMiddleware) // 接口管理路由(需要 JWT + Casbin)
|
||
InitOperationLogRoutes(apiGroup, authMiddleware) // 操作日志路由(需要 JWT + Casbin)
|
||
InitFieldRelationRoutes(apiGroup, authMiddleware) // 字段关系路由(需要 JWT + Casbin)
|
||
|
||
common.Log.Info("🚀 系统路由初始化完成!")
|
||
return r
|
||
}
|