前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8.Gin 自定义控制器

8.Gin 自定义控制器

作者头像
Devops海洋的渔夫
发布2023-11-20 14:33:37
2210
发布2023-11-20 14:33:37
举报
文章被收录于专栏:Devops专栏

8.Gin 自定义控制器

前言

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

1696385129126

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

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

自定义控制器

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

新增 controller/admin/AdminController.go

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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 8.Gin 自定义控制器
    • 前言
      • 自定义控制器
        • 新增 controller/admin/AdminController.go
        • 配置路由
        • 测试接口
      • 控制器的继承
        • 新建controller/base/BaseController.go
        • 继承 BaseController,并使用公共方法
        • 测试接口
    相关产品与服务
    腾讯云服务器利旧
    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档