千家信息网

gorm+gin怎么实现restful分页

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本篇内容主要讲解"gorm+gin怎么实现restful分页",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"gorm+gin怎么实现restful分页"吧!
千家信息网最后更新 2026年11月04日gorm+gin怎么实现restful分页

本篇内容主要讲解"gorm+gin怎么实现restful分页",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"gorm+gin怎么实现restful分页"吧!

API处理分页看似简单,实际上暗藏危机.最常见的分页方式,大概是下面这样的

  • 页数表示法:/user/?page=1&size=15&name=李

  • 偏移量表示法:/user/?offset=100&limit=15&name=李

使用页码表示法对前端开发比较友好,但是本质上是和偏移量表示发相似. 在这里我们将使用 jinzhu/gorm和 gin-gonic/gin 开发一个简单的分页接口

分页查询URL: http://dev.mojotv.cn:3333/api/ssh-log?client_ip=&page=1&size=10&user_id=0&machine_id=0 返回json 结果

{    "data": [        {            "id": 28,            "created_at": "2019-09-12T14:25:54+08:00",            "updated_at": "2019-09-12T14:25:54+08:00",            "user_id": 26,            "machine_id": 1,            "ssh_user": "mojotv.cn",            "client_ip": "10.18.60.16",            "started_at": "2019-09-12T14:24:05+08:00",            "status": 0,            "remark": ""        }    ],    "ok": true,    "page": 1,    "size": 10,    "total": 1}

1. 定义分页struct

//PaginationQ gin handler query binding structtype PaginationQ struct { Ok    bool        `json:"ok"` Size  uint        `form:"size" json:"size"` Page  uint        `form:"page" json:"page"` Data  interface{} `json:"data" comment:"muster be a pointer of slice gorm.Model"` // save pagination list Total uint        `json:"total"`}
  • Ok 代表业务查询没有出错

  • Size 每页显示的数量,使用 form tag 接受gin的url-query参数

  • Page 当前页码,使用 form tag 接受gin的url-query参数

  • Data 分页的数据内容

  • Total 全部的页码数量

2. 数据表Model

这里以ssh_log(ssh 命令日志为示例),使用GORM创建MYSQL数据表模型, 使用 form tag 接受gin的url-query参数,作为搜索条件

type SshLog struct { BaseModel UserId    uint      `gorm:"index" json:"user_id" form:"user_id"` //form tag 绑定gin url-query 参数 MachineId uint      `gorm:"index" json:"machine_id" form:"machine_id"` //form tag 绑定gin url-query 参数 SshUser   string    `json:"ssh_user" comment:"ssh账号"` ClientIp  string    `json:"client_ip" form:"client_ip"` //form tag 绑定gin url-query 参数 StartedAt time.Time `json:"started_at" form:"started_at"` Status    uint      `json:"status" comment:"0-未标记 2-正常 4-警告 8-危险 16-致命"` Remark    string    `json:"remark"` Log       string    `gorm:"type:text" json:"log"` Machine   Machine   `gorm:"association_autoupdate:false;association_autocreate:false" json:"machine"` User      User      `gorm:"association_autoupdate:false;association_autocreate:false" json:"user"`}

3. 定义分页查询搜索的结构体

ssh3ws/internal/h_ssh_log.gotype SshLogQ struct { SshLog PaginationQ FromTime string `form:"from_time"` //搜索开始时间 ToTime   string `form:"to_time"`  //搜索结束时候}

这个结构体是提供给gin handler用作参数绑定的. 使用的方法如下:

func SshLogAll(c *gin.Context) { query := &model.SshLogQ{} err := c.ShouldBindQuery(query) //开始绑定url-query 参数到结构体 if handleError(c, err) {  return } list, total, err := query.Search()  //开始mysql 业务搜索查询 if handleError(c, err) {  return } //返回数据开始拼装分页json jsonPagination(c, list, total, &query.PaginationQ)}

4. 分页和搜索数据查询

1.创建 db-query
2.搜索非空业务字段
3.使用crudAll 方法获取数据

model/m_ssh_log.gotype SshLogQ struct { SshLog PaginationQ FromTime string `form:"from_time"` ToTime   string `form:"to_time"`}func (m SshLogQ) Search() (list *[]SshLog, total uint, err error) { list = &[]SshLog{} //创建 db-query tx := db.Model(m.SshLog).Preload("User").Preload("Machine") //搜索非空业务字段 if m.ClientIp != "" {  tx = tx.Where("client_ip like ?", "%"+m.ClientIp+"%") } //搜索时间段 if m.FromTime != "" && m.ToTime != "" {  tx = tx.Where("`created_at` BETWEEN ? AND ?", m.FromTime, m.ToTime) } //使用crudAll 方法获取数据 total, err = crudAll(&m.PaginationQ, tx, list) return}

crudAll 方法来构建sql分页数据,

  • 设置默认参数

  • 获取全部搜索数量

  • 获取偏移量的数据

  • 拼装json 分页数据

model/helper.go

func crudAll(p *PaginationQ, queryTx *gorm.DB, list interface{}) (uint, error) {     //1.默认参数     if p.Size < 1 {         p.Size = 10     }     if p.Page < 1 {         p.Page = 1     }    //2.部搜索数量     var total uint err := queryTx.Count(&total).Error if err != nil {        return 0, err     }     offset := p.Size * (p.Page - 1)    //3.偏移量的数据    err = queryTx.Limit(p.Size).Offset(offset).Find(list).Error if err != nil {         return 0, err    }         return total, err }//4.json 分页数据 func jsonPagination(c *gin.Context, list interface{}, total uint, query *model.PaginationQ) {     c.AbortWithStatusJSON(200, gin.H{        "ok": true,        "data": list,         "total": total,        "page": query.Page,         "size": query.Size    }) }

API处理分页看似简单,实际上暗藏危机.最常见的分页方式,大概是下面这样的

  • 页数表示法:/user/?page=1&size=15&name=李

  • 偏移量表示法:/user/?offset=100&limit=15&name=李

使用页码表示法对前端开发比较友好,但是本质上是和偏移量表示发相似. 在这里我们将使用 jinzhu/gorm和 gin-gonic/gin 开发一个简单的分页接口

分页查询URL: http://dev.mojotv.cn:3333/api/ssh-log?client_ip=&page=1&size=10&user_id=0&machine_id=0 返回json 结果

{    "data": [        {            "id": 28,            "created_at": "2019-09-12T14:25:54+08:00",            "updated_at": "2019-09-12T14:25:54+08:00",            "user_id": 26,            "machine_id": 1,            "ssh_user": "mojotv.cn",            "client_ip": "10.18.60.16",            "started_at": "2019-09-12T14:24:05+08:00",            "status": 0,            "remark": ""        }    ],    "ok": true,    "page": 1,    "size": 10,    "total": 1}

到此,相信大家对"gorm+gin怎么实现restful分页"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

数据 搜索 参数 查询 表示法 偏移 方法 业务 数量 页码 开发 内容 实际 结构 相似 前端 危机 字段 实际上 常见 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网金融科技创新 致聘互联网科技 米客互联网科技 上游互联网科技 苏州大垚互联网科技 互联网 科技服务平台 青海省互联网新科技 汉立互联网科技有限公司联系电话 恒银科技与互联网金融 互联网金融中的现代科技 昊天互联网科技有限公司 移动互联网年度科技创新 互联网科技和信息 企晟互联网信息科技有限公司 爱医互联网络科技 朱啸虎曾投资哪些互联网科技企业 国大互联网教育科技有限公司薪资 互联网金融科技公司的优势 互联网企业科技类企业如何做账 广州智享互联网科技 湖北九亚互联网络科技有限公司 疫情对互联网科技公司影响 互联网科技垄断 紫鲸互联网科技 互联网科技寓意 贵州叶脉互联网科技有限公司所属行业 广西互联网科技孵化中心 玉溪新华互联网科技好不好 2021世界互联网领先科技成果发布 第三届互联网大会安防黑科技
0