当前位置: 首页 > news >正文

7.Gin 路由详解 - 路由分组 - 路由文件抽离

7.Gin 路由详解 - 路由分组 - 路由文件抽离

前言

在前面的示例中,我们直接将路由的定义全部写在 main.go 文件中,如果后面 路由越来越多,那将会越来越不好管理。

所以,下一步我们应该考虑将路由进行分组管理,并且将其抽离 main.go的文件。

154c7febc20b78ee7e19061b8a0696e6.png
1696330394289

路由分组

我们可以将相同模块路径的作为一组,将路由进行分组处理。

71fdc2716e002fef2aff918712422b08.png
1696330862506
// 2.1 路由分组
// 设置根路径的路由分组
defaultRouter := r.Group("default/")
{// c.HTML 渲染模板defaultRouter.GET("index", func(c *gin.Context) {// 创建对象userInfo := UserInfo{Name:   "李白",Age:    30,Gender: "male",}// 渲染模板c.HTML(http.StatusOK, "default/index.html", gin.H{"title":    "default前台首页","userInfo": userInfo,"score":    60,"hobby":    []string{"吃饭", "睡觉", "写代码"},"now":      time.Now(),"str1":     "hello","str2":     "world",})})
}adminGroup := r.Group("admin")
{adminGroup.GET("index", func(c *gin.Context) {c.HTML(http.StatusOK, "admin/index.html", gin.H{"title": "admin前台首页"})})adminGroup.GET("goods", func(c *gin.Context) {c.HTML(http.StatusOK, "admin/goods.html", gin.H{"title": "商品页面"})})
}

为了简单示例,我只是简单分了两个路由组,一个是 default ,另一个是 admin 的路由组。

测试如下:

  • 访问 default组的 index 路由:http://localhost:8000/default/index

8fc3be3365946a906c734eb371d0c8e6.png
1696330950278
  • 访问 admin组的index路由:http://localhost:8000/admin/index

763164cc4ac8012f18adf6cfcfb46983.png
1696330979558

从效果来看,我们可以将相同模块的路由进行分组,但是还是写在main.go代码文件中,下面我们将路由的内容抽离到其他文件。

路由文件抽离

不管是路由分组、还是普通的路由,我们都可以通过单独编写函数,抽离到其他模块去,避免路由代码全部写在 main.go 代码中。

下面我们来简单示例一下。

新建 routes 文件夹,并且按照不同的模块,创建不同的路由管理文件
0b59b3ad7a94514a6fe6057976da7c8f.png
1696331864037

AdminRouterInit 方法作为示例:

package routesimport ("github.com/gin-gonic/gin""net/http"
)// AdminRouterInit Admin路由分组
func AdminRouterInit(r *gin.Engine) {// 设置admin路由adminRouter := r.Group("admin"){adminRouter.GET("index", func(c *gin.Context) {c.HTML(http.StatusOK, "admin/index.html", gin.H{"title": "admin前台首页"})})adminRouter.GET("goods", func(c *gin.Context) {c.HTML(http.StatusOK, "admin/goods.html", gin.H{"title": "商品页面"})})}
}

在上面通过函数入参,将  r *gin.Engine 传入函数方法中,然后用来定义路由信息。

main.go 初始化路由
22e16c9325e769e185af9d3448489b6d.png
1696331972771
package mainimport ("fmt""github.com/gin-gonic/gin""go-gin-pratice/routes""html/template""time"
)// 定义时间格式转换的方法
func formatAsDate(t time.Time) string {year, month, day := t.Date()return fmt.Sprintf("%d/%02d/%02d", year, month, day)
}// 定义打印信息的方法
func printlnMsg(str1 string, str2 string) string {return fmt.Sprintf("%s.....%s", str1, str2)
}func main() {// 1.创建路由r := gin.Default()//注册全局模板函数 注意顺序,注册模板函数需要在加载模板上面r.SetFuncMap(template.FuncMap{"formatDate": formatAsDate,"printlnMsg": printlnMsg,})// 加载模板文件r.LoadHTMLGlob("templates/**/*")// 定义静态文件路径r.Static("/static", "static")// 2.绑定路由规则,执行的函数// gin.Context,封装了request和response// 2.1 初始化路由routes.DefaultRouterInit(r)routes.AdminRouterInit(r)routes.RootRouterInit(r)// 3.监听端口,默认在8080// 监听并在 0.0.0.0:8080 上启动服务// Run("里面不指定端口号默认为8080")r.Run(":8000")
}
测试效果
c5b3e2467bb4202ba0b3da6ddbc97f49.png
1696332022586

抽离了路由代码后,接口还是可以正常访问的,说明路由初始化正常。

相关文章:

  • Raspberry Pi 5 新一代单板计算机:树莓派5代 (介绍、入门、解疑)
  • el-popover和el-tooltip样式修改(普通的组件样式修改方法,对popover是不生效的)
  • 【Android】画面卡顿优化列表流畅度六(终篇)
  • pdf转png工具类
  • 【力扣面试经典150题】(链表)K 个一组翻转链表
  • bug场景记录
  • C/C++ 实现Windows注册表操作
  • 华为obs上传下载-Java版 2023-11-23
  • vue3父组件提交校验多个子组件
  • Python通过selenium调用IE11浏览器报错解决方法
  • 网络知识学习(笔记二)
  • KaiwuDB 监控组件及辅助 SQL 调优介绍
  • 04.webpack中css的压缩和抽离
  • 数据结构【栈】
  • Boost获取当前时间并格式化为字符串
  • [译] React v16.8: 含有Hooks的版本
  • 【译】理解JavaScript:new 关键字
  • Bootstrap JS插件Alert源码分析
  • classpath对获取配置文件的影响
  • CSS相对定位
  • Django 博客开发教程 8 - 博客文章详情页
  • emacs初体验
  • Git初体验
  • Java 23种设计模式 之单例模式 7种实现方式
  • js 实现textarea输入字数提示
  • js学习笔记
  • linux学习笔记
  • Selenium实战教程系列(二)---元素定位
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 从重复到重用
  • 理解在java “”i=i++;”所发生的事情
  • 让你的分享飞起来——极光推出社会化分享组件
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • Hibernate主键生成策略及选择
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • Python 之网络式编程
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #Linux(Source Insight安装及工程建立)
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $.ajax,axios,fetch三种ajax请求的区别
  • (windows2012共享文件夹和防火墙设置
  • (转)一些感悟
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .Net 6.0 处理跨域的方式
  • .NET MVC之AOP
  • .net 生成二级域名
  • .NET 中让 Task 支持带超时的异步等待
  • [ C++ ] STL---stack与queue
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [Angular 基础] - 表单:响应式表单