From bcc527dccc980f24494197a1600a51844c9750dd 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, 22 Jan 2025 17:53:00 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E8=A7=84=E5=88=99=E7=9A=84=E6=9E=9A=E4=B8=BE=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_type.go | 18 +++++ validator.go | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+) create mode 100644 validator.go diff --git a/data_type.go b/data_type.go index ec737e0..6a89c01 100644 --- a/data_type.go +++ b/data_type.go @@ -194,3 +194,21 @@ func getDataTypeDesc(value DataType, description string) DataTypeDesc { Description: description, } } + +var ( + // DataTypeBaseNumber 基础的int类型 + DataTypeBaseNumber = []DataType{DataTypeInt, DataTypeUint, DataTypeFloat, DataTypeIntPtr, DataTypeUintPtr, DataTypeFloatPtr} + DataTypeBaseInt = []DataType{DataTypeInt, DataTypeIntPtr} + DataTypeBaseUint = []DataType{DataTypeUint, DataTypeUintPtr} + DataTypeBaseFloat = []DataType{DataTypeFloat, DataTypeFloatPtr} + DataTypeBaseString = []DataType{DataTypeString, DataTypeStringPtr} + DataTypeBaseBool = []DataType{DataTypeBool, DataTypeBoolPtr} +) + +func getMergeDataTypeList(dataTypeList ...[]DataType) []DataType { + res := []DataType{} + for _, dataTypeItemList := range dataTypeList { + res = append(res, dataTypeItemList...) + } + return res +} diff --git a/validator.go b/validator.go new file mode 100644 index 0000000..1e4182d --- /dev/null +++ b/validator.go @@ -0,0 +1,208 @@ +// Package consts ... +// +// Description : consts ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-01-22 16:08 +// @see: https://github.com/go-playground/validator/blob/master/README.md#strings +// @demo: https://www.cnblogs.com/zj420255586/p/13542395.html +package consts + +type ValidatorRule string // 验证规则 + +func (vr *ValidatorRule) String() string { + return string(*vr) +} + +func (vr *ValidatorRule) MarshalJSON() ([]byte, error) { + return []byte(vr.String()), nil +} + +// Config 验证规则的配置 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:10 2025/1/22 +func (vr *ValidatorRule) Config() ValidatorRuleConfig { + return ValidatorRuleSupportDataTypeTable[*vr] +} + +// IsSupportDataType 是否支持指定的数据类型 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:11 2025/1/22 +func (vr *ValidatorRule) IsSupportDataType(dataType DataType) bool { + dataTypeList := vr.Config().SupportDataTypeList + if len(dataTypeList) == 0 { + // 未配置则认为支持 + return true + } + for _, dataTypeItem := range dataTypeList { + if dataType.String() == dataTypeItem.String() { + return true + } + } + return false +} + +type ValidatorRuleConfig struct { + ValidatorRule ValidatorRule `json:"validator_rule"` // 验证规则 + Description string `json:"description"` // 规则描述 + SupportDataTypeList []DataType `json:"support_data_type_list"` // 支持的数据类型列表 +} + +// ValidatorRuleSupportDataTypeTable 验证规则支持的数据类型表 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:13 2025/1/22 +var ValidatorRuleSupportDataTypeTable = map[ValidatorRule]ValidatorRuleConfig{ + ValidatorRuleEqcsfield: { + ValidatorRule: ValidatorRuleEqcsfield, + Description: "跨结构体字段相等", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidatorRuleEqfield: { + ValidatorRule: ValidatorRuleEqfield, + Description: "同结构体字段相等", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidatorRuleFieldcontains: { + ValidatorRule: ValidatorRuleFieldcontains, + Description: "检查指定的字段值是否存在于字段中", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFieldexcludes: { + ValidatorRule: ValidatorRuleFieldexcludes, + Description: "检查指定的字段值是否不存在于字段中", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleGtcsfield: { + ValidatorRule: ValidatorRuleGtcsfield, + Description: "大于(跨结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleGtecsfield: { + ValidatorRule: ValidatorRuleGtecsfield, + Description: "大于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleGtfield: { + ValidatorRule: ValidatorRuleGtfield, + Description: "大于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleGtefield: { + ValidatorRule: ValidatorRuleGtefield, + Description: "大于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleLtcsfield: { + ValidatorRule: ValidatorRuleLtcsfield, + Description: "小于(跨结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleLtecsfield: { + ValidatorRule: ValidatorRuleLtecsfield, + Description: "小于等于(跨结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleLtfield: { + ValidatorRule: ValidatorRuleLtfield, + Description: "小于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleLtefield: { + ValidatorRule: ValidatorRuleLtefield, + Description: "小于等于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleNecsfield: { + ValidatorRule: ValidatorRuleNecsfield, + Description: "不等于(跨结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidatorRuleNefield: { + ValidatorRule: ValidatorRuleNefield, + Description: "不等于(同结构体)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidateRuleEq: { + ValidatorRule: ValidateRuleEq, + Description: "等于(严格校验)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidateRuleEqIgnoreCase: { + ValidatorRule: ValidateRuleEqIgnoreCase, + Description: "等于(忽略大小写)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidateRuleGt: { + ValidatorRule: ValidateRuleGt, + Description: "大于", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidateRuleGte: { + ValidatorRule: ValidateRuleGte, + Description: "大于等于", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidateRuleLt: { + ValidatorRule: ValidateRuleLt, + Description: "小于", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidateRuleLte: { + ValidatorRule: ValidateRuleLte, + Description: "小于等于", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidateRuleNe: { + ValidatorRule: ValidateRuleNe, + Description: "不等于(严格判断)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, + ValidateRuleNeIgnoreCase: { + ValidatorRule: ValidateRuleNeIgnoreCase, + Description: "不等于(忽略大小写)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + }, +} + +const ( + // ValidatorRuleEqcsfield .....Fields .............. + ValidatorRuleEqcsfield ValidatorRule = "eqcsfield" // 跨结构体字段相等 + ValidatorRuleEqfield ValidatorRule = "eqfield" // 同结构体字段相等 + ValidatorRuleFieldcontains ValidatorRule = "fieldcontains" // 检查指定的字段值是否存在于字段中 + ValidatorRuleFieldexcludes ValidatorRule = "fieldexcludes" // 检查指定的字段值是否存在于字段中 + ValidatorRuleGtcsfield ValidatorRule = "gtcsfield" // 大于(跨结构体) + ValidatorRuleGtecsfield ValidatorRule = "gtecsfield" // 大于等于(跨结构体) + ValidatorRuleGtfield ValidatorRule = "gtfield" // 大于(同结构体) + ValidatorRuleGtefield ValidatorRule = "gtefield" // 大于等于(同结构体) + ValidatorRuleLtcsfield ValidatorRule = "ltcsfield" // 小于(跨结构体) + ValidatorRuleLtecsfield ValidatorRule = "ltecsfield" // 小于等于(跨结构体) + ValidatorRuleLtfield ValidatorRule = "ltfield" // 小于(同结构体) + ValidatorRuleLtefield ValidatorRule = "ltefield" // 小于等于(同结构体) + ValidatorRuleNecsfield ValidatorRule = "necsfield" // 不等于(跨结构体) + ValidatorRuleNefield ValidatorRule = "nefield" // 不等于(同结构体) + + // ValidateRuleEq Comparisons .................... + ValidateRuleEq ValidatorRule = "eq" // 相等(严格判断) + ValidateRuleEqIgnoreCase ValidatorRule = "eq_ignore_case" // 相等(忽略大小写) + ValidateRuleGt ValidatorRule = "gt" // 大于 + ValidateRuleGte ValidatorRule = "gte" // 大于等于 + ValidateRuleLt ValidatorRule = "lt" // 小于 + ValidateRuleLte ValidatorRule = "lte" // 小于等于 + ValidateRuleNe ValidatorRule = "ne" // 不相等(严格判断) + ValidateRuleNeIgnoreCase ValidatorRule = "ne_ignore_case" // 不相等(忽略大小写) + + // ValidatorCommonDir ............others + ValidatorCommonDir ValidatorRule = "dir" // 文件夹存在 + ValidatorCommonDirPath ValidatorRule = "dirpath" // 文件夹路径 + ValidatorCommonFile ValidatorRule = "file" // 文件存在 + ValidatorCommonFilepath ValidatorRule = "filepath" // 文件路径 + ValidatorCommonImage ValidatorRule = "image" // 图像 + ValidatorCommonIsDefault ValidatorRule = "isdefault" // 是否默认值 +) From 18ceef4276331c680990c5516a866e7eb0154d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Thu, 23 Jan 2025 18:40:04 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E8=A7=84=E5=88=99=E6=9E=9A=E4=B8=BE=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- validator.go | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/validator.go b/validator.go index 1e4182d..35c8460 100644 --- a/validator.go +++ b/validator.go @@ -198,11 +198,38 @@ const ( ValidateRuleNe ValidatorRule = "ne" // 不相等(严格判断) ValidateRuleNeIgnoreCase ValidatorRule = "ne_ignore_case" // 不相等(忽略大小写) - // ValidatorCommonDir ............others - ValidatorCommonDir ValidatorRule = "dir" // 文件夹存在 - ValidatorCommonDirPath ValidatorRule = "dirpath" // 文件夹路径 - ValidatorCommonFile ValidatorRule = "file" // 文件存在 - ValidatorCommonFilepath ValidatorRule = "filepath" // 文件路径 - ValidatorCommonImage ValidatorRule = "image" // 图像 - ValidatorCommonIsDefault ValidatorRule = "isdefault" // 是否默认值 + // ValidatorRuleCommonDir ............others + ValidatorRuleCommonDir ValidatorRule = "dir" // 文件夹存在 + ValidatorRuleCommonDirPath ValidatorRule = "dirpath" // 文件夹路径 + ValidatorRuleCommonFile ValidatorRule = "file" // 文件存在 + ValidatorRuleCommonFilepath ValidatorRule = "filepath" // 文件路径 + ValidatorRuleCommonImage ValidatorRule = "image" // 图像 + ValidatorRuleCommonIsDefault ValidatorRule = "isdefault" // 是否默认值 + ValidatorRuleCommonLen ValidatorRule = "len" // 长度 + ValidatorRuleCommonMax ValidatorRule = "max" // 最大值 + ValidatorRuleCommonMin ValidatorRule = "min" // 最小值 + ValidatorRuleCommonOneOf ValidatorRule = "oneof" // 枚举值, 多个空格分隔 + ValidatorRuleCommonRequired ValidatorRule = "required" // 必传 + ValidatorRuleCommonRequiredIf ValidatorRule = "required_if" // + ValidatorRuleCommonRequiredUnless ValidatorRule = "required_unless" // + ValidatorRuleCommonRequiredWith ValidatorRule = "required_with" // + ValidatorRuleCommonRequiredWithAll ValidatorRule = "required_with_all" // + ValidatorRuleCommonRequiredWithout ValidatorRule = "required_without" // + ValidatorRuleCommonRequiredWithoutAll ValidatorRule = "required_without_all" // + ValidatorRuleCommonExcludedIf ValidatorRule = "excluded_if" // + ValidatorRuleCommonExcludedUnless ValidatorRule = "excluded_unless" // + ValidatorRuleCommonExcludedWith ValidatorRule = "excluded_with" // + ValidatorRuleCommonExcludedWithAll ValidatorRule = "excluded_with_all" // + ValidatorRuleCommonExcludedWithout ValidatorRule = "excluded_without" // + ValidatorRuleCommonExcludedWithoutAll ValidatorRule = "excluded_without_all" // + ValidatorRuleCommonUnique ValidatorRule = "unique" // + + // ValidatorRuleFormatterCron ............. formatter + ValidatorRuleFormatterCron ValidatorRule = "cron" // cron表达式 + ValidatorRuleFormatterEmail ValidatorRule = "email" // 邮件地址 + ValidatorRuleFormatterJson ValidatorRule = "json" // json格式 + ValidatorRuleFormatterJwt ValidatorRule = "jwt" // JSON Web Token (JWT) + ValidatorRuleFormatterLatitude ValidatorRule = "latitude" // 纬度 + ValidatorRuleFormatterLongitude ValidatorRule = "longitude" // 经度 + ValidatorRuleFormatterTimezone ValidatorRule = "timezone" // 时区 ) From bd952701305727f25a59bc39392c1ef915daa4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 24 Jan 2025 12:35:16 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B8=B8=E9=87=8F?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- validator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validator.go b/validator.go index 35c8460..1659271 100644 --- a/validator.go +++ b/validator.go @@ -171,7 +171,7 @@ var ValidatorRuleSupportDataTypeTable = map[ValidatorRule]ValidatorRuleConfig{ }, } -const ( +var ( // ValidatorRuleEqcsfield .....Fields .............. ValidatorRuleEqcsfield ValidatorRule = "eqcsfield" // 跨结构体字段相等 ValidatorRuleEqfield ValidatorRule = "eqfield" // 同结构体字段相等 From 33c60bcd2d3c41a1eeeb92f5c878069b0364da75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 24 Jan 2025 15:05:46 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E5=AE=8C=E5=96=84validator=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E5=80=BC=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_type.go | 61 ++++++++++-- validator.go | 275 ++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 282 insertions(+), 54 deletions(-) diff --git a/data_type.go b/data_type.go index 6a89c01..2c5d428 100644 --- a/data_type.go +++ b/data_type.go @@ -197,12 +197,61 @@ func getDataTypeDesc(value DataType, description string) DataTypeDesc { var ( // DataTypeBaseNumber 基础的int类型 - DataTypeBaseNumber = []DataType{DataTypeInt, DataTypeUint, DataTypeFloat, DataTypeIntPtr, DataTypeUintPtr, DataTypeFloatPtr} - DataTypeBaseInt = []DataType{DataTypeInt, DataTypeIntPtr} - DataTypeBaseUint = []DataType{DataTypeUint, DataTypeUintPtr} - DataTypeBaseFloat = []DataType{DataTypeFloat, DataTypeFloatPtr} - DataTypeBaseString = []DataType{DataTypeString, DataTypeStringPtr} - DataTypeBaseBool = []DataType{DataTypeBool, DataTypeBoolPtr} + DataTypeBaseNumber = []DataType{DataTypeInt, DataTypeUint, DataTypeFloat, DataTypeIntPtr, DataTypeUintPtr, DataTypeFloatPtr} + DataTypeBaseInt = []DataType{DataTypeInt, DataTypeIntPtr} + DataTypeBaseUint = []DataType{DataTypeUint, DataTypeUintPtr} + DataTypeBaseFloat = []DataType{DataTypeFloat, DataTypeFloatPtr} + DataTypeBaseString = []DataType{DataTypeString, DataTypeStringPtr} + DataTypeBaseBool = []DataType{DataTypeBool, DataTypeBoolPtr} + DataTypeSliceMarshal = []DataType{ + DataTypeSliceAnyWithMarshal, + DataTypeSliceIntWithMarshal, + DataTypeSliceUintWithMarshal, + DataTypeSliceFloatWithMarshal, + DataTypeSliceBoolWithMarshal, + DataTypeSliceMapAnyAnyWithMarshal, + DataTypeSliceMapStringAnyWithMarshal, + DataTypeSliceAnyWithMarshal, + DataTypeSliceSliceWithMarshal, + } + DataTypeSliceSplit = []DataType{ + DataTypeSliceIntWithChar, + DataTypeSliceUintWithChar, + DataTypeSliceFloatWithChar, + DataTypeSliceBoolWithChar, + DataTypeSliceStringWithChar, + } + DataTypeSlice = []DataType{ + DataTypeSliceString, + DataTypeSliceAny, + DataTypeSliceBool, + DataTypeSliceMapStringAny, + DataTypeSliceInt, + DataTypeSliceUint, + DataTypeSliceFloat, + DataTypeSliceMapAnyAny, + DataTypeSliceSlice, + } + DataTypeMap = []DataType{ + DataTypeMapStrAny, + DataTypeMapAnyAny, + DataTypeMapStrBool, + DataTypeMapStrInt, + DataTypeMapStrFloat, + DataTypeMapStrUint, + DataTypeMapStrSlice, + DataTypeMapStrStr, + } + DataTypeMapMarshal = []DataType{ + DataTypeMapStrAnyWithMarshal, + DataTypeMapAnyAnyWithMarshal, + DataTypeMapStrBoolWithMarshal, + DataTypeMapStrIntWithMarshal, + DataTypeMapStrFloatWithMarshal, + DataTypeMapStrUintWithMarshal, + DataTypeMapStrSliceWithMarshal, + DataTypeMapStrStrWithMarshal, + } ) func getMergeDataTypeList(dataTypeList ...[]DataType) []DataType { diff --git a/validator.go b/validator.go index 1659271..a067bd4 100644 --- a/validator.go +++ b/validator.go @@ -62,22 +62,22 @@ var ValidatorRuleSupportDataTypeTable = map[ValidatorRule]ValidatorRuleConfig{ ValidatorRuleEqcsfield: { ValidatorRule: ValidatorRuleEqcsfield, Description: "跨结构体字段相等", - SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), }, ValidatorRuleEqfield: { ValidatorRule: ValidatorRuleEqfield, Description: "同结构体字段相等", - SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), }, ValidatorRuleFieldcontains: { ValidatorRule: ValidatorRuleFieldcontains, Description: "检查指定的字段值是否存在于字段中", - SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), }, ValidatorRuleFieldexcludes: { ValidatorRule: ValidatorRuleFieldexcludes, Description: "检查指定的字段值是否不存在于字段中", - SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), }, ValidatorRuleGtcsfield: { ValidatorRule: ValidatorRuleGtcsfield, @@ -122,22 +122,22 @@ var ValidatorRuleSupportDataTypeTable = map[ValidatorRule]ValidatorRuleConfig{ ValidatorRuleNecsfield: { ValidatorRule: ValidatorRuleNecsfield, Description: "不等于(跨结构体)", - SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), }, ValidatorRuleNefield: { ValidatorRule: ValidatorRuleNefield, Description: "不等于(同结构体)", - SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), }, ValidateRuleEq: { ValidatorRule: ValidateRuleEq, Description: "等于(严格校验)", - SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), }, ValidateRuleEqIgnoreCase: { ValidatorRule: ValidateRuleEqIgnoreCase, Description: "等于(忽略大小写)", - SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), }, ValidateRuleGt: { ValidatorRule: ValidateRuleGt, @@ -162,41 +162,216 @@ var ValidatorRuleSupportDataTypeTable = map[ValidatorRule]ValidatorRuleConfig{ ValidateRuleNe: { ValidatorRule: ValidateRuleNe, Description: "不等于(严格判断)", - SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), }, ValidateRuleNeIgnoreCase: { ValidatorRule: ValidateRuleNeIgnoreCase, Description: "不等于(忽略大小写)", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + }, + ValidatorRuleCommonDir: { + ValidatorRule: ValidatorRuleCommonDir, + Description: "文件夹存在", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + }, + ValidatorRuleCommonDirPath: { + ValidatorRule: ValidatorRuleCommonDirPath, + Description: "文件夹路径存在", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + }, + ValidatorRuleCommonFile: { + ValidatorRule: ValidatorRuleCommonFile, + Description: "文件存在", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + }, + ValidatorRuleCommonFilepath: { + ValidatorRule: ValidatorRuleCommonFilepath, + Description: "文件路径存在", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + }, + ValidatorRuleCommonImage: { + ValidatorRule: ValidatorRuleCommonImage, + Description: "是否图像资源", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + }, + ValidatorRuleCommonIsDefault: { + ValidatorRule: ValidatorRuleCommonIsDefault, + Description: "是否对应类型默认值", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonLen: { + ValidatorRule: ValidatorRuleCommonLen, + Description: "数据长度", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal, DataTypeSlice, DataTypeMap), // 所有类型均支持 + }, + ValidatorRuleCommonMax: { + ValidatorRule: ValidatorRuleCommonMax, + Description: "最大值", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleCommonMin: { + ValidatorRule: ValidatorRuleCommonMin, + Description: "最小值", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleCommonOneOf: { + ValidatorRule: ValidatorRuleCommonOneOf, + Description: "枚举值", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), }, + ValidatorRuleCommonRequired: { + ValidatorRule: ValidatorRuleCommonRequired, + Description: "必传校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonRequiredIf: { + ValidatorRule: ValidatorRuleCommonRequiredIf, + Description: "当指定字段等于给定值时, 必传校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonRequiredUnless: { + ValidatorRule: ValidatorRuleCommonRequiredUnless, + Description: "当指定字段不等于给定值时, 必传校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonRequiredWith: { + ValidatorRule: ValidatorRuleCommonRequiredWith, + Description: "当任意一个指定字段不为零值时, 必传校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonRequiredWithAll: { + ValidatorRule: ValidatorRuleCommonRequiredWithAll, + Description: "当全部指定字段不为零值时, 必传校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonRequiredWithout: { + ValidatorRule: ValidatorRuleCommonRequiredWithout, + Description: "当任意一个字段为空时, 必传校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonRequiredWithoutAll: { + ValidatorRule: ValidatorRuleCommonRequiredWithoutAll, + Description: "当全部字段为空时, 必传校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonExcludedIf: { + ValidatorRule: ValidatorRuleCommonExcludedIf, + Description: "当指定字段等于给定值时,排除校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonExcludedUnless: { + ValidatorRule: ValidatorRuleCommonExcludedUnless, + Description: "当指定字段等于给定值时,排除校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonExcludedWith: { + ValidatorRule: ValidatorRuleCommonExcludedWith, + Description: "当全部指定字段不为零值时,排除校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonExcludedWithAll: { + ValidatorRule: ValidatorRuleCommonExcludedWithAll, + Description: "当全部指定字段不为零值时,排除校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonExcludedWithout: { + ValidatorRule: ValidatorRuleCommonExcludedWithout, + Description: "当任意一个指定字段不存在时,排除校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonExcludedWithoutAll: { + ValidatorRule: ValidatorRuleCommonExcludedWithoutAll, + Description: "当全部指定字段不存在时,排除校验", + SupportDataTypeList: nil, // 所有类型均支持 + }, + ValidatorRuleCommonUnique: { + ValidatorRule: ValidatorRuleCommonUnique, + Description: "是否唯一, 用于切片验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeSlice), // 所有类型均支持 + }, + ValidatorRuleFormatterCron: { + ValidatorRule: ValidatorRuleFormatterCron, + Description: "cron表达式验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFormatterEmail: { + ValidatorRule: ValidatorRuleFormatterEmail, + Description: "邮箱地址验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFormatterJson: { + ValidatorRule: ValidatorRuleFormatterJson, + Description: "json格式验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFormatterJwt: { + ValidatorRule: ValidatorRuleFormatterJson, + Description: "JWT(JSON Web Token)验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFormatterLatitude: { + ValidatorRule: ValidatorRuleFormatterLatitude, + Description: "纬度验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleFormatterLongitude: { + ValidatorRule: ValidatorRuleFormatterLongitude, + Description: "经度验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + }, + ValidatorRuleFormatterTimezone: { + ValidatorRule: ValidatorRuleFormatterLongitude, + Description: "时区验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFormatterUrl: { + ValidatorRule: ValidatorRuleFormatterUrl, + Description: "url验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFormatterUri: { + ValidatorRule: ValidatorRuleFormatterUrl, + Description: "uri验证", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFormatterLowercase: { + ValidatorRule: ValidatorRuleFormatterLowercase, + Description: "仅包含小写字符", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, + ValidatorRuleFormatterUppercase: { + ValidatorRule: ValidatorRuleFormatterUppercase, + Description: "仅包含大写字符", + SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + }, } var ( // ValidatorRuleEqcsfield .....Fields .............. - ValidatorRuleEqcsfield ValidatorRule = "eqcsfield" // 跨结构体字段相等 - ValidatorRuleEqfield ValidatorRule = "eqfield" // 同结构体字段相等 - ValidatorRuleFieldcontains ValidatorRule = "fieldcontains" // 检查指定的字段值是否存在于字段中 - ValidatorRuleFieldexcludes ValidatorRule = "fieldexcludes" // 检查指定的字段值是否存在于字段中 - ValidatorRuleGtcsfield ValidatorRule = "gtcsfield" // 大于(跨结构体) - ValidatorRuleGtecsfield ValidatorRule = "gtecsfield" // 大于等于(跨结构体) - ValidatorRuleGtfield ValidatorRule = "gtfield" // 大于(同结构体) - ValidatorRuleGtefield ValidatorRule = "gtefield" // 大于等于(同结构体) - ValidatorRuleLtcsfield ValidatorRule = "ltcsfield" // 小于(跨结构体) - ValidatorRuleLtecsfield ValidatorRule = "ltecsfield" // 小于等于(跨结构体) - ValidatorRuleLtfield ValidatorRule = "ltfield" // 小于(同结构体) - ValidatorRuleLtefield ValidatorRule = "ltefield" // 小于等于(同结构体) - ValidatorRuleNecsfield ValidatorRule = "necsfield" // 不等于(跨结构体) - ValidatorRuleNefield ValidatorRule = "nefield" // 不等于(同结构体) + ValidatorRuleEqcsfield ValidatorRule = "eqcsfield" // 跨结构体字段相等 eqcsfield={{struct.field}} + ValidatorRuleEqfield ValidatorRule = "eqfield" // 同结构体字段相等 eqfield={{struct.field}} + ValidatorRuleFieldcontains ValidatorRule = "fieldcontains" // 检查指定的字段值是否存在于字段中 fieldcontains={{struct.field}} + ValidatorRuleFieldexcludes ValidatorRule = "fieldexcludes" // 检查指定的字段值是否存在于字段中 fieldexcludes={{struct.field}} + ValidatorRuleGtcsfield ValidatorRule = "gtcsfield" // 大于(跨结构体) gtcsfield={{struct.field}} + ValidatorRuleGtecsfield ValidatorRule = "gtecsfield" // 大于等于(跨结构体) gtecsfield={{struct.field}} + ValidatorRuleGtfield ValidatorRule = "gtfield" // 大于(同结构体) gtfield={{struct.field}} + ValidatorRuleGtefield ValidatorRule = "gtefield" // 大于等于(同结构体) gtefield={{struct.field}} + ValidatorRuleLtcsfield ValidatorRule = "ltcsfield" // 小于(跨结构体) ltcsfield={{struct.field}} + ValidatorRuleLtecsfield ValidatorRule = "ltecsfield" // 小于等于(跨结构体) ltecsfield={{struct.field}} + ValidatorRuleLtfield ValidatorRule = "ltfield" // 小于(同结构体) ltfield={{struct.field}} + ValidatorRuleLtefield ValidatorRule = "ltefield" // 小于等于(同结构体) ltefield={{struct.field}} + ValidatorRuleNecsfield ValidatorRule = "necsfield" // 不等于(跨结构体) necsfield={{struct.field}} + ValidatorRuleNefield ValidatorRule = "nefield" // 不等于(同结构体) nefield={{struct.field}} // ValidateRuleEq Comparisons .................... - ValidateRuleEq ValidatorRule = "eq" // 相等(严格判断) - ValidateRuleEqIgnoreCase ValidatorRule = "eq_ignore_case" // 相等(忽略大小写) - ValidateRuleGt ValidatorRule = "gt" // 大于 - ValidateRuleGte ValidatorRule = "gte" // 大于等于 - ValidateRuleLt ValidatorRule = "lt" // 小于 - ValidateRuleLte ValidatorRule = "lte" // 小于等于 - ValidateRuleNe ValidatorRule = "ne" // 不相等(严格判断) - ValidateRuleNeIgnoreCase ValidatorRule = "ne_ignore_case" // 不相等(忽略大小写) + ValidateRuleEq ValidatorRule = "eq" // 相等(严格判断) eq={{any_value}} + ValidateRuleEqIgnoreCase ValidatorRule = "eq_ignore_case" // 相等(忽略大小写) eq_ignore_case={{any_value}} + ValidateRuleGt ValidatorRule = "gt" // 大于 gt={{number_value}} + ValidateRuleGte ValidatorRule = "gte" // 大于等于 gte={{number_value}} + ValidateRuleLt ValidatorRule = "lt" // 小于 lt={{number_value}} + ValidateRuleLte ValidatorRule = "lte" // 小于等于 lte={{number_value}} + ValidateRuleNe ValidatorRule = "ne" // 不相等(严格判断) ne={{any_value}} + ValidateRuleNeIgnoreCase ValidatorRule = "ne_ignore_case" // 不相等(忽略大小写) ne_ignore_case={{any_value}} // ValidatorRuleCommonDir ............others ValidatorRuleCommonDir ValidatorRule = "dir" // 文件夹存在 @@ -205,24 +380,24 @@ var ( ValidatorRuleCommonFilepath ValidatorRule = "filepath" // 文件路径 ValidatorRuleCommonImage ValidatorRule = "image" // 图像 ValidatorRuleCommonIsDefault ValidatorRule = "isdefault" // 是否默认值 - ValidatorRuleCommonLen ValidatorRule = "len" // 长度 - ValidatorRuleCommonMax ValidatorRule = "max" // 最大值 - ValidatorRuleCommonMin ValidatorRule = "min" // 最小值 - ValidatorRuleCommonOneOf ValidatorRule = "oneof" // 枚举值, 多个空格分隔 + ValidatorRuleCommonLen ValidatorRule = "len" // 长度 len={{uint_value}} + ValidatorRuleCommonMax ValidatorRule = "max" // 最大值 max={{int_value}} + ValidatorRuleCommonMin ValidatorRule = "min" // 最小值 min={{int_value}} + ValidatorRuleCommonOneOf ValidatorRule = "oneof" // 枚举值, 多个空格分隔 oneof={{enum1}} {{enum2}} {{enum....}} ValidatorRuleCommonRequired ValidatorRule = "required" // 必传 - ValidatorRuleCommonRequiredIf ValidatorRule = "required_if" // - ValidatorRuleCommonRequiredUnless ValidatorRule = "required_unless" // - ValidatorRuleCommonRequiredWith ValidatorRule = "required_with" // - ValidatorRuleCommonRequiredWithAll ValidatorRule = "required_with_all" // - ValidatorRuleCommonRequiredWithout ValidatorRule = "required_without" // - ValidatorRuleCommonRequiredWithoutAll ValidatorRule = "required_without_all" // - ValidatorRuleCommonExcludedIf ValidatorRule = "excluded_if" // - ValidatorRuleCommonExcludedUnless ValidatorRule = "excluded_unless" // - ValidatorRuleCommonExcludedWith ValidatorRule = "excluded_with" // - ValidatorRuleCommonExcludedWithAll ValidatorRule = "excluded_with_all" // - ValidatorRuleCommonExcludedWithout ValidatorRule = "excluded_without" // - ValidatorRuleCommonExcludedWithoutAll ValidatorRule = "excluded_without_all" // - ValidatorRuleCommonUnique ValidatorRule = "unique" // + ValidatorRuleCommonRequiredIf ValidatorRule = "required_if" // 当指定字段等于给定值时,校验必传 required_if={{check_field}} {{check_field_value}} {{check_field...}} {{check_field_value...}} + ValidatorRuleCommonRequiredUnless ValidatorRule = "required_unless" // 当指定字段不等于给定值时,校验必传 required_if={{check_field}} {{check_field_value}} {{check_field...}} {{check_field_value...}} + ValidatorRuleCommonRequiredWith ValidatorRule = "required_with" // 当任意一个指定字段不为零值时, 校验必传 required_with={{Field1}} {{Field2}} {{Field...}} + ValidatorRuleCommonRequiredWithAll ValidatorRule = "required_with_all" // 当全部指定字段不为零值时, 校验必传 required_with={{Field1}} {{Field2}} {{Field...}} + ValidatorRuleCommonRequiredWithout ValidatorRule = "required_without" // 任意一个字段为空时,必传校验 required_without={{Field1}} {{Field2}} {{Field...}} + ValidatorRuleCommonRequiredWithoutAll ValidatorRule = "required_without_all" // 全部字段为空时,必传校验 required_without_all={{Field1}} {{Field2}} {{Field...}} + ValidatorRuleCommonExcludedIf ValidatorRule = "excluded_if" // 当指定字段等于给定值时,排除校验 excluded_if={{check_field}} {{check_field_value}} {{check_field...}} {{check_field_value...}} + ValidatorRuleCommonExcludedUnless ValidatorRule = "excluded_unless" // 当指定字段不等于给定值时,排除校验 excluded_if={{check_field}} {{check_field_value}} {{check_field...}} {{check_field_value...}} + ValidatorRuleCommonExcludedWith ValidatorRule = "excluded_with" // 当任意一个指定字段不为零值时,排除校验 excluded_with={{Field1}} {{Field2}} {{Field...}} + ValidatorRuleCommonExcludedWithAll ValidatorRule = "excluded_with_all" // 当全部指定字段不为零值时,排除校验 excluded_with_all={{Field1}} {{Field2}} {{Field...}} + ValidatorRuleCommonExcludedWithout ValidatorRule = "excluded_without" // 当任意一个指定字段不存在时,排除校验 excluded_without={{Field1}} {{Field2}} {{Field...}} + ValidatorRuleCommonExcludedWithoutAll ValidatorRule = "excluded_without_all" // 当q廍指定字段不存在时,排除校验 excluded_without-all={{Field1}} {{Field2}} {{Field...}} + ValidatorRuleCommonUnique ValidatorRule = "unique" // 数据唯一校验 // ValidatorRuleFormatterCron ............. formatter ValidatorRuleFormatterCron ValidatorRule = "cron" // cron表达式 @@ -232,4 +407,8 @@ var ( ValidatorRuleFormatterLatitude ValidatorRule = "latitude" // 纬度 ValidatorRuleFormatterLongitude ValidatorRule = "longitude" // 经度 ValidatorRuleFormatterTimezone ValidatorRule = "timezone" // 时区 + ValidatorRuleFormatterUrl ValidatorRule = "url" // url + ValidatorRuleFormatterUri ValidatorRule = "uri" // uri + ValidatorRuleFormatterLowercase ValidatorRule = "lowercase" // 仅包含小写字符 + ValidatorRuleFormatterUppercase ValidatorRule = "uppercase" // 仅包含大写字符 ) From 18dd06b515873eb4577fd90abe0b3521dec3ba1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 24 Jan 2025 15:20:35 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E8=A7=84=E5=88=99=E9=85=8D=E7=BD=AE,=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- validator.go | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 125 insertions(+), 2 deletions(-) diff --git a/validator.go b/validator.go index a067bd4..d6363a5 100644 --- a/validator.go +++ b/validator.go @@ -51,6 +51,10 @@ type ValidatorRuleConfig struct { ValidatorRule ValidatorRule `json:"validator_rule"` // 验证规则 Description string `json:"description"` // 规则描述 SupportDataTypeList []DataType `json:"support_data_type_list"` // 支持的数据类型列表 + MinParamCnt int `json:"min_param_cnt"` // 最小参数数量(闭区间) + MaxParamCnt int `json:"max_param_cnt"` // 最大参数数量(闭区间) + ParamCntMustEven bool `json:"param_cnt_must_even"` // 参数数量必须是偶数 + WithoutParam bool `json:"without_param"` // 没有参数, 此值为 true, 忽略 MinParamCnt / MaxParamCnt / ParamCntMustEven } // ValidatorRuleSupportDataTypeTable 验证规则支持的数据类型表 @@ -63,196 +67,291 @@ var ValidatorRuleSupportDataTypeTable = map[ValidatorRule]ValidatorRuleConfig{ ValidatorRule: ValidatorRuleEqcsfield, Description: "跨结构体字段相等", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleEqfield: { ValidatorRule: ValidatorRuleEqfield, Description: "同结构体字段相等", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleFieldcontains: { ValidatorRule: ValidatorRuleFieldcontains, Description: "检查指定的字段值是否存在于字段中", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 0, + ParamCntMustEven: false, }, ValidatorRuleFieldexcludes: { ValidatorRule: ValidatorRuleFieldexcludes, Description: "检查指定的字段值是否不存在于字段中", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 0, + ParamCntMustEven: false, }, ValidatorRuleGtcsfield: { ValidatorRule: ValidatorRuleGtcsfield, Description: "大于(跨结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleGtecsfield: { ValidatorRule: ValidatorRuleGtecsfield, Description: "大于(同结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleGtfield: { ValidatorRule: ValidatorRuleGtfield, Description: "大于(同结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleGtefield: { ValidatorRule: ValidatorRuleGtefield, Description: "大于(同结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleLtcsfield: { ValidatorRule: ValidatorRuleLtcsfield, Description: "小于(跨结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleLtecsfield: { ValidatorRule: ValidatorRuleLtecsfield, Description: "小于等于(跨结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleLtfield: { ValidatorRule: ValidatorRuleLtfield, Description: "小于(同结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleLtefield: { ValidatorRule: ValidatorRuleLtefield, Description: "小于等于(同结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleNecsfield: { ValidatorRule: ValidatorRuleNecsfield, Description: "不等于(跨结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidatorRuleNefield: { ValidatorRule: ValidatorRuleNefield, Description: "不等于(同结构体)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidateRuleEq: { ValidatorRule: ValidateRuleEq, Description: "等于(严格校验)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidateRuleEqIgnoreCase: { ValidatorRule: ValidateRuleEqIgnoreCase, Description: "等于(忽略大小写)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 1, + ParamCntMustEven: false, }, ValidateRuleGt: { ValidatorRule: ValidateRuleGt, Description: "大于", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 0, + ParamCntMustEven: false, }, ValidateRuleGte: { ValidatorRule: ValidateRuleGte, Description: "大于等于", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 0, + ParamCntMustEven: false, }, ValidateRuleLt: { ValidatorRule: ValidateRuleLt, Description: "小于", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 0, + ParamCntMustEven: false, }, ValidateRuleLte: { ValidatorRule: ValidateRuleLte, Description: "小于等于", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 0, + ParamCntMustEven: false, }, ValidateRuleNe: { ValidatorRule: ValidateRuleNe, Description: "不等于(严格判断)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 0, + ParamCntMustEven: false, }, ValidateRuleNeIgnoreCase: { ValidatorRule: ValidateRuleNeIgnoreCase, Description: "不等于(忽略大小写)", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + MinParamCnt: 1, + MaxParamCnt: 0, + ParamCntMustEven: false, }, ValidatorRuleCommonDir: { ValidatorRule: ValidatorRuleCommonDir, Description: "文件夹存在", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + WithoutParam: true, }, ValidatorRuleCommonDirPath: { ValidatorRule: ValidatorRuleCommonDirPath, Description: "文件夹路径存在", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + WithoutParam: true, }, ValidatorRuleCommonFile: { ValidatorRule: ValidatorRuleCommonFile, Description: "文件存在", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + WithoutParam: true, }, ValidatorRuleCommonFilepath: { ValidatorRule: ValidatorRuleCommonFilepath, Description: "文件路径存在", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + WithoutParam: true, }, ValidatorRuleCommonImage: { ValidatorRule: ValidatorRuleCommonImage, Description: "是否图像资源", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal), + WithoutParam: true, }, ValidatorRuleCommonIsDefault: { ValidatorRule: ValidatorRuleCommonIsDefault, Description: "是否对应类型默认值", SupportDataTypeList: nil, // 所有类型均支持 + WithoutParam: true, }, ValidatorRuleCommonLen: { ValidatorRule: ValidatorRuleCommonLen, Description: "数据长度", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString, DataTypeSliceMarshal, DataTypeSliceSplit, DataTypeMapMarshal, DataTypeSlice, DataTypeMap), // 所有类型均支持 + MinParamCnt: 1, + MaxParamCnt: 1, }, ValidatorRuleCommonMax: { ValidatorRule: ValidatorRuleCommonMax, Description: "最大值", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, }, ValidatorRuleCommonMin: { ValidatorRule: ValidatorRuleCommonMin, Description: "最小值", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + MinParamCnt: 1, + MaxParamCnt: 1, }, ValidatorRuleCommonOneOf: { ValidatorRule: ValidatorRuleCommonOneOf, Description: "枚举值", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber, DataTypeBaseString, DataTypeBaseBool), + MinParamCnt: 1, + MaxParamCnt: 0, }, ValidatorRuleCommonRequired: { ValidatorRule: ValidatorRuleCommonRequired, Description: "必传校验", SupportDataTypeList: nil, // 所有类型均支持 + WithoutParam: true, }, ValidatorRuleCommonRequiredIf: { ValidatorRule: ValidatorRuleCommonRequiredIf, Description: "当指定字段等于给定值时, 必传校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 2, + MaxParamCnt: 0, + ParamCntMustEven: true, }, ValidatorRuleCommonRequiredUnless: { ValidatorRule: ValidatorRuleCommonRequiredUnless, Description: "当指定字段不等于给定值时, 必传校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 2, + MaxParamCnt: 0, + ParamCntMustEven: true, }, ValidatorRuleCommonRequiredWith: { ValidatorRule: ValidatorRuleCommonRequiredWith, Description: "当任意一个指定字段不为零值时, 必传校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 1, + MaxParamCnt: 0, }, ValidatorRuleCommonRequiredWithAll: { ValidatorRule: ValidatorRuleCommonRequiredWithAll, Description: "当全部指定字段不为零值时, 必传校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 1, + MaxParamCnt: 0, }, ValidatorRuleCommonRequiredWithout: { ValidatorRule: ValidatorRuleCommonRequiredWithout, - Description: "当任意一个字段为空时, 必传校验", + Description: "当任意一个字段不存在时, 必传校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 1, + MaxParamCnt: 0, }, ValidatorRuleCommonRequiredWithoutAll: { ValidatorRule: ValidatorRuleCommonRequiredWithoutAll, - Description: "当全部字段为空时, 必传校验", + Description: "当全部字段不存在时, 必传校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 1, + MaxParamCnt: 0, }, ValidatorRuleCommonExcludedIf: { ValidatorRule: ValidatorRuleCommonExcludedIf, @@ -263,86 +362,110 @@ var ValidatorRuleSupportDataTypeTable = map[ValidatorRule]ValidatorRuleConfig{ ValidatorRule: ValidatorRuleCommonExcludedUnless, Description: "当指定字段等于给定值时,排除校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 2, + MaxParamCnt: 0, + ParamCntMustEven: true, }, ValidatorRuleCommonExcludedWith: { ValidatorRule: ValidatorRuleCommonExcludedWith, Description: "当全部指定字段不为零值时,排除校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 2, + MaxParamCnt: 0, + ParamCntMustEven: true, }, ValidatorRuleCommonExcludedWithAll: { ValidatorRule: ValidatorRuleCommonExcludedWithAll, Description: "当全部指定字段不为零值时,排除校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 1, + MaxParamCnt: 0, }, ValidatorRuleCommonExcludedWithout: { ValidatorRule: ValidatorRuleCommonExcludedWithout, Description: "当任意一个指定字段不存在时,排除校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 1, + MaxParamCnt: 0, }, ValidatorRuleCommonExcludedWithoutAll: { ValidatorRule: ValidatorRuleCommonExcludedWithoutAll, Description: "当全部指定字段不存在时,排除校验", SupportDataTypeList: nil, // 所有类型均支持 + MinParamCnt: 1, + MaxParamCnt: 0, }, ValidatorRuleCommonUnique: { ValidatorRule: ValidatorRuleCommonUnique, Description: "是否唯一, 用于切片验证", SupportDataTypeList: getMergeDataTypeList(DataTypeSlice), // 所有类型均支持 + WithoutParam: true, }, ValidatorRuleFormatterCron: { ValidatorRule: ValidatorRuleFormatterCron, Description: "cron表达式验证", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + WithoutParam: true, }, ValidatorRuleFormatterEmail: { ValidatorRule: ValidatorRuleFormatterEmail, Description: "邮箱地址验证", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + WithoutParam: true, }, ValidatorRuleFormatterJson: { ValidatorRule: ValidatorRuleFormatterJson, Description: "json格式验证", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + WithoutParam: true, }, ValidatorRuleFormatterJwt: { ValidatorRule: ValidatorRuleFormatterJson, Description: "JWT(JSON Web Token)验证", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + WithoutParam: true, }, ValidatorRuleFormatterLatitude: { ValidatorRule: ValidatorRuleFormatterLatitude, Description: "纬度验证", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + WithoutParam: true, }, ValidatorRuleFormatterLongitude: { ValidatorRule: ValidatorRuleFormatterLongitude, Description: "经度验证", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseNumber), + WithoutParam: true, }, ValidatorRuleFormatterTimezone: { ValidatorRule: ValidatorRuleFormatterLongitude, Description: "时区验证", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + WithoutParam: true, }, ValidatorRuleFormatterUrl: { ValidatorRule: ValidatorRuleFormatterUrl, Description: "url验证", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + WithoutParam: true, }, ValidatorRuleFormatterUri: { ValidatorRule: ValidatorRuleFormatterUrl, Description: "uri验证", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + WithoutParam: true, }, ValidatorRuleFormatterLowercase: { ValidatorRule: ValidatorRuleFormatterLowercase, Description: "仅包含小写字符", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + WithoutParam: true, }, ValidatorRuleFormatterUppercase: { ValidatorRule: ValidatorRuleFormatterUppercase, Description: "仅包含大写字符", SupportDataTypeList: getMergeDataTypeList(DataTypeBaseString), + WithoutParam: true, }, } From d0dbba0156bc9cc41958c1e5acc30a9480641ca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 24 Jan 2025 15:58:04 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8DValidatorRule.String?= =?UTF-8?q?=E6=96=B9=E6=B3=95NPE=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- validator.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/validator.go b/validator.go index d6363a5..60bdc47 100644 --- a/validator.go +++ b/validator.go @@ -12,6 +12,9 @@ package consts type ValidatorRule string // 验证规则 func (vr *ValidatorRule) String() string { + if nil == vr { + return "" + } return string(*vr) } From 5d23a5428f502394297c6b734a54128b78357d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 24 Jan 2025 18:44:01 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20ValidatorRule.IsValid?= =?UTF-8?q?=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- validator.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/validator.go b/validator.go index 60bdc47..6692bfb 100644 --- a/validator.go +++ b/validator.go @@ -22,6 +22,19 @@ func (vr *ValidatorRule) MarshalJSON() ([]byte, error) { return []byte(vr.String()), nil } +// IsValid 验证规则是否有效 +func (vr *ValidatorRule) IsValid() bool { + _, exist := ValidatorRuleSupportDataTypeTable[*vr] + if !exist { + return false + } + rule := ValidatorRuleSupportDataTypeTable[*vr].ValidatorRule + if vr.String() != (&rule).String() { + return false + } + return exist +} + // Config 验证规则的配置 // // Author : go_developer@163.com<白茶清欢> @@ -538,3 +551,12 @@ var ( ValidatorRuleFormatterLowercase ValidatorRule = "lowercase" // 仅包含小写字符 ValidatorRuleFormatterUppercase ValidatorRule = "uppercase" // 仅包含大写字符 ) + +// RegisterCustomValidatorRule 注册自定义的验证方法, 允许通过此函数, 覆盖内部默认的配置 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 18:35 2025/1/24 +func RegisterCustomValidatorRule(rule ValidatorRule, validatorRuleConfig ValidatorRuleConfig) { + ValidatorRuleSupportDataTypeTable[rule] = validatorRuleConfig +}