人生是不能回头的 每走一步都会有不同的结果 一切都是唯一的 包括遗憾
引入 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 目录
其中.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中新增代码
通过 web 浏览器访问 http://localhost:8088/swagger/index.html
同常来说会显示如下界面
如果看到了 那么恭喜你正确的引入了 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]
示例
添加好后 重新运行 swage init 生成新的 Api 文档 后启动main.go
重新访问http://localhost:8088/swagger/index.html 如下图
没有问题后可以运行
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基础功能