github.com/gogf/gf@v1.16.9/util/gvalid/gvalid_z_example_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  package gvalid_test
     8  
     9  import (
    10  	"context"
    11  	"errors"
    12  	"fmt"
    13  	"math"
    14  	"reflect"
    15  
    16  	"github.com/gogf/gf/container/gvar"
    17  	"github.com/gogf/gf/frame/g"
    18  	"github.com/gogf/gf/util/gconv"
    19  	"github.com/gogf/gf/util/gvalid"
    20  )
    21  
    22  func ExampleCheckMap() {
    23  	params := map[string]interface{}{
    24  		"passport":  "",
    25  		"password":  "123456",
    26  		"password2": "1234567",
    27  	}
    28  	rules := []string{
    29  		"passport@required|length:6,16#账号不能为空|账号长度应当在:min到:max之间",
    30  		"password@required|length:6,16|same:password2#密码不能为空|密码长度应当在:min到:max之间|两次密码输入不相等",
    31  		"password2@required|length:6,16#",
    32  	}
    33  	if e := gvalid.CheckMap(context.TODO(), params, rules); e != nil {
    34  		fmt.Println(e.Map())
    35  		fmt.Println(e.FirstItem())
    36  		fmt.Println(e.FirstString())
    37  	}
    38  	// May Output:
    39  	// map[required:账号不能为空 length:账号长度应当在6到16之间]
    40  	// passport map[required:账号不能为空 length:账号长度应当在6到16之间]
    41  	// 账号不能为空
    42  }
    43  
    44  func ExampleCheckMap2() {
    45  	params := map[string]interface{}{
    46  		"passport":  "",
    47  		"password":  "123456",
    48  		"password2": "1234567",
    49  	}
    50  	rules := []string{
    51  		"passport@length:6,16#账号不能为空|账号长度应当在:min到:max之间",
    52  		"password@required|length:6,16|same:password2#密码不能为空|密码长度应当在:min到:max之间|两次密码输入不相等",
    53  		"password2@required|length:6,16#",
    54  	}
    55  	if e := gvalid.CheckMap(context.TODO(), params, rules); e != nil {
    56  		fmt.Println(e.Map())
    57  		fmt.Println(e.FirstItem())
    58  		fmt.Println(e.FirstString())
    59  	}
    60  	// Output:
    61  	// map[same:两次密码输入不相等]
    62  	// password map[same:两次密码输入不相等]
    63  	// 两次密码输入不相等
    64  }
    65  
    66  // Empty string attribute.
    67  func ExampleCheckStruct() {
    68  	type Params struct {
    69  		Page      int    `v:"required|min:1         # page is required"`
    70  		Size      int    `v:"required|between:1,100 # size is required"`
    71  		ProjectId string `v:"between:1,10000        # project id must between :min, :max"`
    72  	}
    73  	obj := &Params{
    74  		Page: 1,
    75  		Size: 10,
    76  	}
    77  	err := gvalid.CheckStruct(context.TODO(), obj, nil)
    78  	fmt.Println(err == nil)
    79  	// Output:
    80  	// true
    81  }
    82  
    83  // Empty pointer attribute.
    84  func ExampleCheckStruct2() {
    85  	type Params struct {
    86  		Page      int       `v:"required|min:1         # page is required"`
    87  		Size      int       `v:"required|between:1,100 # size is required"`
    88  		ProjectId *gvar.Var `v:"between:1,10000        # project id must between :min, :max"`
    89  	}
    90  	obj := &Params{
    91  		Page: 1,
    92  		Size: 10,
    93  	}
    94  	err := gvalid.CheckStruct(context.TODO(), obj, nil)
    95  	fmt.Println(err == nil)
    96  	// Output:
    97  	// true
    98  }
    99  
   100  // Empty integer attribute.
   101  func ExampleCheckStruct3() {
   102  	type Params struct {
   103  		Page      int `v:"required|min:1         # page is required"`
   104  		Size      int `v:"required|between:1,100 # size is required"`
   105  		ProjectId int `v:"between:1,10000        # project id must between :min, :max"`
   106  	}
   107  	obj := &Params{
   108  		Page: 1,
   109  		Size: 10,
   110  	}
   111  	err := gvalid.CheckStruct(context.TODO(), obj, nil)
   112  	fmt.Println(err)
   113  	// Output:
   114  	// project id must between 1, 10000
   115  }
   116  
   117  func ExampleRegisterRule() {
   118  	type User struct {
   119  		Id   int
   120  		Name string `v:"required|unique-name # 请输入用户名称|用户名称已被占用"`
   121  		Pass string `v:"required|length:6,18"`
   122  	}
   123  	user := &User{
   124  		Id:   1,
   125  		Name: "john",
   126  		Pass: "123456",
   127  	}
   128  
   129  	rule := "unique-name"
   130  	gvalid.RegisterRule(rule, func(ctx context.Context, rule string, value interface{}, message string, data interface{}) error {
   131  		var (
   132  			id   = data.(*User).Id
   133  			name = gconv.String(value)
   134  		)
   135  		n, err := g.Model("user").Where("id != ? and name = ?", id, name).Count()
   136  		if err != nil {
   137  			return err
   138  		}
   139  		if n > 0 {
   140  			return errors.New(message)
   141  		}
   142  		return nil
   143  	})
   144  	err := gvalid.CheckStruct(context.TODO(), user, nil)
   145  	fmt.Println(err.Error())
   146  	// May Output:
   147  	// 用户名称已被占用
   148  }
   149  
   150  func ExampleRegisterRule_OverwriteRequired() {
   151  	rule := "required"
   152  	gvalid.RegisterRule(rule, func(ctx context.Context, rule string, value interface{}, message string, data interface{}) error {
   153  		reflectValue := reflect.ValueOf(value)
   154  		if reflectValue.Kind() == reflect.Ptr {
   155  			reflectValue = reflectValue.Elem()
   156  		}
   157  		isEmpty := false
   158  		switch reflectValue.Kind() {
   159  		case reflect.Bool:
   160  			isEmpty = !reflectValue.Bool()
   161  		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
   162  			isEmpty = reflectValue.Int() == 0
   163  		case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
   164  			isEmpty = reflectValue.Uint() == 0
   165  		case reflect.Float32, reflect.Float64:
   166  			isEmpty = math.Float64bits(reflectValue.Float()) == 0
   167  		case reflect.Complex64, reflect.Complex128:
   168  			c := reflectValue.Complex()
   169  			isEmpty = math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0
   170  		case reflect.String, reflect.Map, reflect.Array, reflect.Slice:
   171  			isEmpty = reflectValue.Len() == 0
   172  		}
   173  		if isEmpty {
   174  			return errors.New(message)
   175  		}
   176  		return nil
   177  	})
   178  	fmt.Println(gvalid.CheckValue(context.TODO(), "", "required", "It's required"))
   179  	fmt.Println(gvalid.CheckValue(context.TODO(), 0, "required", "It's required"))
   180  	fmt.Println(gvalid.CheckValue(context.TODO(), false, "required", "It's required"))
   181  	gvalid.DeleteRule(rule)
   182  	fmt.Println("rule deleted")
   183  	fmt.Println(gvalid.CheckValue(context.TODO(), "", "required", "It's required"))
   184  	fmt.Println(gvalid.CheckValue(context.TODO(), 0, "required", "It's required"))
   185  	fmt.Println(gvalid.CheckValue(context.TODO(), false, "required", "It's required"))
   186  	// Output:
   187  	// It's required
   188  	// It's required
   189  	// It's required
   190  	// rule deleted
   191  	// It's required
   192  	// <nil>
   193  	// <nil>
   194  }
   195  
   196  func ExampleValidator_Rules() {
   197  	data := g.Map{
   198  		"password": "123",
   199  	}
   200  	err := g.Validator().Data(data).Rules("required-with:password").Messages("请输入确认密码").CheckValue("")
   201  	fmt.Println(err.String())
   202  
   203  	// Output:
   204  	// 请输入确认密码
   205  }
   206  
   207  func ExampleValidator_CheckValue() {
   208  	err := g.Validator().Rules("min:18").Messages("未成年人不允许注册哟").CheckValue(16)
   209  	fmt.Println(err.String())
   210  
   211  	// Output:
   212  	// 未成年人不允许注册哟
   213  }
   214  
   215  func ExampleValidator_CheckMap() {
   216  	params := map[string]interface{}{
   217  		"passport":  "",
   218  		"password":  "123456",
   219  		"password2": "1234567",
   220  	}
   221  	rules := map[string]string{
   222  		"passport":  "required|length:6,16",
   223  		"password":  "required|length:6,16|same:password2",
   224  		"password2": "required|length:6,16",
   225  	}
   226  	messages := map[string]interface{}{
   227  		"passport": "账号不能为空|账号长度应当在:min到:max之间",
   228  		"password": map[string]string{
   229  			"required": "密码不能为空",
   230  			"same":     "两次密码输入不相等",
   231  		},
   232  	}
   233  	err := g.Validator().Messages(messages).Rules(rules).CheckMap(params)
   234  	if err != nil {
   235  		g.Dump(err.Maps())
   236  	}
   237  
   238  	// May Output:
   239  	//{
   240  	//	"passport": {
   241  	//	"length": "账号长度应当在6到16之间",
   242  	//		"required": "账号不能为空"
   243  	//},
   244  	//	"password": {
   245  	//	"same": "两次密码输入不相等"
   246  	//}
   247  	//}
   248  }
   249  
   250  func ExampleValidator_CheckStruct() {
   251  	type User struct {
   252  		Name string `v:"required#请输入用户姓名"`
   253  		Type int    `v:"required#请选择用户类型"`
   254  	}
   255  	data := g.Map{
   256  		"name": "john",
   257  	}
   258  	user := User{}
   259  	if err := gconv.Scan(data, &user); err != nil {
   260  		panic(err)
   261  	}
   262  	err := g.Validator().Data(data).CheckStruct(user)
   263  	if err != nil {
   264  		fmt.Println(err.Items())
   265  	}
   266  
   267  	// Output:
   268  	// [map[Type:map[required:请选择用户类型]]]
   269  }