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

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

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

相关文章

护眼灯什么价位的好用?推荐五款好价护眼台灯

如今,我们不难发现许多年轻人早早地就戴上了眼镜,近视问题日益严重。在改善近视问题的众多因素中,营造适宜的照明环境,特别是选择一款合适的护眼台灯,显得尤为重要。然而,对于初次选购护眼台灯的人来说&…

通过sqoop把hive数据到mysql,脚本提示成功,mysql对应的表中没有数

1、脚本执行日志显示脚本执行成功,读写数量不为0 2、手动往Mysql对应表中写入数据十几秒后被自动删除了 问题原因: 建表时引擎用错了,如下图所示 正常情况下应该用InnoDB

Request和Response对象

Request和Response都是Servlet的service方法的参数,Request负责获取请求数据,而Response负责设置相应数据~ 一.Request 1.继承体系 Tomcat负责解析数据,因此由Tomcat来提供实现类~ 2.获取请求数据 请求行 请求头 请求体 需要注意的是只有…

【Greenhills】MULTI IDE工程管理的目录结构

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 关于的GHS的Project Manager中工程的目录结构的组成 2、 问题场景 在GHS中去创建项目后,对于在Project Manager窗口中的目录结构不太清晰,目录中有多个gpj文件,无法确认哪个是…

掼蛋如何识人

掼蛋的吸引力在于其充满变化和挑战性。它不仅仅可以考验玩家的技巧、智慧和决策能力,也是一种社交活动。通过玩家之间的出牌习惯和方式,能快速帮助我们推测出对方的思维方式和性格特征。 一、保守型 这类玩家按部就班,在游戏开始的时候&#…

【JAVA】HashMap扩容性能影响及优化策略

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在软件开发中,HashMap是一种常用的数据结构,但在处理大量数据时,其扩容…

广西省行政村边界shp数据/广西省乡镇边界/广西省土地利用分类数据/径流分布

广西壮族自治区,地处中国南部,北回归线横贯中部。南北以贺州——东兰一线为界,此界以北属中亚热带季风,以南属南亚热带季风。 数据范围:全国行政区划-行政村界 数据类型:面状数据,全国各省市县…

华为数通方向HCIP-DataCom H12-821题库(多选题:141-160)

第141题 以下关于802.1X认证的触发机制,描述正确的有? A、802.1X认证不能由认证设备(如802.1交换机)发起 B、802.1X客户端可以组播或广播方式触发认证 C、认证设备可以以组播或单播方式触发认证 D、802.1X认证只能由客户端主动发起 【参考答案】BC 【答案解析】 第142题 以…

java-ssm-基于jsp商场停车服务管理信息系统

java-ssm-基于jsp商场停车服务管理信息系统

Python网站的搭建和html基础

1.Python网站代码及讲解 一般我们搭建小型的网站就用flask库就行了。 (1)安装flask库 安装完python后,按住windows徽标键和r,弹出“运行”,在里面输入cmd。 回车打开,输入“pip install flask”。 (2&am…

WAServiceMainContext.js:2 ReferenceError: result is not defined

WAServiceMainContext.js:2 ReferenceError: result is not defined at success (index.js? [sm]:280) at Function.forEach.u.<computed> (WASubContext.js?twechat&s1710205354985&v2.16.1:2) at :22955/appservice/<api request success callback fun…

53、WEB攻防——通用漏洞CRLF注入URL重定向资源处理拒绝服务

文章目录 CRLF注入原理&检测&利用URL重定向web拒绝服务 CRLF注入原理&检测&利用 URL重定向 就是url中存在urlhttps://xxx&#xff0c;重定向的页面没有限制。主要用来做钓鱼。 web拒绝服务 例如&#xff0c;图片的长宽参数由前端传入&#xff0c;恶意的数据…

初级爬虫实战——伯克利新闻

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

RT-Thread组件之Audio框架i2s驱动的编写

前言 rt-thread本次使用的是标志版本为5.0。本次实现的是音频播放部分的i2s驱动使用的芯片为stm32f407zgt6在网上搜了一下关于rt-thread 音频部分的内容&#xff0c;没有实质的提供i2s对接的硬件驱动。所以才有了此次的记录&#xff0c;做一下分享记录。参考的git源码驱动&…

基础数据运营 - 面经 - 自如租房

招聘要求&#xff1a; 投递时间&#xff1a; 2023.12.28 BOSS直聘 联系HR 2023.12.29 面试 面试流程&#xff1a; 自我介绍&#xff0c;正常完整表述 你能介绍一下你的实习经历吗&#xff1f;主要做了哪些工作&#xff0c;得到了哪些结论出来 一般Excel有用到过么&#x…

Verilog刷题笔记37

题目&#xff1a;3位二进制加法器 Now that you know how to build a full adder, make 3 instances of it to create a 3-bit binary ripple-carry adder. The adder adds two 3-bit numbers and a carry-in to produce a 3-bit sum and carry out. To encourage you to actua…

2014-2023年42家上市银行ESG评级数据集

数据说明&#xff1a;以 Environment&#xff08;环境&#xff09;、Social&#xff08;社会&#xff09;和 Governance&#xff08;公司治理&#xff09;为核心的 ESG 理念是一种关注企业环境、社会责任、治理绩效而非财务绩效的评价标准。2004 年 6 月&#xff0c;联合国全球…

如何下载网页中的网络视频

你应该知道的&#xff0c;如果是要下载网络地图&#xff0c;你可以通过水经微图&#xff08;下文简称“微图”&#xff09;桌面版进行下载。 那么&#xff0c;如果是需要下载网络视频又应该用什么工具呢&#xff1f; 我们这里就来分享一个网络视频下载工具&#xff0c;以及下…

软件无线电系列——软件无线电的发展历程及体系框架

本节目录 一、软件无线电的起始 二、软件无线电SDR论坛 三、SPEAKeasy计划 四、JTRS与SCA 五、软件无线电体系框架本节内容 一、软件无线电的起始 1992年5月&#xff0c;美国电信会议上&#xff0c;Joseph Mitola III博士提出来软件无线电(Software Radio,SR)的概念。理想化的…

探索 PostgreSQL 的高级数据类型 - 第 二 部分

范围类型 范围类型提供了一种简洁的方式来表示单个数据库字段中的值范围。它们在从时间数据到数字间隔的各种领域中都有应用。在本篇博客文章中&#xff0c;我们将通过 DML/SQL 语句和 Navicat for PostgreSQL 16 来深入了解它们的使用&#xff08;以及好处&#xff01;&#…