项目介绍

使用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 实现分页功能相关推荐

  1. django自带的分页功能

    django自带的分页功能 django中自带的分页功能有缺陷,但是也是一种思路,所以在下做一个整理,方便以后使用,还有服务各位小伙伴. django视图部分的代码.(注释才是重点) from dja ...

  2. ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页

    关键字:DataGrid.存储过程.分页 出自: http://blog.csdn.net/yzx110/archive/2004/08/18/78525.aspx 摘要:在最进的一个项目中因为一个管 ...

  3. hibernate和struts2实现分页功能

    1.DAO层接口的设计,定义一个PersonDAO接口,里面声明了两个方法: public interface PersonDAO {public List<Person> queryBy ...

  4. 分页技巧_实现第一个分页功能(回复列表中的分页)

    分页技巧_实现第一个分页功能(回复列表中的分页) ======================================== 假设共25条数据,每页显示10条,则共3页 first  max - ...

  5. jsp自定义图文新闻列表标签结合ssh2,带分页功能

    jsp自定义图文新闻列表标签结合ssh2,带分页功能(欢迎大家讨论指点,共同进步) 1.service层 (模拟返回数据) package com.mingda.service.impl;import ...

  6. oracle接收输入参数,Oracle带输入输出参数存储过程(包括sql分页功能)

    记录一下,免得以后忘记了又要到处去找. begin /*这里不能直接执行select语句但可以直接执行update.delete.insert语句*/ end里面不能接执行select语句,声明会话级 ...

  7. 【SSH项目实战】国税协同平台-26.分页功能编写

    可以看到,我们之前的用户管理.角色管理和信息发布管理的列表下均有这些东西: 总共1条记录,当前第 1 页,共 1 页    上一页  下一页 到 这个就是美工留给我们做分页的,我们接下来就以信息发布管 ...

  8. [置顶] 分步实现具有分页功能的自定义DataList控件【附源代码】

    一.控件也是类 [效果] [操作步骤] 1.  新建网站Web 2.  添加类CustomDataList.cs(系统会提示你把类建在App_Code文件夹中),代码如下: using System; ...

  9. 使用hibernate和struts2实现分页功能

    想着每天能学个新东西,今天准备了这个hibernate+struts2实现页面的分页功能,在这里,首先要感谢 http://www.blogjava.net/rongxh7/archive/2008/ ...

最新文章

  1. markdown语法进阶
  2. Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。
  3. 应用程序下载地址汇总
  4. 使用RoundedBitmapDrawable快速生成圆角和圆形图片
  5. bzoj3522 Hotel
  6. 视频清晰度、色偏以及亮度异常检测
  7. MySQL模糊查询—in关键字
  8. Apache java文件比对,Java Apache Commons的字符串比较
  9. java store()_Java.util.Properties.store()
  10. python获取窗口句柄_Python+selenium 获取浏览器窗口坐标、句柄的方法
  11. 3DS烧录卡?ACE3DS PRO?这是个闹剧(关于此事的新闻集合)
  12. pdf转换器下载使用步骤
  13. Openwrt:创建编译IPK软件包
  14. POST参数转为DICT
  15. (十三)【数电】(半导体存储电路)同步(电平)触发器|边沿触发的触发器
  16. 认识PASCAL VOC数据集(目标检测)
  17. 常用计算机 启动bios,常见电脑进入bios的方法
  18. 华为WEB前端全栈成长计划招募
  19. 2019最应该投资什么?是你明年的北大核心
  20. van-icon自定义图标的引入

热门文章

  1. Oracle批量数据处理
  2. #444 – DockPanel 中的子元素不一定一直都是平铺显示(Children of DockPanel Don’t Always Have to be Stretched)
  3. Wasm 玩出花?在浏览器中运行虚拟机!
  4. python画热力图(相关系数矩阵图)
  5. VMware-虚拟机-Linux系统(常用命令)
  6. Linux: Usage中[],<>的含义
  7. Mercurial ---hgignore
  8. TypeScript-Int64实现
  9. 发票查验真伪的重要性
  10. 1024开发者盛宴之Java专家问答专场活动说明