1. 用户注册模块的开发
分为三层:modle,service,router。
1.1 modle层的开发
新增了四个方法:SelctUserByUsername()、SelectUserById()、SelectUserByEmail()和InsertUser():
func SelectUserByUsername(username string) UserBasics {
user := UserBasics{}
utils.DB.Where("username = ?", username).First(&user)
return user
}
func SelectUserByEmail(email string) UserBasics {
user := UserBasics{}
utils.DB.Where("email = ?", email).First(&user)
return user
}
func SelectUserById(id int) UserBasics {
user := UserBasics{}
utils.DB.Where("id = ?", id).First(&user)
return user
}
func InsertUser(user UserBasics) *gorm.DB {
return utils.DB.Create(&user)
}
1.2 service层的开发:
主要新增了方法Register(),负责实现用户注册业务,使用gin框架的Query()方法传参,并且使用@param绑定用户参数,将接口注册到了Swagger进行测试,还检测了用户名重名(后续重构还会加入邮箱的注册以及邮箱格式检验等较为复杂的功能):
// Register 使用gin.Context获取JSON数据
// @Summary 新增用户
// @Tags 用户模块
// @param username query string false "用户名"
// @param password query string false "密码"
// @param rePassword query string false "重复密码"
// @Success 200 {string} json{"code", "message"}
// @Router /user/register [get] 路径:/user/register 方法get
func Register(c *gin.Context) {
user := models.UserBasics{}
username := c.Query("username")
password := c.Query("password")
rePassword := c.Query("rePassword")
if username == "" {
c.JSON(http.StatusOK, gin.H{
"message": "请输入用户名!",
})
return
}
if c.Query("password") == "" {
c.JSON(http.StatusOK, gin.H{
"message": "请输入密码!",
})
return
}
if c.Query("rePassword") == "" {
c.JSON(http.StatusOK, gin.H{
"message": "请再次输入密码!",
})
return
}
if password != rePassword {
c.JSON(http.StatusOK, gin.H{
"message": "两次输入密码不一致!",
})
return
}
user = models.SelectUserByUsername(username)
if user.Username != "" {
c.JSON(http.StatusOK, gin.H{
"message": "用户已存在!",
})
return
}
user = models.UserBasics{}
user.Username = c.Query("username")
user.Password = password
models.InsertUser(user)
c.JSON(http.StatusOK, gin.H{
"message": "用户添加成功!",
})
}
1.3 Router层的开发
新增了对Register()方法的调用:
func Router() *gin.Engine {
// 创建默认的gin.Engine对象
r := gin.Default()
docs.SwaggerInfo.BasePath = ""
// 将swagger映射到对应路径
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
// 将相应方法映射到对应路径
r.GET("/index", service.GetIndex)
r.GET("/user/getUserList", service.GetUserList)
r.GET("/product", service.GetProductList)
r.GET("/user/register", service.Register)
return r
}
1.4 测试结果
1.4.1 不输入用户名:
![](https://i-blog.csdnimg.cn/blog_migrate/62921ac1f8f161915ae419f4aac8c009.png)
同理不输入密码、重复密码错误也是一样。
1.4.2 注册成功:
1.4.3 重名注册:
2. 总结
今天花了比较长的时间在琐碎的事情上,做了个面试题意识到自己Go的基础还是比较薄弱,所以决定开始进行Go的系统性学习,今天还用Java刷了一题LeetCode,感觉还不错,决定以后每天分别用Java和Go刷同一题LeetCode,但是今天学会了使用Swagger进行带传参的接口的测试,然后就是更加熟悉Go的开发模式了,有一点找回了使用Java开发的感觉,同样是从数据访问层逐层向上,实现所需要的功能。