8.Gin 自定义控制器

前言

在上一篇路由文件抽离的过程中,我们发现接口的业务逻辑还写在路由配置中,如下:

1696385129126

但是如果业务逻辑比较多,如果写在路由之中,肯定不合适。

我们可以将业务逻辑抽离,单独再写一个Controller的模块。

自定义控制器

下面我们自定义一个 AdminController 模块来作为示例。

新增 controller/admin/AdminController.go

新增 AdminController 模块,主要用于实现接口的业务逻辑。

packageadminimport("github.com/gin-gonic/gin""net/http")//AdminController定义AdminControllertypeAdminControllerstruct{}//Index定义AdminController的首页func(cAdminController)Index(context*gin.Context){context.HTML(http.StatusOK,"admin/index.html",gin.H{"title":"admin前台首页"})}func(cAdminController)AdminList(context*gin.Context){context.JSON(http.StatusOK,gin.H{"message":"AdminList",})}func(cAdminController)AddAdmin(context*gin.Context){context.JSON(http.StatusOK,gin.H{"message":"AddAdmin",})}func(cAdminController)UpdateAdmin(context*gin.Context){context.JSON(http.StatusOK,gin.H{"message":"UpdateAdmin",})}func(cAdminController)DeleteAdmin(context*gin.Context){context.JSON(http.StatusOK,gin.H{"message":"DeleteAdmin",})}

配置路由

1696392231927
packageroutesimport("github.com/gin-gonic/gin""go-gin-pratice/controller/admin")//AdminRouterInitAdmin路由分组funcAdminRouterInit(r*gin.Engine){//设置admin路由adminRouter:=r.Group("admin"){adminRouter.GET("index",admin.AdminController{}.Index)adminRouter.GET("list",admin.AdminController{}.AdminList)adminRouter.POST("add",admin.AdminController{}.AddAdmin)adminRouter.PUT("update",admin.AdminController{}.UpdateAdmin)adminRouter.DELETE("delete",admin.AdminController{}.DeleteAdmin)adminRouter.GET("goods",admin.GoodsController{}.Goods)}}

在这里主要就是使用 admin.AdminController{}.Index 来替代原来的函数逻辑。

测试接口

访问 {{LocalUrl}}:8000/admin/list

1696392307058

访问 {{LocalUrl}}:8000/admin/add

1696392349458

经过测试,接口访问都是正常的。

控制器的继承

如果控制器有多个,并且有些公共方法需要实现,那么这时候我们可以写一个公共的控制器 BaseController,然后其他 Controller 继承即可。

新建controller/base/BaseController.go

新增公共控制器,编写公共方法:

  • 成功的结果返回

  • 失败的结果返回

1696392950440
packagedefaultcontrollerimport("github.com/gin-gonic/gin""net/http")//BaseController定义公共控制器typeBaseControllerstruct{}//Success成功的结果返回func(cBaseController)Success(context*gin.Context,msgstring,dataany){context.JSON(http.StatusOK,gin.H{"message":msg,"data":data,})}//失败的结果返回func(cBaseController)Error(context*gin.Context,errerror){context.JSON(http.StatusBadRequest,gin.H{"error":err.Error(),})}

继承 BaseController,并使用公共方法

1696393029568
packageadminimport("github.com/gin-gonic/gin"defaultcontroller"go-gin-pratice/controller/base""net/http")//AdminController定义AdminControllertypeAdminControllerstruct{//继承公共控制器defaultcontroller.BaseController}func(cAdminController)AdminList(context*gin.Context){//使用公共方法Successc.Success(context,"AdminList",nil)}

测试接口

访问 {{LocalUrl}}:8000/admin/list

1696393064033