diff --git a/generate.go b/generate.go index 625553a..77f5f0f 100644 --- a/generate.go +++ b/generate.go @@ -326,6 +326,10 @@ func (g *Generate) ParseReadConfigParam(requestCfg *define.UriBaseConfig, baseRe baseReqCfg.Parameters = make([]*define.PathConfigParameter, 0) } for i := 0; i < inputType.NumField(); i++ { + if inputType.Field(i).Anonymous { + // 匿名字段, 直接对齐到当前的父级 + g.ParseReadConfigParam(requestCfg, baseReqCfg, inputType.Field(i).Type) + } propertyName := ParseStructField.GetParamName(inputType.Field(i)) if propertyName == "-" { continue @@ -342,6 +346,7 @@ func (g *Generate) ParseReadConfigParam(requestCfg *define.UriBaseConfig, baseRe if inputType.Field(i).Type.Kind() == reflect.Ptr { // 处理指针 if inputType.Field(i).Type.Elem().Kind() == reflect.Struct { + // 结构体指针 schemaNameNext := g.AddComponentsSchema("", propertyName, inputType.Field(i).Type.Elem()) baseReqCfg.Parameters = append(baseReqCfg.Parameters, &define.PathConfigParameter{ @@ -500,6 +505,11 @@ func (g *Generate) AddComponentsSchema(rootSchemaName string, pkgPath string, in // 结构体 if inputType.Kind() == reflect.Struct { for i := 0; i < inputType.NumField(); i++ { + if inputType.Field(i).Anonymous { + // 处理匿名字段 + g.handleAnonymousField(schemaName, inputType.Field(i)) + continue + } propertyName := ParseStructField.GetParamName(inputType.Field(i)) if propertyName == "-" { continue @@ -580,6 +590,42 @@ func (g *Generate) AddComponentsSchema(rootSchemaName string, pkgPath string, in return schemaName } +// handleAnonymousField 处理匿名字段 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 18:43 2025/2/17 +func (g *Generate) handleAnonymousField(schemaName string, field reflect.StructField) { + if !field.Anonymous { + // 不是匿名字段 + return + } + handleType := field.Type + if handleType.Kind() == reflect.Ptr { + handleType = handleType.Elem() + } + for i := 0; i < handleType.NumField(); i++ { + if handleType.Field(i).Anonymous { + // 地柜处理多层嵌套匿名字段 + g.handleAnonymousField(schemaName, handleType.Field(i)) + continue + } else { + if handleType.Kind() == reflect.Map || handleType.Kind() == reflect.Slice || handleType.Kind() == reflect.Array || handleType.Kind() == reflect.Struct || handleType.Kind() == reflect.Ptr { + g.AddComponentsSchema(schemaName, handleType.Field(i).Type.PkgPath(), handleType.Field(i).Type) + continue + } else { + g.docData.Components.Schemas[schemaName].Properties[ParseStructField.GetParamName(handleType.Field(i))] = &define.Property{ + Type: g.realBaseType2SwaggerType(handleType.Field(i).Type.String()), + Format: handleType.Field(i).Type.String(), + Enum: ValidateRule.Enum(handleType.Field(i)), + Default: ParseStructField.GetDefaultValue(handleType.Field(i)), + Description: ParseStructField.GetParamDesc(handleType.Field(i)), + } + } + } + } +} + // parseSliceItem 解析数组每一项 // // Author : go_developer@163.com<白茶清欢>