ldap-1-backend/routes/a_routes.go

131 lines
4.6 KiB
Go
Raw Permalink Normal View History

2025-08-26 00:43:50 +08:00
/*
Package routes 系统路由配置的主入口
该文件负责初始化和配置整个系统的路由结构包括
- Gin 引擎的基础配置
- 全局中间件的注册和配置
- 静态文件服务配置
- API 路由组的初始化
- Swagger 文档路由配置
路由架构说明
1. 静态文件路由服务前端 Vue 应用
2. API 路由组所有后端 API 接口
3. Swagger 文档API 文档和测试界面
中间件执行顺序
1. 静态文件服务中间件
2. 限流中间件令牌桶算法
3. CORS 跨域中间件
4. 操作日志中间件
5. JWT 认证中间件特定路由
6. Casbin 权限中间件特定路由
*/
2022-05-18 17:57:03 +08:00
package routes
import (
"fmt"
"net/http"
2022-05-18 17:57:03 +08:00
"time"
2022-05-29 10:06:21 +08:00
"github.com/eryajf/go-ldap-admin/config"
_ "github.com/eryajf/go-ldap-admin/docs"
2022-05-29 10:06:21 +08:00
"github.com/eryajf/go-ldap-admin/middleware"
"github.com/eryajf/go-ldap-admin/public/common"
"github.com/eryajf/go-ldap-admin/public/static"
2022-05-18 17:57:03 +08:00
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
2022-05-18 17:57:03 +08:00
)
2025-08-26 00:43:50 +08:00
// InitRoutes 初始化系统路由
// 该函数是整个路由系统的入口点,负责:
// 1. 配置 Gin 引擎的运行模式
// 2. 注册全局中间件
// 3. 配置静态文件服务
// 4. 初始化 API 路由组
// 5. 配置 Swagger 文档路由
//
// 返回值:
// - *gin.Engine: 配置完成的 Gin 引擎实例
2022-05-18 17:57:03 +08:00
func InitRoutes() *gin.Engine {
2025-08-26 00:43:50 +08:00
// ==================== Gin 引擎配置 ====================
// 根据配置文件设置 Gin 运行模式debug/release/test
2022-05-18 17:57:03 +08:00
gin.SetMode(config.Conf.System.Mode)
2025-08-26 00:43:50 +08:00
// 创建 Gin 引擎实例,包含默认的日志和恢复中间件
2022-05-18 17:57:03 +08:00
r := gin.Default()
2025-08-26 00:43:50 +08:00
// 备选方案:创建不带默认中间件的引擎
2022-05-18 17:57:03 +08:00
// r := gin.New()
// r.Use(gin.Recovery())
2025-08-26 00:43:50 +08:00
// ==================== 静态文件服务配置 ====================
// 配置静态文件服务,用于提供前端 Vue 应用
r.Use(middleware.Serve("/", middleware.EmbedFolder(static.Static, "dist")))
2025-08-26 00:43:50 +08:00
// 配置 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)
})
2025-08-26 00:43:50 +08:00
// ==================== 全局中间件配置 ====================
// 配置限流中间件(令牌桶算法)
// 根据配置文件设置令牌填充间隔和桶容量,防止 API 被恶意调用
2022-05-18 17:57:03 +08:00
fillInterval := time.Duration(config.Conf.RateLimit.FillInterval)
capacity := config.Conf.RateLimit.Capacity
r.Use(middleware.RateLimitMiddleware(time.Millisecond*fillInterval, capacity))
2025-08-26 00:43:50 +08:00
// 启用 CORS 跨域中间件
// 允许前端应用跨域访问后端 API
2022-05-18 17:57:03 +08:00
r.Use(middleware.CORSMiddleware())
// 启用操作日志中间件
2025-08-26 00:43:50 +08:00
// 记录所有 API 请求的详细信息,用于审计和问题排查
2022-05-18 17:57:03 +08:00
r.Use(middleware.OperationLogMiddleware())
2025-08-26 00:43:50 +08:00
// ==================== JWT 认证中间件初始化 ====================
// 初始化 JWT 认证中间件
2022-05-18 17:57:03 +08:00
authMiddleware, err := middleware.InitAuth()
if err != nil {
2025-08-26 00:43:50 +08:00
common.Log.Panicf("初始化 JWT 中间件失败:%v", err)
panic(fmt.Sprintf("初始化 JWT 中间件失败:%v", err))
2022-05-18 17:57:03 +08:00
}
2025-08-26 00:43:50 +08:00
// ==================== Swagger 文档路由 ====================
// 注册 Swagger API 文档路由
// 提供交互式的 API 文档和测试界面
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
2025-08-26 00:43:50 +08:00
// ==================== API 路由组注册 ====================
// 创建 API 路由组,所有业务接口都在此组下
2022-05-18 17:57:03 +08:00
apiGroup := r.Group("/" + config.Conf.System.UrlPathPrefix)
2025-08-26 00:43:50 +08:00
// 注册各个功能模块的路由
// 注意:路由注册顺序会影响中间件的执行顺序
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("🚀 系统路由初始化完成!")
2022-05-18 17:57:03 +08:00
return r
}