日志打印
在开始curd之前,我们需要为数据库添加日志打印的功能,在utils文件夹中的system_init.go中的InitMysql方法中添加日志打印功能:
func InitMySql() {
//自定义日志模板,打印sql语句
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: time.Second, //慢SQL阈值
LogLevel: logger.Info, //级别
Colorful: true, //彩色
},
)
DB, _ = gorm.Open(mysql.Open(viper.GetString("mysql.dns")), &gorm.Config{
Logger: newLogger,
})
}
用户模块的增删改查
在前面的学习中我们已经完成了用户功能的获取,接下来我们需要完成用户功能的增删改。
新增用户
在models文件夹中user_basic.go中新增CreateUser方法,用来新增用户
func CreateUser(user *UserBasic) *gorm.DB {
return utils.DB.Create(user)
}
在router的app.go文件中新增路由:
func Router() *gin.Engine {
r := gin.Default()
docs.SwaggerInfo.BasePath = ""
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
r.GET("/index", service.GetIndex)
r.GET("/user/getUserList", service.GetUserList)
r.GET("/user/createUser", service.CreateUser)
return r
}
接下来我们需要实现service.CreateUser()方法:
// CreateUser
// @Summary 新增用户
// @Tags 用户模块
// @param name query string false "用户名"
// @param password query string false "密码"
// @param rePassword query string false "确认密码"
// @Success 200 {string} json{"code", "message"}
// @Router /user/createUser [get]
func CreateUser(c *gin.Context) {
user := models.UserBasic{}
user.Name = c.Query("name")
password := c.Query("password")
rePassword := c.Query("rePassword")
if password != rePassword {
c.JSON(-1, gin.H{
"message": "两次密码不一致",
})
return
}
user.Password = password
models.CreateUser(&user)
c.JSON(200, gin.H{
"message": "新增用户成功",
})
}
删除用户
实现的方法类似,在models文件夹中user_basic.go中新增DeleteUser方法,用来删除用户
func DeleteUser(user *UserBasic) *gorm.DB {
return utils.DB.Delete(user)
}
在router的app.go文件中新增路由:
func Router() *gin.Engine {
r := gin.Default()
docs.SwaggerInfo.BasePath = ""
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
r.GET("/index", service.GetIndex)
r.GET("/user/getUserList", service.GetUserList)
r.GET("/user/createUser", service.CreateUser)
r.GET("/user/deleteUser", service.DeleteUser)
return r
}
接下来我们需要实现service.DeleteUser()方法:
// DeleteUser
// @Summary 删除用户
// @Tags 用户模块
// @param id query string false "id"
// @Success 200 {string} json{"code", "message"}
// @Router /user/deleteUser [get]
func DeleteUser(c *gin.Context) {
user := models.UserBasic{}
id, _ := strconv.Atoi(c.Query("id"))
user.ID = uint(id)
models.DeleteUser(&user)
c.JSON(200, gin.H{
"message": "删除用户成功",
})
}
修改用户
修改用户与其他的功能不同,我们需要用POST请求:这里简述一下get请求和post请求的区别: GET 和 POST 是两种常见的 HTTP 请求方法,它们在客户端与服务器之间传输数据时有以下区别:
- 参数位置不同:
GET 请求的参数通常会附加在 URL 后面,形成一个查询字符串。例如:example.com/user?id=123…
POST 请求的参数通常放在请求体中,以表单的形式提交给服务器。例如:example.com/user,其中包含一个… id 和 name 两个参数。
- 安全性不同:
由于 GET 请求的参数直接附加在 URL 上,因此 GET 请求传递的数据相对不安全,容易被拦截和篡改。而 POST 请求的参数放在请求体中,可以采用加密等手段来保护数据的安全性。
- 缓存处理不同:
由于 GET 请求的参数直接附加在 URL 上,因此可以被浏览器缓存下来,不需要每次都向服务器发送请求。而 POST 请求的参数通常不会被浏览器缓存,每次都需要向服务器发送请求。
- 数据大小限制不同:
由于 GET 请求的参数直接附加在 URL 上,因此其数据大小受到 URL 长度的限制。而 POST 请求的参数放在请求体中,没有长度限制。
- 幂等性不同:
GET 请求是幂等的,即多次发送相同的 GET 请求只会返回相同的结果。而 POST 请求是非幂等的,即多次发送相同的 POST 请求可能会导致不同的结果。
各自的优缺点:
GET 请求的优点是方便、易用、可缓存、无长度限制;缺点是不安全、不可控、不可重复、不能上传文件等。
POST 请求的优点是安全、可控、可重复、可上传文件等;缺点是麻烦、不可缓存、长度受限等。 接着我们实现一下用户的修改功能: 实现的方法类似,在models文件夹中user_basic.go中新增UpdateUser方法,用来修改用户:
func UpdateUser(user *UserBasic) *gorm.DB {
return utils.DB.Model(user).Updates(UserBasic{Name: user.Name, Password: user.Password})
}
在router的app.go文件中新增路由:
func Router() *gin.Engine {
r := gin.Default()
docs.SwaggerInfo.BasePath = ""
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
r.GET("/index", service.GetIndex)
r.GET("/user/getUserList", service.GetUserList)
r.GET("/user/createUser", service.CreateUser)
r.GET("/user/deleteUser", service.DeleteUser)
r.POST("/user/updateUser", service.UpdateUser)
return r
}
接下来我们需要实现service.UpdateUser()方法:
// UpdateUser
// @Summary 修改用户
// @Tags 用户模块
// @param id formData string false "id"
// @param name formData string false "name"
// @param password formData string false "password"
// @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")
fmt.Println("update: ", user)
models.UpdateUser(&user)
c.JSON(200, gin.H{
"message": "修改用户成功",
})
}
这样我们就完成好了用户模块的curd功能,接下来运行swag init重新生成文档,重启项目,浏览器打开
http://localhost:8080/swagger/index.html
出现以下页面,即为成功。
测试我们的接口功能,在数据库中查看是否成功: