diff --git a/go.mod b/go.mod index 240354d..eb91469 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.0 toolchain go1.24.1 require ( - git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260105014807-92a7dc3bb97f + git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260106015608-42e268aea545 git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251225094759-09c64ba2541c github.com/gin-gonic/gin v1.11.0 diff --git a/go.sum b/go.sum index 2184c20..12c2f9f 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260105014807-92a7dc3bb97f h1:2p5yxwk472XxY93UTky2Xl2doTU1uqR7vcKara/Dt1E= git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260105014807-92a7dc3bb97f/go.mod h1:5p8CEKGBxi7qPtTXDI3HDmqKAfIm5i/aBWdrbkbdNjc= +git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260106015608-42e268aea545 h1:A6UeeMcSqAlHUmA2coWIuiCS/W9ySylhZMa/0HbFDcQ= +git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260106015608-42e268aea545/go.mod h1:5p8CEKGBxi7qPtTXDI3HDmqKAfIm5i/aBWdrbkbdNjc= git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42 h1:VjYrb4adud7FHeiYS9XA0B/tOaJjfRejzQAlwimrrDc= git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI= git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd h1:kTZOpR8iHx27sUufMWVYhDZx9Q4h80j7RWlaR8GIBiU= diff --git a/openapi/schema.go b/openapi/schema.go index 6f1dc90..783d326 100644 --- a/openapi/schema.go +++ b/openapi/schema.go @@ -28,11 +28,12 @@ type StructFieldInfo struct { Required bool `json:"required" dc:"是否必传"` Min *float64 `json:"min" dc:"最小值"` Max *float64 `json:"max" dc:"最大值"` - MinLength *uint64 `json:"min_length" dc:"最小长度"` - MaxLength *uint64 `json:"max_length" dc:"最大长度"` + MinLength *float64 `json:"min_length" dc:"最小长度"` + MaxLength *float64 `json:"max_length" dc:"最大长度"` Pattern string `json:"pattern" dc:"模式"` Format string `json:"format" dc:"格式"` - Enum []define.EnumValue `json:"enum" dc:"枚举值列表"` + Enum []any `json:"enum" dc:"枚举值列表"` + EnumDesc []define.EnumValue `json:"enum_desc" dc:"枚举值详细描述"` OmitEmpty bool `json:"omit_empty" dc:"是否可控"` } @@ -56,44 +57,18 @@ func ParseStructField(field reflect.StructField) *StructFieldInfo { // 解析示例值 info.Example = util.ParseStructFieldTag.GetExampleValue(field) // 解析验证规则 - if required := field.Tag.Get("required"); required == "true" { - info.Required = true - } - - if min := field.Tag.Get("min"); min != "" { - if val, err := strconv.ParseFloat(min, 64); err == nil { - info.Min = &val - } - } - - if max := field.Tag.Get("max"); max != "" { - if val, err := strconv.ParseFloat(max, 64); err == nil { - info.Max = &val - } - } - - if minLen := field.Tag.Get("minLength"); minLen != "" { - if val, err := strconv.ParseUint(minLen, 10, 64); err == nil { - info.MinLength = &val - } - } - - if maxLen := field.Tag.Get("maxLength"); maxLen != "" { - if val, err := strconv.ParseUint(maxLen, 10, 64); err == nil { - info.MaxLength = &val - } - } - - if pattern := field.Tag.Get("pattern"); pattern != "" { - info.Pattern = pattern - } - - if format := field.Tag.Get("format"); format != "" { - info.Format = format - } + validateRule := util.ParseValidateRule(field.Type, util.ParseStructFieldTag.GetValidateRule(field)) + info.Required = validateRule.Required + info.Min = validateRule.Min + info.Max = validateRule.Max + info.MinLength = validateRule.Min + info.MaxLength = validateRule.Max + info.Pattern = validateRule.Regexp + info.Format = field.Type.String() // 解析枚举值 - info.Enum = util.ParseStructFieldTag.EnumDescription(field) + info.Enum = validateRule.Oneof + info.EnumDesc = util.ParseStructFieldTag.EnumDescription(field) return info } diff --git a/util/validate_v10_parse.go b/util/validate_v10_parse.go index 852acab..65ca88e 100644 --- a/util/validate_v10_parse.go +++ b/util/validate_v10_parse.go @@ -13,6 +13,7 @@ import ( "git.zhangdeman.cn/zhangdeman/consts" utilPkg "git.zhangdeman.cn/zhangdeman/util" + "git.zhangdeman.cn/zhangdeman/wrapper/op_string" ) // ParseValidateRule 解析验证规则 @@ -59,24 +60,19 @@ func ParseValidateRule(dataType reflect.Type, ruleStr string) ValidateRule { continue } switch ruleType { - case consts.ValidateRuleLte.String(), consts.ValidateRuleGte.String(), consts.ValidateRuleGt.String(), consts.ValidateRuleLt.String(): // 数字取值范围 + case consts.ValidatorRuleLte.String(), consts.ValidatorRuleGte.String(), consts.ValidatorRuleGt.String(), consts.ValidatorRuleLt.String(), // 数字取值范围 + consts.ValidatorRuleCommonLen.String(), consts.ValidatorRuleCommonMin.String(), consts.ValidatorRuleCommonMax.String(): // 长度取值范围 var val float64 if err := utilPkg.ConvertAssign(&val, ruleValue); nil == err { switch ruleType { - case consts.ValidateRuleLte.String(): + case consts.ValidatorRuleLte.String(): rule.Lte = &val - case consts.ValidateRuleGte.String(): + case consts.ValidatorRuleGte.String(): rule.Gte = &val - case consts.ValidateRuleGt.String(): + case consts.ValidatorRuleGt.String(): rule.Gt = &val - case consts.ValidateRuleLt.String(): + case consts.ValidatorRuleLt.String(): rule.Lt = &val - } - } - case consts.ValidatorRuleCommonLen.String(), consts.ValidatorRuleCommonMin.String(), consts.ValidatorRuleCommonMax.String(): // 长度取值范围 - var val uint - if err := utilPkg.ConvertAssign(&val, ruleValue); nil == err { - switch ruleType { case consts.ValidatorRuleCommonLen.String(): rule.Len = &val case consts.ValidatorRuleCommonMin.String(): @@ -85,11 +81,29 @@ func ParseValidateRule(dataType reflect.Type, ruleStr string) ValidateRule { rule.Max = &val } } - case consts.ValidateRuleEq.String(): + case consts.ValidatorRuleEq.String(): rule.Eq = ruleValue - case consts.ValidateRuleNe.String(): + case consts.ValidatorRuleNe.String(): rule.Ne = ruleValue + case consts.ValidatorRuleRegexp.String(): + rule.Regexp = ruleValue case consts.ValidatorRuleCommonOneOf.String(): + rule.Oneof = make([]any, 0) + switch dataKind { + case reflect.String: + valList := strings.Split(ruleValue, " ") + for _, item := range valList { + rule.Oneof = append(rule.Oneof, item) + } + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint, + reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int, + reflect.Float32, reflect.Float64: + valList := op_string.ToBaseTypeSlice[float64](ruleValue, " ").Value + for _, item := range valList { + rule.Oneof = append(rule.Oneof, item) + } + default: + } } } return rule @@ -102,10 +116,11 @@ type ValidateRule struct { Gte *float64 `json:"gte" dc:"数字类型大于等于"` Lt *float64 `json:"lt" dc:"数字类型小于"` Gt *float64 `json:"gt" dc:"数字类型大于"` - Len *uint `json:"len" dc:"长度等于"` - Max *uint `json:"max" dc:"长度小于等于"` - Min *uint `json:"min" dc:"长度大于等于"` + Len *float64 `json:"len" dc:"长度等于"` + Max *float64 `json:"max" dc:"长度小于等于"` + Min *float64 `json:"min" dc:"长度大于等于"` Eq any `json:"eq" dc:"等于"` Ne any `json:"ne" dc:"不等于"` Oneof []any `json:"oneof" dc:"枚举值列表"` + Regexp string `json:"regexp" dc:"正则表达式"` }