Skip to content

goodluckxu-go/validator

Repository files navigation

go版本的validator通用验证器

修改日志(change log)

改版前v1.0.1

改版后v1.0.4

树结构v1.0.5

用法(usage)

注意:

1. 规则a.b代表a对象里面key为b的数据,a.*.b代表a数组中对象里面key为b的数据(全局通用)

2. 验证参数存在 param.Field("fieldName") 时,fieldName 必须存在验证规则中

引入

import "github.com/goodluckxu-go/validator"

添加全局验证器

validator.RegisterMethod("test", func(d *validator.Data, args ...interface{}) error {
    return nil
})

调用方法

// data只能有map[string]interface{},[]interface{},interface{}三种类型时字符串类型的数字可转化
var data interface{}
var dataIn int
valid := validator.New().
	SetRequest(req). // *http.Request,不设置则验证传入data数据的值
	SetData(&data).
	SetRules([]validator.Rule{
		{Field:""}, //空字符串代表验证最外层(全部) 
		{Field: "list.*.b.*.a", Methods: validator.Method.List(
			validator.Method.SetMethod("required"), // 常规验证 
			validator.Method.SetMethod("test"), // 添加的全局验证 
			//args表示外部传入的任意参数 
			validator.Method.SetFun(func(d *validator.Data, args ...interface{}) error {
				a, _ := args[0].(*int)
				*a = 10
				return nil
			}, &dataIn), // 自定义验证 
		), Notes: "测试"},
	}). // 不传规则则是赋值
	SetMessages([]validator.Message{ // 只会生效最后一条 
		{"list.*.b.*.a.required", "必填"}, // 其中*代表list1列表的所有的b数组中所有的a的required规则错误注释被替换 
		{"list.*.b.0.a.required", "必填1"},// 其中*代表list1列表的所有的b数组中第0位的a的required规则错误注释被替换 
	}).
	Valid()

验证数据*Data说明

数据

{
    "c": "111",
    "list": [
        {
            "a": {
                "a": 1,
                "b": 2,
                "c": 3
            },
            "b": [
                {
                    "a": 5,
                    "b": 6
                },
                {
                    "a": 5,
                    "b": 7
                },
                {
                    "a": 5,
                    "b": 8
                }
            ]
        },
        {
            "a": {
                "a": 1,
                "b": 2,
                "c": 3
            },
            "b": [
                {
                    "a": 5,
                    "b": 16
                },
                {
                    "a": 5,
                    "b": 17
                },
                {
                    "a": 5,
                    "b": 18
                }
            ]
        }
    ]
}

方法

GetAllData() interface{}

获取所有数据

GetData(path string) []DataOne

根据key获取数据

例如:传 list.*.b. *.b ,获得

[
    {"Path":"list.0.b.0.b","Data":6},
    {"Path":"list.0.b.1.b","Data":7},
    {"Path":"list.0.b.2.b","Data":8},
    {"Path":"list.1.b.0.b","Data":16},
    {"Path":"list.1.b.1.b","Data":17},
    {"Path":"list.1.b.2.b","Data":18}
]

GetCommonData(path string) interface{}

获取两个值最近的公共数据

例如:当期验证数据list.0.a.a,传入list.*.a.b,获取数据则为list.0.a对象

GetLevelData(path string) []DataOne

获取和验证同一层级的数据集合

例如:当期验证数据list.0.a.a,传入list.*.a.b,获取数据则为list.0.a.b数据切片

GetValidData() interface{}

设置验证数据

GetNotes() string

获取注释

GetNotesByPath(path string) string

通过path路径获取注释

func (d *Data) JumpValid() error

跳过当前字段的验证

func (d *Data) JumpChild() error {

跳过子集验证

返回错误信息(callback)

valid.Error

语言包(language)

validator.SetLangAddr("./zh_cn.json")

语言包json格式参照lang/zh_cn.json文件

所有常规验证规则(rules)

通用规则

valid_condition | required | nullable | in | not_in | unique | email | phone | regexp | not_regexp

类型验证

array | map | string | number | integer | bool | date | file

比较验证 (字段,时间,数字)

eq | gt | gte | lt | lte

长度验证 (字符串,数组,文件大小)

len | min | max

文件验证

suffix | mime

规则注释(rule notes)

args参数说明:

1. &&是并且,||是或者

2. &&和||之间的数据为验证公式,公式结果为布尔型

3. 公式目前占1-3个字符

4. 公式可以直接为true或false

5. 验证公式符号有>,>=,<,<=,=,!=,in,not。例如:>,3表示验证数据大于3;3,>,2表示比较3和2的值;param.Field("a"),>,2表示字段a的值大于2

6. in是在数组里面,not是不再数组里面,其他公式符号都是简单类型数组(string,int等)

7. condition.Brackets表示括号,里面值和args一样规则

8. 所有公式满足为true则验证,否在跳过验证

validator.Method.SetMethod("valid_condition", "=", 1, "&&", "<", 10, "&&", param.Field("list.*.a.a"), "=", 12, "&&", condition.Brackets(">", 2)),

验证是否必填。null,字符串为"",数字类型为0,bool类型为false,数组为[],map为{}都不通过 参数为string,number,bool,array,map,代表string为空不验证,number为0不验证,bool为false不验证,array为[]不验证,map为{}不验证

validator.Method.SetMethod("required", "string")

数据为空则不验证后面的规则,字符串为"",数字类型为0,bool类型为false,数组为[],map为{}都不验证后的单规则

validator.Method.SetMethod("nullable")

验证是否在数组里面,参数是slice或array类型

validator.Method.SetMethod("in", []int{1,2,3})

验证是否不在数组里面,参数是slice或array类型

validator.Method.SetMethod("not_in", []int{1,2,3})

验证数组内的值唯一

validator.Method.SetMethod("unique")

验证是否是邮箱

validator.Method.SetMethod("email")

验证是否是手机号

validator.Method.SetMethod("phone")

验证数据在正则表达式中

validator.Method.SetMethod("regexp", `^\d*$`)

验证数据不在正则表达式中

validator.Method.SetMethod("not_regexp", `^\d*$`)

验证是否是数组

validator.Method.SetMethod("array")

验证是否是对象

validator.Method.SetMethod("map")

验证是否是字符串

validator.Method.SetMethod("string")

验证是否是数字。可验证数字和字符串的数字,如果接受数据为map[string]interface{},[]interface{},interface{}验证后会转换成float64

validator.Method.SetMethod("number")

验证是否是整数。可验证数字和字符串的数字,如果接受数据为map[string]interface{},[]interface{},interface{}验证后会转换成int64

validator.Method.SetMethod("integer")

验证是否是布尔类型。可验证整数和布尔类型

validator.Method.SetMethod("bool")

验证是否是日期格式 args参数Y-m-d H:i:s类型,Y年,m月,d日,H时,i分,s秒

validator.Method.SetMethod("date")

验证是否是文件

validator.Method.SetMethod("file")

验证两个字段是否相同,参数可以是param.Field("test")字段值

validator.Method.SetMethod("eq",5)

验证是否大于某个数。可验证数字,字符串的数字或日期,参数可以是param.Field("test"),time.Time字段值

validator.Method.SetMethod("gt",5)

验证是否大于等于某个数。可验证数字和字符串的数字或日期,参数可以是param.Field("test"),time.Time字段值

validator.Method.SetMethod("gte",5)

验证是否小于某个数。可验证数字和字符串的数字或日期,参数可以是param.Field("test"),time.Time字段值

validator.Method.SetMethod("lt",5)

验证是否小于等于某个数。可验证数字和字符串的数字或日期,参数可以是param.Field("test"),time.Time字段值

validator.Method.SetMethod("lte",5)

验证是长度等于某个数。可获取字符串和数组长度或者文件大小(单位: kb)

validator.Method.SetMethod("len", 5)

验证是长度大于等于某个数。可获取字符串和数组长度或者文件大小(单位: kb)

validator.Method.SetMethod("min", 5)

验证是长度小于等于某个数。可获取字符串和数组长度或者文件大小(单位: kb)

validator.Method.SetMethod("max", 5)

验证文件后缀类型,可为多个

validator.Method.SetMethod("suffix", "jpg","png")

验证文件协议类型,可为多个

validator.Method.SetMethod("mime", "image/jpeg","image/png")