:::info 假设我们用它来对外提供接口,比如,我们用它来实现订单服务,要给会员服务提供接口。 :::
1. 给会员服务开通接口调用权限




将 调用方 KEY 和 调用方 SECRET 发给会员服务即可,具体签名规则请看 授权调用方 -> 使用说明。
接下来 授权调用方可访问的接口。

比如,我们要授权 3 个接口,创建订单、取消订单、订单详情。
至此,会员服务就可以使用签名调用我们的订单服务了。
2. 创建订单表
假设订单表字段如下:
CREATE TABLE `order` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',`order_no` char(32) NOT NULL DEFAULT '' COMMENT '订单号',`order_fee` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '订单金额(分)',`status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '订单状态 1:已创建 2:已取消',`is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否',`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人',`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人',PRIMARY KEY (`id`),UNIQUE KEY `unique_order_no` (`order_no`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
创建表结构后,就可以使用 代码生成器 -> 生成表 CURD 了。
3. 生成表的 CURD 代码


生成后代码,存放在 ./internal/repository/mysql/order 目录。
- gen_model.go 为 order 表结构体。
- gen_order.go 为 order 表相关 CURD 方法。
- gen_table.md 为 order 表接口 Markdown 格式的文档。
如果生成的方法不够用,也可以自定义方法,切记不要写到 gen_order.go 文件!!!
4. 定义控制器需要实现的接口
在 ./internal/api 目录中,新增 order 目录。
在 order 目录中,新增 handler.go 文件,定义相关接口。
例如:
package orderimport ("github.com/xinliangnote/go-gin-api/configs""github.com/xinliangnote/go-gin-api/internal/pkg/core""github.com/xinliangnote/go-gin-api/internal/repository/mysql""github.com/xinliangnote/go-gin-api/internal/repository/redis""github.com/xinliangnote/go-gin-api/pkg/hash""go.uber.org/zap")var _ Handler = (*handler)(nil)type Handler interface {i()// Create 创建订单// @Tags API.order// @Router /api/order/create [post]Create() core.HandlerFunc// Cancel 取消订单// @Tags API.order// @Router /api/order/cancel [post]Cancel() core.HandlerFunc// Detail 取消订单// @Tags API.order// @Router /api/order/{id} [get]Detail() core.HandlerFunc}type handler struct {logger *zap.Loggerdb mysql.Repocache redis.Repohashids hash.Hash}func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler {return &handler{logger: logger,db: db,cache: cache,hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length),}}func (h *handler) i() {}
为什么定义 i() ? 可以看下这篇文章:https://mp.weixin.qq.com/s/gpMzEoRofGE9LmayeYw1qw
interface 接口定义完成后,就可以使用 代码生成器 -> 生成控制器方法 了。
5. 生成控制器方法


这时在 ./internal/api/controller/order_handler 目录中,会生成三个文件。
这时 3 个空方法就生成完毕了,咱们一起来看一下,以 func_create.go 为例:
package orderimport ("github.com/xinliangnote/go-gin-api/internal/pkg/core")type createRequest struct{}type createResponse struct{}// Create 创建订单// @Summary 创建订单// @Description 创建订单// @Tags API.order// @Accept multipart/form-data// @Produce json// @Param Request body createRequest true "请求信息"// @Success 200 {object} createResponse// @Failure 400 {object} code.Failure// @Router /api/order/create [post]func (h *handler) Create() core.HandlerFunc {return func(c core.Context) {}}
在 createRequest 结构体中定义 入参 结构体。
在 createResponse 结构体中定义 出参 结构体。
在 return func(c core.Context) {} 方法中,定义方法体。
6. 定义接口路由
在 ./internal/api/router/router_api.go 文件中,增加路由即可。
例如:
order := r.mux.Group("/api/order", r.middles.Signature()){orderHandler := order_handler.New(r.logger, r.db, r.cache)order.POST("/create", orderHandler.Create())order.POST("/cancel", orderHandler.Cancel())order.GET("/:id", orderHandler.Detail())}
r.middles.Signature() 表示签名验证中间件。
7. 定义 Service 文件
在 ./internal/services 目录中,新增 order 目录。
在 order 目录中,新增 service.go 文件,定义相关接口。
在这,就不贴例子了,具体可参考其他 service 中的代码。
在 handler 中如何调用 service ?在 service 中如何调用 mysql 和 redis ?参考其他文件即可。
8. 生成 Swagger 接口文档
执行脚本 ./scripts/swagger.sh 即可。
