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

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!

介绍

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

目前 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 的编写还是非常快速的,可以使用这个框架进行快速开发,从而将产品快速推出市场进行验证。目前从简单的测试来看,应该对新人还是非常友好的,屏蔽了一些底层细节,专注在上层服务的编写,没有过高的心智负担。大家感兴趣的话,可以扫码进群交流。

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于 `go-gin-api` 是基于 [Gin](gin-gonic/gin) 进行模块化设计的 API 框架,封装了常用的功能,使用简单,致力于进行快速的业务研发,同时增加了更多限制,约束项目组开发成员,规避混乱无序及自由随意的编码。 供参考学习,线上使用请谨慎! 集成组件: 1. 支持 [rate](https://golang.org/x/time/rate) 接口限流 2. 支持 panic 异常时邮件通知 3. 支持 [cors](rs/cors) 接口跨域 4. 支持 [Prometheus](prometheus/client_golang) 指标记录 5. 支持 [Swagger](swaggo/gin-swagger) 接口文档生成 6. 支持 [GraphQL](99designs/gqlgen) 查询语言 7. 支持 trace 项目内部链路追踪 8. 支持 [pprof](gin-contrib/pprof) 性能剖析 9. 支持 errno 统一定义错误码 10. 支持 [zap](https://go.uber.org/zap) 日志收集 11. 支持 [viper](spf13/viper) 配置文件解析 12. 支持 [gorm](https://gorm.io/gorm) 数据库组件 13. 支持 [go-redis](go-redis/redis/v7) 组件 14. 支持 RESTful API 返回值规范 15. 支持 生成数据表 CURD、控制器方法 等代码生成器 16. 支持 [cron](jakecoffman/cron) 定时任务,在后台可界面配置 17. 支持 [websocket](gorilla/websocket) 实时通讯,在后台有界面演示 18. 支持 web 界面,使用的 [Light Year Admin 模板](https://gitee.com/yinqi/Light-Year-Admin-Using-Iframe) ## 文档索引(可加入交流群) - 中文文档:[go-gin-api - 语雀](https://www.yuque.com//ngc3x5) - English Document:[en.md](/blob/master/en.md) ## 轻量版 为了满足开发者对于简单、轻量级 API 框架的需求,开发了 gin-api-mono,旨在提供更便捷的业务开发体验。 相比于 go-gin-api,首先 gin-api-mono 去掉了一些集成的功能和界面,使得整个框架更加简洁、轻量。其次 gin-api-mono 对框架代码进行了升级,以确保其在性能和稳定性方面的优势。这样,开发者就可以更灵活地选择所需的功能,并获得更好的性能和稳定性。 详见链接:https://xiaobot.net/post/e9f7ef4c-81b1-4ffc-9053-bec55c3abb12 ##
gin-admin-api是一个基于Gin框架开发的后台管理系统的API接口。Gin框架是一个轻量级的、高性能的Go语言框架,具有路由和中间件的功能,适合用于构建Web应用程序。 gin-admin-api提供了一套完善的API接口,用于实现后台管理系统的各种功能,例如用户管理、角色管理、权限管理、菜单管理、日志管理等。通过这些接口,可以方便地进行用户的注册、登录和认证,管理用户的角色和权限,管理系统的菜单和日志信息。 gin-admin-api的优点之一是高性能。由于采用了Gin框架,它具有快速的路由匹配和中间件处理的能力,能够处理大量的请求,并在高并发的情况下保持稳定性和可靠性。 另一个优点是易于扩展和定制。gin-admin-api使用了模块化的设计,各个功能模块之间松耦合,可以根据实际需求进行灵活的扩展和定制。例如,可以根据业务需求添加新的功能模块,或者修改和优化已有的模块。 此外,gin-admin-api还提供了友好的文档和示例代码,方便开发者理解和使用。它的源代码也是开源的,可以在GitHub上找到,这样可以方便地进行二次开发和定制,满足特定的业务需求。 总之,gin-admin-api是一个功能丰富、高性能、易扩展的后台管理系统API接口,大大简化了后台管理系统的开发工作,帮助开发者快速构建稳定、可靠的后台管理系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值