upgrade: 优化部分代码, 部分内容待配置化

This commit is contained in:
2025-08-23 01:09:57 +08:00
parent 14e56e4caf
commit bac8242f5e
19 changed files with 169 additions and 153 deletions

View File

@ -10,16 +10,18 @@ package api_doc
import (
"embed"
"fmt"
"net/http"
"path/filepath"
"strings"
"git.zhangdeman.cn/gateway/api-doc/define"
"git.zhangdeman.cn/gateway/api-doc/enums"
"git.zhangdeman.cn/zhangdeman/consts"
"github.com/gin-gonic/gin"
knife4goFiles "github.com/go-webtools/knife4go"
knife4goGin "github.com/go-webtools/knife4go/gin"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
"net/http"
"path/filepath"
"strings"
)
//go:embed ydoc-lucky-ui/*
@ -29,11 +31,7 @@ var ydocUIFiles embed.FS
var redocFreeIndexContent string
// NewSwaggerUI ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:21 2025/2/15
func NewSwaggerUI(info *define.Info, servers []*define.ServerItem, uiTheme string) *SwaggerUI {
func NewSwaggerUI(info *define.Info, servers []*define.ServerItem, uiTheme enums.SwaggerUITheme) *SwaggerUI {
return &SwaggerUI{
docInstance: NewOpenapiDoc(info, servers),
uiTheme: uiTheme,
@ -41,26 +39,18 @@ func NewSwaggerUI(info *define.Info, servers []*define.ServerItem, uiTheme strin
}
type SwaggerUI struct {
docInstance *Generate // 文档实例
uiTheme string // 文档主题, swaggerUI / knife4go, 默认 knife4go
docInstance *Generate // 文档实例
uiTheme enums.SwaggerUITheme // 文档主题, swaggerUI / knife4go, 默认 knife4go
router *gin.Engine
baseUri string
}
// DocInstance 文档实例
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 13:23 2025/2/16
func (su *SwaggerUI) DocInstance() *Generate {
return su.docInstance
}
// RegisterHandler ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:00 2025/2/16
func (su *SwaggerUI) RegisterHandler(router *gin.Engine, baseUri string) {
su.router = router
baseUri = strings.TrimRight(baseUri, "/")
@ -80,7 +70,7 @@ func (su *SwaggerUI) RegisterHandler(router *gin.Engine, baseUri string) {
{
"name": "服务文档",
"url": "doc.json",
"swaggerVersion": consts.SwaggerDocVersion3,
"swaggerVersion": enums.SwaggerDocVersion3.String(),
},
})
ctx.Abort()
@ -92,7 +82,7 @@ func (su *SwaggerUI) RegisterHandler(router *gin.Engine, baseUri string) {
{
"name": "服务文档",
"url": baseUri + "/doc.json",
"swaggerVersion": consts.SwaggerDocVersion3,
"swaggerVersion": enums.SwaggerDocVersion3.String(),
},
})
// ctx.JSON(http.StatusOK, swaggerInstance.docInstance.Data())
@ -100,20 +90,16 @@ func (su *SwaggerUI) RegisterHandler(router *gin.Engine, baseUri string) {
}
// Handler 访问文档的接口处理
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:34 2025/2/15
func (su *SwaggerUI) Handler() func(ctx *gin.Context) {
switch su.uiTheme {
case define.SwaggerUIThemeKnife4go:
case enums.SwaggerUIThemeKnife4go:
return su.HandleKnife4goUI()
case define.SwaggerUIThemeYDocLucky:
case enums.SwaggerUIThemeYDocLucky:
// YDoc-Lucky-UI 主题处理
return su.HandleLuckyUI()
case define.SwaggerUIThemeDefault:
case enums.SwaggerUIThemeDefault:
return su.HandleSwaggerUI()
case define.SwaggerUIThemeRedocFree:
case enums.SwaggerUIThemeRedocFree:
// redoc免费版
return su.HandleRedocFreeUI()
default:
@ -122,15 +108,11 @@ func (su *SwaggerUI) Handler() func(ctx *gin.Context) {
}
// HandleLuckyUI ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:04 2025/2/16
func (su *SwaggerUI) HandleLuckyUI() func(ctx *gin.Context) {
// su.router.StaticFS(su.baseUri+"/assets", http.FS(ydocUIFiles))
return func(ctx *gin.Context) {
fileRealPath := strings.TrimPrefix(ctx.Request.RequestURI, su.baseUri)
byteData, _ := ydocUIFiles.ReadFile(filepath.Join(define.SwaggerUIThemeYDocLucky, fileRealPath))
byteData, _ := ydocUIFiles.ReadFile(filepath.Join(enums.SwaggerUIThemeYDocLucky.String(), fileRealPath))
if strings.HasSuffix(ctx.Request.RequestURI, "html") {
byteData = []byte(strings.ReplaceAll(string(byteData), "{{BASE_URI}}", su.baseUri))
}
@ -141,17 +123,13 @@ func (su *SwaggerUI) HandleLuckyUI() func(ctx *gin.Context) {
} else if strings.HasSuffix(ctx.Request.RequestURI, "js") {
contentType = "application/javascript"
}
ctx.Header("Content-Type", contentType)
ctx.Header(consts.HeaderKeyContentType.String(), contentType)
ctx.String(http.StatusOK, string(byteData))
ctx.Abort()
}
}
// HandleKnife4goUI ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:38 2025/2/15
func (su *SwaggerUI) HandleKnife4goUI() func(ctx *gin.Context) {
resetOption := func(cfg *knife4goGin.Config) {
if nil == cfg {
@ -163,19 +141,11 @@ func (su *SwaggerUI) HandleKnife4goUI() func(ctx *gin.Context) {
}
// HandleSwaggerUI ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:41 2025/2/15
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 : 这部分数据支持外部传参替换
@ -188,7 +158,7 @@ func (su *SwaggerUI) HandleRedocFreeUI() func(ctx *gin.Context) {
for k, v := range replaceTable {
redocFreeIndexContent = strings.ReplaceAll(redocFreeIndexContent, k, v)
}
ctx.Header("Content-Type", "text/html; charset=utf-8")
ctx.Header(consts.HeaderKeyContentType.String(), "text/html; charset=utf-8")
ctx.String(http.StatusOK, redocFreeIndexContent)
ctx.Abort()
}