可以优化的地方:
可以将查询条件构造封装成一个函数,使代码更加清晰易读。
对于不同 menuId 的处理逻辑,建议使用 switch-case 来代替 if 语句。
对于错误处理,建议使用 defer 和 recover 函数来进行统一处理。
以下是优化后的代码:
func (g *GamesApi) GetGamesInfo(c *gin.Context) {
pageNumStr := c.Query("pageNum")
pageSizeStr := c.Query("pageSize")
isRecommend := c.Query("isRecommend")
infoTypeStr := c.Query("infoType")
menuIdStr := c.Query("menuId")
var games []system.SysGames
var err interface{}
var pageNum, pageSize, infoType, menuId int
if pageNum, err = strconv.Atoi(pageNumStr); err != nil {
pageNum = 1
}
if pageSize, err = strconv.Atoi(pageSizeStr); err != nil {
pageSize = 10
}
if infoType, err = strconv.Atoi(infoTypeStr); err != nil {
infoType = 0
}
if menuId, err = strconv.Atoi(menuIdStr); err != nil {
menuId = 0
}
dbQuery := buildQuery(infoType, isRecommend, menuId)
offset := (pageNum - 1) * pageSize
defer func() {
if r := recover(); r != nil {
global.GBQ_LOG.Error("查询数据库失败!")
response.FailWithMessage("数据库查询错误", c)
return
}
}()
err = dbQuery.Offset(offset).Limit(pageSize).Find(&games).Error
response.OkWithData(games, c)
}
func buildQuery(infoType int, isRecommend string, menuId int) *gorm.DB {
dbQuery := global.GBQ_DB.Where("info_type = ?", infoType)
if isRecommend != "" {
dbQuery = dbQuery.Where("is_recommend = ?", isRecommend)
}
switch menuId {
case 0:
dbQuery = dbQuery.Order("create_time DESC")
case 1:
dbQuery = dbQuery.Order("download_count_total DESC")
case 2:
dbQuery = dbQuery.Order("download_count_week DESC")
case 3:
dbQuery = dbQuery.Where("is_recommend = ?", "1").Order("create_time DESC")
default:
dbQuery = dbQuery.Order("create_time DESC")
}
return dbQuery
}




