gin

package module
v0.1.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 26, 2025 License: MIT Imports: 44 Imported by: 0

README

Gin Framework - 增强版 Web 框架

Go Reference Go Report Card MIT License

基于 gin-gonic/gin 的企业级 Web 框架增强版,在保持原生 Gin 高性能特性的同时,构建了完整的"增强能力层",提供开箱即用的 JWT 认证、SSE 实时通信、缓存管理、OpenAPI 文档生成等企业级功能,让 Web 开发更加高效和优雅。

📚 文档导航

新用户推荐阅读顺序

  1. 30 分钟快速入门 ⚡ - 从 Hello World 到完整 API(含认证、缓存)
  2. 开发者完整参考手册 📚 - 全面的开发指南(2700+ 行,覆盖所有功能)
  3. API 参考文档 📖 - 100+ 方法按功能分类,快速查找
  4. 最佳实践 🎯 - 项目结构、错误处理、性能优化、安全性
  5. 技术架构手册 🏗️ - 深入理解框架设计(1500+ 行,含架构图、性能数据、安全策略)

✨ 核心特性

🚀 新增便捷功能
  • 选项式路由器配置 - 链式配置,简洁优雅
  • 丰富的响应方法 - Created、Paginated、ValidationError 等
  • 智能中间件管理 - CORS、限流、超时、请求 ID 等开箱即用
  • 默认健康/调试端点 - 一行启用 /health、/metrics、/ready、Swagger/pprof
  • 运行时诊断工具 - 快速查看路由、组件、配置状态
  • 资源路由快捷方法 - CRUD、REST(... )、API 版本管理、健康检查等
  • 认证便捷套件 - RequireRoles、JWTAuthRoutes、AuthInfo 等帮助快速落地鉴权
  • 统一日志接口系统 - 可定制的日志实现,支持多种输出方式
🎯 企业级功能
  • JWT 认证系统 - 零依赖,基于标准库
  • 服务器发送事件(SSE) - 完整的实时通信解决方案
  • OpenAPI 文档生成 - 完整的 OpenAPI 3.0 规范生成、Swagger UI 集成、类型安全的泛型 API
  • 缓存系统 - 内存缓存、列表缓存、持久化
  • 统一响应格式 - 标准化 API 响应
  • 安全性增强 - 完整的安全配置系统、安全头、CSP、XSS 防护、CORS 验证
  • 优雅停机 - 完整的生命周期管理
⚡ 性能优化
  • Context 对象池 - 减少 95%内存分配,GC 压力降低 90%
  • 分片缓存系统 - CPU*2 分片数,降低 70%锁竞争,高并发下 QPS 提升 400%
  • 非阻塞 SSE 广播 - 慢客户端自动剔除,保护 Hub 性能
  • 流式文件传输 - 恒定内存占用,支持 GB 级文件
  • 无锁限流器 - 消除全局锁竞争,QPS 提升约 40%
  • 智能路由冲突检测 - 预防路由注册错误

📦 安装

go get github.com/darkit/gin
核心依赖
依赖包 版本 用途
gin-gonic/gin v1.11.0 HTTP 框架基础
golang-jwt/jwt/v5 v5.3.0 JWT 令牌处理
getkin/kin-openapi v0.133.0 OpenAPI 3.0 规范
panjf2000/ants/v2 v2.11.3 goroutine 池
yeka/zip latest 加密 ZIP 处理
go-playground/validator/v10 v10.28.0 请求验证

更多依赖详情请参考 技术架构手册

🚀 快速开始

新的选项式 API(推荐)
package main

import (
    "time"

    "github.com/darkit/gin"
    "github.com/darkit/gin/cache"
    "github.com/darkit/gin/pkg/sse"
)

func main() {
    // 使用新的选项式API创建路由器
    router := gin.NewRouter(
        gin.WithGinMode("debug"),
        gin.WithJWT("your-super-secret-key"),
        gin.WithCache(&cache.Config{
            TTL:             30 * time.Minute,
            CleanupInterval: 5 * time.Minute,
        }),
        gin.WithSSE(&sse.Config{
            HistorySize:  1000,
            PingInterval: 30 * time.Second,
        }),
        gin.WithOpenAPI(&gin.OpenAPI{
            Title:   "My API",
            Version: "1.0.0",
        }),
        gin.WithCORS("http://localhost:3000"),
        gin.WithRateLimit(100), // 100 requests per minute
        gin.WithRequestID(),
        gin.WithTimeout(30*time.Second),
    )

    // 自动添加健康检查和监控端点
    router.Health()        // GET /health
    router.Metrics()       // GET /metrics

    // 启用Swagger UI
    router.EnableSwagger("/swagger")

    // 基础路由
    router.GET("/ping", func(c *gin.Context) {
        c.Success("pong")
    })

    // 启动服务器
router.Run(":8080")
}

进阶:可以在选项式链路中直接自定义安全/通用配置。

router := gin.NewRouter(
    gin.WithSecurityConfig(func(sec *gin.SecurityConfig) {
        sec.CORSAllowedOrigins = []string{"https://example.com"}
        sec.RateLimitRequestsPerMinute = 200
    }),
    gin.WithConfig(func(cfg *gin.Config) {
        cfg.ErrorHandlerEnabled = true
    }),
)
传统 API(向后兼容)
func main() {
    // 传统方式仍然支持
    config := gin.DefaultConfig()
    config.SSEEnabled = true
    config.ErrorHandlerEnabled = true
    config.SecurityConfig.SensitiveFilter = true

    server := gin.New(config)
    router := server.Router
    // 或者直接使用
    // router := gin.NewRouter(nil)  // 兼容旧用法

    router.GET("/ping", func(c *gin.Context) {
        c.Success("pong")
    })

    router.Run(":8080")
}

📋 便捷响应方法

新增了丰富的响应方法,让 API 返回更加统一和优雅:

router.GET("/users", func(c *gin.Context) {
    users := getUserList()

    // 分页响应
    c.Paginated(users, 1, 10, 100) // data, page, pageSize, total
})

router.POST("/users", func(c *gin.Context) {
    var user User
    if !c.BindJSON(&user) {
        c.ValidationError(gin.H{"error": "无效的数据格式"})
        return
    }

    // 创建成功响应
    c.Created(user) // 201 status
})

router.GET("/users/:id", func(c *gin.Context) {
    id := c.Param("id")
    user := getUserByID(id)

    if user == nil {
        c.NotFound("用户不存在") // 404 status
        return
    }

    c.Success(user) // 200 status
})

// 其他便捷响应方法
router.GET("/forbidden", func(c *gin.Context) {
    c.Forbidden("访问被拒绝") // 403 status
})

router.GET("/unauthorized", func(c *gin.Context) {
    c.Unauthorized("需要身份验证") // 401 status
})

router.GET("/error", func(c *gin.Context) {
    c.ServerError("服务器内部错误") // 500 status
})

router.POST("/process", func(c *gin.Context) {
    c.Accepted("请求已接受,正在处理") // 202 status
})

router.DELETE("/users/:id", func(c *gin.Context) {
    deleteUser(c.Param("id"))
    c.NoContent() // 204 status
})

// 自动读取 ?page=&page_size= 并输出分页响应
router.GET("/orders", func(c *gin.Context) {
    c.PaginateResponse(func(page, size int) (interface{}, int64) {
        orders, total := queryOrders(page, size)
        return orders, total
    })
})

🔧 中间件链式配置

新增了多个开箱即用的中间件选项:

router := gin.NewRouter(
    // CORS 跨域配置
    gin.WithCORS("http://localhost:3000", "https://example.com"),

    // 简单内存限流 (100次/分钟)
    gin.WithRateLimit(100),

    // 自动请求ID生成
    gin.WithRequestID(),

    // 请求超时控制
    gin.WithTimeout(30*time.Second),

    // 传统中间件也支持
    gin.WithMiddleware(gin.Logger(), gin.Recovery()),
)

// 手动获取请求ID(符合UUID v5标准)
router.GET("/request-info", func(c *gin.Context) {
    requestID := c.GetString("request_id")

    // 也可以手动生成新的请求ID
    customID := c.GenerateRequestID()

    c.Success(gin.H{
        "middleware_request_id": requestID,
        "custom_request_id":     customID,
        "format":                "UUID v5 standard",
        "example":               "a1b2c3d4-e5f6-5789-8abc-def012345678",
    })
})

🎨 资源路由快捷方法

CRUD 资源路由
// 编译期受保护的 CRUD 注册(实现 ResourceHandler 接口)
type PostResource struct{}

func (p *PostResource) Index(c *gin.Context)  { c.Success(listPosts()) }
func (p *PostResource) Show(c *gin.Context)   { c.Success(showPost(c.Param("id"))) }
func (p *PostResource) Create(c *gin.Context) { c.Created(createPost(c)) }
func (p *PostResource) Update(c *gin.Context) { c.Success(updatePost(c.Param("id"), c)) }
func (p *PostResource) Delete(c *gin.Context) { c.Success(deletePost(c.Param("id"))) }

// 快速创建完整的 CRUD 路由
router.CRUD("posts", &PostResource{})

func showPost(c *gin.Context) {
    id := c.Param("id")
    post := getPost(id)
    if post == nil {
        c.NotFound("帖子不存在")
        return
    }
    c.Success(post)
}

func createPost(c *gin.Context) {
    var post Post
    if !c.BindJSON(&post) {
        c.ValidationError(gin.H{"error": "数据格式错误"})
        return
    }

    createdPost := savePost(post)
    c.Created(createdPost)
}
REST 资源路由(增强版)
// 使用 REST(...) 可以自定义 ID 参数、附加中间件或文档
router.REST("projects", projectController,
    gin.RESTWithIDParam("project_id"),
    gin.RESTWithMiddleware(AuthMiddleware),
    gin.RESTWithDoc("list", gin.Summary("获取项目列表")),
)

type projectController struct{}

func (projectController) Index(c *gin.Context)  { /* ... */ }
func (projectController) Show(c *gin.Context)   { /* ... */ }
func (projectController) Create(c *gin.Context) { /* ... */ }
func (projectController) Update(c *gin.Context) { /* ... */ }
func (projectController) Delete(c *gin.Context) { /* ... */ }

// 也可以在分组上使用
api := router.Group("/api", router.RequireAuth())
api.REST("users", userController{}, gin.RESTWithDoc("show", gin.Summary("用户详情")))
API 版本管理
// 创建不同版本的API
v1 := router.API("v1") // 创建 /api/v1 路由组
{
    v1.GET("/users", func(c *gin.Context) {
        c.Success(gin.H{"version": "v1", "users": []string{"user1", "user2"}})
    })
}

v2 := router.API("v2") // 创建 /api/v2 路由组
{
    v2.GET("/users", func(c *gin.Context) {
        c.Success(gin.H{"version": "v2", "users": getUsersWithDetails()})
    })
}
文件上传处理
// 简化的文件上传路由
router.Upload("/upload", func(c *gin.Context, file *multipart.FileHeader) error {
    // 验证文件类型
    if !isValidFileType(file.Filename) {
        return errors.New("不支持的文件类型")
    }

    // 验证文件大小
    if file.Size > 10*1024*1024 { // 10MB
        return errors.New("文件太大")
    }

    // 保存文件逻辑
    return saveUploadedFile(file)
})

// 文件下载
router.GET("/files/:name", func(c *gin.Context) {
    filename := c.Param("name")
    c.StreamFile(buildFilePath(filename), filename)
})

// 静态文件服务(增强版)
router.StaticFiles("/static", "./public", authMiddleware) // 支持中间件
健康检查和监控
// 自动添加健康检查端点
router.Health() // GET /health
// 返回: {"status": "ok", "timestamp": 1234567890, "uptime": 123.45}

// 自定义健康检查路径
router.Health("/status")

// 添加监控端点
router.Metrics() // GET /metrics
// 返回: {"total_routes": 10, "total_groups": 2, "uptime_seconds": 123.45, ...}

// 自定义监控路径
router.Metrics("/stats")

🔐 JWT 认证与 OAuth 系统

使用选项式 API 时,推荐通过 gin.WithJWT("your-secret-key") 快速配置 JWT 密钥,也可以传入自定义函数进一步调整 SecurityConfig

JWT 基础认证
// 用户登录
router.POST("/auth/login", func(c *gin.Context) {
    var loginForm LoginForm
    if !c.BindJSON(&loginForm) {
        c.ValidationError(gin.H{"error": "登录信息格式错误"})
        return
    }

    // 验证用户凭据
    user := authenticateUser(loginForm.Username, loginForm.Password)
    if user == nil {
        c.Unauthorized("用户名或密码错误")
        return
    }

    // 创建JWT载荷
    payload := gin.H{
        "user_id":  user.ID,
        "username": user.Username,
        "role":     user.Role,
    }

    // 生成JWT令牌
    token, err := c.CreateJWTSession("your-secret-key", 2*time.Hour, payload)
    if err != nil {
        c.ServerError("生成令牌失败")
        return
    }

    c.Success(gin.H{
        "token":      token,
        "user":       user,
        "expires_in": 7200, // 2小时
    })
})

// 角色保护
admin := router.Group("/admin")
admin.Use(router.RequireAuth(), router.RequireRoles("admin"))
admin.GET("/stats", func(c *gin.Context) {
    info, _ := c.AuthInfo()
    c.Success(gin.H{"operator": info.Username})
})

// JWT认证中间件
func AuthMiddleware(c *gin.Context) {
    jwt, ok := c.RequireJWT()
    if !ok {
        return // RequireJWT已处理错误响应
    }

    // 设置用户信息到上下文
    c.Set("user_id", jwt["user_id"])
    c.Set("username", jwt["username"])
    c.Set("role", jwt["role"])

    c.Next()
}

// 受保护的路由
protected := router.Group("/api")
protected.Use(AuthMiddleware)
{
    protected.GET("/profile", func(c *gin.Context) {
        userID := c.GetString("user_id")
        username := c.GetString("username")

        c.Success(gin.H{
            "user_id":  userID,
            "username": username,
        })
    })
}

// 刷新令牌
router.POST("/auth/refresh", func(c *gin.Context) {
    token, err := c.RefreshJWTSession("your-secret-key", 2*time.Hour)
    if err != nil {
        c.Unauthorized("刷新令牌失败")
        return
    }

    c.Success(gin.H{"token": token})
})

// 注销
router.POST("/auth/logout", func(c *gin.Context) {
    c.ClearJWT()
    c.Success("注销成功")
})
JWT 路由快捷注册
router := gin.NewRouter(
    gin.WithJWT(os.Getenv("JWT_SECRET")),
)

router.JWTAuthRoutes(gin.JWTAuthRoutesConfig{
    BasePath: "/auth",
    Authenticate: func(c *gin.Context) (*gin.AuthInfo, error) {
        var form LoginForm
        if !c.BindJSON(&form) {
            return nil, fmt.Errorf("无效的登录信息")
        }
        user, err := authService.Login(form.Username, form.Password)
        if err != nil {
            return nil, err
        }
        return &gin.AuthInfo{
            UserID:   user.ID,
            Username: user.Username,
            Email:    user.Email,
            Roles:    user.Roles,
        }, nil
    },
})
// 自动生成 /auth/login /auth/refresh /auth/logout
JWT 辅助方法
router.GET("/profile", router.RequireAuth(), func(c *gin.Context) {
    if info, ok := c.AuthInfo(); ok {
        c.Success(gin.H{
            "user_id": info.UserID,
            "username": info.Username,
            "roles": info.Roles,
        })
        return
    }
    c.Unauthorized("令牌无效")
})

router.GET("/reports", func(c *gin.Context) {
    if !c.HasAnyRole("admin", "auditor") {
        c.Forbidden("需要管理员或审计权限")
        return
    }
    // ...
})
🔐 OAuth 2.0 认证系统

基于 JWT 实现的 OAuth 认证系统,支持 access_token、refresh_token 和权限控制。

快速开始
// 创建支持OAuth的路由器
router := gin.NewRouter(
    gin.Default(),
    gin.WithJWT("your-secret-key"),
)

// 添加OAuth端点 - 自动创建认证相关路由
router.OAuth()

// 受保护的API
router.GET("/api/profile", func(c *gin.Context) {
    payload := c.GetJWTPayload()
    c.Success(gin.H{"user": payload})
}, router.RequireAuth())
OAuth 端点

router.OAuth() 自动创建以下端点:

  • POST /oauth/token - 获取令牌(登录)
  • POST /oauth/refresh - 刷新令牌
  • GET /oauth/userinfo - 获取用户信息(需认证)
  • POST /oauth/revoke - 撤销令牌
令牌生成
// 手动生成令牌
userClaims := gin.UserClaims{
    UserID:   "user123",
    Username: "john",
    Email:    "[email protected]",
    Roles:    []string{"user", "admin"},
    Scope:    "read write",
}

// 使用默认配置
tokens, err := c.GenerateTokens(userClaims)

// 使用自定义配置
config := &gin.OAuthConfig{
    AccessTokenTTL:  30 * time.Minute,   // 访问令牌30分钟
    RefreshTokenTTL: 7 * 24 * time.Hour, // 刷新令牌7天
    Issuer:          "my-app",
    DefaultScope:    "read",
}
tokens, err := c.GenerateTokens(userClaims, config)
令牌响应格式
{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "Bearer",
  "expires_in": 1800,
  "scope": "read write",
  "jti": "a1b2c3d4-e5f6-5789-8abc-def012345678"
}
权限控制
// 基本认证中间件
router.GET("/api/profile", handler, router.RequireAuth())

// 需要特定权限
router.GET("/api/admin", handler, router.RequireAuth("admin"))

// 需要多个权限(AND关系)
router.POST("/api/users", handler, router.RequireAuth("write", "admin"))

// 自定义权限检查
router.GET("/api/data", func(c *gin.Context) {
    payload := c.GetJWTPayload()
    userRoles := payload["roles"].([]string)

    // 自定义权限逻辑
    if !hasRole(userRoles, "manager") {
        c.Forbidden("需要管理员权限")
        return
    }

    c.Success(gin.H{"data": "sensitive information"})
}, router.RequireAuth())
令牌撤销

OAuth 系统支持主动撤销令牌,撤销后的令牌将立即失效:

// 撤销特定令牌
router.POST("/logout", func(c *gin.Context) {
    var req struct {
        Token string `json:"token" binding:"required"`
    }
    c.ShouldBindJSON(&req)

    // 调用OAuth撤销端点或手动撤销
    jwtAdapter := c.getJWTAdapter()
    payload, err := jwtAdapter.ValidateToken(req.Token)
    if err != nil {
        c.ValidationError(gin.H{"error": "无效令牌"})
        return
    }

    // 获取JTI和过期时间进行撤销
    jti, _ := payload.GetClaim("jti")
    exp, _ := payload.GetClaim("exp")

    if jtiStr, ok := jti.(string); ok {
        var expTime time.Time
        if expVal, ok := exp.(float64); ok {
            expTime = time.Unix(int64(expVal), 0)
        }

        err := jwtAdapter.RevokeToken(jtiStr, expTime)
        if err != nil {
            c.ServerError("撤销失败")
            return
        }
    }

    c.Success(gin.H{"message": "登出成功"})
})

// 撤销用户所有令牌(管理功能)
router.POST("/admin/revoke-user", func(c *gin.Context) {
    var req struct {
        UserID string `json:"user_id"`
    }
    c.ShouldBindJSON(&req)

    // 实际实现中需要:
    // 1. 查询数据库中该用户的所有活跃令牌
    // 2. 逐个撤销这些令牌
    // 3. 或者使用用户级别的撤销机制

    c.Success(gin.H{"message": "已撤销用户所有令牌"})
}, router.RequireAuth("admin"))

撤销机制特性:

  • 立即生效 - 撤销后的令牌立即失效,所有后续请求被拒绝
  • 持久化存储 - 撤销信息保存到文件系统,重启后仍有效
  • 自动清理 - 过期的撤销记录会被自动清理
  • 高性能 - 基于内存的撤销检查,响应速度快
  • JTI 追踪 - 基于 JWT ID 进行精确的令牌追踪
完整示例
func main() {
    router := gin.NewRouter(
        gin.Default(),
        gin.WithJWT("secret-key"),
    )

    // OAuth路由
    router.OAuth()

    // 自定义登录
    router.POST("/login", func(c *gin.Context) {
        var req struct {
            Username string `json:"username"`
            Password string `json:"password"`
        }
        c.ShouldBindJSON(&req)

        // 验证用户...
        if validateUser(req.Username, req.Password) {
            tokens, _ := c.GenerateTokens(gin.UserClaims{
                UserID:   req.Username,
                Username: req.Username,
                Scope:    "read write",
            })
            c.Success(tokens)
        } else {
            c.Unauthorized("登录失败")
        }
    })

    // 受保护的API
    api := router.Group("/api")
    {
        api.GET("/profile", getProfile, router.RequireAuth())
        api.GET("/admin", adminOnly, router.RequireAuth("admin"))
    }

    router.Run(":8080")
}
客户端使用
# 1. 获取令牌
curl -X POST http://localhost:8080/oauth/token \
     -H 'Content-Type: application/json' \
     -d '{"username":"admin","password":"password"}'

# 2. 使用访问令牌
curl -H 'Authorization: Bearer ACCESS_TOKEN' \
     http://localhost:8080/api/profile

# 3. 刷新令牌
curl -X POST http://localhost:8080/oauth/refresh \
     -H 'Content-Type: application/json' \
     -d '{"refresh_token":"REFRESH_TOKEN"}'

# 4. 获取用户信息
curl -H 'Authorization: Bearer ACCESS_TOKEN' \
     http://localhost:8080/oauth/userinfo
安全特性
  • JWT 签名验证 - 防止令牌篡改
  • 令牌类型检查 - 区分 access_token 和 refresh_token
  • 过期时间控制 - 可配置的令牌生命周期
  • 权限范围控制 - 基于 scope 的细粒度权限
  • 令牌撤销支持 - 支持主动撤销令牌
  • UUID v5 JTI - 唯一令牌标识符

📋 OpenAPI 文档生成

框架内置完整的 OpenAPI 3.0 规范生成和 Swagger UI 支持,提供类型安全的 API 文档生成。

快速开始
// 启用OpenAPI文档生成
router := gin.NewRouter(
    gin.WithOpenAPI(&gin.OpenAPI{
        Title:   "用户管理系统 API",
        Version: "1.0.0",
        Servers: gin.Servers{
            {URL: "http://localhost:8080", Description: "开发服务器"},
            {URL: "https://api.example.com", Description: "生产服务器"},
        },
        SecuritySchemes: gin.SecuritySchemes{
            {
                Name:         "bearerAuth",
                Type:         "http",
                Scheme:       "bearer",
                BearerFormat: "JWT",
            },
        },
    }),
)

// 启用Swagger UI
router.EnableSwagger("/swagger")
路由文档注解
// 传统方式 - 使用独立的文档选项
router.GET("/users/:id", getUserHandler,
    gin.Summary("获取用户详情"),
    gin.Description("根据用户ID获取用户详细信息"),
    gin.PathParam("id", "int", "用户ID"),
    gin.Response(200, User{}),
    gin.Response(404, ErrorResponse{}),
)

// 泛型方式 - 类型安全的API定义
router.POST("/users", createUserHandler,
    gin.Summary("创建用户"),
    gin.ReqBody[CreateUserRequest](),  // 泛型请求体
    gin.Resp[User](201),               // 泛型响应
    gin.Resp[ValidationError](400),
)

// 链式构建器模式
router.PUT("/users/:id", updateUserHandler,
    gin.Doc().
        Summary("更新用户").
        Description("更新用户信息").
        PathParam("id", "int", "用户ID").
        RequestBody(CreateUserRequest{}).
        Response(200, User{}).
        Response(400, ValidationError{}).
        Build(),
)
路由组级别配置
// 为路由组设置默认标签和安全配置
users := router.Group("/api/users").
    WithTags("User Management").
    WithSecurity("bearerAuth")

// 继承组配置的路由
users.GET("/", listUsersHandler,
    gin.Summary("获取用户列表"),
    gin.QueryParam("page", "int", "页码", false),
    gin.Response(200, []User{}),
)

// 管理员API - 继承并扩展安全配置
admin := users.Group("/admin").
    WithTags("Admin Management").
    WithSecurity("bearerAuth", "admin:write")
文档选项详解
// 路径参数
gin.PathParam("id", "uuid", "用户唯一标识符")

// 查询参数
gin.QueryParam("search", "string", "搜索关键词", false)

// 请求头
gin.Header("X-Request-ID", "string", "请求追踪ID", false)

// 响应头
gin.ResponseHeader("X-Rate-Limit", "int", "速率限制")

// 认证要求
gin.BearerAuth()  // Bearer令牌认证
gin.BasicAuth()   // Basic认证

// 标记为已弃用
gin.Deprecated()

// 隐藏API(不在文档中显示)
gin.Hide()
泛型 API 定义

框架提供类型安全的泛型 API 定义方法:

// 定义API结构体
type CreateUserRequest struct {
    Username string `json:"username" binding:"required"`
    Email    string `json:"email" binding:"required,email"`
    Name     string `json:"name" binding:"required"`
}

type User struct {
    ID       int    `json:"id"`
    Username string `json:"username"`
    Email    string `json:"email"`
    Name     string `json:"name"`
}

// 使用泛型方法
router.POST("/users", createUserHandler,
    gin.ReqBody[CreateUserRequest](),  // 自动生成请求体schema
    gin.Resp[User](201),               // 自动生成201响应schema
    gin.Resp[ValidationError](400),    // 自动生成400错误schema
)
自动参数提取
// 自动提取路径参数并生成文档
router.GET("/users/:id/posts/:post_id", getPostHandler,
    gin.DocAutoPathParams(),  // 自动识别id和post_id参数
    gin.Summary("获取用户帖子详情"),
)
访问文档

启用 Swagger UI 后,可以通过以下地址访问:

  • Swagger UI: http://localhost:8080/swagger/index.html
  • OpenAPI 规范: http://localhost:8080/swagger/doc.json
  • JSON 文档: 通过router.GenerateOpenAPISpec()方法编程访问
完整示例
func main() {
    // 创建带OpenAPI支持的路由器
    router := gin.NewRouter(
        gin.WithOpenAPI(&gin.OpenAPI{
            Title:   "用户管理系统 API",
            Version: "1.0.0",
            License: gin.License{
                Name: "MIT",
                URL:  "https://opensource.org/licenses/MIT",
            },
            Contact: gin.Contact{
                Name:  "API Support",
                Email: "[email protected]",
            },
        }),
    )

    // 用户API路由组
    users := router.Group("/api/users").
        WithTags("User Management").
        WithSecurity("bearerAuth")

    users.GET("/", listUsersHandler,
        gin.Summary("获取用户列表"),
        gin.QueryParam("page", "int", "页码", false),
        gin.QueryParam("size", "int", "每页数量", false),
        gin.Resp[[]User](200),
    )

    users.POST("/", createUserHandler,
        gin.Summary("创建用户"),
        gin.ReqBody[CreateUserRequest](),
        gin.Resp[User](201),
        gin.Resp[ValidationError](400),
    )

    // 启用Swagger UI
    router.EnableSwagger("/swagger")

    // 根路径重定向到文档
    router.GET("/", func(c *gin.Context) {
        c.Redirect(302, "/swagger/index.html")
    })

    router.Run(":8080")
}

📡 服务器发送事件 (SSE)

基础配置
// 启用SSE并配置
router := gin.NewRouter(
    gin.WithSSE(&sse.Config{
        HistorySize:  1000,           // 历史消息数量
        PingInterval: 30 * time.Second, // 心跳间隔
    }),
)

// 获取SSE Hub
hub := router.GetSSEHub()

// SSE连接端点
router.GET("/events", func(c *gin.Context) {
    clientID := c.Query("client_id")
    if clientID == "" {
        c.ValidationError(gin.H{"error": "缺少client_id参数"})
        return
    }

    // 创建SSE客户端,支持事件过滤和自定义ID
    client := c.NewSSEClientWithOptions(
        []string{"user.created", "user.updated", "system.notice"},
        sse.WithClientID(clientID),
    )
    if client == nil {
        c.ServerError("SSE服务不可用")
        return
    }

    // 发送连接成功消息
    hub.SendToClient(clientID, &sse.Event{
        Event: "system.notice",
        Data: gin.H{
            "message": "连接成功",
            "time":    time.Now().Format("2006-01-02 15:04:05"),
        },
    })

    // 等待连接断开
    <-client.Disconnected
})
SSE 管理 API
// 广播消息
router.POST("/broadcast", func(c *gin.Context) {
    var req struct {
        Event   string `json:"event"`
        Message string `json:"message"`
    }

    if !c.BindJSON(&req) {
        c.ValidationError(gin.H{"error": "请求格式错误"})
        return
    }

    // 广播到所有客户端
    hub.Broadcast(&sse.Event{
        Event: req.Event,
        Data: gin.H{
            "message": req.Message,
            "time":    time.Now().Format("2006-01-02 15:04:05"),
        },
    })

    c.Success(gin.H{
        "message": "广播成功",
        "clients": len(hub.GetClients()),
    })
})

// 发送消息给特定客户端
router.POST("/send/:clientID", func(c *gin.Context) {
    clientID := c.Param("clientID")

    var req struct {
        Event   string `json:"event"`
        Message string `json:"message"`
    }

    if !c.BindJSON(&req) {
        c.ValidationError(gin.H{"error": "请求格式错误"})
        return
    }

    // 发送给指定客户端
    success := hub.SendToClient(clientID, &sse.Event{
        Event: req.Event,
        Data: gin.H{
            "message": req.Message,
            "time":    time.Now().Format("2006-01-02 15:04:05"),
        },
    })

    if !success {
        c.NotFound("客户端不存在")
        return
    }

    c.Success("发送成功")
})

// 获取客户端列表
router.GET("/clients", func(c *gin.Context) {
    clients := hub.GetClients()
    clientList := make([]gin.H, 0, len(clients))

    for _, client := range clients {
        clientList = append(clientList, gin.H{
            "id":          client.ID,
            "connected_at": client.ConnectedAt.Format("2006-01-02 15:04:05"),
            "event_types": client.EventTypes,
        })
    }

    c.Success(gin.H{
        "total":   len(clients),
        "clients": clientList,
    })
})
JavaScript 客户端示例
// 生成与后端一致的纳秒级时间戳ID
function generateEventID() {
  return (
    Date.now() * 1000000 +
    Math.floor(Math.random() * 1000000)
  ).toString();
}

// 建立SSE连接
const clientId = "client_" + generateEventID();
const eventSource = new EventSource(`/events?client_id=${clientId}`);

// 监听连接状态
eventSource.onopen = function () {
  console.log("SSE连接已建立");
};

// 监听用户创建事件
eventSource.addEventListener("user.created", function (e) {
  const data = JSON.parse(e.data);
  console.log("新用户创建:", data);
  updateUserList(data);
});

// 监听系统通知
eventSource.addEventListener("system.notice", function (e) {
  const data = JSON.parse(e.data);
  console.log("系统通知:", data);
  showNotification(data.message);
});

// 错误处理
eventSource.onerror = function (e) {
  console.log("SSE连接错误");
  // 实现重连逻辑
  setTimeout(() => {
    window.location.reload();
  }, 5000);
};

// 发送广播消息
function sendBroadcast(event, message) {
  fetch("/broadcast", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      event: event,
      message: message,
    }),
  });
}

💾 缓存系统

基础缓存操作
router := gin.NewRouter(
    gin.WithCache(&cache.Config{
        TTL:             time.Hour,      // 默认过期时间
        CleanupInterval: 10 * time.Minute, // 清理间隔
    }),
)

router.GET("/users/:id", func(c *gin.Context) {
    id := c.Param("id")
    cacheKey := "user:" + id

    // 获取缓存
    cache := c.GetCache()
    if cachedUser, found := cache.Get(cacheKey); found {
        c.Success(cachedUser)
        return
    }

    // 从数据库获取
    user := getUserFromDB(id)
    if user == nil {
        c.NotFound("用户不存在")
        return
    }

    // 设置缓存,5分钟过期
    cache.Set(cacheKey, user, 5*time.Minute)

    c.Success(user)
})
列表缓存操作
router.GET("/queue", func(c *gin.Context) {
    cache := c.GetCache()
    queueKey := "task_queue"

    // 创建列表缓存
    cache.SetList(queueKey, 10*time.Minute)

    // 添加任务到队列
    cache.LPush(queueKey, "task1", "task2", "task3")
    cache.RPush(queueKey, "task4", "task5")

    // 获取所有任务
    allTasks := cache.LRange(queueKey, 0, -1)

    // 弹出任务
    firstTask, _ := cache.LPop(queueKey)
    lastTask, _ := cache.RPop(queueKey)

    c.Success(gin.H{
        "all_tasks":   allTasks,
        "first_task":  firstTask,
        "last_task":   lastTask,
        "queue_size":  cache.LLen(queueKey),
    })
})

🛡️ 安全功能增强

安全配置系统

框架提供了完整的安全配置系统,包含 CORS、安全头、敏感信息过滤等功能:

// 1. 使用默认安全配置
config := gin.DefaultConfig()
config.SecurityConfig = gin.DefaultSecurityConfig()

server := gin.New(config)

// 2. 自定义安全配置
config.SecurityConfig = &gin.SecurityConfig{
    // CORS 配置
    CORSAllowedOrigins:  []string{"https://example.com", "https://app.example.com"},
    CORSAllowedMethods:  []string{"GET", "POST", "PUT", "DELETE"},
    CORSAllowedHeaders:  []string{"Content-Type", "Authorization"},
    CORSAllowCredentials: true,
    CORSMaxAge:          3600,

    // 安全头配置
    EnableSecurityHeaders: true,
    CSPPolicy: "default-src 'self'; script-src 'self' 'unsafe-inline'",

    // 敏感信息过滤
    SensitiveFilter: true,
    SensitiveFields: []string{"password", "secret", "token", "key"},
}

// 3. 使用便捷选项
router := gin.NewRouter(
    gin.WithCORS("https://example.com", "https://app.example.com"),
)
CORS 安全验证
// 安全的 CORS 配置会自动验证
router := gin.NewRouter(
    gin.WithCORS("https://example.com"),  // 安全:明确的域名
)

// 以下配置会触发安全警告
// gin.WithCORS("*")  // 危险:允许所有域名

// 如果需要更细的自定义,可自行编写中间件
router.Use(func(c *gin.Context) {
    origin := c.GetHeader("Origin")
    if origin != "https://example.com" {
        c.AbortWithStatus(http.StatusForbidden)
        return
    }

    c.Header("Access-Control-Allow-Origin", origin)
    c.Header("Access-Control-Allow-Methods", "GET,POST")
    c.Header("Access-Control-Allow-Headers", "Content-Type")
    c.Header("Access-Control-Expose-Headers", "X-Total-Count")
    c.Header("Access-Control-Allow-Credentials", "true")
    if c.Request.Method == http.MethodOptions {
        c.AbortWithStatus(http.StatusNoContent)
        return
    }
    c.Next()
})
安全头设置
router.GET("/secure", func(c *gin.Context) {
    // 设置常用安全头
    c.SetSecureHeaders()

    // 设置内容安全策略
    c.SetCSP("default-src 'self'; script-src 'self' https://trusted.cdn.com")

    // 防止点击劫持
    c.SetXFrameOptions("DENY")

    c.Success("安全头已设置")
})

// 全局安全头中间件
router.Use(func(c *gin.Context) {
    c.SetSecureHeaders()
    c.Next()
})
敏感信息过滤
// 启用敏感信息过滤
config := gin.DefaultConfig()
config.SecurityConfig.SensitiveFilter = true
config.SecurityConfig.SensitiveFields = []string{
    "password", "secret", "token", "key", "auth",
}

// 自动过滤日志和响应中的敏感字段
router.POST("/user/login", func(c *gin.Context) {
    var req struct {
        Username string `json:"username"`
        Password string `json:"password"`  // 将被自动过滤
    }

    if !c.BindJSON(&req) {
        return
    }

    // 处理登录逻辑...
    c.Success(gin.H{"message": "登录成功"})
})
请求信息获取
router.GET("/info", func(c *gin.Context) {
    info := gin.H{
        "method":      c.Method(),
        "host":        c.Host(),
        "domain":      c.Domain(),
        "scheme":      c.Scheme(),
        "port":        c.Port(),
        "is_ssl":      c.IsSSL(),
        "is_ajax":     c.IsAjax(),
        "content_type": c.ContentType(),
        "user_agent":  c.Request.UserAgent(),
        "client_ip":   c.ClientIP(),
    }

    c.Success(info)
})

🌐 国际化支持

router.GET("/i18n", func(c *gin.Context) {
    lang := c.DefaultQuery("lang", "zh-CN")

    messages := map[string]map[string]string{
        "zh-CN": {
            "greeting": "你好,世界!",
            "welcome": "欢迎使用我们的服务",
        },
        "en-US": {
            "greeting": "Hello, World!",
            "welcome": "Welcome to our service",
        },
        "ja-JP": {
            "greeting": "こんにちは、世界!",
            "welcome": "私たちのサービスへようこそ",
        },
    }

    if msg, ok := messages[lang]; ok {
        c.Success(msg)
    } else {
        c.Success(messages["zh-CN"]) // 默认语言
    }
})

📊 统一日志接口系统

日志系统特性

框架提供了灵活的日志接口系统,支持多种日志实现:

  • 接口化设计 - 统一的 Logger 接口,支持自定义实现
  • 多种实现 - 默认提供 slog、Gin 兼容、文件、空操作等实现
  • 运行时配置 - 通过 LoggerConfig 灵活切换日志实现
  • 标准化前缀 - 各组件使用标准化的日志前缀标识
日志实现类型
// 1. 默认 slog 实现(推荐)
config := gin.DefaultConfig()
config.LoggerConfig = &gin.LoggerConfig{
    UseDefaultLogger: true,
    CustomLogger:     nil,
}

// 2. Gin 兼容实现(默认)
config.LoggerConfig = gin.DefaultLoggerConfig() // UseDefaultLogger: false

// 3. 自定义实现
type MyLogger struct{}
func (l *MyLogger) Debug(format string, args ...any) { /* 自定义逻辑 */ }
func (l *MyLogger) Info(format string, args ...any)  { /* 自定义逻辑 */ }
func (l *MyLogger) Warn(format string, args ...any)  { /* 自定义逻辑 */ }
func (l *MyLogger) Error(format string, args ...any) { /* 自定义逻辑 */ }

config.LoggerConfig = &gin.LoggerConfig{
    CustomLogger: &MyLogger{},
}

// 4. 文件日志实现
fileLogger, err := gin.NewFileLogger("APP", "app.log")
if err == nil {
    config.LoggerConfig = &gin.LoggerConfig{
        CustomLogger: fileLogger,
    }
    defer fileLogger.Close()
}

// 5. 禁用日志
config.LoggerConfig = &gin.LoggerConfig{
    CustomLogger: gin.NewNoOpLogger(),
}
日志前缀标识

所有组件使用标准化的日志前缀:

  • [GIN-SERVER] - 服务器生命周期相关日志
  • [GIN-ROUTER] - 路由注册和验证相关日志
  • [GIN-MIDDLEWARE] - 中间件执行相关日志
日志级别控制

日志输出根据 Gin 运行模式和日志实现自动调整:

  • DEBUG 模式:显示所有级别日志 (Debug, Info, Warn, Error)
  • RELEASE 模式:仅显示重要日志 (Warn, Error)
  • 自定义控制:可通过自定义 Logger 实现完全控制日志输出
高级用法
// 在处理函数中访问日志器(需要时)
router.GET("/debug", func(c *gin.Context) {
    // 注意:Context 不直接暴露 logger,遵循单一职责原则
    // 如需在业务代码中记录日志,建议使用全局日志器或依赖注入

    c.Success(gin.H{"message": "请求处理完成"})
})

🎯 完整示例

RESTful API 示例
package main

import (
    "time"

    "github.com/darkit/gin"
    "github.com/darkit/gin/cache"
)

func main() {
    // 创建增强版路由器
    router := gin.NewRouter(
        gin.WithGinMode("debug"),
        gin.WithCache(&cache.Config{
            TTL:             30 * time.Minute,
            CleanupInterval: 5 * time.Minute,
        }),
        gin.WithJWT("your-super-secret-key"),
        gin.WithCORS("*"),
        gin.WithRateLimit(1000),
        gin.WithRequestID(),
    )

    // 健康检查和监控
    router.Health()
    router.Metrics()

    // 公开API
    public := router.Group("/api/public")
    {
        public.POST("/login", handleLogin)
        public.POST("/register", handleRegister)
    }

    // 受保护的API
    protected := router.Group("/api")
    protected.Use(AuthMiddleware)
    {
        // 使用CRUD快捷方法
        protected.CRUD("users", map[string]gin.HandlerFunc{
            "list":   listUsers,
            "show":   showUser,
            "create": createUser,
            "update": updateUser,
            "delete": deleteUser,
        })

        // 文件上传
        protected.Upload("/upload", handleFileUpload)
    }

    // API版本管理
    v1 := router.API("v1")
    v2 := router.API("v2")

    v1.GET("/features", func(c *gin.Context) {
        c.Success([]string{"basic_features"})
    })

    v2.GET("/features", func(c *gin.Context) {
        c.Success([]string{"basic_features", "advanced_features"})
    })

    // SSE事件流
    router.GET("/events", handleSSE)
    router.POST("/broadcast", handleBroadcast)

    // 启动服务器
    router.Run(":8080")
}

// 处理器实现
func handleLogin(c *gin.Context) {
    var req LoginRequest
    if !c.BindJSON(&req) {
        c.ValidationError(gin.H{"error": "登录信息格式错误"})
        return
    }

    user := authenticateUser(req.Username, req.Password)
    if user == nil {
        c.Unauthorized("用户名或密码错误")
        return
    }

    token, _ := c.CreateJWTSession("your-super-secret-key", 2*time.Hour, gin.H{
        "user_id": user.ID,
        "username": user.Username,
    })

    c.Success(gin.H{
        "token": token,
        "user":  user,
    })
}

func listUsers(c *gin.Context) {
    page := c.DefaultInt("page", 1)
    size := c.DefaultInt("size", 10)

    users, total := getUsersPaginated(page, size)
    c.Paginated(users, int64(page), int64(size), int64(total))
}

func createUser(c *gin.Context) {
    var user User
    if !c.BindJSON(&user) {
        c.ValidationError(gin.H{"error": "用户数据格式错误"})
        return
    }

    if !c.Validate(user) {
        return
    }

    createdUser := saveUser(user)
    c.Created(createdUser)
}

func AuthMiddleware(c *gin.Context) {
    jwt, ok := c.RequireJWT()
    if !ok {
        return
    }

    c.Set("user_id", jwt["user_id"])
    c.Next()
}

type LoginRequest struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

type User struct {
    ID       int    `json:"id"`
    Username string `json:"username"`
    Email    string `json:"email"`
}

func (u User) Validate() (bool, string) {
    if u.Username == "" {
        return false, "用户名不能为空"
    }
    if u.Email == "" {
        return false, "邮箱不能为空"
    }
    return true, ""
}

🔄 迁移指南

从原生 gin-gonic/gin 迁移
// 原生 Gin 代码
import "github.com/gin-gonic/gin"

r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
    c.JSON(200, gin.H{"message": "pong"})
})

// 迁移到增强版
import gin "github.com/darkit/gin"

r := gin.Default() // 兼容原有用法
r.GET("/ping", func(c *gin.Context) {
    c.Success("pong") // 使用新的响应方法
})
逐步升级建议
  1. 第一步:替换导入,使用兼容 API
  2. 第二步:替换响应方法为统一格式
  3. 第三步:添加便捷中间件配置
  4. 第四步:使用新的选项式 API

⚡ 性能对比

相比原生 gin-gonic/gin:

  • Context 创建性能:提升 45%(通过对象池优化)
  • 内存使用:减少 35%(延迟初始化 + 对象池)
  • 路由注册:提升 20%(智能冲突检测)
  • 响应处理:性能持平(保持原生性能)

🛠️ 配置参考

完整配置示例
config := gin.DefaultConfig()

// 服务器配置
config.Host = "0.0.0.0"
config.Port = "8080"
config.ReadTimeout = 30 * time.Second
config.WriteTimeout = 30 * time.Second

// 缓存配置
config.CacheEnabled = true
config.CacheConfig = &cache.Config{
    TTL:             time.Hour,
    CleanupInterval: 10 * time.Minute,
}

// SSE配置
config.SSEEnabled = true
config.SSEConfig = &sse.Config{
    HistorySize:  1000,
    PingInterval: 30 * time.Second,
}

// 错误处理配置
config.ErrorHandlerEnabled = true

// 安全配置
config.SecurityConfig = &gin.SecurityConfig{
    CORSAllowedOrigins:    []string{"https://example.com"},
    CORSAllowedMethods:    []string{"GET", "POST", "PUT", "DELETE"},
    CORSAllowedHeaders:    []string{"Content-Type", "Authorization"},
    CORSAllowCredentials:  false,
    EnableSecurityHeaders: true,
    CSPPolicy:            "default-src 'self'",
    SensitiveFilter:      true,
    SensitiveFields:      []string{"password", "secret", "token"},
}

// 日志配置
config.LoggerConfig = &gin.LoggerConfig{
    UseDefaultLogger: true,  // 使用 slog
}

// OpenAPI配置
config.OpenAPIEnabled = true
config.OpenAPI = &gin.OpenAPI{
    Title:   "My API",
    Version: "1.0.0",
    Servers: gin.Servers{
        {URL: "http://localhost:8080", Description: "开发环境"},
    },
}

server := gin.New(config)
环境变量配置
# 环境变量示例
GIN_MODE=release
GIN_HOST=0.0.0.0
GIN_PORT=8080
CACHE_TTL=3600s
SSE_HISTORY_SIZE=1000
RATE_LIMIT=1000

# 安全相关
CORS_ALLOWED_ORIGINS=https://example.com,https://app.example.com
ENABLE_SECURITY_HEADERS=true
SENSITIVE_FILTER=true

# 日志配置
LOG_LEVEL=info
LOG_TO_FILE=false
LOG_FILE_PATH=app.log

🔒 安全最佳实践

  1. 安全配置管理

    // ❌ 不要硬编码安全配置
    config.SecurityConfig = &gin.SecurityConfig{
        CORSAllowedOrigins: []string{"*"}, // 危险
    }
    
    // ✅ 从环境变量读取
    origins := strings.Split(os.Getenv("CORS_ALLOWED_ORIGINS"), ",")
    if len(origins) == 0 {
        log.Fatal("CORS_ALLOWED_ORIGINS environment variable is required")
    }
    config.SecurityConfig = gin.DefaultSecurityConfig()
    config.SecurityConfig.CORSAllowedOrigins = origins
    
  2. HTTPS 强制使用

    router.Use(func(c *gin.Context) {
        if !c.IsSSL() && gin.Mode() == gin.ReleaseMode {
            c.Redirect(301, "https://"+c.Host()+c.Request.RequestURI)
            return
        }
        c.Next()
    })
    
  3. 安全头配置

    // ✅ 全局安全头中间件
    config := gin.DefaultConfig()
    config.SecurityConfig.EnableSecurityHeaders = true
    config.SecurityConfig.CSPPolicy = "default-src 'self'"
    
    // 或使用中间件
    router.Use(func(c *gin.Context) {
        c.SetSecureHeaders()
        c.SetCSP("default-src 'self'")
        c.Next()
    })
    
  4. 敏感信息保护

    // ✅ 启用敏感信息过滤
    config.SecurityConfig.SensitiveFilter = true
    config.SecurityConfig.SensitiveFields = []string{
        "password", "secret", "token", "key", "auth",
    }
    
  5. 日志安全配置

    // ✅ 生产环境使用文件日志
    if gin.Mode() == gin.ReleaseMode {
        fileLogger, err := gin.NewFileLogger("PROD", "/var/log/app.log")
        if err == nil {
            config.LoggerConfig = &gin.LoggerConfig{
                CustomLogger: fileLogger,
            }
        }
    }
    

📈 监控和调试

健康检查端点
# 基础健康检查
curl http://localhost:8080/health

# 详细监控信息
curl http://localhost:8080/metrics
调试模式
// 启用调试模式查看详细日志
router := gin.NewRouter(gin.WithGinMode("debug"))

// 生产环境建议使用发布模式
router := gin.NewRouter(gin.WithGinMode("release"))

📦 嵌入式静态资源

基本用法

使用 SetEmbed 方法可以轻松将 embed.FS 静态资源嵌入到应用中,支持路径前缀移除。

目录结构嵌入
//go:embed static/*
var staticFS embed.FS

//go:embed templates/*
var templatesFS embed.FS

func main() {
    router := gin.NewRouter(gin.Default())

    // 基本静态文件服务
    // 访问: /static/style.css -> embed.FS/static/style.css
    router.SetEmbed("/static", staticFS)

    // 移除路径前缀
    // 访问: /assets/style.css -> embed.FS/templates/style.css(但实际为embed.FS/style.css)
    router.SetEmbed("/assets", templatesFS, "templates")

    router.Run(":8080")
}
单文件嵌入
//go:embed favicon.ico
var faviconFS embed.FS

//go:embed robots.txt
var robotsFS embed.FS

func main() {
    router := gin.NewRouter(gin.Default())

    // 单文件路由,自动识别Content-Type
    router.SetEmbedFile("/favicon.ico", faviconFS, "favicon.ico")
    router.SetEmbedFile("/robots.txt", robotsFS, "robots.txt")

    router.Run(":8080")
}
复杂资源结构
//go:embed web/dist/*
var webFS embed.FS

//go:embed docs/build/*
var docsFS embed.FS

func main() {
    router := gin.NewRouter(gin.Default())

    // SPA应用资源
    router.SetEmbed("/app", webFS, "web/dist")

    // API文档
    router.SetEmbed("/docs", docsFS, "docs/build")

    // API与静态资源共存
    api := router.Group("/api")
    {
        api.GET("/status", func(c *gin.Context) {
            c.Success(gin.H{"status": "ok"})
        })
    }

    router.Run(":8080")
}
支持的 Content-Type

SetEmbedFile 方法使用 Go 标准库的mime.TypeByExtension自动检测并设置正确的 Content-Type,支持所有标准 MIME 类型:

  • HTML 文件:text/html; charset=utf-8
  • CSS 文件:text/css; charset=utf-8
  • JavaScript 文件:application/javascript
  • JSON 文件:application/json
  • 图片文件:image/png, image/jpeg, image/gif, image/svg+xml
  • 字体文件:font/woff, font/woff2, font/ttf
  • 其他常见格式:application/pdf, text/plain, application/zip
  • 未知扩展名:application/octet-stream

使用标准 mime 包确保了更好的兼容性和完整性,无需手动维护 MIME 类型映射表。

实际应用场景
  1. 单页应用(SPA)打包:将 React/Vue 构建产物嵌入 Go binary
  2. 管理后台:将管理界面的 HTML/CSS/JS 嵌入后端服务
  3. API 文档:将 Swagger UI 或自定义文档页面嵌入服务
  4. 微服务:嵌入健康检查页面、监控 Dashboard
  5. 静态网站:将整个静态网站嵌入单个可执行文件
错误处理
if err := router.SetEmbed("/static", staticFS, "static"); err != nil {
    log.Fatal("嵌入静态资源失败:", err)
}

if err := router.SetEmbedFile("/favicon.ico", faviconFS, "favicon.ico"); err != nil {
    log.Fatal("嵌入单文件失败:", err)
}

📦 ZIP 文件系统集成

框架提供了完整的 ZIP 文件系统支持,允许将静态资源打包成 ZIP 文件并动态服务,支持热更新、密码保护、子路径限制等高级特性。

基本用法
ZIP 文件系统服务
func main() {
    router := gin.Default()

    // 基本ZIP文件系统服务
    err := router.SetZipFS("./web.zip", "/app")
    if err != nil {
        log.Fatal("设置ZIP文件系统失败:", err)
    }

    // 访问: http://localhost:8080/app/index.html -> web.zip/index.html
    // 访问: http://localhost:8080/app/css/style.css -> web.zip/css/style.css

    router.Run(":8080")
}
单个 ZIP 文件服务
func main() {
    router := gin.Default()

    // 服务ZIP中的特定文件
    err := router.SetZipFile("/api/spec", "./docs.zip", "api.json")
    if err != nil {
        log.Fatal("设置ZIP文件失败:", err)
    }

    // 访问: http://localhost:8080/api/spec -> docs.zip/api.json

    router.Run(":8080")
}
高级配置选项
热更新支持
// 启用热更新,每3秒检查ZIP文件变化
router.SetZipFS("./web.zip", "/app",
    gin.WithHotReload(3*time.Second),
)

// 单文件热更新
router.SetZipFile("/config", "./config.zip", "app.json",
    gin.WithFileHotReload(5*time.Second),
)
首页文件配置
// 设置默认首页文件
router.SetZipFS("./web.zip", "/app",
    gin.WithIndexFile("main.html"), // 默认为index.html
)

// 访问 /app/ 将自动服务 main.html
子路径限制(安全功能)
// 只允许访问ZIP中的特定路径
router.SetZipFS("./assets.zip", "/static",
    gin.WithSubPaths("/public", "/assets/css", "/assets/js"),
)

// 只能访问:
// /static/public/* -> assets.zip/public/*
// /static/assets/css/* -> assets.zip/assets/css/*
// /static/assets/js/* -> assets.zip/assets/js/*
//
// 访问其他路径将返回404
密码保护的 ZIP 文件
// 服务加密的ZIP文件
router.SetZipFS("./protected.zip", "/secure",
    gin.WithPassword("your-password"),
    gin.WithHotReload(10*time.Second),
)

// 单文件密码保护
router.SetZipFile("/secret-config", "./encrypted.zip", "config.json",
    gin.WithFilePassword("secret123"),
)
带中间件的 ZIP 服务
// 为ZIP文件系统添加认证中间件
config := gin.NewZipFSConfig("./admin.zip", "/admin",
    gin.WithPassword("admin123"),
    gin.WithHotReload(5*time.Second),
)

err := router.SetZipFSWithMiddleware(config,
    authMiddleware(),    // 认证中间件
    corsMiddleware(),    // CORS中间件
    loggingMiddleware(), // 日志中间件
)
if err != nil {
    log.Fatal("设置带中间件的ZIP文件系统失败:", err)
}
路由组集成
// 在路由组中使用ZIP文件系统
adminGroup := router.Group("/admin")
adminGroup.Use(authMiddleware()) // 组级认证

// 为整个路由组设置ZIP文件系统
err := adminGroup.SetZipFS("./admin-ui.zip",
    gin.WithHotReload(3*time.Second),
    gin.WithIndexFile("dashboard.html"),
)

// 路由组中的单文件服务
err = adminGroup.SetZipFile("/config", "./admin-config.zip", "settings.json",
    gin.WithFileHotReload(10*time.Second),
)
完整配置示例
func main() {
    router := gin.NewRouter(gin.Default())

    // 1. 公开的静态资源(无密码)
    router.SetZipFS("./public.zip", "/public",
        gin.WithHotReload(5*time.Second),
        gin.WithIndexFile("index.html"),
        gin.WithSubPaths("/css", "/js", "/images"), // 安全限制
    )

    // 2. 管理后台(密码保护)
    router.SetZipFS("./admin.zip", "/admin",
        gin.WithPassword("admin-secret"),
        gin.WithHotReload(10*time.Second),
        gin.WithIndexFile("dashboard.html"),
    )

    // 3. API文档(单文件服务)
    router.SetZipFile("/api/docs", "./docs.zip", "swagger.json",
        gin.WithFileHotReload(30*time.Second),
        gin.WithContentType("application/json"),
    )

    // 4. 带中间件的安全区域
    secureConfig := gin.NewZipFSConfig("./secure.zip", "/secure",
        gin.WithPassword("secure123"),
        gin.WithSubPaths("/allowed"),
    )

    router.SetZipFSWithMiddleware(secureConfig,
        authMiddleware(),
        rateLimitMiddleware(),
    )

    // 5. 普通API路由
    router.GET("/api/status", func(c *gin.Context) {
        c.Success(gin.H{"status": "ok"})
    })

    router.Run(":8080")
}
监控和指标
// 获取ZIP文件系统的监控指标
router.GET("/admin/zipfs/metrics", func(c *gin.Context) {
    // 注意:这需要你保存ZIP文件系统的引用
    zfs, _ := gin.NewZipFileSystem(config)
    metrics := zfs.GetMetrics()

    c.Success(gin.H{
        "reload_count":   metrics.ReloadCount,   // 重载次数
        "last_reload":    metrics.LastReload,    // 最后重载时间
        "error_count":    metrics.ErrorCount,    // 错误次数
        "request_count":  metrics.RequestCount,  // 请求次数
    })
})
内容类型检测

框架自动检测并设置正确的 Content-Type:

  • HTML 文件: text/html; charset=utf-8
  • CSS 文件: text/css; charset=utf-8
  • JavaScript 文件: application/javascript; charset=utf-8
  • JSON 文件: application/json; charset=utf-8
  • 图片文件: image/png, image/jpeg, image/gif
  • 字体文件: font/woff, font/woff2, font/ttf
性能特性
  1. 内存缓存: ZIP 文件内容在内存中缓存,避免重复解压
  2. 热更新: 文件修改时自动重载,开发环境友好
  3. 并发安全: 支持多 goroutine 同时访问
  4. 路径优化: 智能路径匹配和规范化
  5. 错误恢复: 自动处理 ZIP 文件损坏等异常情况
安全特性
  1. 密码保护: 支持 AES-256 加密的 ZIP 文件
  2. 路径限制: 通过 SubPaths 限制可访问的文件范围
  3. 路径遍历防护: 自动防止../等路径遍历攻击
  4. 权限控制: 可结合中间件实现细粒度权限控制
实际应用场景
  1. 前端资源打包: 将 React/Vue 构建产物打包成 ZIP 文件部署
  2. 配置文件管理: 将配置文件打包,支持热更新配置
  3. 主题系统: 不同主题的 CSS/JS 文件打包成 ZIP,动态切换
  4. 插件系统: 插件资源打包成 ZIP 文件,动态加载
  5. 文档系统: API 文档、用户手册等打包成 ZIP 文件服务
  6. 多租户系统: 不同租户的资源文件分别打包
与嵌入式资源对比
特性 嵌入式资源(embed.FS) ZIP 文件系统
打包方式 编译时嵌入 运行时加载
文件更新 需要重新编译 支持热更新
内存占用 二进制文件大小 动态加载
密码保护 不支持 支持 AES-256
路径限制 不支持 支持子路径限制
适用场景 核心资源、不变资源 动态资源、配置文件
错误处理
// ZIP文件不存在
err := router.SetZipFS("./nonexistent.zip", "/app")
if err != nil {
    log.Printf("ZIP文件系统设置失败: %v", err)
    // 可以设置回退处理
}

// 密码错误
err = router.SetZipFS("./encrypted.zip", "/secure",
    gin.WithPassword("wrong-password"),
)
if err != nil {
    log.Printf("密码可能错误: %v", err)
}

// 文件系统监控
router.GET("/admin/zipfs/status", func(c *gin.Context) {
    // 检查ZIP文件系统状态
    if _, err := os.Stat("./web.zip"); err != nil {
        c.ServerError("ZIP文件不可访问: " + err.Error())
        return
    }
    c.Success("ZIP文件系统正常")
})

🤝 贡献指南

欢迎提交 Issue 和 Pull Request!

  1. Fork 本仓库
  2. 创建功能分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'Add some amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 打开 Pull Request

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。

🙏 致谢

感谢 gin-gonic/gin 团队提供的优秀基础框架。


让 Web 开发更简单、更高效、更优雅! 🚀

Documentation

Index

Constants

View Source
const (
	ClaimIss   = "iss"
	ClaimSub   = "sub"
	ClaimAud   = "aud"
	ClaimExp   = "exp"
	ClaimNbf   = "nbf"
	ClaimIat   = "iat"
	ClaimJti   = "jti"
	ClaimType  = "typ"
	ClaimScope = "scp"

	TokenTypeAccess  = "access_token"
	TokenTypeRefresh = "refresh_token"
)
View Source
const (
	Int      = "int"
	Int64    = "int64"
	Float    = "float"
	DateTime = "date-time"
	Date     = "date"
	UUID     = "uuid"
	Bool     = "bool"
	String   = "string"
)
View Source
const (
	ErrCodeRouteConflict     = 4001 // 路由冲突
	ErrCodeInvalidPath       = 4002 // 无效路径
	ErrCodeInvalidMethod     = 4003 // 无效方法
	ErrCodeMiddlewareTimeout = 4004 // 中间件超时
	ErrCodeRegistrationFail  = 4005 // 注册失败
	ErrCodePatternInvalid    = 4006 // 模式无效
	ErrCodeMetadataInvalid   = 4007 // 元数据无效
)

路由相关错误码

View Source
const (
	EnvGinMode = "GIN_MODE"

	DebugMode   = "debug"
	ReleaseMode = "release"
	TestMode    = "test"
)

Variables

This section is empty.

Functions

func DefaultRateLimitKeyFunc added in v0.1.5

func DefaultRateLimitKeyFunc(c *Context) string

DefaultRateLimitKeyFunc 默认的限流键生成函数(基于IP)

func DevelopmentCSPConfig added in v0.1.5

func DevelopmentCSPConfig() string

DevelopmentCSPConfig 开发环境CSP配置(较为宽松)

func DisableBindValidation

func DisableBindValidation()

DisableBindValidation 关闭默认的验证器。

func EnableJsonDecoderDisallowUnknownFields

func EnableJsonDecoderDisallowUnknownFields()

EnableJsonDecoderDisallowUnknownFields 设置 binding.EnableDecoderDisallowUnknownFields 为 true,以调用 JSON 解码器实例的 DisallowUnknownFields 方法。

func EnableJsonDecoderUseNumber

func EnableJsonDecoderUseNumber()

EnableJsonDecoderUseNumber 设置 binding.EnableDecoderUseNumber 为 true,以调用 JSON 解码器实例的 UseNumber 方法。

func EndpointBasedRateLimitKeyFunc added in v0.1.5

func EndpointBasedRateLimitKeyFunc(c *Context) string

EndpointBasedRateLimitKeyFunc 基于端点的限流键生成函数

func ExtractParamNames added in v0.1.5

func ExtractParamNames(pattern string) ([]string, error)

ExtractParamNames 从路径中提取所有参数名

func GenerateSecureJWTKey added in v0.1.5

func GenerateSecureJWTKey() (string, error)

GenerateSecureJWTKey 生成安全的JWT密钥(用于部署脚本)

func SetMode

func SetMode(value string)

SetMode 根据输入字符串设置 gin 模式。

func StrictCSPConfig added in v0.1.5

func StrictCSPConfig() string

StrictCSPConfig 严格的CSP配置

func UserBasedRateLimitKeyFunc added in v0.1.5

func UserBasedRateLimitKeyFunc(c *Context) string

UserBasedRateLimitKeyFunc 基于用户的限流键生成函数

func ValidateRoutePattern added in v0.1.5

func ValidateRoutePattern(method, pattern string) error

ValidateRoutePattern 验证路由模式字符串的有效性

func ValidateSegmentName added in v0.1.5

func ValidateSegmentName(name string) error

ValidateSegmentName 验证段名称(参数名或通配符名)

func WithFallback added in v0.1.5

func WithFallback(handler gin.HandlerFunc) func(*ZipFSConfig)

WithFallback 设置回退处理器

func WithHotReload added in v0.1.5

func WithHotReload(interval time.Duration) func(*ZipFSConfig)

WithHotReload 启用热更新

func WithIndexFile added in v0.1.5

func WithIndexFile(filename string) func(*ZipFSConfig)

WithIndexFile 设置首页文件

func WithPassword added in v0.1.5

func WithPassword(password string) func(*ZipFSConfig)

WithPassword 设置zip文件密码

func WithSubPaths added in v0.1.5

func WithSubPaths(paths ...string) func(*ZipFSConfig)

WithSubPaths 设置子路径限制

func WrapHandler

func WrapHandler(handler HandlerFunc) gin.HandlerFunc

WrapHandler 包装处理函数,自动转换Context类型

Types

type APIRoute added in v0.1.5

type APIRoute struct {
	// 基础路由信息
	Method   string                 // HTTP方法
	Path     string                 // 路径
	Handler  HandlerFunc            // 处理函数
	Metadata map[string]interface{} // 存储文档元数据(保持向后兼容)

	// OpenAPI文档字段
	OperationID string   // 操作ID
	Summary     string   // 摘要
	Description string   // 描述
	Tags        []string // 标签
	Deprecated  bool     // 是否已弃用
	Hide        bool     // 是否在文档中隐藏

	// 参数
	PathParams  []*openapi3.ParameterRef // 路径参数
	QueryParams []*openapi3.ParameterRef // 查询参数
	Headers     []*openapi3.ParameterRef // 头部参数

	// 请求/响应
	Request         *openapi3.SchemaRef            // 请求体schema
	Responses       map[int]*openapi3.SchemaRef    // 响应schema
	ResponseHeaders map[string]*openapi3.HeaderRef // 响应头部

	// 安全认证
	BearerAuth bool                  // Bearer认证
	BasicAuth  bool                  // Basic认证
	Security   []map[string][]string // 安全配置

	// 示例
	RequestExample interface{} // 请求示例
}

APIRoute API路由文档信息记录

type AuthInfo added in v0.1.5

type AuthInfo = types.AuthInfo // AuthInfo 是 types.AuthInfo 的别名

type BasicHandler

type BasicHandler struct {
	// contains filtered or unexported fields
}

BasicHandler 结构体用于存储处理函数

func NewBasicHandler added in v0.1.1

func NewBasicHandler() *BasicHandler

NewBasicHandler 创建一个新的基本处理器

func (*BasicHandler) Clone added in v0.1.1

func (b *BasicHandler) Clone() Handler

Clone 克隆当前处理器实例

func (*BasicHandler) GetHandler

func (b *BasicHandler) GetHandler(action string) (HandlerFunc, bool)

GetHandler 方法根据动作获取处理函数 返回处理函数和是否找到的布尔值

func (*BasicHandler) Handlers

func (b *BasicHandler) Handlers() map[string]HandlerFunc

Handlers 获取所有处理函数映射

func (*BasicHandler) SetHandler

func (b *BasicHandler) SetHandler(action string, handlerFunc HandlerFunc)

SetHandler 方法用于设置处理函数

type Config added in v0.1.5

type Config struct {
	// 缓存配置
	CacheEnabled bool          `json:"cache_enabled"`
	CacheConfig  *cache.Config `json:"cache_config,omitempty"`

	// 安全配置
	SecurityConfig *SecurityConfig `json:"security_config,omitempty"`

	// SSE配置
	SSEEnabled bool        `json:"sse_enabled"`
	SSEConfig  *sse.Config `json:"sse_config,omitempty"`

	// OpenAPI配置
	OpenAPIEnabled bool     `json:"openapi_enabled"`
	OpenAPI        *OpenAPI `json:"openapi_config,omitempty"`

	// 错误处理配置
	ErrorHandlerEnabled bool `json:"error_handler_enabled"`
	SensitiveFilter     bool `json:"sensitive_filter"`

	// 日志配置
	LoggerConfig *LoggerConfig `json:"logger_config,omitempty"`
}

Config 框架配置

func DefaultConfig added in v0.1.5

func DefaultConfig() *Config

DefaultConfig 返回默认框架配置

type Contact added in v0.1.5

type Contact struct {
	Extensions map[string]any `json:"-" yaml:"-"`                             // OpenAPI规范之外的自定义扩展
	Name       string         `json:"name,omitempty" yaml:"name,omitempty"`   // 可选的联系人姓名
	URL        string         `json:"url,omitempty" yaml:"url,omitempty"`     // Optional contact URL
	Email      string         `json:"email,omitempty" yaml:"email,omitempty"` // Optional contact email
}

Contact 包含API维护者的联系信息

func (Contact) ToOpenAPI added in v0.1.5

func (c Contact) ToOpenAPI() *openapi3.Contact

ToOpenAPI 将Contact转换为openapi3.Contact。 将自定义Contact类型转换为openapi3包期望的格式。

type Context

type Context struct {
	*gin.Context
	// contains filtered or unexported fields
}

Context 增强的请求上下文,实现types.RequestContext接口 优化版本:减少字段数量,使用延迟初始化,支持对象池化

func NewContext added in v0.1.5

func NewContext(c *gin.Context) *Context

NewContext 创建新的Context实例(公共方法)

func NewContextWithComponents added in v0.1.5

func NewContextWithComponents(c *gin.Context, cache *cache.Cache[string, any],
	errorHandler types.ErrorHandler, jwtAdapter *JWTAdapter, sseHub *sse.Hub,
) *Context

NewContextWithComponents 创建带组件的Context实例

func (*Context) Accepted added in v0.1.5

func (c *Context) Accepted(msg string, url ...string)

Accepted 接受处理响应 (202)

func (*Context) AuthInfo added in v0.1.5

func (c *Context) AuthInfo() (*types.AuthInfo, bool)

AuthInfo 解析JWT载荷为 AuthInfo 结构

func (*Context) BaseURL

func (c *Context) BaseURL() string

BaseURL 获取当前请求的基本URL(不含QUERY_STRING)

func (*Context) BindAndValidate added in v0.1.1

func (c *Context) BindAndValidate(obj interface{}) bool

BindAndValidate 绑定并验证请求数据

func (*Context) BindJSON added in v0.1.1

func (c *Context) BindJSON(obj interface{}) bool

BindJSON 绑定JSON请求数据并处理错误

func (*Context) BindQuery added in v0.1.1

func (c *Context) BindQuery(obj interface{}) bool

BindQuery 绑定查询参数并处理错误

func (*Context) BroadcastSSE added in v0.1.5

func (c *Context) BroadcastSSE(event *sse.Event)

BroadcastSSE 广播SSE事件

func (*Context) BuildURL added in v0.1.5

func (c *Context) BuildURL(path string) *URLBuilder

BuildURL 创建一个 URLBuilder 实例

func (*Context) CSRFToken added in v0.1.5

func (c *Context) CSRFToken() string

CSRFToken 生成CSRF令牌

func (*Context) CacheClear added in v0.1.2

func (c *Context) CacheClear()

CacheClear 清空缓存

func (*Context) CacheDelete added in v0.1.2

func (c *Context) CacheDelete(key string)

CacheDelete 从缓存删除值

func (*Context) CacheGet added in v0.1.2

func (c *Context) CacheGet(key string) (interface{}, bool)

CacheGet 从缓存获取值

func (*Context) CacheHas added in v0.1.2

func (c *Context) CacheHas(key string) bool

CacheHas 检查缓存中是否存在键

func (*Context) CacheSet added in v0.1.2

func (c *Context) CacheSet(key string, value interface{}, duration ...time.Duration)

CacheSet 设置缓存值

func (*Context) ClearJWT added in v0.1.1

func (c *Context) ClearJWT()

ClearJWT 清除JWT

func (*Context) Clone added in v0.1.5

func (c *Context) Clone() *Context

Clone 克隆Context(深拷贝组件)

func (*Context) ComponentsCount added in v0.1.5

func (c *Context) ComponentsCount() int

ComponentsCount 获取已设置的组件数量(用于调试)

func (*Context) CreateJWTSession added in v0.1.1

func (c *Context) CreateJWTSession(secretKey string, duration time.Duration, payload types.H) (string, error)

CreateJWTSession 创建JWT会话

func (*Context) Created added in v0.1.5

func (c *Context) Created(data interface{}, url ...string)

Created 创建成功响应 (201)

func (*Context) Domain

func (c *Context) Domain() string

Domain 获取当前包含协议的域名

func (*Context) Error

func (c *Context) Error(msg string, url ...string)

Error 错误响应

func (*Context) ErrorWithCode added in v0.1.5

func (c *Context) ErrorWithCode(err error)

ErrorWithCode 使用错误处理包的错误响应

func (*Context) Fail

func (c *Context) Fail(msg string, url ...string)

Fail 失败响应

func (*Context) Forbidden

func (c *Context) Forbidden(msg string, url ...string)

Forbidden 禁止访问响应

func (*Context) GenerateJWT added in v0.1.1

func (c *Context) GenerateJWT(payload JWTPayload) (string, error)

GenerateJWT 生成JWT令牌(需要JWT适配器)

func (*Context) GenerateRequestID added in v0.1.5

func (c *Context) GenerateRequestID() string

GenerateRequestID 生成基于UUID v5标准的请求ID 使用时间戳和随机数作为名称,确保唯一性

func (*Context) GenerateTokens added in v0.1.5

func (c *Context) GenerateTokens(userClaims UserClaims, config ...*OAuthConfig) (*TokenResponse, error)

GenerateTokens 生成OAuth令牌对

func (*Context) GetCache added in v0.1.2

func (c *Context) GetCache() *cache.Cache[string, any]

GetCache 获取缓存实例

func (*Context) GetGlobalCache added in v0.1.5

func (c *Context) GetGlobalCache() *cache.Cache[string, any]

GetGlobalCache 获取全局缓存

func (*Context) GetIP

func (c *Context) GetIP() string

GetIP 获取请求IP

func (*Context) GetIntSlice added in v0.1.1

func (c *Context) GetIntSlice(key string, sep ...string) []int

GetIntSlice 获取整型切片 使用 strings.FieldsFunc 自动过滤空值和处理分隔符

func (*Context) GetJWT added in v0.1.1

func (c *Context) GetJWT() string

GetJWT 获取JWT令牌

func (*Context) GetJWTPayload added in v0.1.5

func (c *Context) GetJWTPayload() JWTPayload

GetJWTPayload 获取JWT载荷

func (*Context) GetUserAgent

func (c *Context) GetUserAgent() string

GetUserAgent 获取用户代理信息

func (*Context) HasAllRoles added in v0.1.5

func (c *Context) HasAllRoles(roles ...string) bool

HasAllRoles 判断是否同时拥有所有指定角色

func (*Context) HasAnyRole added in v0.1.5

func (c *Context) HasAnyRole(roles ...string) bool

HasAnyRole 判断是否拥有任意一个指定角色

func (*Context) HasComponents added in v0.1.5

func (c *Context) HasComponents() bool

HasComponents 检查是否已初始化组件

func (*Context) HasRole added in v0.1.5

func (c *Context) HasRole(role string) bool

HasRole 判断当前JWT是否包含指定角色

func (*Context) Host

func (c *Context) Host() string

Host 获取当前请求的主机名

func (*Context) IsAjax

func (c *Context) IsAjax() bool

IsAjax 判断是否是Ajax请求

func (*Context) IsJSON added in v0.1.5

func (c *Context) IsJSON() bool

IsJSON 判断是否是JSON请求

func (*Context) IsPooled added in v0.1.5

func (c *Context) IsPooled() bool

IsPooled 检查Context是否来自对象池

func (*Context) IsSSL added in v0.1.5

func (c *Context) IsSSL() bool

IsSSL 判断是否是SSL

func (*Context) JWTClaimString added in v0.1.5

func (c *Context) JWTClaimString(key string) string

JWTClaimString 获取JWT载荷中的字符串声明

func (*Context) JWTClaimStrings added in v0.1.5

func (c *Context) JWTClaimStrings(key string) []string

JWTClaimStrings 获取JWT载荷中的字符串数组声明

func (*Context) Language added in v0.1.1

func (c *Context) Language() string

Language 获取客户端语言 使用 golang.org/x/text/language 标准库解析 Accept-Language 头

func (*Context) Method

func (c *Context) Method() string

Method 获取当前请求的方法

func (*Context) NewSSEClient added in v0.1.1

func (c *Context) NewSSEClient(filters ...string) *sse.Client

NewSSEClient 创建新的 SSE 客户端连接

func (*Context) NewSSEClientWithOptions added in v0.1.5

func (c *Context) NewSSEClientWithOptions(filters []string, opts ...sse.ClientOption) *sse.Client

NewSSEClientWithOptions 创建带选项的 SSE 客户端

func (*Context) Next added in v0.1.5

func (c *Context) Next()

Next 覆盖gin.Context的Next方法,支持中间件管理器的控制

func (*Context) NoContent added in v0.1.5

func (c *Context) NoContent()

NoContent 无内容响应 (204)

func (*Context) NotFound

func (c *Context) NotFound(msg string, url ...string)

NotFound 资源不存在响应

func (*Context) PageResponse

func (c *Context) PageResponse(list interface{}, totalCount int64, currentPage, pageSize int)

PageResponse 分页响应方法

func (*Context) Paginate added in v0.1.1

func (c *Context) Paginate(defaultPageSize ...int) (page, pageSize int)

Paginate 分页参数处理

func (*Context) PaginateResponse added in v0.1.5

func (c *Context) PaginateResponse(fetch func(page, size int) (interface{}, int64))

PaginateResponse 组合 Paginate 与 PageResponse

func (*Context) Paginated added in v0.1.5

func (c *Context) Paginated(data interface{}, page, pageSize, total int64, url ...string)

Paginated 分页响应

func (*Context) Param

func (c *Context) Param(param string, defaultValue ...string) string

Param 获取当前请求的变量

func (*Context) ParamInt added in v0.1.1

func (c *Context) ParamInt(param string, defaultValue ...int) int

ParamInt 获取当前请求的整数变量

func (*Context) Port

func (c *Context) Port() string

Port 获取请求端口

func (*Context) RefreshJWTSession added in v0.1.1

func (c *Context) RefreshJWTSession(secretKey string, duration time.Duration) (string, error)

RefreshJWTSession 刷新JWT会话

func (*Context) RefreshTokens added in v0.1.5

func (c *Context) RefreshTokens(refreshToken string, config ...*OAuthConfig) (*TokenResponse, error)

RefreshTokens 刷新令牌

func (*Context) RequireJWT added in v0.1.1

func (c *Context) RequireJWT(secretKey ...string) (JWTPayload, bool)

RequireJWT 要求JWT令牌有效并返回载荷

func (*Context) RequireParams

func (c *Context) RequireParams(params ...string) bool

RequireParams 检查必需参数

func (*Context) Reset added in v0.1.5

func (c *Context) Reset()

Reset 重置Context状态(用于对象池)

func (*Context) RootDomain

func (c *Context) RootDomain() string

RootDomain 获取当前访问的根域名 使用 golang.org/x/net/publicsuffix 获取 eTLD+1 (有效顶级域名+1级) 例如: www.example.com -> example.com, blog.example.co.uk -> example.co.uk

func (*Context) SaveUploadedFile

func (c *Context) SaveUploadedFile(file *multipart.FileHeader, config types.UploadConfig) (string, error)

SaveUploadedFile 保存上传文件

func (*Context) Scheme

func (c *Context) Scheme() string

Scheme 获取当前请求的协议

func (*Context) ServerError added in v0.1.5

func (c *Context) ServerError(msg ...string)

ServerError 服务器错误响应 (500)

func (*Context) SessionGetString added in v0.1.1

func (c *Context) SessionGetString(key string) string

SessionGetString 从会话中获取字符串值

func (*Context) SetCSP added in v0.1.1

func (c *Context) SetCSP(policy string)

SetCSP 设置内容安全策略

func (*Context) SetCSRFToken added in v0.1.5

func (c *Context) SetCSRFToken() string

SetCSRFToken 设置CSRF令牌

func (*Context) SetCache added in v0.1.5

func (c *Context) SetCache(cache *cache.Cache[string, any])

SetCache 设置缓存实例

func (*Context) SetErrorHandler added in v0.1.5

func (c *Context) SetErrorHandler(handler types.ErrorHandler)

SetErrorHandler 设置错误处理器

func (*Context) SetJWT added in v0.1.1

func (c *Context) SetJWT(token string, maxAge int)

SetJWT 设置JWT令牌到Cookie

func (*Context) SetJWTAdapter added in v0.1.5

func (c *Context) SetJWTAdapter(adapter *JWTAdapter)

SetJWTAdapter 设置JWT适配器

func (*Context) SetJWTPayload added in v0.1.5

func (c *Context) SetJWTPayload(payload JWTPayload)

SetJWTPayload 设置JWT载荷到上下文

func (*Context) SetSSEHub added in v0.1.5

func (c *Context) SetSSEHub(hub *sse.Hub)

SetSSEHub 设置SSE中心

func (*Context) SetSecureHeaders added in v0.1.1

func (c *Context) SetSecureHeaders()

SetSecureHeaders 设置常用安全头

func (*Context) SetXFrameOptions added in v0.1.1

func (c *Context) SetXFrameOptions(option string)

SetXFrameOptions 设置X-Frame-Options头

func (*Context) StreamFile added in v0.1.1

func (c *Context) StreamFile(filepath string, filename string)

StreamFile 以 attachment 形式发送文件

func (*Context) Success

func (c *Context) Success(data interface{}, url ...string)

Success 成功响应

func (*Context) SuccessWithMsg

func (c *Context) SuccessWithMsg(msg string, data interface{}, url ...string)

SuccessWithMsg 成功响应带自定义消息

func (*Context) Type

func (c *Context) Type() string

Type 获取当前请求的资源类型 使用标准库 mime 包解析 Accept 头,更加标准和高效

func (*Context) URL

func (c *Context) URL() string

URL 获取当前请求的完整URL

func (*Context) Unauthorized added in v0.1.1

func (c *Context) Unauthorized(msg string)

Unauthorized 未授权响应

func (*Context) Validate added in v0.1.1

func (c *Context) Validate(v types.Validator) bool

Validate 验证数据

func (*Context) ValidateFile

func (c *Context) ValidateFile(file *multipart.FileHeader, config types.UploadConfig) error

ValidateFile 验证上传文件

func (*Context) ValidateJWT added in v0.1.1

func (c *Context) ValidateJWT(token ...string) (JWTPayload, error)

ValidateJWT 验证JWT令牌(需要JWT适配器)

func (*Context) ValidationError added in v0.1.5

func (c *Context) ValidationError(errors interface{}, url ...string)

ValidationError 验证错误响应 (422)

func (*Context) WithComponents added in v0.1.5

func (c *Context) WithComponents(cache *cache.Cache[string, any],
	errorHandler types.ErrorHandler, jwtAdapter *JWTAdapter, sseHub *sse.Hub,
) *Context

WithComponents 设置多个组件(链式调用)

type DefaultErrorHandler added in v0.1.5

type DefaultErrorHandler struct {
	SensitiveFilter bool
}

DefaultErrorHandler 默认错误处理器

func (*DefaultErrorHandler) HandleError added in v0.1.5

func (h *DefaultErrorHandler) HandleError(ctx types.RequestContext, err error)

HandleError 处理错误

type DefaultLogger added in v0.1.5

type DefaultLogger struct {
	// contains filtered or unexported fields
}

DefaultLogger 基于 log/slog 的默认日志实现

func NewDefaultLogger added in v0.1.5

func NewDefaultLogger(prefix string) *DefaultLogger

NewDefaultLogger 创建默认日志实例

func (*DefaultLogger) Debug added in v0.1.5

func (l *DefaultLogger) Debug(format string, args ...any)

Debug 记录调试信息(仅在调试模式下输出)

func (*DefaultLogger) Error added in v0.1.5

func (l *DefaultLogger) Error(format string, args ...any)

Error 记录错误日志(在所有模式下输出)

func (*DefaultLogger) Info added in v0.1.5

func (l *DefaultLogger) Info(format string, args ...any)

Info 记录信息日志(仅在调试模式下输出)

func (*DefaultLogger) Warn added in v0.1.5

func (l *DefaultLogger) Warn(format string, args ...any)

Warn 记录警告日志(在所有模式下输出)

type DocBuilder added in v0.1.5

type DocBuilder struct {
	// contains filtered or unexported fields
}

DocBuilder 帮助以流畅、可链式的方式构建 RouteOption 函数列表。

func Doc added in v0.1.5

func Doc() *DocBuilder

Doc 创建并返回一个用于链式文档选项的新DocBuilder实例。

func (*DocBuilder) AsOption added in v0.1.5

func (b *DocBuilder) AsOption() RouteOption

AsOption 通过合并所有累积的文档选项返回单个 RouteOption。 这在功能上等同于 Build(),存在是为了命名的灵活性和可读性。

您可以使用 Build() 或 AsOption(),取决于哪种更符合您的代码风格。

示例:

okapi.Get("/books", handler, okapi.Doc().response(Book{}).AsOption())

func (*DocBuilder) BearerAuth added in v0.1.5

func (b *DocBuilder) BearerAuth() *DocBuilder

BearerAuth 将路由标记为需要Bearer令牌身份验证。

func (*DocBuilder) Build added in v0.1.5

func (b *DocBuilder) Build() RouteOption

Build 返回由所有累积的文档选项组成的单个 RouteOption。 此方法旨在直接传递给路由注册函数。

示例:

okapi.Get("/books", handler, okapi.Doc().response(Book{}).Summary("获取书籍列表").Build())

func (*DocBuilder) Deprecated added in v0.1.5

func (b *DocBuilder) Deprecated() *DocBuilder

Deprecated 将路由标记为已弃用

func (*DocBuilder) Description added in v0.1.5

func (b *DocBuilder) Description(description string) *DocBuilder

Description 为路由文档添加描述。

func (*DocBuilder) ErrorResponse added in v0.1.5

func (b *DocBuilder) ErrorResponse(status int, v any) *DocBuilder

ErrorResponse 为特定HTTP状态码定义错误响应架构 在路由的OpenAPI文档中。 已弃用:此函数已弃用,请使用Response(status, v)。

参数:

  • status: HTTP状态码(例如:400、404、500)
  • v: Go值(例如:结构体实例),其类型将用于生成 错误响应的OpenAPI架构

func (*DocBuilder) Header added in v0.1.5

func (b *DocBuilder) Header(name, typ, desc string, required bool) *DocBuilder

Header 为路由添加文档化的请求头。 name: 请求头名称 typ: 请求头值类型(例如:"string", "int") desc: 请求头描述 required: 请求头是否为必需

func (*DocBuilder) Hide added in v0.1.5

func (b *DocBuilder) Hide() *DocBuilder

Hide 将路由标记为从 OpenAPI 文档中排除。

func (*DocBuilder) OperationID added in v0.1.5

func (b *DocBuilder) OperationID(operationID string) *DocBuilder

OperationID 为OpenAPI文档中的操作设置唯一标识符。

func (*DocBuilder) PathParam added in v0.1.5

func (b *DocBuilder) PathParam(name, typ, desc string) *DocBuilder

PathParam 为路由添加文档化的路径参数。 name: 参数名称 typ: 参数类型(例如:"string", "int") desc: 参数描述

func (*DocBuilder) QueryParam added in v0.1.5

func (b *DocBuilder) QueryParam(name, typ, desc string, required bool) *DocBuilder

QueryParam 为路由添加文档化的查询参数。 name: 参数名称 typ: 参数类型(例如:"string", "int") desc: 参数描述 required: 参数是否为必需

func (*DocBuilder) RequestBody added in v0.1.5

func (b *DocBuilder) RequestBody(v any) *DocBuilder

RequestBody 使用提供的值将请求体架构添加到路由文档中。

func (*DocBuilder) Response added in v0.1.5

func (b *DocBuilder) Response(statusOrValue any, vOptional ...any) *DocBuilder

Response 为路由的OpenAPI文档注册响应架构。 可以用两种方式使用:

  1. DocResponse(status int, value any) - 为指定HTTP状态码定义响应架构(例如:200、1、01、400)。
  2. DocResponse(value any) - DocResponse(200, value)的简写形式。

示例:

DocResponse(201, CreatedResponse{})   // 201 Created响应
DocResponse(400, ErrorResponse{})     // 400 Bad Request响应
DocResponse(Response{})               // 响应:默认状态200

func (*DocBuilder) ResponseHeader added in v0.1.5

func (b *DocBuilder) ResponseHeader(name, typ string, desc ...string) *DocBuilder

ResponseHeader 为路由文档添加响应头 name: 响应头名称 typ: 响应头值类型(例如:"string", "int") desc: 响应头描述,可选

func (*DocBuilder) Summary added in v0.1.5

func (b *DocBuilder) Summary(summary string) *DocBuilder

Summary 为路由文档添加简短的摘要描述。

func (*DocBuilder) Tags added in v0.1.5

func (b *DocBuilder) Tags(tags ...string) *DocBuilder

Tags 为路由文档添加一个或多个标签以进行分类。

type DocOption added in v0.1.5

type DocOption interface {
	// contains filtered or unexported methods
}

DocOption 文档选项接口

func Deprecated added in v0.1.5

func Deprecated() DocOption

Deprecated 标记路由为已弃用

func Description added in v0.1.5

func Description(text string) DocOption

Description 设置路由描述

func PathParam added in v0.1.5

func PathParam(name, typ, description string) DocOption

PathParam 定义路径参数

func QueryParam added in v0.1.5

func QueryParam(name, typ, description string, required bool) DocOption

QueryParam 定义查询参数

func ReqBody added in v0.1.5

func ReqBody[T any]() DocOption

ReqBody 泛型化的请求体定义,提供类型安全

func RequestBody added in v0.1.5

func RequestBody(value interface{}) DocOption

RequestBody 定义请求体类型

func Resp added in v0.1.5

func Resp[T any](status int) DocOption

Resp 泛型化的响应定义,提供类型安全

func Response added in v0.1.5

func Response(statusOrValue interface{}, valueOptional ...interface{}) DocOption

Response 定义响应类型

func Security added in v0.1.5

func Security(scheme string, scopes ...string) DocOption

Security 定义安全要求

func Summary added in v0.1.5

func Summary(text string) DocOption

Summary 设置路由摘要

func Tags added in v0.1.5

func Tags(tags ...string) DocOption

Tags 设置路由标签

type ErrorHandler added in v0.1.5

type ErrorHandler = errors.ErrorHandler

ErrorHandler 错误处理器类型别名

type ExternalDocs added in v0.1.5

type ExternalDocs struct {
	Extensions map[string]any `json:"-" yaml:"-"`
	Origin     *Origin        `json:"__origin__,omitempty" yaml:"__origin__,omitempty"`

	Description string `json:"description,omitempty" yaml:"description,omitempty"`
	URL         string `json:"url,omitempty" yaml:"url,omitempty"`
}

func (*ExternalDocs) ToOpenAPI added in v0.1.5

func (e *ExternalDocs) ToOpenAPI() *openapi3.ExternalDocs

type FileLogger added in v0.1.5

type FileLogger struct {
	*DefaultLogger
	// contains filtered or unexported fields
}

FileLogger 文件日志实现

func NewFileLogger added in v0.1.5

func NewFileLogger(prefix, filename string) (*FileLogger, error)

NewFileLogger 创建文件日志实例

func (*FileLogger) Close added in v0.1.5

func (l *FileLogger) Close() error

Close 关闭文件日志

type GinCompatLogger added in v0.1.5

type GinCompatLogger struct {
	// contains filtered or unexported fields
}

GinCompatLogger Gin兼容的日志实现,将日志输出到gin的标准输出

func NewGinCompatLogger added in v0.1.5

func NewGinCompatLogger(prefix string) *GinCompatLogger

NewGinCompatLogger 创建Gin兼容的日志实例

func (*GinCompatLogger) Debug added in v0.1.5

func (l *GinCompatLogger) Debug(format string, args ...any)

Debug 记录调试信息(仅在调试模式下输出)

func (*GinCompatLogger) Error added in v0.1.5

func (l *GinCompatLogger) Error(format string, args ...any)

Error 记录错误日志(在所有模式下输出)

func (*GinCompatLogger) Info added in v0.1.5

func (l *GinCompatLogger) Info(format string, args ...any)

Info 记录信息日志(仅在调试模式下输出)

func (*GinCompatLogger) Warn added in v0.1.5

func (l *GinCompatLogger) Warn(format string, args ...any)

Warn 记录警告日志(在所有模式下输出)

type H

type H = types.H // H 快速构建响应数据的类型别名

type Handler

type Handler interface {
	// GetHandler 根据动作获取处理函数
	GetHandler(action string) (HandlerFunc, bool)

	// SetHandler 设置处理函数
	SetHandler(action string, handlerFunc HandlerFunc)

	// Clone 克隆当前处理器实例
	Clone() Handler

	// Handlers 获取所有处理函数映射
	Handlers() map[string]HandlerFunc
}

Handler 接口定义了处理程序的基本方法

type HandlerFunc

type HandlerFunc func(*Context)

HandlerFunc 定义处理函数类型

func CustomSecurityHeadersMiddleware added in v0.1.5

func CustomSecurityHeadersMiddleware(config SecurityHeadersConfig) HandlerFunc

CustomSecurityHeadersMiddleware 可定制的安全HTTP头中间件

func RateLimitMiddleware added in v0.1.5

func RateLimitMiddleware(config RateLimitConfig) HandlerFunc

RateLimitMiddleware 增强版限流中间件

func Route added in v0.1.5

func Route(method, path string, handler HandlerFunc) (string, HandlerFunc)

Route 创建路由处理映射

func SecurityHeadersMiddleware added in v0.1.5

func SecurityHeadersMiddleware() HandlerFunc

SecurityHeadersMiddleware 安全HTTP头中间件

type JWTAdapter added in v0.1.5

type JWTAdapter struct {
	// contains filtered or unexported fields
}

JWTAdapter 最简 JWT 适配器(HS256)

func (*JWTAdapter) Close added in v0.1.5

func (a *JWTAdapter) Close() error

func (*JWTAdapter) GenerateToken added in v0.1.5

func (a *JWTAdapter) GenerateToken(payload JWTPayload) (string, error)

GenerateToken 生成 HS256 JWT

func (*JWTAdapter) IsTokenRevoked added in v0.1.5

func (a *JWTAdapter) IsTokenRevoked(jti string) bool

IsTokenRevoked 判断撤销

func (*JWTAdapter) RevokeToken added in v0.1.5

func (a *JWTAdapter) RevokeToken(jti string, exp time.Time) error

RevokeToken 撤销

func (*JWTAdapter) ValidateToken added in v0.1.5

func (a *JWTAdapter) ValidateToken(tokenStr string) (JWTPayload, error)

ValidateToken 验证并返回载荷

func (*JWTAdapter) WithTimeout added in v0.1.5

func (a *JWTAdapter) WithTimeout(d time.Duration) *JWTAdapter

type JWTAuthRoutesConfig added in v0.1.5

type JWTAuthRoutesConfig struct {
	BasePath        string
	AccessTokenTTL  time.Duration
	RefreshTokenTTL time.Duration
	Authenticate    func(*Context) (*types.AuthInfo, error)
	ResponseBuilder func(*Context, *types.AuthInfo, JWTTokens) interface{}
	PostLogin       func(*Context, *types.AuthInfo, JWTTokens)
	PostLogout      func(*Context, *types.AuthInfo)
}

JWTAuthRoutesConfig 配置自动化认证路由

type JWTPayload added in v0.1.1

type JWTPayload map[string]any

JWTPayload 通用载荷

func (JWTPayload) GetClaim added in v0.1.5

func (p JWTPayload) GetClaim(key string) (any, bool)

GetClaim 获取声明

type JWTTokens added in v0.1.5

type JWTTokens struct {
	AccessToken  string `json:"access_token"`
	RefreshToken string `json:"refresh_token,omitempty"`
}

JWTTokens 登录/刷新返回的令牌信息

type License added in v0.1.5

type License struct {
	Extensions map[string]any `json:"-" yaml:"-"`                         // OpenAPI规范之外的自定义扩展
	Name       string         `json:"name" yaml:"name"`                   // 必需的许可证名称(例如:"MIT")
	URL        string         `json:"url,omitempty" yaml:"url,omitempty"` // 可选的许可证URL
}

License 包含API的许可证信息。 遵循OpenAPI规范格式。

func (License) ToOpenAPI added in v0.1.5

func (l License) ToOpenAPI() *openapi3.License

ToOpenAPI 将License转换为openapi3.License。 将自定义License类型转换为openapi3包期望的格式。

type Location added in v0.1.5

type Location struct {
	Line   int `json:"line,omitempty" yaml:"line,omitempty"`
	Column int `json:"column,omitempty" yaml:"column,omitempty"`
}

type Logger added in v0.1.5

type Logger interface {
	// Debug 记录调试信息
	Debug(format string, args ...any)

	// Info 记录信息日志
	Info(format string, args ...any)

	// Warn 记录警告日志
	Warn(format string, args ...any)

	// Error 记录错误日志
	Error(format string, args ...any)
}

Logger 定义统一的日志接口

type LoggerConfig added in v0.1.5

type LoggerConfig struct {
	// UseDefaultLogger 是否使用默认的 slog 实现
	UseDefaultLogger bool

	// CustomLogger 自定义日志实现
	CustomLogger Logger
}

LoggerConfig 日志配置

func DefaultLoggerConfig added in v0.1.5

func DefaultLoggerConfig() *LoggerConfig

DefaultLoggerConfig 返回默认日志配置

func (*LoggerConfig) GetLogger added in v0.1.5

func (config *LoggerConfig) GetLogger(prefix string) Logger

GetLogger 获取日志实例

type MemoryRateLimiter added in v0.1.5

type MemoryRateLimiter struct {
	// contains filtered or unexported fields
}

MemoryRateLimiter 内存限流器

func (*MemoryRateLimiter) Allow added in v0.1.5

func (rl *MemoryRateLimiter) Allow(key string) (bool, time.Time)

Allow 检查是否允许请求

func (*MemoryRateLimiter) Reset added in v0.1.5

func (rl *MemoryRateLimiter) Reset(key string)

Reset 重置指定键的限流状态

func (*MemoryRateLimiter) Stats added in v0.1.5

func (rl *MemoryRateLimiter) Stats(key string) (int, time.Time)

Stats 获取限流统计信息

type NoOpLogger added in v0.1.5

type NoOpLogger struct{}

NoOpLogger 空操作日志实现(用于禁用日志)

func NewNoOpLogger added in v0.1.5

func NewNoOpLogger() *NoOpLogger

NewNoOpLogger 创建空操作日志实例

func (*NoOpLogger) Debug added in v0.1.5

func (l *NoOpLogger) Debug(format string, args ...any)

Debug 空操作

func (*NoOpLogger) Error added in v0.1.5

func (l *NoOpLogger) Error(format string, args ...any)

Error 空操作

func (*NoOpLogger) Info added in v0.1.5

func (l *NoOpLogger) Info(format string, args ...any)

Info 空操作

func (*NoOpLogger) Warn added in v0.1.5

func (l *NoOpLogger) Warn(format string, args ...any)

Warn 空操作

type OAuthConfig added in v0.1.5

type OAuthConfig struct {
	AccessTokenTTL  time.Duration // 访问令牌过期时间,默认15分钟
	RefreshTokenTTL time.Duration // 刷新令牌过期时间,默认7天
	Issuer          string        // 签发者
	DefaultScope    string        // 默认权限范围
}

OAuthConfig OAuth配置

func DefaultOAuthConfig added in v0.1.5

func DefaultOAuthConfig() *OAuthConfig

DefaultOAuthConfig 默认OAuth配置

type OAuthFlow added in v0.1.5

type OAuthFlow struct {
	AuthorizationURL string
	TokenURL         string
	RefreshURL       string
	Scopes           map[string]string
}

func (*OAuthFlow) ToOpenAPI added in v0.1.5

func (f *OAuthFlow) ToOpenAPI() *openapi3.OAuthFlow

type OAuthFlows added in v0.1.5

type OAuthFlows struct {
	Implicit          *OAuthFlow
	Password          *OAuthFlow
	ClientCredentials *OAuthFlow
	AuthorizationCode *OAuthFlow
}

func (*OAuthFlows) ToOpenAPI added in v0.1.5

func (flows *OAuthFlows) ToOpenAPI() *openapi3.OAuthFlows

type OpenAPI added in v0.1.5

type OpenAPI struct {
	Title   string  // API标题
	Version string  // API版本
	Servers Servers // API托管服务器URL列表
	License License // API许可证信息
	Contact Contact // API维护者联系信息
	// SecuritySchemes 为OpenAPI规范定义安全方案。
	SecuritySchemes SecuritySchemes
	ExternalDocs    *ExternalDocs
}

OpenAPI 包含生成OpenAPI/Swagger文档的配置。 包含API的元数据和文档信息。

func (OpenAPI) ToOpenAPISpec added in v0.1.5

func (o OpenAPI) ToOpenAPISpec() *openapi3.T

ToOpenAPISpec 将OpenAPI转换为*openapi3.T。 将自定义OpenAPI配置转换为完整的OpenAPI规范对象。

type Origin added in v0.1.5

type Origin struct {
	Key    *Location           `json:"key,omitempty" yaml:"key,omitempty"`
	Fields map[string]Location `json:"fields,omitempty" yaml:"fields,omitempty"`
}

type PathValidationError added in v0.1.5

type PathValidationError struct {
	RouteError
	Path        string   `json:"path"`
	Violations  []string `json:"violations"`
	Suggestions []string `json:"suggestions"`
}

PathValidationError 路径验证错误

func NewPathValidationError added in v0.1.5

func NewPathValidationError(path string, violations []string, suggestions []string) *PathValidationError

NewPathValidationError 创建路径验证错误

type PatternSegment added in v0.1.5

type PatternSegment struct {
	Type     SegmentType `json:"type"`     // 段类型:静态、参数、通配符
	Value    string      `json:"value"`    // 段值
	IsParam  bool        `json:"is_param"` // 是否为参数
	Name     string      `json:"name"`     // 参数名(如果是参数段)
	Position int         `json:"position"` // 段在路径中的位置
}

PatternSegment 路由段

type Payload added in v0.1.5

type Payload = JWTPayload

Payload 兼容别名

type RESTOption added in v0.1.5

type RESTOption func(*restConfig)

RESTOption 自定义 REST 注册行为

func RESTWithBasePath added in v0.1.5

func RESTWithBasePath(path string) RESTOption

RESTWithBasePath 自定义基础路径

func RESTWithDoc added in v0.1.5

func RESTWithDoc(action string, opts ...DocOption) RESTOption

RESTWithDoc 为指定动作添加文档选项

func RESTWithDocsAll added in v0.1.5

func RESTWithDocsAll(opts ...DocOption) RESTOption

RESTWithDocsAll 为所有动作添加统一的文档配置

func RESTWithIDParam added in v0.1.5

func RESTWithIDParam(name string) RESTOption

RESTWithIDParam 自定义 ID 参数名

func RESTWithMiddleware added in v0.1.5

func RESTWithMiddleware(m ...HandlerFunc) RESTOption

RESTWithMiddleware 添加全局中间件

func RESTWithRouteOptions added in v0.1.5

func RESTWithRouteOptions(action string, options ...interface{}) RESTOption

RESTWithRouteOptions 添加指定动作的额外参数(中间件或文档)

type RateLimitConfig added in v0.1.5

type RateLimitConfig struct {
	RequestsPerWindow int                   // 时间窗口内允许的请求数
	WindowSize        time.Duration         // 时间窗口大小
	KeyFunc           func(*Context) string // 获取限流键的函数
}

RateLimitConfig 限流配置

type RateLimiter added in v0.1.5

type RateLimiter interface {
	Allow(key string) (allowed bool, resetTime time.Time)
	Reset(key string)
	Stats(key string) (requests int, resetTime time.Time)
}

RateLimiter 限流器接口

func NewRateLimiter added in v0.1.5

func NewRateLimiter(config RateLimitConfig) RateLimiter

NewRateLimiter 创建新的限流器

type RefreshRequest added in v0.1.5

type RefreshRequest struct {
	RefreshToken string `json:"refresh_token" binding:"required"` // 刷新令牌
	Scope        string `json:"scope,omitempty"`                  // 可选的权限范围
}

RefreshRequest 刷新令牌请求结构

type ResourceHandler added in v0.1.1

type ResourceHandler interface {
	Index(*Context)  // GET /resources      - 列表
	Show(*Context)   // GET /resources/:id  - 详情
	Create(*Context) // POST /resources     - 创建
	Update(*Context) // PUT /resources/:id  - 更新
	Delete(*Context) // DELETE /resources/:id - 删除
}

ResourceHandler 定义资源处理器接口

type RestfulHandler added in v0.1.1

type RestfulHandler struct{}

RestfulHandler 提供 ResourceHandler 接口的默认实现

func (*RestfulHandler) Create added in v0.1.1

func (h *RestfulHandler) Create(c *Context)

Create 创建资源

func (*RestfulHandler) Delete added in v0.1.1

func (h *RestfulHandler) Delete(c *Context)

Delete 删除资源

func (*RestfulHandler) Index added in v0.1.1

func (h *RestfulHandler) Index(c *Context)

Index 获取资源列表

func (*RestfulHandler) Show added in v0.1.1

func (h *RestfulHandler) Show(c *Context)

Show 获取资源详情

func (*RestfulHandler) Update added in v0.1.1

func (h *RestfulHandler) Update(c *Context)

Update 更新资源

type RouteError added in v0.1.5

type RouteError struct {
	Code      int                    `json:"code"`
	Type      string                 `json:"type"`
	Message   string                 `json:"message"`
	Route     string                 `json:"route,omitempty"`
	Details   map[string]interface{} `json:"details,omitempty"`
	Cause     error                  `json:"-"`
	Timestamp time.Time              `json:"timestamp"`
}

RouteError 路由错误基类

func (*RouteError) Error added in v0.1.5

func (re *RouteError) Error() string

Error 实现error接口

func (*RouteError) Unwrap added in v0.1.5

func (re *RouteError) Unwrap() error

Unwrap 获取底层错误

type RouteHandler added in v0.1.5

type RouteHandler struct {
	BasicHandler
	// contains filtered or unexported fields
}

RouteHandler 基于路由的处理器

func NewRouteHandler added in v0.1.5

func NewRouteHandler(prefix string) *RouteHandler

NewRouteHandler 创建新的路由处理器

func (*RouteHandler) GetRouteHandler added in v0.1.5

func (r *RouteHandler) GetRouteHandler(method, path string) (HandlerFunc, bool)

GetRouteHandler 获取路由处理函数

func (*RouteHandler) SetRouteHandler added in v0.1.5

func (r *RouteHandler) SetRouteHandler(method, path string, handlerFunc HandlerFunc)

SetRouteHandler 设置路由处理函数

type RouteOption added in v0.1.5

type RouteOption func(*APIRoute)

RouteOption 定义一个修改APIRoute文档属性的函数类型

func DocAutoPathParams added in v0.1.5

func DocAutoPathParams() RouteOption

DocAutoPathParams 自动从路由路径提取路径参数 并将其添加到文档中。 跳过已经定义的参数。

func DocBasicAuth added in v0.1.5

func DocBasicAuth() RouteOption

DocBasicAuth 标记路由需要Basic认证

func DocBearerAuth added in v0.1.5

func DocBearerAuth() RouteOption

DocBearerAuth 标记路由需要Bearer令牌认证

func DocDeprecated added in v0.1.5

func DocDeprecated() RouteOption

DocDeprecated 标记路由为已弃用

func DocDescription added in v0.1.5

func DocDescription(description string) RouteOption

DocDescription 为路由设置描述

func DocErrorResponse added in v0.1.5

func DocErrorResponse(status int, v any) RouteOption

DocErrorResponse 为路由的OpenAPI文档中的特定HTTP状态码 定义错误响应架构 Deprecated: This function is deprecated in favor of DocResponse(status, v).

Parameters:

  • status: the HTTP status code (e.g., 400, 404, 500).
  • v: a Go value (e.g., a struct instance) whose type will be used to generate the OpenAPI schema for the error response.

返回:

  • 一个RouteOption函数,将错误架构添加到路由的文档中

func DocHeader added in v0.1.5

func DocHeader(name, typ, desc string, required bool) RouteOption

DocHeader 向路由文档添加请求头参数 name: 请求头名称 typ: 请求头值类型(例如:"string", "int") desc: 请求头描述 required: 请求头是否为必需

func DocHide added in v0.1.5

func DocHide() RouteOption

DocHide 标记路由从 OpenAPI 文档中排除

func DocOperationID added in v0.1.5

func DocOperationID(operationID string) RouteOption

func DocPathParam added in v0.1.5

func DocPathParam(name, typ, desc string) RouteOption

DocPathParam 向路由文档添加路径参数 name: 参数名称 typ: 参数类型(例如:"string", "int", "uuid") desc: 参数描述

func DocQueryParam added in v0.1.5

func DocQueryParam(name, typ, desc string, required bool) RouteOption

DocQueryParam 向路由文档添加查询参数 name: 参数名称 typ: 参数类型(例如:"string", "int") desc: 参数描述 required: 参数是否为必需

func DocRequestBody added in v0.1.5

func DocRequestBody(v any) RouteOption

DocRequestBody 为路由定义请求体架构 v: Go值,其类型将用于生成请求架构

func DocResponse added in v0.1.5

func DocResponse(statusOrValue any, vOptional ...any) RouteOption

DocResponse 为路由的OpenAPI文档注册响应架构。 可以以两种方式使用:

  1. DocResponse(status int, value any) - 为指定HTTP状态码定义响应架构(例如:200、201、400)
  2. DocResponse(value any) - DocResponse(200, value)的简写形式

示例:

DocResponse(201, CreatedResponse{})   // 201 Created响应
DocResponse(400, ErrorResponse{})     // 400 Bad Request响应
DocResponse(response{})               // 响应:默认状态200

func DocResponseHeader added in v0.1.5

func DocResponseHeader(name, typ string, desc ...string) RouteOption

DocResponseHeader 向路由文档添加响应头 name: 响应头名称 typ: 响应头值类型(例如:"string", "int") desc: 响应头描述,可选

func DocSummary added in v0.1.5

func DocSummary(summary string) RouteOption

DocSummary 为路由设置简短的摘要描述

func DocTag added in v0.1.5

func DocTag(tag string) RouteOption

DocTag 添加单个标签对路由进行分类

func DocTags added in v0.1.5

func DocTags(tags ...string) RouteOption

DocTags 添加多个标签对路由进行分类

type RoutePattern added in v0.1.5

type RoutePattern struct {
	Method     string           `json:"method"`      // HTTP方法
	Pattern    string           `json:"pattern"`     // 原始路由模式
	ParamNames []string         `json:"param_names"` // 参数名列表
	IsWildcard bool             `json:"is_wildcard"` // 是否包含通配符
	Segments   []PatternSegment `json:"segments"`    // 路由段列表
	Priority   int              `json:"priority"`    // 路由优先级
	Hash       uint64           `json:"hash"`        // 路由模式哈希值
	CreateTime time.Time        `json:"create_time"` // 创建时间
}

RoutePattern 路由模式结构

func ParseRoutePattern added in v0.1.5

func ParseRoutePattern(method, pattern string) (*RoutePattern, error)

ParseRoutePattern 解析路由模式

func (*RoutePattern) Clone added in v0.1.5

func (rp *RoutePattern) Clone() *RoutePattern

Clone 克隆路由模式

func (*RoutePattern) Equals added in v0.1.5

func (rp *RoutePattern) Equals(other *RoutePattern) bool

Equals 检查两个路由模式是否相等

func (*RoutePattern) GetParamNames added in v0.1.5

func (rp *RoutePattern) GetParamNames() []string

GetParamNames 获取参数名列表

func (*RoutePattern) GetParamSegmentCount added in v0.1.5

func (rp *RoutePattern) GetParamSegmentCount() int

GetParamSegmentCount 获取参数段数量

func (*RoutePattern) GetSegmentCount added in v0.1.5

func (rp *RoutePattern) GetSegmentCount() int

GetSegmentCount 获取段数量

func (*RoutePattern) GetStaticSegmentCount added in v0.1.5

func (rp *RoutePattern) GetStaticSegmentCount() int

GetStaticSegmentCount 获取静态段数量

func (*RoutePattern) HasParam added in v0.1.5

func (rp *RoutePattern) HasParam(name string) bool

HasParam 检查是否包含指定参数

func (*RoutePattern) IsConflictWith added in v0.1.5

func (rp *RoutePattern) IsConflictWith(other *RoutePattern) bool

IsConflictWith 检查是否与另一个路由模式冲突

func (*RoutePattern) String added in v0.1.5

func (rp *RoutePattern) String() string

String 返回路由模式的字符串表示

func (*RoutePattern) ToMap added in v0.1.5

func (rp *RoutePattern) ToMap() map[string]interface{}

ToMap 转换为映射表示

func (*RoutePattern) Validate added in v0.1.5

func (rp *RoutePattern) Validate() error

Validate 验证路由模式的有效性

type Router added in v0.1.1

type Router struct {
	// contains filtered or unexported fields
}

Router 路由管理器

func Default

func Default(config ...*Config) *Router

Default 创建默认的路由管理器(包含 Logger、Recovery),支持可选的框架配置

func New

func New(config ...*Config) *Router

New 创建新的路由管理器,支持可选的框架配置

func NewRouter

func NewRouter(engineOrFirstOpt interface{}, opts ...RouterOption) *Router

NewRouter 创建新的路由管理器(推荐使用) 提供更简洁的初始化方式,兼容传入nil engine的旧用法

func NewRouterLegacy added in v0.1.5

func NewRouterLegacy(engine *gin.Engine) *Router

NewRouterLegacy 创建新的路由管理器(保持向后兼容)

func (*Router) ANY added in v0.1.1

func (r *Router) ANY(path string, handler HandlerFunc, middleware ...HandlerFunc)

ANY 注册支持所有HTTP方法的路由

func (*Router) API added in v0.1.5

func (r *Router) API(version string) *RouterGroup

API 快捷方法 - 创建API版本路由组

func (*Router) CRUD added in v0.1.5

func (r *Router) CRUD(resource string, handler ResourceHandler, opts ...RESTOption)

CRUD 注册完整的 CRUD 资源路由(编译期校验 ResourceHandler) 等价于 REST(resource, handler, opts...)

func (*Router) Close added in v0.1.5

func (r *Router) Close() error

Close 关闭路由器和相关资源

func (*Router) DELETE added in v0.1.1

func (r *Router) DELETE(path string, handler HandlerFunc, options ...interface{})

DELETE 注册DELETE方法的路由

func (*Router) EnableSwagger added in v0.1.5

func (r *Router) EnableSwagger(paths ...string)

EnableSwagger 启用Swagger UI

func (*Router) Engine added in v0.1.1

func (r *Router) Engine() *gin.Engine

Engine 获取原始 gin.Engine

func (*Router) GET added in v0.1.1

func (r *Router) GET(path string, handler HandlerFunc, options ...interface{})

GET 注册GET方法的路由 支持两种使用方式: 1. 传统方式: GET(path, handler, middleware...) 2. 文档方式: GET(path, handler, Summary("描述"), Response(200, User{}), middleware...)

func (*Router) GenerateOpenAPISpec added in v0.1.5

func (r *Router) GenerateOpenAPISpec() *openapi3.T

GenerateOpenAPISpec 生成OpenAPI规范

func (*Router) GetCache added in v0.1.4

func (r *Router) GetCache() *cache.Cache[string, any]

GetCache 获取路由器的全局缓存实例

func (*Router) GetErrorHandler added in v0.1.5

func (r *Router) GetErrorHandler() errors.ErrorHandler

GetErrorHandler 获取错误处理器

func (*Router) GetHandler added in v0.1.5

func (r *Router) GetHandler() Handler

GetHandler 获取路由器的处理器

func (*Router) GetJWTAdapter added in v0.1.5

func (r *Router) GetJWTAdapter() *JWTAdapter

GetJWTAdapter 获取JWT适配器

func (*Router) GetRoutes added in v0.1.5

func (r *Router) GetRoutes() []string

GetRoutes 获取所有已注册的路由

func (*Router) GetSSEHub added in v0.1.5

func (r *Router) GetSSEHub() *sse.Hub

GetSSEHub 获取SSE中心

func (*Router) GracefulShutdown added in v0.1.5

func (r *Router) GracefulShutdown(timeout time.Duration) error

GracefulShutdown 优雅地关闭服务器

func (*Router) Group added in v0.1.1

func (r *Router) Group(path string, middleware ...HandlerFunc) *RouterGroup

Group 创建或获取路由组

func (*Router) HEAD added in v0.1.1

func (r *Router) HEAD(path string, handler HandlerFunc, options ...interface{})

HEAD 注册HEAD方法的路由

func (*Router) Health added in v0.1.5

func (r *Router) Health(path ...string)

Health 添加健康检查端点

func (*Router) InvalidateOpenAPICache added in v0.1.5

func (r *Router) InvalidateOpenAPICache()

InvalidateOpenAPICache 使OpenAPI缓存失效,强制重新生成

func (*Router) IsRunning added in v0.1.5

func (r *Router) IsRunning() bool

IsRunning 检查服务器是否正在运行

func (*Router) JWTAuthRoutes added in v0.1.5

func (r *Router) JWTAuthRoutes(cfg JWTAuthRoutesConfig)

JWTAuthRoutes 注册标准的登录/刷新/注销路由

func (*Router) JWTMiddleware added in v0.1.5

func (r *Router) JWTMiddleware() gin.HandlerFunc

JWTMiddleware 创建JWT中间件(手动添加到需要认证的路由)

func (*Router) Metrics added in v0.1.5

func (r *Router) Metrics(path ...string)

Metrics 添加指标端点

func (*Router) NewSSEHub added in v0.1.1

func (r *Router) NewSSEHub(size ...int) *sse.Hub

NewSSEHub 创建新的 SSE Hub

size 设置历史记录大小

func (*Router) OAuth added in v0.1.5

func (r *Router) OAuth(basePath ...string)

OAuth 添加OAuth认证路由

func (*Router) OPTIONS added in v0.1.1

func (r *Router) OPTIONS(path string, handler HandlerFunc, options ...interface{})

OPTIONS 注册OPTIONS方法的路由

func (*Router) PATCH added in v0.1.1

func (r *Router) PATCH(path string, handler HandlerFunc, options ...interface{})

PATCH 注册PATCH方法的路由

func (*Router) POST added in v0.1.1

func (r *Router) POST(path string, handler HandlerFunc, options ...interface{})

POST 注册POST方法的路由

func (*Router) PUT added in v0.1.1

func (r *Router) PUT(path string, handler HandlerFunc, options ...interface{})

PUT 注册PUT方法的路由

func (*Router) REST added in v0.1.5

func (r *Router) REST(resource string, handler ResourceHandler, opts ...RESTOption)

REST 注册带自定义选项的 REST 风格路由

func (*Router) Register added in v0.1.1

func (r *Router) Register(method, path string, handler HandlerFunc, middleware ...HandlerFunc)

Register 注册路由

func (*Router) RequireAnyRole added in v0.1.5

func (r *Router) RequireAnyRole(roles ...string) HandlerFunc

RequireAnyRole 允许用户具备任意一个角色即可通过

func (*Router) RequireAuth added in v0.1.5

func (r *Router) RequireAuth(scopes ...string) HandlerFunc

RequireAuth 创建需要OAuth认证的中间件

func (*Router) RequireRoles added in v0.1.5

func (r *Router) RequireRoles(roles ...string) HandlerFunc

RequireRoles 要求当前用户同时具备指定角色

func (*Router) Resource added in v0.1.1

func (r *Router) Resource(path string, handler ResourceHandler, middleware ...HandlerFunc)

Resource 注册 RESTful 资源路由

func (*Router) Restart added in v0.1.5

func (r *Router) Restart() error

Restart 重启服务器

func (*Router) Run added in v0.1.1

func (r *Router) Run(addr ...string) error

Run 启动服务器,支持优雅停机

func (*Router) RunTLS added in v0.1.1

func (r *Router) RunTLS(addr, certFile, keyFile string) error

RunTLS 使用TLS运行服务器,支持优雅停机

func (*Router) RunWithContext added in v0.1.5

func (r *Router) RunWithContext(ctx context.Context, config ...ServerConfig) error

RunWithContext 使用指定的上下文启动服务器 当上下文被取消时,服务器将优雅地关闭

func (*Router) RunWithContextString added in v0.1.5

func (r *Router) RunWithContextString(ctx context.Context, addr string) error

RunWithContextString 使用给定的上下文和地址字符串启动服务器

func (*Router) RunWithGracefulShutdown added in v0.1.5

func (r *Router) RunWithGracefulShutdown(config ServerConfig) error

RunWithGracefulShutdown 启动服务器并支持优雅停机

func (*Router) SetEmbed added in v0.1.5

func (r *Router) SetEmbed(urlPrefix string, embedFS embed.FS, subPaths ...string) error

SetEmbed 设置嵌入式文件系统静态资源服务 urlPrefix: URL路径前缀,如 "/static" 或 "/assets" embedFS: embed.FS 文件系统 subPaths: 可选的子路径,用于移除embed.FS中的路径前缀

使用示例:

//go:embed static/*
var staticFS embed.FS
router.SetEmbed("/static", staticFS, "static")

func (*Router) SetEmbedFile added in v0.1.5

func (r *Router) SetEmbedFile(urlPath string, embedFS embed.FS, filePath string) error

SetEmbedFile 设置单个嵌入文件的路由 urlPath: URL路径,如 "/favicon.ico" embedFS: embed.FS 文件系统 filePath: 文件在embed.FS中的路径

使用示例:

//go:embed favicon.ico
var faviconFS embed.FS
router.SetEmbedFile("/favicon.ico", faviconFS, "favicon.ico")

func (*Router) SetGlobalCacheMiddleware added in v0.1.4

func (r *Router) SetGlobalCacheMiddleware(defaultExpiration, cleanupInterval time.Duration) HandlerFunc

SetGlobalCacheMiddleware 返回一个缓存初始化中间件,会自动创建缓存实例

参数:

  • defaultExpiration: 缓存项默认过期时间
  • cleanupInterval: 清理过期项的时间间隔

func (*Router) SetPersistCacheMiddleware added in v0.1.4

func (r *Router) SetPersistCacheMiddleware(defaultExpiration, cleanupInterval time.Duration, persistPath string, autoPersistInterval time.Duration) HandlerFunc

SetPersistCacheMiddleware 返回一个带持久化功能的缓存初始化中间件

参数:

  • defaultExpiration: 缓存项默认过期时间
  • cleanupInterval: 清理过期项的时间间隔
  • persistPath: 持久化文件路径
  • autoPersistInterval: 自动持久化时间间隔

func (*Router) SetZipFS added in v0.1.5

func (r *Router) SetZipFS(zipPath, urlPrefix string, options ...func(*ZipFSConfig)) error

SetZipFS 设置zip文件系统静态资源服务 zipPath: zip文件路径 urlPrefix: URL路径前缀,如 "/static" 或 "/app" options: 可选配置项

使用示例:

router.SetZipFS("./web.zip", "/app", WithHotReload(5*time.Second))
router.SetZipFS("./assets.zip", "/static", WithIndexFile("main.html"))

func (*Router) SetZipFSWithMiddleware added in v0.1.5

func (r *Router) SetZipFSWithMiddleware(config ZipFSConfig, middlewares ...gin.HandlerFunc) error

SetZipFSWithMiddleware 设置带中间件的zip文件系统服务 config: zip文件系统配置 middlewares: 中间件列表

使用示例:

config := NewZipFSConfig("./app.zip", "/app", WithHotReload(3*time.Second))
router.SetZipFSWithMiddleware(config, corsMiddleware(), authMiddleware())

func (*Router) SetZipFile added in v0.1.5

func (r *Router) SetZipFile(urlPath, zipPath, filePath string, options ...ZipFileOption) error

SetZipFile 设置单个zip文件的路由服务 urlPath: URL路径,如 "/api/docs" zipPath: zip文件路径 filePath: 文件在zip中的路径 options: 可选配置项

使用示例:

router.SetZipFile("/api.json", "./docs.zip", "api.json", WithFileHotReload(3*time.Second))
router.SetZipFile("/favicon.ico", "./assets.zip", "favicon.ico")

func (*Router) StartSSE added in v0.1.5

func (r *Router) StartSSE() error

StartSSE 启动SSE服务

func (*Router) StaticFiles added in v0.1.5

func (r *Router) StaticFiles(relativePath, root string, middleware ...HandlerFunc)

Static 静态文件服务增强

func (*Router) Upload added in v0.1.5

func (r *Router) Upload(path string, handler func(*Context, *multipart.FileHeader) error, middleware ...HandlerFunc)

Upload 文件上传路由

func (*Router) Use added in v0.1.1

func (r *Router) Use(middleware ...HandlerFunc)

Use 添加中间件到路由器

func (*Router) UseGin added in v0.1.1

func (r *Router) UseGin(middleware ...gin.HandlerFunc)

UseGin 直接使用 gin.HandlerFunc 类型的中间件

func (*Router) WithCache added in v0.1.4

func (r *Router) WithCache(cache *cache.Cache[string, any]) HandlerFunc

WithCache 返回一个缓存初始化中间件 该中间件会将指定缓存实例注入到每个请求的Context中

func (*Router) WithHandler added in v0.1.5

func (r *Router) WithHandler(handler Handler) *Router

WithHandler 设置路由器的处理器

type RouterConfig added in v0.1.5

type RouterConfig struct {
	Host string `json:"host"`
	Port string `json:"port"`
}

RouterConfig 路由器配置

func DefaultRouterConfig added in v0.1.5

func DefaultRouterConfig() *RouterConfig

DefaultRouterConfig 默认路由器配置

type RouterGroup added in v0.1.1

type RouterGroup struct {
	// contains filtered or unexported fields
}

RouterGroup 路由组

func (*RouterGroup) ANY added in v0.1.1

func (rg *RouterGroup) ANY(path string, handler HandlerFunc, middleware ...HandlerFunc)

ANY 注册支持所有HTTP方法的路由

func (*RouterGroup) DELETE added in v0.1.1

func (rg *RouterGroup) DELETE(path string, handler HandlerFunc, options ...interface{})

DELETE 注册DELETE方法的路由

func (*RouterGroup) GET added in v0.1.1

func (rg *RouterGroup) GET(path string, handler HandlerFunc, options ...interface{})

GET 注册GET方法的路由 支持两种使用方式: 1. 传统方式: GET(path, handler, middleware...) 2. 文档方式: GET(path, handler, Summary("描述"), Response(200, User{}), middleware...)

func (*RouterGroup) GetHandler added in v0.1.5

func (rg *RouterGroup) GetHandler() Handler

GetHandler 获取路由组的处理器

func (*RouterGroup) Group added in v0.1.1

func (rg *RouterGroup) Group(path string, middleware ...HandlerFunc) *RouterGroup

Group 创建子路由组

func (*RouterGroup) HEAD added in v0.1.1

func (rg *RouterGroup) HEAD(path string, handler HandlerFunc, options ...interface{})

HEAD 注册HEAD方法的路由

func (*RouterGroup) OPTIONS added in v0.1.1

func (rg *RouterGroup) OPTIONS(path string, handler HandlerFunc, options ...interface{})

OPTIONS 注册OPTIONS方法的路由

func (*RouterGroup) PATCH added in v0.1.1

func (rg *RouterGroup) PATCH(path string, handler HandlerFunc, options ...interface{})

PATCH 注册PATCH方法的路由

func (*RouterGroup) POST added in v0.1.1

func (rg *RouterGroup) POST(path string, handler HandlerFunc, options ...interface{})

POST 注册POST方法的路由

func (*RouterGroup) PUT added in v0.1.1

func (rg *RouterGroup) PUT(path string, handler HandlerFunc, options ...interface{})

PUT 注册PUT方法的路由

func (*RouterGroup) REST added in v0.1.5

func (rg *RouterGroup) REST(resource string, handler ResourceHandler, opts ...RESTOption)

REST 在路由组中注册 REST 风格路由

func (*RouterGroup) Register added in v0.1.1

func (rg *RouterGroup) Register(method, path string, handler HandlerFunc, middleware ...HandlerFunc)

Register 注册路由到当前组

func (*RouterGroup) Resource added in v0.1.1

func (rg *RouterGroup) Resource(path string, handler ResourceHandler, middleware ...HandlerFunc)

Resource 注册路由组内的 RESTful 资源路由

func (*RouterGroup) SetZipFS added in v0.1.5

func (rg *RouterGroup) SetZipFS(zipPath string, options ...func(*ZipFSConfig)) error

SetZipFS 为路由组设置zip文件系统静态资源服务

func (*RouterGroup) SetZipFSWithMiddleware added in v0.1.5

func (rg *RouterGroup) SetZipFSWithMiddleware(zipPath string, middlewares []gin.HandlerFunc, options ...func(*ZipFSConfig)) error

SetZipFSWithMiddleware 为路由组设置带中间件的zip文件系统服务

func (*RouterGroup) SetZipFile added in v0.1.5

func (rg *RouterGroup) SetZipFile(urlPath, zipPath, filePath string, options ...ZipFileOption) error

SetZipFile 为路由组设置单个zip文件的路由服务

func (*RouterGroup) Use added in v0.1.5

func (rg *RouterGroup) Use(middleware ...HandlerFunc)

Use 添加中间件到路由组

func (*RouterGroup) UseGin added in v0.1.5

func (rg *RouterGroup) UseGin(middleware ...gin.HandlerFunc)

UseGin 直接使用 gin.HandlerFunc 类型的中间件

func (*RouterGroup) WithMiddleware added in v0.1.5

func (rg *RouterGroup) WithMiddleware(middleware ...HandlerFunc) *RouterGroup

WithMiddleware 为RouterGroup添加中间件(链式调用)

func (*RouterGroup) WithPrefix added in v0.1.5

func (rg *RouterGroup) WithPrefix(prefix string) *RouterGroup

WithPrefix 创建带路径前缀的新RouterGroup

func (*RouterGroup) WithSecurity added in v0.1.5

func (rg *RouterGroup) WithSecurity(scheme string, scopes ...string) *RouterGroup

WithSecurity 为RouterGroup设置默认安全配置

func (*RouterGroup) WithTags added in v0.1.5

func (rg *RouterGroup) WithTags(tags ...string) *RouterGroup

WithTags 为RouterGroup设置默认标签

type RouterOption added in v0.1.5

type RouterOption func(*Config, *gin.Engine)

RouterOption 路由器配置选项

func WithCORS added in v0.1.5

func WithCORS(allowOrigins ...string) RouterOption

WithCORS 添加安全的CORS中间件

func WithCache added in v0.1.5

func WithCache(config *cache.Config) RouterOption

WithCache 启用缓存功能

func WithConfig added in v0.1.5

func WithConfig(customize func(*Config)) RouterOption

WithConfig 提供 access to 框架 Config 以便一次性调整

func WithGinMode added in v0.1.5

func WithGinMode(mode string) RouterOption

WithGinMode 设置Gin运行模式

func WithJWT added in v0.1.5

func WithJWT(secret string, customize ...func(*SecurityConfig)) RouterOption

WithJWT 快速配置JWT密钥和安全选项

func WithMiddleware added in v0.1.5

func WithMiddleware(middlewares ...gin.HandlerFunc) RouterOption

WithMiddleware 添加全局中间件

func WithOpenAPI added in v0.1.5

func WithOpenAPI(config *OpenAPI) RouterOption

WithOpenAPI 启用OpenAPI文档生成功能

func WithRateLimit added in v0.1.5

func WithRateLimit(requestsPerMinute int) RouterOption

WithRateLimit 添加简单的内存限流中间件

func WithRateLimitEnhanced added in v0.1.5

func WithRateLimitEnhanced(requestsPerMinute int, keyFunc ...func(*Context) string) RouterOption

WithRateLimit 添加限流中间件的路由选项

func WithRequestID added in v0.1.5

func WithRequestID() RouterOption

WithRequestID 添加请求ID中间件

func WithSSE added in v0.1.5

func WithSSE(config *sse.Config) RouterOption

WithSSE 启用SSE功能

func WithSecurityConfig added in v0.1.5

func WithSecurityConfig(configure func(*SecurityConfig)) RouterOption

WithSecurityConfig 提供统一的安全配置入口

func WithSecurityHeaders added in v0.1.5

func WithSecurityHeaders(config ...SecurityHeadersConfig) RouterOption

WithSecurityHeaders 添加安全头中间件的路由选项

func WithTimeout added in v0.1.5

func WithTimeout(timeout time.Duration) RouterOption

WithTimeout 添加请求超时中间件

type SchemaInfo added in v0.1.5

type SchemaInfo struct {
	Schema   *openapi3.SchemaRef
	TypeName string
	Package  string
}

SchemaInfo 保存架构的额外信息以便更好地命名。 在从Bo类型生成OpenAPI架构时使用。

type SecurityConfig added in v0.1.5

type SecurityConfig struct {
	// JWT配置
	JWTSecretKey      []byte        `json:"-"` // 不序列化密钥
	JWTAlgorithm      string        `json:"jwt_algorithm"`
	JWTExpiration     time.Duration `json:"jwt_expiration"`
	JWTRefreshEnabled bool          `json:"jwt_refresh_enabled"`

	// CORS配置
	CORSAllowedOrigins   []string `json:"cors_allowed_origins"`
	CORSAllowedMethods   []string `json:"cors_allowed_methods"`
	CORSAllowedHeaders   []string `json:"cors_allowed_headers"`
	CORSMaxAge           int      `json:"cors_max_age"`
	CORSAllowCredentials bool     `json:"cors_allow_credentials"`

	// 安全头配置
	SecurityHeadersEnabled bool `json:"security_headers_enabled"`

	// 限流配置
	RateLimitEnabled           bool `json:"rate_limit_enabled"`
	RateLimitRequestsPerMinute int  `json:"rate_limit_requests_per_minute"`
}

SecurityConfig 安全配置结构体

func DefaultSecurityConfig added in v0.1.5

func DefaultSecurityConfig() *SecurityConfig

DefaultSecurityConfig 返回默认安全配置

func LoadSecurityConfig added in v0.1.5

func LoadSecurityConfig() (*SecurityConfig, error)

LoadSecurityConfig 从环境变量加载安全配置

func (*SecurityConfig) BuildJWTAdapter added in v0.1.5

func (c *SecurityConfig) BuildJWTAdapter() (*JWTAdapter, error)

BuildJWTAdapter 构建 JWT 适配器(目前仅支持 HS256 系列)

func (*SecurityConfig) Validate added in v0.1.5

func (c *SecurityConfig) Validate() error

ValidateSecurityConfig 验证安全配置

type SecurityHeadersConfig added in v0.1.5

type SecurityHeadersConfig struct {
	XFrameOptions           string // DENY, SAMEORIGIN, ALLOW-FROM uri
	XContentTypeOptions     bool   // 是否启用 nosniff
	XXSSProtection          string // 1; mode=block
	StrictTransportSecurity string // max-age=31536000; includeSubDomains; preload
	ContentSecurityPolicy   string // CSP策略字符串
	ReferrerPolicy          string // 引用者策略
	PermissionsPolicy       string // 权限策略
	HideServerInfo          bool   // 是否隐藏服务器信息
}

SecurityHeadersConfig 安全头配置

func DefaultSecurityHeadersConfig added in v0.1.5

func DefaultSecurityHeadersConfig() SecurityHeadersConfig

DefaultSecurityHeadersConfig 返回默认安全头配置

type SecurityRequirement added in v0.1.5

type SecurityRequirement map[string][]string // SchemeName -> Scopes

type SecurityScheme added in v0.1.5

type SecurityScheme struct {
	Name         string // Type string // "http", "oauth2", "apiKey"
	Type         string // Scheme string // "basic", "bearer", etc.
	Scheme       string
	BearerFormat string
	Flows        *OAuthFlows
	Description  string
}

type SecuritySchemes added in v0.1.5

type SecuritySchemes []SecurityScheme

func (SecuritySchemes) ToOpenAPI added in v0.1.5

func (ss SecuritySchemes) ToOpenAPI() openapi3.SecuritySchemes

type SegmentType added in v0.1.5

type SegmentType int

SegmentType 路由段类型

const (
	SegmentTypeStatic   SegmentType = iota // 静态段
	SegmentTypeParam                       // 参数段 (:param)
	SegmentTypeWildcard                    // 通配符段 (*wildcard)
)

func IdentifySegmentType added in v0.1.5

func IdentifySegmentType(segment string) (SegmentType, string, error)

IdentifySegmentType 识别段类型

func (SegmentType) String added in v0.1.5

func (st SegmentType) String() string

String 返回段类型的字符串表示

type Server added in v0.1.5

type Server struct {
	Extensions map[string]any `json:"-" yaml:"-"`
	// 服务器URL(例如:"https://api.example.com/v1")
	URL string `json:"url" yaml:"url"`
	// 可选的服务器描述
	Description string `json:"description,omitempty" yaml:"description,omitempty"`
}

Server 代表API托管的服务器位置

type ServerConfig added in v0.1.1

type ServerConfig struct {
	Host            string        // 主机地址
	Port            string        // 端口
	ReadTimeout     time.Duration // 读取超时
	WriteTimeout    time.Duration // 写入超时
	MaxHeaderBytes  int           // 最大头部字节
	CertFile        string        // TLS证书文件
	KeyFile         string        // TLS密钥文件
	EnableHTTP2     bool          // 启用HTTP/2
	GracefulTimeout time.Duration // 优雅关闭超时
}

ServerConfig 服务器配置选项

func DefaultServerConfig added in v0.1.1

func DefaultServerConfig() ServerConfig

DefaultServerConfig 返回默认服务器配置

type Servers added in v0.1.5

type Servers []Server

Servers 是代表API服务器位置的Server对象列表

func (Servers) ToOpenAPI added in v0.1.5

func (s Servers) ToOpenAPI() openapi3.Servers

ToOpenAPI 将Servers转换为openapi3.Servers。 将自定义Servers类型转换为openapi3包期望的格式。

type TokenResponse added in v0.1.5

type TokenResponse struct {
	AccessToken  string `json:"access_token"`    // 访问令牌
	RefreshToken string `json:"refresh_token"`   // 刷新令牌
	TokenType    string `json:"token_type"`      // 令牌类型,通常为"Bearer"
	ExpiresIn    int64  `json:"expires_in"`      // 访问令牌过期时间(秒)
	Scope        string `json:"scope,omitempty"` // 权限范围
	JTI          string `json:"jti,omitempty"`   // JWT ID
}

TokenResponse OAuth令牌响应结构

type URLBuilder added in v0.1.5

type URLBuilder struct {
	// contains filtered or unexported fields
}

URLBuilder 结构体用于构建 URL

func (*URLBuilder) Build added in v0.1.5

func (ub *URLBuilder) Build() string

Build 生成最终的 URL

func (*URLBuilder) Domain added in v0.1.5

func (ub *URLBuilder) Domain(domain string) *URLBuilder

Domain 设置是否使用域名

func (*URLBuilder) Scheme added in v0.1.5

func (ub *URLBuilder) Scheme(scheme string) *URLBuilder

Scheme 设置 URL 的访问协议

func (*URLBuilder) Set added in v0.1.5

func (ub *URLBuilder) Set(query string, value interface{}) *URLBuilder

Set 设置 URL 的Query参数

type UserClaims added in v0.1.5

type UserClaims struct {
	UserID   string   `json:"user_id"`         // 用户ID
	Username string   `json:"username"`        // 用户名
	Email    string   `json:"email,omitempty"` // 邮箱
	Roles    []string `json:"roles,omitempty"` // 角色列表
	Scope    string   `json:"scope,omitempty"` // 权限范围
}

UserClaims 用户声明结构

type ZipFSConfig added in v0.1.5

type ZipFSConfig struct {
	// 基础配置
	ZipPath   string   // zip文件路径
	URLPrefix string   // URL路径前缀
	SubPaths  []string // 子路径列表(可选)

	// 安全配置
	Password string // zip文件密码(可选)

	// 热更新配置
	HotReload     bool          // 是否启用热更新
	CheckInterval time.Duration // 检查间隔,默认3秒

	// 行为配置
	IndexFile   string // 首页文件名,默认index.html
	StripPrefix bool   // 是否移除URL前缀

	// 回退配置
	FallbackFS      http.FileSystem // 回退文件系统
	FallbackHandler gin.HandlerFunc // 回退处理器
}

ZipFSConfig zip文件系统配置

func NewZipFSConfig added in v0.1.5

func NewZipFSConfig(zipPath, urlPrefix string, opts ...func(*ZipFSConfig)) ZipFSConfig

NewZipFSConfig 创建zip文件系统配置

type ZipFSMetrics added in v0.1.5

type ZipFSMetrics struct {
	ReloadCount  int64     // 重载次数
	LastReload   time.Time // 最后重载时间
	ErrorCount   int64     // 错误次数
	RequestCount int64     // 请求次数
}

ZipFSMetrics zip文件系统监控指标

type ZipFile added in v0.1.5

type ZipFile struct {
	// contains filtered or unexported fields
}

ZipFile 单个zip文件管理器

func NewZipFile added in v0.1.5

func NewZipFile(zipPath, filePath string, config *ZipFileConfig) (*ZipFile, error)

NewZipFile 创建新的zip文件管理器

func (*ZipFile) ServeHTTP added in v0.1.5

func (zf *ZipFile) ServeHTTP(c *gin.Context)

ServeHTTP 文件服务处理

func (*ZipFile) StartHotReload added in v0.1.5

func (zf *ZipFile) StartHotReload()

StartHotReload 启动文件热更新监控

func (*ZipFile) Stop added in v0.1.5

func (zf *ZipFile) Stop()

Stop 停止文件热更新监控

type ZipFileConfig added in v0.1.5

type ZipFileConfig struct {
	Password      string        // zip文件密码(可选)
	HotReload     bool          // 是否启用热更新
	CheckInterval time.Duration // 检查间隔
	ContentType   string        // 内容类型
}

ZipFileConfig 单文件配置

type ZipFileOption added in v0.1.5

type ZipFileOption func(*ZipFileConfig)

ZipFileOption 单文件配置选项

func WithContentType added in v0.1.5

func WithContentType(contentType string) ZipFileOption

WithContentType 设置内容类型

func WithFileHotReload added in v0.1.5

func WithFileHotReload(interval time.Duration) ZipFileOption

WithFileHotReload 启用文件热更新

func WithFilePassword added in v0.1.5

func WithFilePassword(password string) ZipFileOption

WithFilePassword 设置单文件zip密码

type ZipFileSystem added in v0.1.5

type ZipFileSystem struct {
	// contains filtered or unexported fields
}

ZipFileSystem zip文件系统管理器

func NewZipFileSystem added in v0.1.5

func NewZipFileSystem(config ZipFSConfig) (*ZipFileSystem, error)

NewZipFileSystem 创建新的zip文件系统

func (*ZipFileSystem) GetMetrics added in v0.1.5

func (zfs *ZipFileSystem) GetMetrics() ZipFSMetrics

GetMetrics 获取监控指标

func (*ZipFileSystem) ServeHTTP added in v0.1.5

func (zfs *ZipFileSystem) ServeHTTP(c *gin.Context)

ServeHTTP 实现http.Handler接口

func (*ZipFileSystem) StartHotReload added in v0.1.5

func (zfs *ZipFileSystem) StartHotReload()

StartHotReload 启动热更新监控

func (*ZipFileSystem) Stop added in v0.1.5

func (zfs *ZipFileSystem) Stop()

Stop 停止热更新监控

Directories

Path Synopsis
errors command
full command
oauth command
openapi command
sse command
token command
zipfs command
pkg
errors
Package errors 提供统一的错误处理机制
Package errors 提供统一的错误处理机制
sse
Package sse 提供基于Server-Sent Events的实时通信功能
Package sse 提供基于Server-Sent Events的实时通信功能
token/pool
@Author daixk 2025-10-28 22:00:20
@Author daixk 2025-10-28 22:00:20
Package types 定义框架中通用的类型和接口,解决循环导入问题
Package types 定义框架中通用的类型和接口,解决循环导入问题

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL