zoukankan      html  css  js  c++  java
  • 27.用户注册场景:数据验证(2):自定义验证tag、正则验证

    首先重新改造一下我们之前的自定义错误处理函数

    package AppLib
    
    import (
        "fmt"
        "gopkg.in/go-playground/validator.v9"
        "reflect"
        "regexp"
    )
    
    //封装一个通用的正则方法,省去每次都要写下面这段很长的代码
    func AddRegexTag(tagName string, pattern string, v *validator.Validate) error {
        return v.RegisterValidation(tagName, func(fl validator.FieldLevel) bool {
            m, _ := regexp.MatchString(pattern, fl.Field().String()) //返回bool和错误类型
            return m
        }, false) //为true则值为null也做判断,为false则不判断
    }
    
    func ValidErrMsg(obj interface{}, err error) error {
        getObj := reflect.TypeOf(obj) //获取tag要用TypeOf
        if err != nil {
            if errs, ok := err.(validator.ValidationErrors); ok {
                for _, e := range errs {
                    if f, exist := getObj.Elem().FieldByName(e.Field()); exist {
                        if value, ok := f.Tag.Lookup("vmsg"); ok { //查找tag中有没有我们自定义的错误消息,有就用自定义的没有就用默认的
                            return fmt.Errorf("%s", value)
                        } else {
                            return fmt.Errorf("%s", e.Value())
                        }
                    }
                }
            }
        }
        return nil
    }
    

    如上的规则,我们使用内置的验证器已经满足不了,我们这里应该使用正则

    func AddRegexTag(tagName string, pattern string, v *validator.Validate) error {
        return v.RegisterValidation(tagName, func(fl validator.FieldLevel) bool {
            m, _ := regexp.MatchString(pattern, fl.Field().String())
            fmt.Println(fl.Field().String())
            return m
        }, true) //最后的参数true表示如果值是null也做判断,如果是false则不作判断
    }

    调用验证器判断字段

    package main
    
    import (
        "fmt"
        "gopkg.in/go-playground/validator.v9"
        "log"
        "micro/AppLib"
    )
    
    type Users struct {
        Username string `validate:"required,min=6,max=20" vmsg:"用户名必须6位以上"`
        Userpwd  string `validate:"required,min=6,max=18" vmsg:"用户密码必须6位以上"`
        Testname string `validate:"username"  vmsg:"用户名规则不正确"` //这里的username对应v.RegisterValidation(tagName中的tagName,随便写写abc都可以但是要和它对应起来
    }
    
    func main() {
    
        user := &Users{Username: "shenyi", Userpwd: "123123", Testname: "wqeqdasd"}
        valid := validator.New()
        //加入自定义的正则验证tag
        err := AppLib.AddRegexTag("username", "[a-zA-Z]\w{5,19}", valid)
        if err != nil {
            log.Fatal(err)
        }
        err = AppLib.ValidErrMsg(user, valid.Struct(user))
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println("验证成功")
    }




  • 相关阅读:
    timeStamp(时间戳) 事件属性
    解析Javascript事件冒泡机制(转) 本文转自:http://blog.csdn.net/luanlouis/article/details/23927347
    stopPropagation()阻止事件的冒泡传递
    JavaScript for...in 循环
    js中的内置对象(还没怎么看)
    python 数组的切片
    python 文件的读写
    python 基础数据类型作业
    pycharm本地git拉代码使用方法
    数据库日常练习
  • 原文地址:https://www.cnblogs.com/hualou/p/12145298.html
Copyright © 2011-2022 走看看