Categorygithub.com/owc888/verify
modulepackage
1.0.2
Repository: https://github.com/owc888/verify.git
Documentation: pkg.go.dev

# README

参数验证

封装 github.com/go-playground/validator/v10 验证器,以简化参数的验证。

使用方法

1.引入

import "github.com/owc888/verify"

2.编写需要校验数据的结构体。在tag中,binding填写校验规则(具体校验规则可查看validator package);byname写参数别名,即输出时,用byname替换参数名,原校验器对参数名的显示并不友好。

type Example struct {
    ID     int    `json:"id" binding:"required"`
    Title  string `json:"title" binding:"required" byname:"标题"`
    Author Author `json:"author"`
    Works  []Work `json:"works" binding:"gt=0,dive,required" byname:"公式"`
}

type Author struct {
    FirstName string `json:"first_name" byname:"姓"`
    LastName  string `json:"last_name"  byname:"名"`
    Age       string `json:"age" binding:"CheckAge" byname:"年龄"`
}

type Work struct {
    Name string `json:"name" byname:"名字"`
    Code string `json:"code" binding:"required" byname:"代码"`
}

3.个性化校验,在binding中写入自定义的校验方法名,同时编写好校验方法,前两种写法,主要是传参类型不同。沿用github.com/go-playground/validator/v10的功能。第三种写法直接返回错误信息。

// 有自定义校验标签时,一定要写同名校验方法
func (t Example) CheckAge(rv reflect.Value) bool {
    if rv.String() == "1" {
        return true
    }
    return false
}

// 第二种写法
func (t Example) CheckAge2(vf validator.FieldLevel) bool {
    if vf.Field().String() == "1" {
        return true
    }
    return false
}

// 第三种写法
func (t Example) CheckFirstName(rv reflect.Value) string {
    if rv.String() == "first name" {
        return "名字不能为“first name”"
    }
    return ""
}

4.可对结构体附加参数可设置在不同场景下,针对不同的参数进行校验。添加如下方法并返回正确的数据格式的数据即可。

func (t Example) Scenes() map[string]interface{} {
    return map[string]interface{}{
        "create": []string{
            "Title", "Works",
        },
        "update": map[string]string{
            "ID","Title":,"Works",
        },
        "delete": []string{
            "ID",
        },
    }
}

4.整体性的校验,当以上校验都不能满足要求时,可以在以下方法进行校验

// 整体性校验,一些上面的方法校验不出来的时候,都可以在这个方法里校验
func (t Example) CheckWhole(scene string) map[string]string {
    warns := make(map[string]string)
    if scene == "delete" && t.ID != 1 {
        warns["id"] = "id不能等于1"
    }
    if t.Title == t.Author {
        warns["title"] = "标题不能等于作者名"
    }            
    return warns
}

自定义方法可以自己构造方法名,场景设置和整体校验必须用Scenes()和WholeCheck()方法,不需要时可以直接不写方法。

使用时,将需要校验的参数传入Check()方法即可:

var e = &Example{
	Title: "怎么验证",
}
pass, warns, err := Check(e, "update", "zh")

具体使用看查看测试用例。

未来更新计划

1.校验校验方法可传递额外参数

2.对于相同的校验规则,Warns()尝试对不同层级的不同字段有不同的告警信息,如'x1.x2:required' 提示”我需要x2“;同时'x1.x3:required'可提示”不能没有x3啊“,两者有不同的告警信息

3.针对不同场景的校验,可替换结构体里的binging,以覆盖原有的校验规则,进一步实现个性化

4.全局初始化验证工具,将tag信息保存下来,减少反射逻辑的执行

# Functions

验证数据 param:传指针 args:第一个参数是校验场景,第二个参数是语言.

# Structs

No description provided by the author
需要校验的结构体的例子 关于更多的binding标签的校验规则:https://pkg.go.dev/github.com/go-playground/validator/v10 byname标签:字段对应的别名,当输出告警信息中有json标签的值时,会被替换成别名.
No description provided by the author