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

1. 给会员服务开通接口调用权限

image.png
image.png
image.png
image.png
调用方 KEY调用方 SECRET 发给会员服务即可,具体签名规则请看 授权调用方 -> 使用说明。
接下来 授权调用方可访问的接口
image.png
image.png
比如,我们要授权 3 个接口,创建订单取消订单订单详情
image.png
至此,会员服务就可以使用签名调用我们的订单服务了。

2. 创建订单表

假设订单表字段如下:

  1. CREATE TABLE `order` (
  2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  3. `order_no` char(32) NOT NULL DEFAULT '' COMMENT '订单号',
  4. `order_fee` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '订单金额(分)',
  5. `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '订单状态 1:已创建 2:已取消',
  6. `is_deleted` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '是否删除 1:是 -1:否',
  7. `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  8. `created_user` varchar(60) NOT NULL DEFAULT '' COMMENT '创建人',
  9. `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  10. `updated_user` varchar(60) NOT NULL DEFAULT '' COMMENT '更新人',
  11. PRIMARY KEY (`id`),
  12. UNIQUE KEY `unique_order_no` (`order_no`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

创建表结构后,就可以使用 代码生成器 -> 生成表 CURD 了。

3. 生成表的 CURD 代码

image.png
image.png
生成后代码,存放在 ./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 文件,定义相关接口。

例如:

  1. package order
  2. import (
  3. "github.com/xinliangnote/go-gin-api/configs"
  4. "github.com/xinliangnote/go-gin-api/internal/pkg/core"
  5. "github.com/xinliangnote/go-gin-api/internal/repository/mysql"
  6. "github.com/xinliangnote/go-gin-api/internal/repository/redis"
  7. "github.com/xinliangnote/go-gin-api/pkg/hash"
  8. "go.uber.org/zap"
  9. )
  10. var _ Handler = (*handler)(nil)
  11. type Handler interface {
  12. i()
  13. // Create 创建订单
  14. // @Tags API.order
  15. // @Router /api/order/create [post]
  16. Create() core.HandlerFunc
  17. // Cancel 取消订单
  18. // @Tags API.order
  19. // @Router /api/order/cancel [post]
  20. Cancel() core.HandlerFunc
  21. // Detail 取消订单
  22. // @Tags API.order
  23. // @Router /api/order/{id} [get]
  24. Detail() core.HandlerFunc
  25. }
  26. type handler struct {
  27. logger *zap.Logger
  28. db mysql.Repo
  29. cache redis.Repo
  30. hashids hash.Hash
  31. }
  32. func New(logger *zap.Logger, db mysql.Repo, cache redis.Repo) Handler {
  33. return &handler{
  34. logger: logger,
  35. db: db,
  36. cache: cache,
  37. hashids: hash.New(configs.Get().HashIds.Secret, configs.Get().HashIds.Length),
  38. }
  39. }
  40. func (h *handler) i() {}

为什么定义 i() ? 可以看下这篇文章:https://mp.weixin.qq.com/s/gpMzEoRofGE9LmayeYw1qw
interface 接口定义完成后,就可以使用 代码生成器 -> 生成控制器方法 了。

5. 生成控制器方法

image.png
image.png
这时在 ./internal/api/controller/order_handler 目录中,会生成三个文件。

这时 3 个空方法就生成完毕了,咱们一起来看一下,以 func_create.go 为例:

  1. package order
  2. import (
  3. "github.com/xinliangnote/go-gin-api/internal/pkg/core"
  4. )
  5. type createRequest struct{}
  6. type createResponse struct{}
  7. // Create 创建订单
  8. // @Summary 创建订单
  9. // @Description 创建订单
  10. // @Tags API.order
  11. // @Accept multipart/form-data
  12. // @Produce json
  13. // @Param Request body createRequest true "请求信息"
  14. // @Success 200 {object} createResponse
  15. // @Failure 400 {object} code.Failure
  16. // @Router /api/order/create [post]
  17. func (h *handler) Create() core.HandlerFunc {
  18. return func(c core.Context) {
  19. }
  20. }

在 createRequest 结构体中定义 入参 结构体。
在 createResponse 结构体中定义 出参 结构体。
在 return func(c core.Context) {} 方法中,定义方法体。

6. 定义接口路由

./internal/api/router/router_api.go 文件中,增加路由即可。

例如:

  1. order := r.mux.Group("/api/order", r.middles.Signature())
  2. {
  3. orderHandler := order_handler.New(r.logger, r.db, r.cache)
  4. order.POST("/create", orderHandler.Create())
  5. order.POST("/cancel", orderHandler.Cancel())
  6. order.GET("/:id", orderHandler.Detail())
  7. }

r.middles.Signature() 表示签名验证中间件。

7. 定义 Service 文件

./internal/services 目录中,新增 order 目录。
order 目录中,新增 service.go 文件,定义相关接口。
在这,就不贴例子了,具体可参考其他 service 中的代码。
在 handler 中如何调用 service ?在 service 中如何调用 mysql 和 redis ?参考其他文件即可。

8. 生成 Swagger 接口文档

执行脚本 ./scripts/swagger.sh 即可。