7.Gin 路由详解 - 路由分组 - 路由文件抽离
前言
在前面的示例中,我们直接将路由的定义全部写在 main.go
文件中,如果后面 路由越来越多,那将会越来越不好管理。
所以,下一步我们应该考虑将路由进行分组管理,并且将其抽离 main.go
的文件。
路由分组
我们可以将相同模块路径的作为一组,将路由进行分组处理。
// 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
访问
admin
组的index
路由:http://localhost:8000/admin/index
从效果来看,我们可以将相同模块的路由进行分组,但是还是写在main.go
代码文件中,下面我们将路由的内容抽离到其他文件。
路由文件抽离
不管是路由分组、还是普通的路由,我们都可以通过单独编写函数,抽离到其他模块去,避免路由代码全部写在 main.go
代码中。
下面我们来简单示例一下。
新建 routes 文件夹,并且按照不同的模块,创建不同的路由管理文件
以 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
初始化路由
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")
}
测试效果
抽离了路由代码后,接口还是可以正常访问的,说明路由初始化正常。