package users import ( "github.com/gin-gonic/gin" "goskeleton/app/global/consts" "goskeleton/app/http/controller/web" "goskeleton/app/http/validator/core/data_transfer" "goskeleton/app/utils/response" ) // 验证器是本项目骨架的先锋队,必须发挥它的极致优势,具体参考地址: //https://godoc.org/github.com/go-playground/validator ,该验证器非常强大,强烈建议重点发挥, //请求正式进入控制器等后面的业务逻辑层之前,参数的校验必须在验证器层完成,后面的控制器等就只管获取各种参数,代码一把梭 // 给出一些最常用的验证规则: //required 必填; //len=11 长度=11; //min=3 如果是数字,验证的是数据范围,最小值为3,如果是文本,验证的是最小长度为3, //max=6 如果是数字,验证的是数字最大值为6,如果是文本,验证的是最大长度为6 // mail 验证邮箱 //gt=3 对于文本就是长度>=3 //lt=6 对于文本就是长度<=6 type PublicKey struct { UserName string `form:"user_name" json:"user_name" binding:"required,min=3"` } // 特别注意: 表单参数验证器结构体的函数,绝对不能绑定在指针上 // 我们这部分代码项目启动后会加载到容器,如果绑定在指针,一次请求之后,会造成容器中的代码段被污染 func (p PublicKey) CheckParams(context *gin.Context) { //1.先按照验证器提供的基本语法,基本可以校验90%以上的不合格参数 if err := context.ShouldBind(&p); err != nil { response.ValidatorError(context, err) return } //2.继续验证具有中国特色的参数,例如 身份证号码等,基本语法校验了长度18位,然后可以自行编写正则表达式等更进一步验证每一部分组成 // r.CardNo 获取身份证号码继续校验,可能需要开发者编写正则表达式,稍微复杂,这里忽略 // r.Phone 获取手机号码,可以根据手机号码开头等等自定义验证,例如 如果不是以138 开头的手机号码,则报错 //if !strings.HasPrefix(r.CardNo, "138") { // response.ErrorParam(context, gin.H{"tips": "手机号码字段:card_no 必须以138开头"}) // return //} // 该函数主要是将本结构体的字段(成员)按照 consts.ValidatorPrefix+ json标签对应的 键 => 值 形式绑定在上下文,便于下一步(控制器)可以直接通过 context.Get(键) 获取相关值 extraAddBindDataContext := data_transfer.DataAddContext(p, consts.ValidatorPrefix, context) if extraAddBindDataContext == nil { response.ErrorSystem(context, "UserRegister表单验证器json化失败", "") } else { // 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性 (&web.Users{}).PublicKey(extraAddBindDataContext) } }