从零开始的IM聊天系统(五)——用户信息校验

160 阅读1分钟

在前面的课程中,我们已经成功学习了完成用户功能的curd,接下来我们要针对用户信息进行一些校验

信息校验模块govalidator

引入govalidator

go get github.com/asaskevich/govalidator

在项目中使用包,这里我们以验证phone和email为例

Phone         string `valid:"matches(^1[3-9]{1}\d{9}$)" gorm:"column:phone" json:"phone"`
Email         string `valid:"email" gorm:"column:email" json:"email"`

在service的UpdateUser方法中添加phone和email参数。

import "github.com/asaskevich/govalidator"

// UpdateUser
// @Summary 修改用户
// @Tags 用户模块
// @param id formData string false "id"
// @param name formData string false "name"
// @param password formData string false "password"
// @param phone formData string false "phone"
// @param email formData string false "email"
// @Success 200 {string} json{"code", "message"}
// @Router /user/updateUser [post]
func UpdateUser(c *gin.Context) {
   user := models.UserBasic{}
   id, _ := strconv.Atoi(c.PostForm("id"))
   user.ID = uint(id)
   user.Name = c.PostForm("name")
   user.Phone = c.PostForm("phone")
   user.Email = c.PostForm("email")
   fmt.Println("update: ", user)

   _, err := govalidator.ValidateStruct(user)

   if err != nil {
      fmt.Println(err)
      c.JSON(200, gin.H{
         "message": "修改参数格式不正确",
      })
   } else {
      models.UpdateUser(&user)

      c.JSON(200, gin.H{
         "message": "修改用户成功",
      })
   }
}

接下来,为models中的UpdateUser添加phone和email字段:

func UpdateUser(user *UserBasic) *gorm.DB {
   return utils.DB.Model(user).Updates(UserBasic{Name: user.Name, Password: user.Password, Phone: user.Phone, Email: user.Email})
}

govalidator中需要注意的点:在结构体注解中添加valid字段,作为判定依据;在service中的调用方法中添加govalidator.ValidateStruct(结构体)。

添加重复注册校验

为了防止用户名重复,我们需要添加重复用户名校验。

添加数据库查询方法

func FindUserByName(name string) UserBasic {
   user := UserBasic{}
   utils.DB.Where("name = ?", name).First(&user)
   return user
}

在service中的CreateUser方法中添加

func CreateUser(c *gin.Context) {
   user := models.UserBasic{}
   user.Name = c.Query("name")
   password := c.Query("password")
   rePassword := c.Query("rePassword")

   data := models.FindUserByName(user.Name)
   if data.Name != "" {
      c.JSON(-1, gin.H{
         "message": "用户名已经注册",
      })
      return
   }

   if password != rePassword {
      c.JSON(-1, gin.H{
         "message": "两次密码不一致",
      })
      return
   }

   models.CreateUser(&user)

   c.JSON(200, gin.H{
      "message": "新增用户成功",
   })
}

测试数据库结构验证一下即可。