// Package router ... // // Description : router ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2025-02-07 18:19 package router import ( "fmt" "net/http" "strings" "git.zhangdeman.cn/zhangdeman/consts" apiDocDefine "git.zhangdeman.cn/gateway/api-doc/define" "github.com/gin-gonic/gin" ) // NewServer server实例 // // Author : go_developer@163.com<白茶清欢> // // Date : 18:20 2025/2/7 func NewServer(port int, option any) *server { if port < 80 { panic("port should be greater than 80") } return &server{ router: gin.Default(), docInstance: NewDoc(nil, []*apiDocDefine.ServerItem{ { Url: fmt.Sprintf("http://127.0.0.1:%d", port), Description: "测试服务器", }, }), // TODO : 配置相关信息 port: port, } } type server struct { router *gin.Engine port int docInstance *Doc } // Start 启动服务 // // Author : go_developer@163.com<白茶清欢> // // Date : 18:31 2025/2/7 func (s *server) Start() { if err := s.router.Run(fmt.Sprintf(":%d", s.port)); err != nil { panic("服务启动监听失败" + err.Error()) } } // Group 注册接口路由 // // Author : go_developer@163.com<白茶清欢> // // Date : 19:35 2025/1/27 func (s *server) Group(routerPrefix string, middlewareList []gin.HandlerFunc, cList ...any) { g := s.router.Group(routerPrefix) g.Use(middlewareList...) cParser := controller{} for _, c := range cList { urlTable := cParser.Parse(c) for _, itemUriCfg := range urlTable { s.docInstance.Add(routerPrefix, itemUriCfg.FormDataType, itemUriCfg.ResultDataType) method := strings.ToUpper(itemUriCfg.RequestMethod) switch method { case http.MethodGet: g.GET(itemUriCfg.Path, RequestHandler(itemUriCfg)) case http.MethodHead: g.HEAD(itemUriCfg.Path, RequestHandler(itemUriCfg)) case http.MethodPost: g.POST(itemUriCfg.Path, RequestHandler(itemUriCfg)) case http.MethodPut: g.PUT(itemUriCfg.Path, RequestHandler(itemUriCfg)) case http.MethodPatch: g.PATCH(itemUriCfg.Path, RequestHandler(itemUriCfg)) case http.MethodDelete: g.DELETE(itemUriCfg.Path, RequestHandler(itemUriCfg)) case http.MethodOptions: g.OPTIONS(itemUriCfg.Path, RequestHandler(itemUriCfg)) case http.MethodTrace: panic(`method Trace is not supported`) default: panic("method " + itemUriCfg.RequestMethod + " is not support") } } } // 注册文档 s.SwaggerUI() } // SwaggerUI ... // // Author : go_developer@163.com<白茶清欢> // // Date : 21:45 2025/2/15 func (s *server) SwaggerUI() { swaggerInstance := NewSwaggerUI(s.docInstance, SwaggerUIThemeKnife4go) s.router.GET("/swagger-resources", func(ctx *gin.Context) { // lucky UI获取分组信息 ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*") // 允许访问所有域 ctx.JSON(http.StatusOK, []map[string]any{ { "name": "服务文档", "url": "/swagger-ui/doc/openapi.json", "swaggerVersion": consts.SwaggerDocVersion3, }, }) // ctx.JSON(http.StatusOK, swaggerInstance.docInstance.Data()) }) s.router.GET("/swagger-ui/doc/openapi.json", func(ctx *gin.Context) { ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*") // 允许访问所有域 ctx.JSON(http.StatusOK, swaggerInstance.docInstance.Data()) }) s.router.GET("/doc/swagger/*any", func(ctx *gin.Context) { if ctx.Request.RequestURI == "/doc/swagger/doc.json" { // 默认swagger, 通过此接口读取文档数据 ctx.JSON(http.StatusOK, swaggerInstance.docInstance.Data()) ctx.Abort() } if ctx.Request.RequestURI == "/doc/swagger/openapi.json" { // knife4go 文档通过此接口读取文档列表 ctx.JSON(http.StatusOK, []map[string]any{ { "name": "服务文档", "url": "doc.json", "swaggerVersion": consts.SwaggerDocVersion3, }, }) ctx.Abort() } }, swaggerInstance.Handler()) }