From 0be17c936c35384005b0ea3e1599f8a9c7db17a3 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 10 Apr 2018 12:01:17 +0800 Subject: [PATCH] =?UTF-8?q?gvalid=E6=96=B0=E5=A2=9E=E5=AF=B9=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E5=AF=B9=E8=B1=A1=E5=B1=9E=E6=80=A7=E7=9A=84?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/util/gvalid/gvalid.go | 11 +++++++++++ g/util/gvalid/gvalid_test.go | 22 ++++++++++++++++++++++ geg/other/test.go | 18 +++++++++++++----- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/g/util/gvalid/gvalid.go b/g/util/gvalid/gvalid.go index 630423aed..69bf82c09 100644 --- a/g/util/gvalid/gvalid.go +++ b/g/util/gvalid/gvalid.go @@ -18,6 +18,8 @@ import ( "gitee.com/johng/gf/g/util/gregx" "gitee.com/johng/gf/g/encoding/gjson" "gitee.com/johng/gf/g/container/gmap" + "github.com/fatih/structs" + "gitee.com/johng/gf/g/util/gconv" ) /* @@ -401,6 +403,15 @@ func CheckMap(params map[string]string, rules map[string]string, msgs...map[stri return nil } +// 校验struct对象属性,object参数也可以是一个指向对象的指针,返回值同CheckMap方法 +func CheckObject(object interface{}, rules map[string]string, msgs...map[string]interface{}) map[string]map[string]string { + params := make(map[string]string) + for k, v := range structs.Map(object) { + params[k] = gconv.String(v) + } + return CheckMap(params, rules, msgs...) +} + // 检测单条数据的规则,其中params参数为非必须参数,可以传递所有的校验参数进来,进行多参数对比(部分校验规则需要) // msgs为自定义错误信息,由于同一条数据的校验规则可能存在多条,为方便调用,参数类型支持string/map[string]string,允许传递多个自定义的错误信息,如果类型为string,那么中间使用"|"符号分隔多个自定义错误 // values参数为表单联合校验参数,对于需要联合校验的规则有效,如:required-*、same、different diff --git a/g/util/gvalid/gvalid_test.go b/g/util/gvalid/gvalid_test.go index 1ba81b4d5..d0ea5c5ea 100644 --- a/g/util/gvalid/gvalid_test.go +++ b/g/util/gvalid/gvalid_test.go @@ -64,6 +64,28 @@ func Test_CheckMap(t *testing.T) { } } +func Test_CheckObject(t *testing.T) { + type Object struct { + Name string + Age int + } + rules := map[string]string { + "Name" : "required|length:6,16", + "Age" : "between:18,30", + } + msgs := map[string]interface{} { + "Name" : map[string]string { + "required" : "名称不能为空", + "length" : "名称长度为:min到:max个字符", + }, + "Age" : "年龄为18到30周岁", + } + obj := &Object{"john", 16} + if m := gvalid.CheckObject(obj, rules, msgs); m == nil { + t.Error("CheckObject校验失败") + } +} + func Test_Required(t *testing.T) { if m := gvalid.Check("1", "required", nil); m != nil { t.Error(m) diff --git a/geg/other/test.go b/geg/other/test.go index a7fd01173..56bead281 100644 --- a/geg/other/test.go +++ b/geg/other/test.go @@ -2,17 +2,25 @@ package main import ( "fmt" - "reflect" + "github.com/fatih/structs" ) type T struct { - + Name string + Age int + S struct { + N string + } } func (t *T) Test2Test() {} func main() { - obj := &T{} - v := reflect.ValueOf(obj).MethodByName("Test2Test") - fmt.Println(v.IsValid()) + v := &T{ + Name : "john", + Age : 18, + } + v.S.N = "ttt" + fmt.Println(structs.Map(v)) + } \ No newline at end of file