入门第四章 Go引入 Swaggo 整合现有API并自定义Sql日志模板(全程干货无废话)

228 阅读4分钟

人生是不能回头的 每走一步都会有不同的结果 一切都是唯一的 包括遗憾

引入 Swaggo

Swaggo(Swagger for Go)是一个Go语言的项目

其核心意义是通过Go代码中的注释自动生成Swagger文档 可测试Api

首先进入pkg.go.dev 中搜索 swag

引用 swag (github.com/swaggo/swag/v2)

go get -u github.com/swaggo/swag/cmd/swag@latest
或
go install github.com/swaggo/swag/cmd/swag@latest
swag官方文档说明 go get 这种方式在go1.17后弃用 建议使用install命令拉取包
但我实际使用发现 
install命令运行后没有响应下文
而 get 可以正常使用

引用完成后去检查一下自己的go.mod文件 是否存在相关依赖了

没问题后重启当前shell (goland需要重开一个shell) 运行 swag init

运行完swag init后 你的目录中应新建了一个 docs 目录 image.png

其中.json和.yaml都是Swagger规范的表示 文件类型不同是因为表示的格式不同

docs.go 的意义是为了在您的Go应用程序中嵌入Swagger文档。这个文件由Swaggo在构建过程中生成,它包含了Swagger文档的初始化代码和一些必要的配置

引入swaggo生态中的相关依赖
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files 
同样 检查一下你的 go.mod文件中是否存在依赖记录
名称意义
gin-swagger这个库允许您在Gin项目中使用Swagger。Swagger可以帮助您为API生成文档,而gin-swagger则允许通过一个用户友好的界面来查看和测试Api
files这个库用于提供静态文件,如HTML、CSS和JavaScript文件。在Swagger的上下文中,它用于提供Swagger UI的静态文件,这样就可以在浏览器查看API文档并进行交互

测试 Swaggo

在路由文件app.go中新增代码 image.png

通过 web 浏览器访问 http://localhost:8088/swagger/index.html

同常来说会显示如下界面 image.png 如果看到了 那么恭喜你正确的引入了 Swaggo 并可以开始使用了

在先前编写好的方法中添加 Swaggo注释

如下 可选用
// PingExample godoc
// @Summary ping example
// @Schemes
// @Description do ping
// @Tags example
// @Accept json
// @Produce json
// @Success 200 {string} Helloworld
// @Router /example/helloworld [get]

示例 image.png

添加好后 重新运行 swage init 生成新的 Api 文档 后启动main.go

重新访问http://localhost:8088/swagger/index.html 如下图

image.png

没有问题后可以运行

go mod tidy

重新整理依赖记录和关系 实际上就是整理 go.mod中的依赖

它会移除未使用的依赖 添加已使用但不存在的依赖

自定义 Sql日志模板

// MysqlInit 函数用于初始化MySQL数据库连接
func MysqlInit() {
   //newLogger函数返回一个gorm.Logger的实现,用来记录sql执行的日志
   newlogger := logger2.New(
      // 定义log.Logger的输出目的地,这里是输出到标准输出
      log.New(os.Stdout, "\r\n", log.LstdFlags),
      //定义gorm.Logger的配置
      logger2.Config{
         SlowThreshold: time.Second,  //慢 sql日志 单位 秒
         LogLevel:      logger2.Info, //级别
         Colorful:      true,         //彩色
      },
   )
   // 使用gorm.Open函数连接MySQL数据库
   DB, _ = gorm.Open(mysql.Open(viper.GetString("mysql.dsn")), &gorm.Config{
      Logger: newlogger,
   })
}

编写用户模块CURD

定义路由

//定义路由地址及调用函数
r.POST("/user/user_create", service.UserCreate)
r.GET("/user/user_delete", service.UserDelete)
r.POST("/user/user_update", service.UserUpdate)
r.GET("/user/get_user_list", service.UserList)

编写 Services 代码

package service

import (
   "ginchat/models"
   "github.com/gin-gonic/gin"
   "strconv"
)

// UserList
// @Summary 查询用户列表
// @Tags 用户模块
// @Success 200 {string} json{ code:200, data:[{id:1, name:"user1"}}
// @Router /user/get_user_list [get]
func UserList(c *gin.Context) {
   //获取返回的数据集
   data := models.GetUserList()
   //返回json格式数据到客户端
   c.JSON(200, gin.H{
      "data": data,
   })
}

// UserCreate
// @Summary 新增用户
// @Tags 用户模块
// @param name formData string false "姓名"
// @param password formData string false "密码"
// @param repassword formData string false "确认密码"
// @Success 200 {string} json{ code:200, message:"success" }
// @Router /user/user_create [post]
func UserCreate(c *gin.Context) {
   user := models.UserBasic{}
   user.Name = c.PostForm("name")
   password := c.PostForm("password")
   repassword := c.PostForm("repassword")
   if password != repassword {
      c.JSON(-1, gin.H{
         "code": -1,
         "msg":  "两次输入的密码不一致",
      })
   }
   user.Password = password
   models.UserCreate(user)
   c.JSON(200, gin.H{
      "code": 200,
      "msg":  "success",
   })
}

// UserDelete
// @Summary 删除用户
// @Tags 用户模块
// @param id query string false "UID"
// @Success 200 {string} json{ code:200, message:"success" }
// @Router /user/user_delete [get]
func UserDelete(c *gin.Context) {
   user := models.UserBasic{}
   id, _ := strconv.Atoi(c.Query("id"))
   user.ID = uint(id)
   models.DeleteUser(user)
   c.JSON(200, gin.H{
      "code": 200,
      "msg":  "success",
   })
}

// UserUpdate
// @Summary 修改用户
// @Tags 用户模块
// @param id formData string false "UID"
// @param name formData string false "姓名"
// @param password formData string false "密码"
// @param phone formData string false "手机号"
// @param email formData string false "邮箱"
// @Success 200 {string} json{ code:200, message:"success" }
// @Router /user/user_update [post]
func UserUpdate(c *gin.Context) {
   user := models.UserBasic{}
   id, _ := strconv.Atoi(c.PostForm("id"))
   user.ID = uint(id)
   user.Name = c.PostForm("name")
   user.Password = c.PostForm("password")
   user.Phone = c.PostForm("phone")
   user.Email = c.PostForm("email")
   models.UpdateUser(user)
   c.JSON(200, gin.H{
      "code": 200,
      "msg":  "success",
   })
}

编写Model代码


func GetUserList() []*UserBasic {
   //[]*UserBasic 返回值声明 为 GetUserList 声明返回数据集为 []*UserBasic 切片
   // 在内存中开辟空间 定义返回数据集的长度为 10
   data := make([]*UserBasic, 10)
   //执行查询语句 并将数据存放在开辟好的内存地址
   utils.DB.Find(&data)
   //循环打印测试 range关键字的作用是遍历data数组中的所有元素
   for _, v := range data {
      fmt.Println(v)
   }
   //返回数据集
   return data
}

func UserCreate(user UserBasic) *gorm.DB {
   return utils.DB.Create(&user)
}

func DeleteUser(user UserBasic) *gorm.DB {
   return utils.DB.Delete(&user)
}

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,
      })
}

调整完后自行使用 Swaggo测试是否正常 校验Api基础功能