掘金 后端 ( ) • 2024-04-24 10:15

Gin 和 Gorm 是 Golang 开发中比较受欢迎的两个库,分别用于 Web 框架和数据库操作。两者结合使用,可以轻松实现 CRUD、自定义查询、分页等操作,快速构建 RESTful API 服务。

本文将介绍使用脚手架sponge如何快速添加 CRUD api,sponge集成了 Gin 和 Gorm,专为高效便捷开发web后端服务而生。为了避免从0开始编码(例如定义模型、写CRUD逻辑、路由配置、错误码、api文档等),sponge支持一次性生成CRUD api所需的代码,不需要写任何go代码,这是最简单的添加CRUD api方式之一。

sponge的github地址: https://github.com/zhufuyi/sponge


环境准备

  1. 确保您的环境已经安装了 Go 和 一个mysql服务,mysql创建有一些表,例如 user库下的表

  2. 安装一个脚手架sponge,支持在windows、mac、linux环境下,点击查看 安装sponge说明

  3. 安装完成后打开终端,启动sponge UI界面服务:

sponge run

在浏览器访问 http://localhost:24631,进入sponge生成代码的UI界面。


创建web服务

进入sponge的UI界面:

  1. 点击左边菜单栏【SQL】-->【创建web服务】;
  2. 选择数据库mysql,填写数据库dsn,然后点击按钮获取表名,选择表名(可多选);
  3. 填写其他参数,鼠标放在问号?位置可以查看参数说明;

填写完参数后,点击按钮下载代码生成web服务完整项目代码,如下图所示:

web-http.png

这是创建的web服务代码目录,已经包含了teacher表的CRUD api所有代码,包含了Gin和Gorm的初始化和配置代码,开箱即用。

.
├─ cmd
│   └─ user
│       ├─ initial
│       └─ main.go
├─ configs
├─ deployments
│   ├─ binary
│   ├─ docker-compose
│   └─ kubernetes
├─ docs
├─ internal
│   ├─ cache
│   ├─ config
│   ├─ dao
│   ├─ ecode
│   ├─ handler
│   ├─ model
│   ├─ routers
│   ├─ server
│   └─ types
└─ scripts

解压代码文件,打开终端,切换到web服务代码目录,执行命令:

# 生成swagger文档
make docs

# 编译和运行服务
make run

在浏览器打开 http://localhost:8080/swagger/index.html,可以在页面上进行增删改查api测试,如下图所示:

web-http-swagger.png


批量添加CRUD api

如果有新的mysql表需要生成CRUD api代码,

  1. 点击左边菜单栏【Public】-->【生成handler CRUD代码】;
  2. 选择数据库mysql,填写数据库dsn,然后点击按钮获取表名,选择mysql表(可多选);
  3. 填写其他参数。

填写完参数后,点击按钮下载代码生成handler CRUD代码,如下图所示:

web-http-handler.png

生成的CRUD handler代码目录如下

.
└─ internal
    ├─ cache
    ├─ dao
    ├─ ecode
    ├─ handler
    ├─ model
    ├─ routers
    └─ types

解压代码,把目录internal移动到web服务代码目录下,就完成了在web服务中批量添加handler CURD api。

在终端执行命令:

# 生成swagger文档
make docs

# 编译和运行服务
make run

在浏览器刷新页面 http://localhost:8080/swagger/index.html,在页面上可以看到新添加的CURD api。


批量添加标准化的CURD api代码到web服务项目代码中,不需要人工编写任何go代码,这已经是在web服务以最简单的方式添加CRUD api了。


人工添加自定义api

由于自定义api不能像CRUD那样自动生成代码,则需要人工编写完整的自定义代码了,包括路由设置、handler函数、定义请求参数和返回值、定义字段校验tag、定义业务错误码、填写swagger用的注解信息、编写业务逻辑代码等一系列步骤。

例如在本项目中添加一个登录接口,需要经过下面6个步骤:

1. 定义请求参数和返回结果结构体

进入目录internal/types,打开文件teacher_types.go,添加登录的请求和返回结构体代码:

// LoginRequest login request params
type LoginRequest struct {
	Email      string `json:"email" binding:"email"`      // 邮件
	Password   string `json:"password" binding:"min=6"`   // 密码
}

// LoginRespond data
type LoginRespond struct {
	ID       uint64 `json:"id"`
	Token    string `json:"token"`
}

[!tip] 结构体字段tag中 bingding 是字段校验规则,点击查看更多validator校验规则


2. 定义错误码

进入目录internal/ecode,打开文件teacher_http.go,添加一行代码,定义登录错误码:

var (
	teacherNO       = 1
	teacherName     = "teacher"
	teacherBaseCode = errcode.HCode(teacherNO)

	// ...
	ErrLoginTeacher        = errcode.NewError(teacherBaseCode+8, "failed to login "+teacherName)
	// for each error code added, add +1 to the previous error code
)

3. 定义handler函数

进入目录internal/handler,打开文件teacher.go,定义一个登录方法,并添加swagger注解:

// Login 登录
// @Summary login
// @Description login by account and password
// @Tags teacher
// @accept json
// @Produce json
// @Param data body types.LoginRequest true "login information"
// @Success 200 {object} types.Result{}
// @Router /api/v1/teacher/login [post]
func (h *teacherHandler) Login(c *gin.Context) {
	// 验证密码

	// 生成和存储token

	response.Success(c, gin.H{
    	"id": 1,
    	"token": "xxxxxx",
    })
}

然后把Login方法添加到TeacherHandler接口:

type TeacherHandler interface {
	Create(c *gin.Context)
	// ...
	Login(c *gin.Context)
}

4. 注册路由

进入目录internal/routers,打开文件teacher.go,把Login路由注册进来:

func teacherRouter(group *gin.RouterGroup, h handler.TeacherHandler) {
	group.POST("/teacher", h.Create)
	// ...
	group.POST("/teacher/login", h.Login)
}

5. 编写业务逻辑代码

编写登录的业务逻辑代码,例如验证密码、生成token等。

在人工添加的自定义api中,可能需要对数据增删改查操作(也叫dao CRUD),这些dao CRUD代码可以直接生成,不需要人工编写,直接在在sponge的UI界面生成: Public --> 生成dao CRUD代码


6. 测试api

编写完业务逻辑代码后,在终端执行命令:

# 生成swagger文档
make docs

# 编译和运行服务
make run

在浏览器刷新 http://localhost:8080/swagger/index.html,在页面上可以看到登录api,在页面测试通过后,一个自定义的api才算正式添加完成。


总结

sponge是集成了Gin 和 Gorm 强大的web后端服务开发工具,可以帮助开发者轻松快速构建 RESTful API 服务。希望能够帮助 Golang 开发者彻底告别手写 CRUD api,更轻松便捷的构建高效、优雅的 RESTful API 服务。