From ab8f68c799013eebb75a47c23daed511248e4e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Tue, 18 Feb 2025 16:10:40 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0redoc=20free=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- define/seagger_ui.go | 1 + swagger_ui.go | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/define/seagger_ui.go b/define/seagger_ui.go index db5ef34..df64281 100644 --- a/define/seagger_ui.go +++ b/define/seagger_ui.go @@ -11,4 +11,5 @@ const ( SwaggerUIThemeDefault = "swaggerUI" // 文档默认主题 SwaggerUIThemeKnife4go = "knife4go" // knife4go 主题 SwaggerUIThemeYDocLucky = "ydoc-lucky-ui" // YDoc Lucky UI 主题: https://github.com/NoBugBoy/LuckyUI + SwaggerUIThemeRedocFree = "redoc-free" // redoc UI 主题, 开源免费版: https://github.com/Redocly/redoc ) diff --git a/swagger_ui.go b/swagger_ui.go index dc00fa7..7c97a81 100644 --- a/swagger_ui.go +++ b/swagger_ui.go @@ -106,6 +106,11 @@ func (su *SwaggerUI) Handler() func(ctx *gin.Context) { case define.SwaggerUIThemeYDocLucky: // YDoc-Lucky-UI 主题处理 return su.HandleLuckyUI() + case define.SwaggerUIThemeDefault: + return su.HandleSwaggerUI() + case define.SwaggerUIThemeRedocFree: + // redoc免费版, TODO : 待完成 + return su.HandleSwaggerUI() default: return su.HandleSwaggerUI() } From 93d399d845b5fd05674431d3ac7f3111cb0822d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Tue, 18 Feb 2025 16:50:37 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=95=B4=E5=90=88redoc=E5=85=8D=E8=B4=B9?= =?UTF-8?q?=E7=89=88swagger=E6=96=87=E6=A1=A3=E4=B8=BB=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- redoc-free/index.html | 29 +++++++++++++++++++++++++++++ swagger_ui.go | 29 +++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 redoc-free/index.html diff --git a/redoc-free/index.html b/redoc-free/index.html new file mode 100644 index 0000000..b24dbd1 --- /dev/null +++ b/redoc-free/index.html @@ -0,0 +1,29 @@ + + + + Redoc + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/swagger_ui.go b/swagger_ui.go index 7c97a81..dc8c56b 100644 --- a/swagger_ui.go +++ b/swagger_ui.go @@ -23,6 +23,9 @@ import ( //go:embed ydoc-lucky-ui/* var ydocUIFiles embed.FS +//go:embed redoc-free/index.html +var redocFreeIndexContent string + // NewSwaggerUI ... // // Author : go_developer@163.com<白茶清欢> @@ -109,8 +112,8 @@ func (su *SwaggerUI) Handler() func(ctx *gin.Context) { case define.SwaggerUIThemeDefault: return su.HandleSwaggerUI() case define.SwaggerUIThemeRedocFree: - // redoc免费版, TODO : 待完成 - return su.HandleSwaggerUI() + // redoc免费版 + return su.HandleRedocFreeUI() default: return su.HandleSwaggerUI() } @@ -165,3 +168,25 @@ func (su *SwaggerUI) HandleKnife4goUI() func(ctx *gin.Context) { func (su *SwaggerUI) HandleSwaggerUI() func(ctx *gin.Context) { return ginSwagger.WrapHandler(swaggerFiles.Handler) } + +// HandleRedocFreeUI 处理redoc_free主题 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:40 2025/2/18 +func (su *SwaggerUI) HandleRedocFreeUI() func(ctx *gin.Context) { + return func(ctx *gin.Context) { + // TODO : 这部分数据支持外部传参替换 + replaceTable := map[string]string{ + "{{CSS_FAMILY}}": "https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700", + "{{DOC_PATH}}": "doc.json", + "{{REDOC_STANDALONE_JS}}": "https://cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js", + } + for k, v := range replaceTable { + redocFreeIndexContent = strings.ReplaceAll(redocFreeIndexContent, k, v) + } + ctx.Header("Content-Type", "text/html; charset=utf-8") + ctx.String(http.StatusOK, redocFreeIndexContent) + ctx.Abort() + } +} From 7aa4d3c417a289c30ebf2e33bcadd255fdbf89cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Tue, 18 Feb 2025 17:04:47 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dget=E7=B1=BB=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=8C=BF=E5=90=8D=E5=AD=97=E6=AE=B5=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- generate.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/generate.go b/generate.go index b1cdf44..08fa1b3 100644 --- a/generate.go +++ b/generate.go @@ -329,6 +329,7 @@ func (g *Generate) ParseReadConfigParam(requestCfg *define.UriBaseConfig, baseRe if inputType.Field(i).Anonymous { // 匿名字段, 直接对齐到当前的父级 g.ParseReadConfigParam(requestCfg, baseReqCfg, inputType.Field(i).Type) + continue } propertyName := ParseStructFieldTag.GetParamName(inputType.Field(i)) if propertyName == "-" { @@ -496,15 +497,16 @@ func (g *Generate) AddComponentsSchema(rootSchemaName string, pkgPath string, in // 结构体 if inputType.Kind() == reflect.Struct { for i := 0; i < inputType.NumField(); i++ { + propertyName := ParseStructFieldTag.GetParamName(inputType.Field(i)) + if propertyName == "-" { + continue + } + if inputType.Field(i).Anonymous { // 处理匿名字段 g.handleAnonymousField(schemaName, inputType.Field(i)) continue } - propertyName := ParseStructFieldTag.GetParamName(inputType.Field(i)) - if propertyName == "-" { - continue - } if inputType.Field(i).Type.Kind() == reflect.Ptr { // 处理指针 if inputType.Field(i).Type.Elem().Kind() == reflect.Struct { @@ -605,15 +607,15 @@ func (g *Generate) handleAnonymousField(schemaName string, field reflect.StructF handleType = handleType.Elem() } for i := 0; i < handleType.NumField(); i++ { - if handleType.Field(i).Anonymous { + itemField := handleType.Field(i) + if itemField.Anonymous { // 递归处理多层嵌套匿名字段 - g.handleAnonymousField(schemaName, handleType.Field(i)) + g.handleAnonymousField(schemaName, itemField) continue } else { - itemField := handleType.Field(i) baseConvertType, isBaseType := g.realBaseType2SwaggerType(itemField.Type.String()) if !isBaseType { - g.AddComponentsSchema(schemaName, itemField.Type.PkgPath(), itemField.Type) + g.AddComponentsSchema(schemaName, handleType.Field(i).Type.PkgPath(), handleType.Field(i).Type) continue } else { paramName := ParseStructFieldTag.GetParamName(itemField) @@ -621,8 +623,8 @@ func (g *Generate) handleAnonymousField(schemaName string, field reflect.StructF Type: baseConvertType, Format: itemField.Type.String(), Enum: ValidateRule.Enum(itemField), - Default: ParseStructFieldTag.GetDefaultValue(itemField), - Description: ParseStructFieldTag.GetParamDesc(itemField), + Default: ParseStructFieldTag.GetDefaultValue(handleType.Field(i)), + Description: ParseStructFieldTag.GetParamDesc(handleType.Field(i)), } if ValidateRule.IsRequired(itemField) { g.docData.Components.Schemas[schemaName].Required = append(g.docData.Components.Schemas[schemaName].Required, paramName)