使用 gin-api-mono 创建简单的 TODO 服务

 更新时间:2026年07月08日 09:47:58   作者:-睡到自然醒~  
本文主要介绍了使用 gin-api-mono 创建简单的 TODO 服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

介绍

首先介绍一下 gin-api-mono 这个项目,这个项目是由 go-gin-api 作者基于用户的需求衍生出来的一个项目。因为有些用户觉得 go-gin-api 是一个前后端都有的一个开源项目,对于很多用户来说,前端部分是不需要的,所以作者看到这层需求,从而将后端代码抽离出来成为 gin-api-mono 这个项目。

运行

现在我们基于 gin-api-mono 的 README.md 来进行一个 Quick Start:

首先我们创建一个 mysql database 以及一些表结构、数据等。

-- 1. 创建数据库 --
CREATE database gin_api_mono;
USE gin_api_mono;
-- 2. 创建数据表 --
CREATE TABLE `admin` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名',
  `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员表';
-- 3. 初始化数据 --
INSERT INTO `admin` (`id`, `username`, `mobile`) VALUES
(1, '张三', '13888888888'),
(2, '李四', '13888888888'),
(3, '赵五', '13888888888');

在 dev 配置中配置上以下信息:

[mysql.read]
addr = '127.0.0.1:3306'
name = 'gin_api_mono'
pass = '123456'
user = 'root'
[mysql.write]
addr = '127.0.0.1:3306'
name = 'gin_api_mono'
pass = '123456'
user = 'root'

到此为止,我们已经成功配置好 gin-api-mono 的项目配置了,现在我们开始执行程序:

go run main.go -env dev

输出如下即成功:

 ██████╗ ██╗███╗   ██╗       █████╗ ██████╗ ██╗      ███╗   ███╗ ██████╗ ███╗   ██╗ ██████╗ 
██╔════╝ ██║████╗  ██║      ██╔══██╗██╔══██╗██║      ████╗ ████║██╔═══██╗████╗  ██║██╔═══██╗
██║  ███╗██║██╔██╗ ██║█████╗███████║██████╔╝██║█████╗██╔████╔██║██║   ██║██╔██╗ ██║██║   ██║
██║   ██║██║██║╚██╗██║╚════╝██╔══██║██╔═══╝ ██║╚════╝██║╚██╔╝██║██║   ██║██║╚██╗██║██║   ██║
╚██████╔╝██║██║ ╚████║      ██║  ██║██║     ██║      ██║ ╚═╝ ██║╚██████╔╝██║ ╚████║╚██████╔╝
 ╚═════╝ ╚═╝╚═╝  ╚═══╝      ╚═╝  ╚═╝╚═╝     ╚═╝      ╚═╝     ╚═╝ ╚═════╝ ╚═╝  ╚═══╝ ╚═════╝

我们来看看对应的 swagger 文档:

我们使用 postman 调用一下接口看看:

目前来看,都是非常顺畅且快速。这对新手来说是非常友好的一个开始,有了正反馈,才会有继续下去的动力。
下面我们快速写一个 TODO List 的 DEMO 看看,检验一下该项目是否能达到快速开发的目标。

TODO List

数据库

首先我们还是先配置好我们的数据结构,简单处理,用户我们就用上面的管理员来表示,简单创建一个 todo 表:

CREATE TABLE `todo` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
    `user_id` int(11) NOT NULL COMMENT '用户ID',
    `title` varchar(32) NOT NULL COMMENT '标题',
    `desc` varchar(128) NOT NULL DEFAULT '' COMMENT '描述',
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

路由

我们先简单的定义两个简单的路由:

  • [POST] /api/todo: 创建一个 todo。
  • [POST] /api/todo/update: 修改某个 todo。
    编写对应的 router:
	todoHandler := todo.New(logger, db)
	todoRouter := mux.Group("/api")
	{
		// 创建一个 todo
		todoRouter.POST("/todo", todoHandler.Create())
		// 修改某个 todo
		todoRouter.POST("/todo/update", todoHandler.Update())
	}

服务

现在我们来编写对应的 handler func。

var _ Handler = (*handler)(nil)

type Handler interface {
	i()

	// Create 创建一个 todo
	// @Tags API.todo
	// @Router /api/todo [post]
	Create() core.HandlerFunc

	// Update 修改某个 todo
	// @Tags API.todo
	// @Router /api/todo/{id} [post]
	Update() core.HandlerFunc
}

type handler struct {
	logger *zap.Logger
	db     mysql.Repo
}

func New(logger *zap.Logger, db mysql.Repo) Handler {
	return &handler{
		logger: logger,
		db:     db,
	}
}

func (h *handler) i() {}

进而实现对应的接口方法,下面只贴出部分代码:

// Create 创建一个 todo
// @Summary 创建一个 todo
// @Description 创建一个 todo
// @Tags API.todo
// @Accept json
// @Produce json
// @Param todo body createRequest true "TODO信息"
// @Success 200 {object} createResponse
// @Failure 400 {object} code.Failure
// @Router /api/todo [post]
func (h *handler) Create() core.HandlerFunc {
	return func(ctx core.Context) {
		req := new(createRequest)
		res := new(createResponse)
		if err := ctx.ShouldBindJSON(req); err != nil {
			ctx.AbortWithError(core.Error(
				http.StatusBadRequest,
				code.ParamBindError,
				validation.Error(err)).WithError(err),
			)
			return
		}
		// found admin
		a := new(models.Admin)
		adminResult := h.db.GetDbR().WithContext(ctx.RequestContext()).First(&a, req.UserID)
		if adminResult.Error != nil {
			ctx.AbortWithError(core.Error(
				http.StatusBadRequest,
				code.TodoCreateError,
				code.Text(code.TodoCreateError)).WithError(adminResult.Error),
			)
			return
		}
		if a == nil {
			ctx.AbortWithError(core.Error(
				http.StatusBadRequest,
				code.AdminNotFound,
				code.Text(code.AdminNotFound)),
			)
			return
		}

		createData := new(models.Todo)
		createData.UserID = req.UserID
		createData.Title = req.Title
		createData.Desc = req.Desc
		dbResult := h.db.GetDbW().WithContext(ctx.RequestContext()).Create(createData)
		if dbResult.Error != nil {
			ctx.AbortWithError(core.Error(
				http.StatusBadRequest,
				code.TodoCreateError,
				code.Text(code.TodoCreateError)).WithError(dbResult.Error),
			)
			return
		}
		res.Id = createData.Id
		ctx.Payload(res)
	}
}

这样我们就编写好我们的 api 服务了,现在来稍微测试一下创建一个 todo,还是像上面一样,使用 postman 发出一个请求:

总结

从上面的一个简单的例子来看,进行一些简单的 CURL api 的编写还是非常快速的,可以使用这个框架进行快速开发,从而将产品快速推出市场进行验证。目前从简单的测试来看,应该对新人还是非常友好的,屏蔽了一些底层细节,专注在上层服务的编写,没有过高的心智负担。

到此这篇关于使用 gin-api-mono 创建简单的 TODO 服务的文章就介绍到这了,更多相关gin-api-mono 创建 TODO内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在Go中复制文件最流行的3种方法

    在Go中复制文件最流行的3种方法

    今天小编就为大家分享一篇关于在Go中复制文件最流行的3种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Go 跨域中间件解决CORS问题

    Go 跨域中间件解决CORS问题

    跨域问题CORS是前端开发人员经常遇到的问题,本文主要介绍了Go 跨域中间件解决CORS问题,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • 解决Go中拦截HTTP流数据时字段丢失的问题

    解决Go中拦截HTTP流数据时字段丢失的问题

    在开发高并发的Web应用时,尤其是在处理HTTP代理和流数据拦截的场景下,遇到数据丢失的问题并不罕见,最近,在一个项目中,我遇到了一个棘手的问题:在拦截并转发HTTP流数据的过程中,某些数据字段因为处理过快而被丢失,所以本文给大家介绍如何解决这个问题
    2024-08-08
  • Go语言中零拷贝的原理与实现详解

    Go语言中零拷贝的原理与实现详解

    零拷贝是相对于用户态来讲的,即数据在用户态不发生任何拷贝,那么零拷贝的原理是什么,又是如何实现的呢,下面小编就来和大家详细聊聊吧
    2023-08-08
  • Golang中Map按照Value大小排序的方法实例

    Golang中Map按照Value大小排序的方法实例

    这篇文章主要给大家介绍了关于Golang中Map按照Value大小排序的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • Golang使用JWT进行认证和加密的示例详解

    Golang使用JWT进行认证和加密的示例详解

    JWT是一个签名的JSON对象,通常用作Oauth2的Bearer token,JWT包括三个用.分割的部分。本文将利用JWT进行认证和加密,感兴趣的可以了解一下
    2023-02-02
  • 浅析Go语言中包的介绍与初始化

    浅析Go语言中包的介绍与初始化

    这篇文章主要为大家详细介绍了Go语言中包的介绍与初始化,从而搞清Go程序的执行次序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解下
    2023-10-10
  • go语言中proto文件的使用

    go语言中proto文件的使用

    在Go语言编程中,.proto文件用于定义Protocol Buffers数据结构和服务,是实现跨语言通信和高效序列化的关键,具有一定的参考价值,感兴趣的可以了解一下
    2024-10-10
  • Go语言内建函数len的使用

    Go语言内建函数len的使用

    Go语言中的len函数是一个内建函数,用于获取数组、切片、字符串、映射和通道等数据类型的长度或大小,本文介绍了len函数在不同数据类型中的使用场景和特点,感兴趣的可以了解一下
    2024-10-10
  • Go gRPC教程实现Simple RPC

    Go gRPC教程实现Simple RPC

    这篇文章主要为大家介绍了Go gRPC教程实现Simple RPC示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论