8.Gin 自定义控制器
前言
在上一篇路由文件抽离的过程中,我们发现接口的业务逻辑还写在路由配置中,如下:
1696385129126
但是如果业务逻辑比较多,如果写在路由之中,肯定不合适。
我们可以将业务逻辑抽离,单独再写一个Controller的模块。
自定义控制器
下面我们自定义一个 AdminController
模块来作为示例。
新增 controller/admin/AdminController.go
新增 AdminController
模块,主要用于实现接口的业务逻辑。
package admin
import (
"github.com/gin-gonic/gin"
"net/http"
)
// AdminController 定义AdminController
type AdminController struct {
}
// Index 定义AdminController的首页
func (c AdminController) Index(context *gin.Context) {
context.HTML(http.StatusOK, "admin/index.html", gin.H{"title": "admin前台首页"})
}
func (c AdminController) AdminList(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"message": "AdminList",
})
}
func (c AdminController) AddAdmin(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"message": "AddAdmin",
})
}
func (c AdminController) UpdateAdmin(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"message": "UpdateAdmin",
})
}
func (c AdminController) DeleteAdmin(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"message": "DeleteAdmin",
})
}
配置路由
代码语言:javascript复制package routes
import (
"github.com/gin-gonic/gin"
"go-gin-pratice/controller/admin"
)
// AdminRouterInit Admin路由分组
func AdminRouterInit(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
代码语言:javascript复制package defaultcontroller
import (
"github.com/gin-gonic/gin"
"net/http"
)
// BaseController 定义公共控制器
type BaseController struct {
}
// Success 成功的结果返回
func (c BaseController) Success(context *gin.Context, msg string, data any) {
context.JSON(http.StatusOK, gin.H{
"message": msg,
"data": data,
})
}
// 失败的结果返回
func (c BaseController) Error(context *gin.Context, err error) {
context.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
}
继承 BaseController
,并使用公共方法
1696393029568
代码语言:javascript复制package admin
import (
"github.com/gin-gonic/gin"
defaultcontroller "go-gin-pratice/controller/base"
"net/http"
)
// AdminController 定义AdminController
type AdminController struct {
// 继承公共控制器
defaultcontroller.BaseController
}
func (c AdminController) AdminList(context *gin.Context) {
// 使用公共方法Success
c.Success(context, "AdminList", nil)
}
测试接口
访问 {{LocalUrl}}:8000/admin/list
1696393064033