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

8.Gin 自定义控制器

8.Gin 自定义控制器

前言

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

1fbb9d4b2b32754b82dc4f7bec282f92.png
1696385129126

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

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

自定义控制器

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

新增 controller/admin/AdminController.go

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

package adminimport ("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",})
}

配置路由

5e38759322ac641445e24c8d8c672f1f.png
1696392231927
package routesimport ("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

27d6c5b825ad2f96805b9d1ce5c83c8f.png
1696392307058

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

1b7402487ac75a8b38fead53c9ffdbe0.png
1696392349458

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

控制器的继承

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

新建controller/base/BaseController.go

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

  • 成功的结果返回

  • 失败的结果返回

ed7ea3ab1306ef39d114232ab3335300.png
1696392950440
package defaultcontrollerimport ("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,并使用公共方法

ec020c38403b7aef2c10d975e878794f.png
1696393029568
package adminimport ("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) {// 使用公共方法Successc.Success(context, "AdminList", nil)
}

测试接口

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

3fee4e9927a9dd24c50da64f732c2275.png
1696393064033

相关文章:

  • Flutter笔记:使用相机
  • Linux应用开发基础知识——网络通信编程(九)
  • Debian 12 / Ubuntu 22.04 安装 Docker 以及 Docker Compose 教程
  • 容器 - 八大架构的演进
  • 深度学习中的图像处理(基本介绍+示例代码)
  • Python---函数的应用案例(多个)
  • Laravel/Lumen 任务调度简易入门说明
  • Windows系统搭建VisualSVN服务并结合内网穿透实现公网访问
  • 【C++进阶之路】第九篇:特殊类设计
  • STM32 寄存器配置笔记——系统时钟配置 HSE as PLL
  • web:[GXYCTF2019]禁止套娃
  • gwas数据获取如何获取完整的GWAS summary数据(1)------GWAS catalog数据库
  • 【JavaEE初阶】 JavaScript基础语法——贰
  • R语言——taxize(第三部分)
  • Linux 常用命令学习笔记
  • ES2017异步函数现已正式可用
  • js数组之filter
  • python3 使用 asyncio 代替线程
  • spring boot下thymeleaf全局静态变量配置
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Theano - 导数
  • Tornado学习笔记(1)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 经典排序算法及其 Java 实现
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 算法-插入排序
  • 移动端唤起键盘时取消position:fixed定位
  • 容器镜像
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • $ git push -u origin master 推送到远程库出错
  • $.ajax()
  • (6)设计一个TimeMap
  • (arch)linux 转换文件编码格式
  • (NSDate) 时间 (time )比较
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • .dwp和.webpart的区别
  • .NET : 在VS2008中计算代码度量值
  • .net core 依赖注入的基本用发
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .Net接口调试与案例
  • /var/spool/postfix/maildrop 下有大量文件
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @JSONField或@JsonProperty注解使用
  • @Transactional 竟也能解决分布式事务?
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [100天算法】-二叉树剪枝(day 48)
  • [1127]图形打印 sdutOJ
  • [c#基础]DataTable的Select方法
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [ITIL学习笔记]之事件管理(2)
  • [javaSE] GUI(Action事件)