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"
|
2024-04-04 16:27:34 +08:00
|
|
|
|
"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"
|
2024-05-20 21:55:42 +08:00
|
|
|
|
_ "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"
|
2024-04-04 16:27:34 +08:00
|
|
|
|
"github.com/eryajf/go-ldap-admin/public/static"
|
2022-05-18 17:57:03 +08:00
|
|
|
|
"github.com/gin-gonic/gin"
|
2024-05-20 21:55:42 +08:00
|
|
|
|
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 应用
|
2024-04-04 16:27:34 +08:00
|
|
|
|
r.Use(middleware.Serve("/", middleware.EmbedFolder(static.Static, "dist")))
|
2025-08-26 00:43:50 +08:00
|
|
|
|
|
|
|
|
|
// 配置 NoRoute 处理器,用于 SPA 路由支持
|
|
|
|
|
// 当请求的路由不存在时,返回 index.html,让前端路由接管
|
2024-04-04 16:27:34 +08:00
|
|
|
|
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 文档和测试界面
|
2024-05-20 21:55:42 +08:00
|
|
|
|
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
|
|
|
|
|
}
|