上文《Go语言Web开发系列(十三)Gin web框架操作mysql存储案例》我们演示gin web+mysql的案例的时候,大家可以发现一个问题,就是我们在每一个方法里面都是使用
c.JSON(200, gin.H{
"code": 200,
"message": "登录成功",
})在真实开发环境里面,其实我们一般都是会直接封装一个统一的返回json结构体,例如:
{
"code": 200,
"msg": "请求成功",
"data": null
}这样子的话,我们每个接口里面都写一遍这个,是不是很麻烦,所以我们需要的就是封装一个统一返回的结构体。这里的封装也比较方便,主要是编写一个方法,把相关的参数传递进来即可,示例:
func Ok(c *gin.Context, code int, msg string, data any) {
c.JSON(http.StatusOK, gin.H{
"code": code,
"msg": msg,
"data": data,
})
}然后在代码里面调用这个方法即可,例如:
Ok(c, 200, "登录成功", user)
示例图如下:
然后我们把项目运行起来,可以看到返回的格式都是统一的,如下图:
这样子是不是很方便?
备注:
1、这里的话由于我们的web返回的主要是3个字段,code,msg,data,相对来说简单,所以就没有专门写一个struct结构体,直接使用的json组合起来的。 2、处理成功或者失败事件都可以这么封装。
最后附上我们修改后的完整代码,大家可以试试:
// demo1 project main.go
package main
import (
"database/sql"
"log"
"net/http"
"time"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
)
type Users struct {
Id int
Name string
NickName string
}
/*
*
创建数据库连接
*/
func connectToDatabase() (*sql.DB, error) {
db, err := sql.Open("mysql", "root:123456@tcp(192.168.31.217:33306)/test")
if err != nil {
return nil, err
}
db.SetConnMaxLifetime(time.Second * 3600 * 8)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(10)
err = db.Ping()
if err != nil {
return nil, err
}
return db, nil
}
func main() {
//创建数据库连接
db, err := connectToDatabase()
if err != nil {
panic(err)
}
//程序关闭的时候需要关闭掉数据库连接
defer db.Close()
router := gin.Default()
//用户登录
router.POST("/login", func(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
log.Println("获取到的用户名和密码是:", username, password)
rows, err := db.Query("SELECT id FROM users WHERE username = ? and password = ?", username, password)
if err != nil {
log.Fatal(err)
}
defer rows.Columns()
if rows.Next() == true {
Ok(c, 200, "登录成功", nil)
} else {
Error(c, 400, "用户名或者密码不正确")
}
})
//用户注册
router.POST("/register", func(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
nickname := c.PostForm("nickname")
log.Println("获取到的用户名和密码是:", username, password)
inserSql := "insert into users(username,password,nickname) values(?,?,?)"
// 创建事务
tx, err := db.Begin()
if err != nil {
log.Println("事务创建失败:", err)
return
}
// 执行插入语句
_, err = tx.Exec(inserSql, username, password, nickname) //value输入具体的值
if err != nil {
log.Println("插入数据失败:", err)
tx.Rollback() // 回滚事L务
return
}
// 提交事务
err = tx.Commit()
if err != nil {
log.Println("提交事务失败:", err)
return
}
Ok(c, 200, "注册成功", nil)
})
//获取用户信息
router.POST("/getUinfo/:username", func(c *gin.Context) {
username := c.Param("username")
var user Users
querySql := "SELECT id, username, nickname FROM users WHERE username = ?"
err = db.QueryRow(querySql, username).Scan(&user.Id, &user.Name, &user.NickName)
if err != nil {
log.Fatal(err)
}
Ok(c, 200, "登录成功", user)
})
//修改用户信息
router.POST("/updateUinfo", func(c *gin.Context) {
username := c.PostForm("username")
nickname := c.PostForm("nickname")
updateSql := "update users set nickname= ? WHERE username = ?"
_, err = db.Exec(updateSql, nickname, username)
if err != nil {
log.Fatal(err)
}
Ok(c, 200, "修改成功", nil)
})
//删除用户信息
router.POST("/deleteU/:username", func(c *gin.Context) {
username := c.Param("username")
updateSql := "delete from users WHERE username = ?"
_, err = db.Exec(updateSql, username)
if err != nil {
log.Fatal(err)
}
Ok(c, 200, "删除成功", nil)
})
router.Run(":9000")
}
func Error(c *gin.Context, code int, msg string) {
c.JSON(http.StatusOK, gin.H{
"code": code,
"message": msg,
})
}
func Ok(c *gin.Context, code int, msg string, data any) {
c.JSON(http.StatusOK, gin.H{
"code": code,
"msg": msg,
"data": data,
})
}










还没有评论,来说两句吧...