api处理分页看似简单,实际上暗藏危机.最常见的分页方式,大概是下面这样的
页数表示法:/ur/?page=1&size=15&name=李偏移量表示法:/ur/?offt=100&limit=15&name=李使用页码表示法对前端开发比较友好,但是本质上是和偏移量表示发相似. 在这里我们将使用jinzhu/gorm和gin-gonic/gin开发一个简单的分页接口
分页查询url:http://dev.mojotv.cn:3333/api/ssh-log?client_ip=&page=1&size=10&ur_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", "ur_id": 26, "machine_id": 1, "ssh_ur": "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}
//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 g哥哥妹妹orm.model"` // save pagination list total uint `json:"total"`}ok代表业务查询没有出错size每页显示的数量,使用formtag 接受gin的url-query参数page当前页码,使用formtag 接受gin的url-query参数data分页的数据内容total全部的页码数量
这里以ssh_log(ssh 命令日志为示例),使用gorm创建mysql数据表模型, 使用formtag 接受gin的url-query参数,作为搜索条件
type sshlog struct { bamodel urid uint `gorm:"index" json:"ur_id" form:"ur_id"` //form tag 绑定gin url-query 参数 machineid uint `gorm:"index" json:"machine_id" form:"machine_id"` //form tag 绑定gin url-query 参数 sshur string `json:"ssh_ur" comment:"ssh账号"` clientip string `json:"client_ip" form:"client_ip"` //form tag 绑定gin url-query 参数 startedat time.tim电玩竞技场e `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:fal;association_autocreate:fal" json:"machine"` ur ur `gorm:"association_autoupdate:fal;association_autocreate:fal" json:"ur"`}
ssh2ws/internal/h_ssh_log.gotype sshlogq str2017双十一交易额uct { sshlog paginationq fromtime string `form:"f怎么排版rom_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.arch() //开始mysql 业务搜索查询 if handleerror(c, err) { return } //返回数据开始拼装分页json jsonpagination(c, list, total, &query.paginationq)}
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) arch() (list *[]sshlog, total uint, err error) { list = &[]sshlog{} //创建 db-query tx := db.model(m.sshlog).preload("ur").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 } offt := p.size * (p.page - 1) //3.偏移量的数据 err = querytx.limit(p.size).offt(offt).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处理分页看似简单,实际上暗藏危机.最常见的分页方式,大概是下面这样的
页数表示法:/ur/?page=1&size=15&name=李偏移量表示法:/ur/?offt=100&limit=15&name=李使用页码表示法对前端开发比较友好,但是本质上是和偏移量表示发相似. 在这里我们将使用jinzhu/gorm和gin-gonic/gin开发一个简单的分页接口
分页查询url:http://dev.mojotv.cn:3333/api/ssh-log?client_ip=&page=1&size=10&ur_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", "ur_id": 26, "machine_id": 1, "ssh_ur": "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分页接口的实践的文章就介绍到这了,更多相关gorm gin restful分页接口内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 04:35:42,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/8d4c7319576e9335a5713ef30986e50b.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:gorm+gin实现restful分页接口的实践.doc
本文 PDF 下载地址:gorm+gin实现restful分页接口的实践.pdf
留言与评论(共有 0 条评论) |