gin + grom 实现分页功能
项目介绍
使用gin
+ gorm
实现分页,按一般的mvc
架构思想去划分目录,良好的编码习惯是用Dao
层去查询数据库,Server
层去实现业务逻辑(此案例业务逻辑简单所以没有封装)。
第三方库
gin
gorm
以及对应的mysql
驱动包
目录结构
├── README.md
├── config
│ └── config.go
├── controller
│ └── user.go
├── dao
│ └── user.go
├── data.sql
├── go.mod
├── go.sum
├── main.go
├── model
│ ├── page.go
│ └── user.go
├── routes
│ └── routes.go
└── utils└── pagination.go
config
目录
var DB *gorm.DBfunc init() {var err errorDB, err = gorm.Open(mysql.Open("帐号:密码@tcp(数据库连接地址:3306)/数据库名?charset=utf8mb4&parseTime=True&loc=Local"))if err != nil {panic(err)}var db *sql.DBdb, err = DB.DB()if err != nil {panic(err)}// 设置打开数据库连接最大数量db.SetMaxOpenConns(100)// 设置空闲连接池连接的最大数量db.SetMaxIdleConns(10)// 设置连接最大可复用时间db.SetConnMaxLifetime(time.Hour)db.SetConnMaxIdleTime(time.Hour)// 自动迁移if err := DB.AutoMigrate(&model.User{}); err != nil {log.Panicf("自动迁移失败: %s", err)}
}
该目录主要存放配置信息,这里主要是设置gorm
的连接配置,定义好模型后还可以自动迁移,相比较Laravel
框架的迁移方便多了。
controller
目录
定义用户控制器,与路由直接绑定:
func GetAllUser(c *gin.Context) {pagination := utils.GeneratePaginationFromRequest(c)// 这里可以组装查询条件var user model.Userusers, err := dao.GetAllUsers(&user, &pagination)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err,})return}c.JSON(http.StatusOK, gin.H{"data": users,})
}
dao
目录
直接查询数据库,这样可以保证Model
层的简洁,一般在Laravel
框架我只在Model
层定义关联关系,查询都是放在Dao
层,Spring Boot
框架也是如此设计。
func GetAllUsers(user *model.User, pagination *model.Pagination) (users []model.User, err error) {// 分页查询offset := (pagination.Page - 1) * pagination.Limiterr = config.DB.Where(user).Limit(pagination.Limit).Offset(offset).Order(pagination.Sort).Find(&users).Errorreturn
}
model
目录
page
文件
定义分页的结构体:
type Pagination struct {Limit int `json:"limit" form:"limit" uri:"limit"`Page int `json:"page" form:"page" uri:"page"`Sort string `json:"sort" form:"sort" uri:"sort"`
}
user
文件
定义用户模型:
type User struct {ID uint `gorm:"primaryKey" json:"id"`Name string `gorm:"varchar(20);comment:'用户名称'" json:"name"`Email string `gorm:"comment:'邮箱'" json:"email"`CreatedAt time.Time `gorm:"autoCreateTime;comment:'创建时间'" json:"created_at"`UpdatedAt time.Time `gorm:"autoUpdateTime;comment:'操作事件'" json:"updated_at]"`
}
routes
目录
定义路由规则:
func SetUpRouter() *gin.Engine {r := gin.Default()user := r.Group("/user"){user.GET("all", controller.GetAllUser)}return r
}
utils
目录
辅助函数,类似Laravel
框架的helper
:
func GeneratePaginationFromRequest(c *gin.Context) (pagination model.Pagination) {if err := c.ShouldBind(&pagination); err != nil {fmt.Printf("参数绑定错误:%s\n", err)}// 校验参数if pagination.Limit < 0 {pagination.Limit = 2}if pagination.Page < 1 {pagination.Page = 1}if len(pagination.Sort) == 0 {pagination.Sort = "created_at desc"}return
}
测试sql
insert into users (`name`, `email`, `created_at`, `updated_at`) values ("chris", "aaaa@chris.com", "2022-07-13 18:00:00", "2022-07-13 18:00:00");
insert into users (`name`, `email`, `created_at`, `updated_at`) values ("张三", "zhangsan@chris.com", "2022-07-13 18:00:00", "2022-07-13 18:00:00");
insert into users (`name`, `email`, `created_at`, `updated_at`) values ("李四", "lisi@chris.com", "2022-07-13 18:00:00", "2022-07-13 18:00:00");
insert into users (`name`, `email`, `created_at`, `updated_at`) values ("王五", "wangwu@chris.com", "2022-07-13 18:00:00", "2022-07-13 18:00:00");
main
函数
上述代码都完成后,就可以运行测试:
func main() {router := routes.SetUpRouter()err := router.Run(":8080")if err != nil {panic(err)}
}
运行结果
gin + grom 实现分页功能相关推荐
- django自带的分页功能
django自带的分页功能 django中自带的分页功能有缺陷,但是也是一种思路,所以在下做一个整理,方便以后使用,还有服务各位小伙伴. django视图部分的代码.(注释才是重点) from dja ...
- ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
关键字:DataGrid.存储过程.分页 出自: http://blog.csdn.net/yzx110/archive/2004/08/18/78525.aspx 摘要:在最进的一个项目中因为一个管 ...
- hibernate和struts2实现分页功能
1.DAO层接口的设计,定义一个PersonDAO接口,里面声明了两个方法: public interface PersonDAO {public List<Person> queryBy ...
- 分页技巧_实现第一个分页功能(回复列表中的分页)
分页技巧_实现第一个分页功能(回复列表中的分页) ======================================== 假设共25条数据,每页显示10条,则共3页 first max - ...
- jsp自定义图文新闻列表标签结合ssh2,带分页功能
jsp自定义图文新闻列表标签结合ssh2,带分页功能(欢迎大家讨论指点,共同进步) 1.service层 (模拟返回数据) package com.mingda.service.impl;import ...
- oracle接收输入参数,Oracle带输入输出参数存储过程(包括sql分页功能)
记录一下,免得以后忘记了又要到处去找. begin /*这里不能直接执行select语句但可以直接执行update.delete.insert语句*/ end里面不能接执行select语句,声明会话级 ...
- 【SSH项目实战】国税协同平台-26.分页功能编写
可以看到,我们之前的用户管理.角色管理和信息发布管理的列表下均有这些东西: 总共1条记录,当前第 1 页,共 1 页 上一页 下一页 到 这个就是美工留给我们做分页的,我们接下来就以信息发布管 ...
- [置顶] 分步实现具有分页功能的自定义DataList控件【附源代码】
一.控件也是类 [效果] [操作步骤] 1. 新建网站Web 2. 添加类CustomDataList.cs(系统会提示你把类建在App_Code文件夹中),代码如下: using System; ...
- 使用hibernate和struts2实现分页功能
想着每天能学个新东西,今天准备了这个hibernate+struts2实现页面的分页功能,在这里,首先要感谢 http://www.blogjava.net/rongxh7/archive/2008/ ...
最新文章
- markdown语法进阶
- Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。
- 应用程序下载地址汇总
- 使用RoundedBitmapDrawable快速生成圆角和圆形图片
- bzoj3522 Hotel
- 视频清晰度、色偏以及亮度异常检测
- MySQL模糊查询—in关键字
- Apache java文件比对,Java Apache Commons的字符串比较
- java store()_Java.util.Properties.store()
- python获取窗口句柄_Python+selenium 获取浏览器窗口坐标、句柄的方法
- 3DS烧录卡?ACE3DS PRO?这是个闹剧(关于此事的新闻集合)
- pdf转换器下载使用步骤
- Openwrt:创建编译IPK软件包
- POST参数转为DICT
- (十三)【数电】(半导体存储电路)同步(电平)触发器|边沿触发的触发器
- 认识PASCAL VOC数据集(目标检测)
- 常用计算机 启动bios,常见电脑进入bios的方法
- 华为WEB前端全栈成长计划招募
- 2019最应该投资什么?是你明年的北大核心
- van-icon自定义图标的引入
热门文章
- Oracle批量数据处理
- #444 – DockPanel 中的子元素不一定一直都是平铺显示(Children of DockPanel Don’t Always Have to be Stretched)
- Wasm 玩出花?在浏览器中运行虚拟机!
- python画热力图(相关系数矩阵图)
- VMware-虚拟机-Linux系统(常用命令)
- Linux: Usage中[],<>的含义
- Mercurial ---hgignore
- TypeScript-Int64实现
- 发票查验真伪的重要性
- 1024开发者盛宴之Java专家问答专场活动说明