:::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 order
import (
"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.Logger
db mysql.Repo
cache redis.Repo
hashids 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 order
import (
"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 即可。