一、綁定參數:
type Page struct { Page int `form:"page"` Size int `form:"size"` Desc int `form:"desc"` }
//-------------router內-----------------------------//
var p Page
if c.ShouldBindQuery(&p) != nil {
c.JSON(http.StatusUnauthorized, gin.H{
"error": "參數錯誤",
})
return
}
page := p.Page
pageSize := p.Size
desc := p.Desc
if page <= 0 {
page = 1
}
構建傳參結構體,包含頁碼、分頁大小以及正負序,除此之外還可以拓展關鍵字keyword,使用like進行模糊搜索,這里就不展開了。
二、計算總頁數:
var total int DB.Model(&Comment{}).Count(&total) pageNum := total / pageSize if total % pageSize != 0{ pageNum++ }
先計算總數量total,用總的數量total整除頁大小pageSize得到頁數量pageNum(有余數需要加一頁)。
拓展:對比總頁數和選擇頁數,如果超出范圍,就返回錯誤。
三、分頁查詢:
err = DB.Limit(pageSize).Offset((page-1)*pageSize).Find(&comments).Error if err != nil { c.JSON(http.StatusUnauthorized, gin.H{ "error": err.Error(), }) }
Limit:返回的數量,即頁大小
Offset:按順序跳過數量(一般以創建時間為標准),數量為 (頁數 - 1) * 頁大小
Find:不解釋了
可能用到的拓展:
.Order("created_at desc") // 按創建時間反向 .Where(fmt.Sprintf(" comment like %q ", ("%" + keyword))) // 關鍵字模糊搜索
四、返回樣例
c.JSON(200, gin.H{ "status": "success", "data": serializer.BuildComments(comments), "total": total, "page_num": pageNum, })
需要返回總頁數,總數量可選,方便前端進行分頁處理,序列化和狀態碼看個人。
