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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 使用 gin-api-mono 创建简单的 TODO 服务

介绍


首先介绍一下 gin-api-mono 这个项目,这个项目是由 go-gin-api[1] 作者基于用户的需求衍生出来的一个项目。因为有些用户觉得 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 的编写还是非常快速的,可以使用这个框架进行快速开发,从而将产品快速推出市场进行验证。目前从简单的测试来看,应该对新人还是非常友好的,屏蔽了一些底层细节,专注在上层服务的编写,没有过高的心智负担。大家感兴趣的话,可以扫码进群交流。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
JSON 安全 Java
API 一键转换 MCP 服务!Higress 助今日投资快速上线 MCP 市场
今日投资的技术负责人介绍了如何通过Higress MCP 市场完善的解决方案,快捷地将丰富的金融数据 API 转化为 MCP 工具,帮助用户通过 MCP 的方式非常轻松地调用专业金融数据,自由快速地构建自己的金融大模型应用。
723 23
|
4月前
|
人工智能 算法 API
国产化用于单导联和六导联的心电算法及API服务
随着智能设备普及,心电图功能逐渐应用于智能手表、体脂仪等设备。苏州唯理推出单导联及6导联心电算法API服务,由AI驱动,1分钟内快速评估心律失常、房颤、早搏等问题,已广泛用于医疗设备及三甲医院。其算法还可评估压力、疲劳、情绪状态,筛查效率远超进口设备。唯理率先实现国产医疗级心电芯片,支持快速集成与私有化部署,适用于多种智能硬件。
|
6月前
|
人工智能 自然语言处理 API
硅基流动入驻阿里云云市场,核心API服务将全面接入阿里云百炼平台💐
2025年6月18日,AI Infra企业硅基流动与阿里云达成战略合作,加入“繁花计划”并入驻云市场。其大模型推理平台SiliconCloud核心API将接入阿里云百炼平台,依托灵骏智能计算集群为客户提供高效服务。作为国内领先的MaaS平台,SiliconCloud已集成百余款开源大模型,服务600万用户及众多企业。双方将在算力协同、行业解决方案等领域深化合作,推动AI生态发展。
791 0
|
8月前
|
人工智能 API 开发工具
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
GitHub MCP Server是基于Model Context Protocol的服务器工具,提供与GitHub API的无缝集成,支持自动化处理问题、Pull Request和仓库管理等功能。
1612 2
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
|
8月前
|
人工智能 算法 安全
OpenRouter 推出百万 token 上下文 AI 模型!Quasar Alpha:提供完全免费的 API 服务,同时支持联网搜索和多模态交互
Quasar Alpha 是 OpenRouter 推出的预发布 AI 模型,具备百万级 token 上下文处理能力,在代码生成、指令遵循和低延迟响应方面表现卓越,同时支持联网搜索和多模态交互。
689 1
OpenRouter 推出百万 token 上下文 AI 模型!Quasar Alpha:提供完全免费的 API 服务,同时支持联网搜索和多模态交互
|
自然语言处理 数据可视化 API
淘宝商品评论 API 接口:深度解析用户评论,优化产品与服务
淘宝是领先的中国电商平台,其API为开发者提供商品信息、交易记录及用户评价等数据访问服务。对于获授权的开发者和商家,可通过申请API权限、获取并解析评论数据来进行情感分析和统计,进而优化产品设计、提升服务质量、增强用户互动及调整营销策略。未授权用户可能受限于数据访问。
|
9月前
|
人工智能 缓存 程序员
大模型文生图服务API设计原来如此简单(1)
文生图大模型的API设计其实很简单!无论是Midjourney这样的商业产品,还是ComfyUI这样的开源工具,它们的核心API设计都遵循着相似的简单原则。
394 1
|
10月前
|
Cloud Native 安全 Serverless
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
|
JSON 关系型数据库 测试技术
使用Python和Flask构建RESTful API服务
使用Python和Flask构建RESTful API服务
541 2
|
人工智能 Serverless API
一键服务化:从魔搭开源模型到OpenAI API服务
在多样化大模型的背后,OpenAI得益于在领域的先发优势,其API接口今天也成为了业界的一个事实标准。
一键服务化:从魔搭开源模型到OpenAI API服务