From c75166912da87f5dc45962a36ddd193da692214f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=8C?= <259278618@qq.com> Date: Thu, 27 Nov 2025 09:46:47 +0800 Subject: [PATCH] =?UTF-8?q?swagger=E4=BF=AE=E6=94=B9=EF=BC=8C=E9=99=90?= =?UTF-8?q?=E6=B5=81=E4=BB=A4=E7=89=8C=E6=A1=B6=E9=85=8D=E7=BD=AE=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http/http.go | 33 +++++++++++++++++++++--- middleware/middleware.go | 55 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 middleware/middleware.go diff --git a/http/http.go b/http/http.go index 8d84822..c675ec4 100644 --- a/http/http.go +++ b/http/http.go @@ -6,6 +6,7 @@ import ( "fmt" _ "gitee.com/red-future---jilin-g/common/consul" "gitee.com/red-future---jilin-g/common/jaeger" + "gitee.com/red-future---jilin-g/common/middleware" "gitee.com/red-future---jilin-g/common/utils" "github.com/gogf/gf/contrib/registry/consul/v2" "github.com/gogf/gf/v2/frame/g" @@ -38,9 +39,33 @@ func init() { //s.Use(common.Cors) //中间件验证 //s.EnablePProf() //启用性能分析 Httpserver.SetOpenApiPath("/api.json") - Httpserver.SetSwaggerPath("/swagger") //api文档访问路径 - Httpserver.SetDumpRouterMap(true) //关闭打印路由注册信息 - Httpserver.BindMiddlewareDefault(ghttp.MiddlewareHandlerResponse, jaeger.NewTracer) //使用默认http返回结构 + Httpserver.SetSwaggerPath("/docs") //api文档访问路径 + Httpserver.SetDumpRouterMap(true) //关闭打印路由注册信息 + Httpserver.SetSwaggerUITemplate(` + + + + + + + SwaggerUI + + + +
+ + + + + `) + Httpserver.BindMiddlewareDefault(ghttp.MiddlewareCORS, ghttp.MiddlewareHandlerResponse, middleware.Limiter, jaeger.NewTracer) //使用默认http返回结构 go Httpserver.Run() consulCfg, _ := g.Cfg().Get(context.Background(), "consul.address") @@ -51,7 +76,6 @@ func init() { } gsvc.SetRegistry(registry) gsel.SetBuilder(gsel.NewBuilderRoundRobin()) - Httpclient.SetHeader("Authorization", g.RequestFromCtx(context.TODO()).GetHeader("Authorization")) Httpclient.SetDiscovery(gsvc.GetRegistry()) } func RouteRegister(controllers []interface{}) { @@ -71,6 +95,7 @@ func doRequest(ctx context.Context, method string, url string, target any, data if err != nil { return } + Httpclient.SetHeader("Authorization", g.RequestFromCtx(ctx).GetHeader("Authorization")) response, err := Httpclient.DoRequest(ctx, method, url, data) if err != nil { return diff --git a/middleware/middleware.go b/middleware/middleware.go new file mode 100644 index 0000000..593c25c --- /dev/null +++ b/middleware/middleware.go @@ -0,0 +1,55 @@ +package middleware + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/text/gstr" + "golang.org/x/time/rate" +) + +// Logger 中间件 +func Logger(r *ghttp.Request) { + startTime := gtime.TimestampMilli() + r.Middleware.Next() + endTime := gtime.TimestampMilli() + g.Log().Infof(r.GetCtx(), + "request: %s %s | status: %d | time: %dms", + r.Method, + r.URL.Path, + r.Response.Status, + endTime-startTime, + ) +} + +var rateLimit, _ = g.Cfg().Get(context.TODO(), "rate.limit") +var rateBurst, _ = g.Cfg().Get(context.TODO(), "rate.burst") +var limiter = rate.NewLimiter(rate.Limit(rateLimit.Int()), rateBurst.Int()) + +func Limiter(r *ghttp.Request) { + if !limiter.Allow() { + r.Response.WriteStatusExit(429) // Return 429 Too Many Requests + r.ExitAll() + } + r.Middleware.Next() +} +func Auth(r *ghttp.Request) { + token := r.Header.Get("Authorization") + if token == "" || !gstr.HasPrefix(token, "Bearer ") { + r.Response.WriteStatusExit(401, "Unauthorized") + return + } + + // 验证 token + if !validateToken(gstr.SubStrFrom(token, "7")) { + r.Response.WriteStatusExit(401, "Unauthorized") + return + } + + r.Middleware.Next() +} +func validateToken(token string) bool { + // 实现 token 验证逻辑 + return token == "valid-token" +}