8.Gin 自定义控制器

8.Gin 自定义控制器

前言

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

1fbb9d4b2b32754b82dc4f7bec282f92.png
1696385129126

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

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

自定义控制器

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

新增 controller/admin/AdminController.go

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

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

配置路由

5e38759322ac641445e24c8d8c672f1f.png
1696392231927
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

27d6c5b825ad2f96805b9d1ce5c83c8f.png
1696392307058

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

1b7402487ac75a8b38fead53c9ffdbe0.png
1696392349458

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

控制器的继承

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

新建controller/base/BaseController.go

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

  • 成功的结果返回

  • 失败的结果返回

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

ec020c38403b7aef2c10d975e878794f.png
1696393029568
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

3fee4e9927a9dd24c50da64f732c2275.png
1696393064033

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/174645.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python实战—核心基础4(超市购物小票随机抽奖程序) lv1

目录 一、核心代码解释 二、代码 三、运行截图 一、核心代码解释 1、random() 函数 描述 random() 方法返回随机生成的一个实数,它在[0,1)范围内。 语法 以下是 random() 方法的语法: import randomrandom.random() 注意:random()是不能直接访问…

【高性能计算】CUDA,OpenCL,FPGA 加速,MPI

OpenCL OpenCL(Open Computing Language)是一种跨平台的GPU加速技术,由Khronos Group开发。OpenCL允许开发人员在不同的硬件平台上编写并行计算应用程序。 OpenCL使用C语言的子集来编写应用程序,并提供了一组API,可以…

Keil MDK 安装

0 Preface/Foreword 1 下载和安装 官网:Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families. Keil MDK 下载链接:Keil MDK 1.1 下载 根据需求下载对应的Keil MDK edition。 不同的editions包括 …

TensorFlow实战教程(一)-TensorFlow环境部署

从本篇文章开始,作者正式开始研究Python深度学习、神经网络及人工智能相关知识。第一篇文章主要讲解神经网络基础概念,同时讲解TensorFlow2.0的安装过程及基础用法,主要结合作者之前的博客和"莫烦大神"的视频介绍,后面随着深入会讲解具体的项目及应用。基础性文章…

Python的安装及其python程序生成exe可执行程序

Python是一种高级编程语言,由Guido van Rossum在1989年12月首次发布。它具有简单易学、易读、易写的语法和强大的动态类型和垃圾回收机制。Python解释器是自由且开放源代码的软件,可以在各种操作系统(如Linux、Windows、macOS等)上…

基于Bagging集成学习方法的情绪分类预测模型研究(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

机器学习笔记 - 创建CNN + RNN + CTC损失的模型来识别图像中的文本

我们将创建一个具有CTC损失的卷积循环神经网络来实现我们的OCR识别模型。 一、数据集 我们将使用 Visual Geometry Group 提供的数据。 Visual Geometry Group - University of OxfordComputer Vision group from the University of Oxfordhttps://www.robots.ox.ac.uk/~vgg/d…

chromium114添加新的语言国际化支持

一、需求说明 需要chromium114支持新语言体系,例如藏语,蒙古语,苗语等 二、操作步骤 1. build/config/locales.gni修改 在all_chrome_locales变量中添加新的语种标识,如下图。 2. 添加编译文件,告诉浏览器在编译时需要加载和输出那些文件 尝试编译出现错误一提示。需要…

Linux socket编程(5):三次握手和四次挥手分析和SIGPIPE信号的处理

在我之前写的Wireshark抓包:理解TCP三次握手和四次挥手过程中,通过抓包分析了TCP传输的三次握手和四次挥手的过程。在这一节中,将分析在Linux中的三次握手和四次挥手的状态和过程,另外还有一个在我们编程过程中值得注意的SIGPIPE信…

《微信小程序开发从入门到实战》学习二十四

3.3.12开发创建投票多选投票页面 创建投票多选投票页面和创建单选投票页面没有区别,唯一区别仅在于向服务端发送数据时,告诉服务器这个投票是什么类型的投票。这个类型用三种数据类型表示都可以,分别如下所示: multiple:true/fa…

【计算机网络笔记】路由算法之距离向量路由算法

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

软件设计中如何画各类图之一实体关系图(ER图):数据库设计与分析的核心工具

目录 1 前言2 符号及作用:3 绘制清晰的ER图步骤4 实体关系图的用途5 使用场景6 实际应用场景举例7 结语 1 前言 当谈到数据库设计与分析的核心工具时,实体关系图(ER图)无疑是其中最重要的一环。在软件开发、信息管理以及数据库设…

从大模型到内容生成,初窥门径的AI新次元

视频云AI进化新纪元。 最近Gartner发布2024年十大战略技术趋势,AI显然成为其背后共同的主题。全民化的生成式人工智能、AI增强开发、智能应用......我们正在进入一个AI新纪元。 从ChatGPT的横空出世,到开发者大会的惊艳亮相,OpenAI以一己之力…

909-2015-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 线性表使用公式化描述方式存储。编写一个函数&#xff0c;从一给定的线性表A中删除值在x ~ y&#xff08;x到y&#xff0c;x<y&#xff09;之间的所有元素&#xff0c;要求以较高的效率来实现。提示&#…

Redis(事务和持久化)(很重要!)

事务的定义&#xff1a; Redis中的事务是指一组命令的集合&#xff0c;这些命令可以在一个原子操作中执行。在Redis中&#xff0c;可以使用MULTI命令开始一个事务&#xff0c;然后使用EXEC命令来执行事务中的所有命令&#xff0c;或者使用DISCARD命令来取消事务。事务可以确保…

Python+Qt虹膜检测识别

程序示例精选 PythonQt虹膜检测识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonQt虹膜检测识别》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推…

从0开始学习JavaScript--JavaScript类型化数组进阶

前面的文章&#xff0c;已经介绍了JavaScript类型化数组的基本概念、常见类型和基本操作。在本文中&#xff0c;我们将深入探讨类型化数组的一些进阶特性&#xff0c;包括共享内存、大端小端字节序、以及类型化数组与普通数组之间的转换&#xff0c;通过更丰富的示例代码&#…

读像火箭科学家一样思考笔记05_思想实验

1. 思想实验室 1.1. 思想实验至少可以追溯到古希腊时期 1.1.1. 从那时起&#xff0c;它们就跨越各个学科&#xff0c;在哲学、物理学、生物学、经济学等领域取得重大突破 1.1.2. 它们为火箭提供动力&#xff0c;推翻政府&#xff0c;发展进化生物学&#xff0c;解开宇宙的奥…

算法的奥秘:常见的六种算法(算法导论笔记2)

算法的奥秘&#xff1a;种类、特性及应用详解&#xff08;算法导论笔记1&#xff09; 上期总结算法的种类和大致介绍&#xff0c;这一期主要讲常见的六种算法详解以及演示。 排序算法&#xff1a; 排序算法是一类用于对一组数据元素进行排序的算法。根据不同的排序方式和时间复…

弄懂Rust编程中的Trait

1.定义 trait trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共享的行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。 一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话&#xff…