MisakaOJ项目,第一次记录内容
gotype Question struct {
gorm.Model
Identity string `gorm:"column:identity;type:varchar(36);" json:"identity"` // 题目唯一标识
CategoryId string `gorm:"column:category_id;type:varchar(255);" json:"category_id"` // 分类ID 以逗号分割
Title string `gorm:"column:title;type:varchar(255);" json:"title"` // 题目标题
Content string `gorm:"column:content;type:text;" json:"content"` // 题目正文
MaxRuntime int `gorm:"column:max_runtime;type:int(11)" json:"max_runtime"` // 最大运行时长
MaxMem int `gorm:"column:max_memory;type:int(11)" json:"max_mem"` // 最大允许内存
}
func (table *Question) TableName() string {
return "question"
}
gotype User struct {
gorm.Model
Identity string `gorm:"column:identity;type:varchar(36);" json:"identity"` // 用户唯一标识
Name string `gorm:"column:user;type:varchar(100);" json:"name"` // 用户名
Password string `gorm:"column:password;type:varchar(32);" json:"password"` // 密码 加密后
Phone string `gorm:"column:phone;type:varchar(20)" json:"phone"` // 手机号
Mail string `gorm:"column:mail;type:varchar(100);" json:"mail"` // 邮箱地址
}
func (table *User) TableName() string {
return "user"
}
gotype Category struct {
gorm.Model
Identity string `gorm:"column:identity;type:varchar(36);" json:"identity"` // 分类唯一标识
Name string `gorm:"column:user;type:varchar(100);" json:"name"` // 分类名称
ParentId int `gorm:"column:parent_id;type:int(11);default:0" json:"parent_id"` // 父级ID 自身为顶级是默认为0
}
func (table *Category) TableName() string {
return "category"
}
gotype Submit struct {
gorm.Model
Identity string `gorm:"column:identity;type:varchar(36);" json:"identity"` // 提交记录唯一标识
ProblemIdentity string `gorm:"column:problem_identity;type:varchar(36);" json:"problem_identity"` // 问题唯一标识
UserIdentity string `gorm:"column:user_identity;type:varchar(36);" json:"user_identity"` // 用户唯一标识
Path string `gorm:"column:path;type:varchar(255);" json:"path"` // 保存提交代码位置的路径
Status int `gorm:"column:status;type:tinyint(1);default:0;" json:"status"` // 提交记录状态
}
func (table *Submit) TableName() string {
return "submit"
}
安装:
bashgo get -u github.com/swaggo/gin-swagger go install github.com/swaggo/swag/cmd/swag@latest go get -u github.com/swaggo/files
使用:
swag init
即可在该位置下快速生成/更新docs包以及其中的文件swag -v
查看swag版本号r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
,并且在include中以匿名方式加入刚才生成的docs包。URL路径可以自己指定。xxxxx/swagger/index.html
下访问Swagger文档。为一个接口编写注释以快速生成Swagger:
假设现在有这么一个接口:
gofunc GetQuestionList(c *gin.Context) {
page, err := strconv.Atoi(c.DefaultQuery("page", constants.DefaultPage))
if err != nil {
log.Println("Get Param Error: ", err)
return
}
size, err := strconv.Atoi(c.DefaultQuery("size", constants.DefaultSize))
if err != nil {
log.Println("Get Param Error: ", err)
return
}
keyword := c.Query("keyword")
// 中间省略
c.JSON(http.StatusOK, gin.H{
"code": 200,
"data": gin.H{
"list": result,
"count": count,
},
})
}
为其添加注解可以帮助Swagger-Gin快速生成文档,比如:
go// @Tags 公共方法
// @Summary 获取问题列表
// @Param page query int false "page"
// @Param size query int false "size"
// @Param keyword query string false "keyword"
// @Success 200 {data} json "{"code": "200", "data": ""}"
// @Router /question-list [get]
func GetQuestionList(c *gin.Context) {
page, err := strconv.Atoi(c.DefaultQuery("page", constants.DefaultPage))
if err != nil {
log.Println("Get Param Error: ", err)
return
}
size, err := strconv.Atoi(c.DefaultQuery("size", constants.DefaultSize))
if err != nil {
log.Println("Get Param Error: ", err)
return
}
keyword := c.Query("keyword")
// 中间省略
c.JSON(http.StatusOK, gin.H{
"code": 200,
"data": gin.H{
"list": result,
"count": count,
},
})
}
可以通过注解被添加到文档中的信息有以下类别:
注解 | 含义 | 示例 |
---|---|---|
description | 该接口的详细说明 | @Description xxx |
tags | 该接口的类别 | @Tags xxx |
summary | 该接口的简短说明 | @Summary xxx |
accept | 该接口接受数据类型 | @Accept json |
produce | 该接口返回的数据的类型 | @Produce json |
param | 该接口的参数 这个注解可以有多行 每一行代表一种参数 | @Param 参数名 参数类型 数据类型 是否必须 注释 属性(可选) |
success | 该接口成功返回的结果 | @Success 返回码 {参数类型} 数据类型 注释 |
failure | 该接口失败返回的结果 | 同success |
response | 该接口返回结果说明 | 同success |
router | 该接口的路径 | @Router xxx |
更多信息可以查看官方文档
go// GetQuestionList
// @Tags 公共方法
// @Summary 获取问题列表
// @Param page query int false "page"
// @Param size query int false "size"
// @Param keyword query string false "keyword"
// @Success 200 {data} json "{"code": "200", "data": ""}"
// @Router /question-list [get]
func GetQuestionList(c *gin.Context) {
page, err := strconv.Atoi(c.DefaultQuery("page", constants.DefaultPage))
if err != nil {
log.Println("Get Param Error: ", err)
return
}
size, err := strconv.Atoi(c.DefaultQuery("size", constants.DefaultSize))
if err != nil {
log.Println("Get Param Error: ", err)
return
}
page = (page - 1) * size // page到offset的转换
keyword := c.Query("keyword")
var count int64
// tx是transaction的缩写
tx := models.GetQuestionList(keyword)
result := make([]*models.Question, 0)
err = tx.Count(&count).Omit("content").Offset(page).Limit(size).Find(&result).Error
// Omit 指定一行要忽略的数据
if err != nil {
log.Println("Get Problem List Error: ", err)
return
}
c.JSON(http.StatusOK, gin.H{
"code": 200,
"data": gin.H{
"list": result,
"count": count,
},
})
}
func GetQuestionList(keyword string) *gorm.DB {
return DB.Model(new(Question)).Where("title like ? OR content like ?", "%"+keyword+"%", "%"+keyword+"%")
}
本文作者:御坂19327号
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!