From 1cafe70192d899f32ec8c8b8a62bd0f04a94bc95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Wed, 7 Jan 2026 11:27:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E9=85=8D=E7=BD=AESec?= =?UTF-8?q?urity=20+=20=E7=A7=BB=E9=99=A4=E4=B8=8D=E5=BF=85=E8=A6=81?= =?UTF-8?q?=E7=9A=84components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openapi/generate.go | 15 +++++++-------- openapi/generate_test.go | 19 ++++++++++++++++++- openapi/option.go | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/openapi/generate.go b/openapi/generate.go index 23c2219..c6011b5 100644 --- a/openapi/generate.go +++ b/openapi/generate.go @@ -29,7 +29,7 @@ var ( func NewOpenApiDoc(optionFunc ...OptionFunc) *openapi3.T { t := &openapi3.T{ Extensions: map[string]any{}, - OpenAPI: "3.1.0", + OpenAPI: "3.0.3", Components: &openapi3.Components{ Extensions: map[string]any{}, Origin: &openapi3.Origin{ @@ -167,7 +167,7 @@ func (g *Generate) AddApiDoc(docFlag string, apiMeta define.UriConfig, request a schemaData := GenerateOpenAPISchema(requestType) apiOperate, isRead := g.initApiConfig(docFlag, apiMeta) - requestTypeStr := requestType.String() + //requestTypeStr := requestType.String() if isRead { for paramName, paramConfig := range schemaData.Value.Properties { apiOperate.Parameters = append(apiOperate.Parameters, &openapi3.ParameterRef{ @@ -217,14 +217,13 @@ func (g *Generate) AddApiDoc(docFlag string, apiMeta define.UriConfig, request a } } - // 初始化接口配置 - if _, exist := g.docTable[docFlag].Components.Schemas[requestTypeStr]; !exist { + /*if _, exist := g.docTable[docFlag].Components.Schemas[requestTypeStr]; !exist { g.docTable[docFlag].Components.Schemas[requestTypeStr] = schemaData - } - responseTypeStr := responseType.String() + }*/ + /*responseTypeStr := responseType.String() if _, exist := g.docTable[docFlag].Components.Schemas[responseTypeStr]; !exist { g.docTable[docFlag].Components.Schemas[responseTypeStr] = GenerateOpenAPISchema(responseType) - } + }*/ desc := "请求成功" apiOperate.Responses.Set(fmt.Sprintf("%v", http.StatusOK), &openapi3.ResponseRef{ Extensions: nil, @@ -239,7 +238,7 @@ func (g *Generate) AddApiDoc(docFlag string, apiMeta define.UriConfig, request a consts.MimeTypeJson: { Extensions: nil, Origin: nil, - Schema: g.docTable[docFlag].Components.Schemas[responseTypeStr], + Schema: GenerateOpenAPISchema(responseType), Example: nil, Examples: nil, Encoding: nil, diff --git a/openapi/generate_test.go b/openapi/generate_test.go index 985a944..7f053fa 100644 --- a/openapi/generate_test.go +++ b/openapi/generate_test.go @@ -11,10 +11,13 @@ import ( "encoding/json" "fmt" "net/http" + "strings" "testing" "time" "git.zhangdeman.cn/zhangdeman/api-doc/define" + "git.zhangdeman.cn/zhangdeman/consts" + "github.com/getkin/kin-openapi/openapi3" ) func TestGenerate_AddApiDoc(t *testing.T) { @@ -35,7 +38,21 @@ func TestGenerate_AddApiDoc(t *testing.T) { Category *Category `json:"category,omitempty" description:"分类"` } docFlag := "demo" - DocManager.NewOpenApiDoc(docFlag) + DocManager.NewOpenApiDoc(docFlag, WithSecurity(&openapi3.SecuritySchemes{ + "Token-Auth": { + Extensions: nil, + Origin: nil, + Ref: "", + Value: &openapi3.SecurityScheme{ + Extensions: nil, + Origin: nil, + Type: "apiKey", + Description: "Token 身份认证", + Name: "token", + In: strings.ToLower(consts.RequestDataLocationHeader.String()), + }, + }, + })) DocManager.AddApiDoc(docFlag, define.UriConfig{ Path: "/a/b/c", RequestMethod: http.MethodGet, diff --git a/openapi/option.go b/openapi/option.go index 3603a99..918a208 100644 --- a/openapi/option.go +++ b/openapi/option.go @@ -7,7 +7,11 @@ // Date : 2026-01-06 22:48 package openapi -import "github.com/getkin/kin-openapi/openapi3" +import ( + "sort" + + "github.com/getkin/kin-openapi/openapi3" +) // OptionFunc 设置文档选项 type OptionFunc func(t *openapi3.T) @@ -31,3 +35,31 @@ func WithInfo(info *openapi3.Info) OptionFunc { t.Info = info } } + +// WithSecurity 设置安全策略 +func WithSecurity(securityTable *openapi3.SecuritySchemes) OptionFunc { + return func(t *openapi3.T) { + if nil == securityTable { + return + } + if nil == t.Components { + t.Components = &openapi3.Components{} + } + if nil == t.Components.SecuritySchemes { + t.Components.SecuritySchemes = make(map[string]*openapi3.SecuritySchemeRef) + } + if nil == t.Security { + t.Security = make([]openapi3.SecurityRequirement, 0) + } + keyList := make([]string, 0) + for k, v := range *securityTable { + keyList = append(keyList, k) + t.Components.SecuritySchemes[k] = v + } + // 保证生成结果有序 + sort.Strings(keyList) + for _, k := range keyList { + t.Security = append(t.Security, map[string][]string{k: {}}) + } + } +}