feat: 升级swagger ui 注册

This commit is contained in:
2026-01-07 23:13:13 +08:00
parent e98874d1ca
commit 55fc40a43a
3 changed files with 8 additions and 1014 deletions

View File

@@ -8,12 +8,10 @@
package api_doc
import (
"fmt"
"net/http"
"path/filepath"
"strings"
"git.zhangdeman.cn/zhangdeman/api-doc/define"
"git.zhangdeman.cn/zhangdeman/api-doc/enums"
"git.zhangdeman.cn/zhangdeman/api-doc/theme"
"git.zhangdeman.cn/zhangdeman/consts"
@@ -25,96 +23,18 @@ import (
)
// NewSwaggerUI ...
func NewSwaggerUI(info *define.Info, servers []*define.ServerItem, uiTheme enums.SwaggerUITheme) *SwaggerUI {
if nil == info {
info = &define.Info{
Description: "",
Title: "",
TermsOfService: "",
Contact: &define.Contact{
Name: "",
Url: "",
Email: "",
},
License: nil,
Version: "",
}
}
if nil == info.Contact {
info.Contact = &define.Contact{
Name: "",
Url: "",
Email: "",
}
}
if nil == info.License {
info.License = &define.License{
Name: "",
Url: "",
}
}
func NewSwaggerUI(docTitle string, docBaseUri string, uiTheme enums.SwaggerUITheme) *SwaggerUI {
return &SwaggerUI{
docInstance: NewOpenapiDoc(
WithDocDescription(info.Description),
WithDocTitle(info.Title),
WithDocContactEmail(info.Contact.Email),
WithDocContactName(info.Contact.Name),
WithDocLicense(info.License.Name),
WithDocServers(servers),
),
uiTheme: uiTheme,
baseUri: docBaseUri,
docTitle: docTitle,
uiTheme: uiTheme,
}
}
type SwaggerUI struct {
docInstance *Generate // 文档实例
uiTheme enums.SwaggerUITheme // 文档主题, swaggerUI / knife4go, 默认 knife4go
router *gin.Engine
baseUri string
}
// DocInstance 文档实例
func (su *SwaggerUI) DocInstance() *Generate {
return su.docInstance
}
// RegisterHandler ...
func (su *SwaggerUI) RegisterHandler(router *gin.Engine, baseUri string) {
su.router = router
baseUri = strings.TrimRight(baseUri, "/")
if len(baseUri) == 0 {
baseUri = "/docs/swagger"
}
su.baseUri = baseUri
router.GET(baseUri+"/*any", func(ctx *gin.Context) {
if ctx.Request.RequestURI == baseUri+"/doc.json" {
// 默认swagger, 通过此接口读取文档数据
ctx.JSON(http.StatusOK, su.docInstance.Doc())
ctx.Abort()
}
if ctx.Request.RequestURI == "/doc/swagger/openapi.json" {
// knife4go 文档通过此接口读取文档列表
ctx.JSON(http.StatusOK, []map[string]any{
{
"name": "服务文档",
"url": "doc.json",
"swaggerVersion": enums.SwaggerDocVersion3.String(),
},
})
ctx.Abort()
}
}, su.Handler())
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": baseUri + "/doc.json",
"swaggerVersion": enums.SwaggerDocVersion3.String(),
},
})
// ctx.JSON(http.StatusOK, swaggerInstance.docInstance.Data())
})
baseUri string
docTitle string
uiTheme enums.SwaggerUITheme // 文档主题, swaggerUI / knife4go, 默认 knife4go
}
// Handler 访问文档的接口处理
@@ -178,7 +98,7 @@ func (su *SwaggerUI) HandleRedocFreeUI() func(ctx *gin.Context) {
return func(ctx *gin.Context) {
// TODO : 这部分数据支持外部传参替换
replaceTable := map[string]string{
"{{DOC_TITLE}}": fmt.Sprintf("【%v】%v", su.docInstance.Doc().Info.Version, su.docInstance.Doc().Info.Title),
"{{DOC_TITLE}}": su.docTitle,
"{{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",