2023-01-14 16:29:52 +08:00
|
|
|
|
package req
|
2021-03-24 17:18:39 +08:00
|
|
|
|
|
|
|
|
|
|
import (
|
2022-01-28 11:30:11 +08:00
|
|
|
|
"io"
|
2022-06-02 17:41:11 +08:00
|
|
|
|
"mayfly-go/pkg/ginx"
|
|
|
|
|
|
"mayfly-go/pkg/model"
|
|
|
|
|
|
"mayfly-go/pkg/utils/assert"
|
2021-04-21 10:22:09 +08:00
|
|
|
|
"time"
|
2021-04-16 15:10:07 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
2021-03-24 17:18:39 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2021-04-16 15:10:07 +08:00
|
|
|
|
// 处理函数
|
2023-01-14 16:29:52 +08:00
|
|
|
|
type HandlerFunc func(*Ctx)
|
2021-04-16 15:10:07 +08:00
|
|
|
|
|
2023-01-14 16:29:52 +08:00
|
|
|
|
type Ctx struct {
|
2021-05-08 18:00:33 +08:00
|
|
|
|
GinCtx *gin.Context // gin context
|
2021-04-16 15:10:07 +08:00
|
|
|
|
|
2021-06-09 16:58:57 +08:00
|
|
|
|
RequiredPermission *Permission // 需要的权限信息,默认为nil,需要校验token
|
|
|
|
|
|
LoginAccount *model.LoginAccount // 登录账号信息,只有校验token后才会有值
|
2021-03-24 17:18:39 +08:00
|
|
|
|
|
2023-01-14 16:29:52 +08:00
|
|
|
|
LogInfo *LogInfo // 日志相关信息
|
|
|
|
|
|
ReqParam any // 请求参数,主要用于记录日志
|
|
|
|
|
|
ResData any // 响应结果
|
|
|
|
|
|
Err any // 请求错误
|
2021-06-09 16:58:57 +08:00
|
|
|
|
|
|
|
|
|
|
timed int64 // 执行时间
|
2022-06-30 16:42:25 +08:00
|
|
|
|
NoRes bool // 无需返回结果,即文件下载等
|
2021-03-24 17:18:39 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-14 16:29:52 +08:00
|
|
|
|
func (rc *Ctx) Handle(handler HandlerFunc) {
|
2021-04-16 15:10:07 +08:00
|
|
|
|
ginCtx := rc.GinCtx
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
if err := recover(); err != nil {
|
2021-05-08 18:00:33 +08:00
|
|
|
|
rc.Err = err
|
2021-04-16 15:10:07 +08:00
|
|
|
|
ginx.ErrorRes(ginCtx, err)
|
|
|
|
|
|
}
|
|
|
|
|
|
// 应用所有请求后置处理器
|
2021-05-08 18:00:33 +08:00
|
|
|
|
ApplyHandlerInterceptor(afterHandlers, rc)
|
2021-04-16 15:10:07 +08:00
|
|
|
|
}()
|
2021-07-28 18:03:19 +08:00
|
|
|
|
assert.IsTrue(ginCtx != nil, "ginContext == nil")
|
2021-04-16 15:10:07 +08:00
|
|
|
|
|
|
|
|
|
|
// 默认为不记录请求参数,可在handler回调函数中覆盖赋值
|
2023-01-14 16:29:52 +08:00
|
|
|
|
rc.ReqParam = nil
|
2021-04-16 15:10:07 +08:00
|
|
|
|
// 默认响应结果为nil,可在handler中赋值
|
|
|
|
|
|
rc.ResData = nil
|
|
|
|
|
|
|
|
|
|
|
|
// 调用请求前所有处理器
|
2021-05-08 18:00:33 +08:00
|
|
|
|
err := ApplyHandlerInterceptor(beforeHandlers, rc)
|
2021-04-16 15:10:07 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-04-21 10:22:09 +08:00
|
|
|
|
begin := time.Now()
|
2021-04-16 15:10:07 +08:00
|
|
|
|
handler(rc)
|
2022-07-14 11:39:12 +08:00
|
|
|
|
rc.timed = time.Since(begin).Milliseconds()
|
2022-06-30 16:42:25 +08:00
|
|
|
|
if !rc.NoRes {
|
2021-05-08 18:00:33 +08:00
|
|
|
|
ginx.SuccessRes(ginCtx, rc.ResData)
|
2021-03-24 17:18:39 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-14 16:29:52 +08:00
|
|
|
|
func (rc *Ctx) Download(reader io.Reader, filename string) {
|
2022-06-30 16:42:25 +08:00
|
|
|
|
rc.NoRes = true
|
2022-01-28 11:30:11 +08:00
|
|
|
|
ginx.Download(rc.GinCtx, reader, filename)
|
2021-03-24 17:18:39 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-01-14 16:29:52 +08:00
|
|
|
|
func NewCtxWithGin(g *gin.Context) *Ctx {
|
|
|
|
|
|
return &Ctx{GinCtx: g}
|
2021-04-16 15:10:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 调用该方法设置请求描述,则默认记录日志,并不记录响应结果
|
2023-01-14 16:29:52 +08:00
|
|
|
|
func (r *Ctx) WithLog(li *LogInfo) *Ctx {
|
2021-04-16 15:10:07 +08:00
|
|
|
|
r.LogInfo = li
|
|
|
|
|
|
return r
|
2021-03-24 17:18:39 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-09 16:58:57 +08:00
|
|
|
|
// 设置请求上下文需要的权限信息
|
2023-01-14 16:29:52 +08:00
|
|
|
|
func (r *Ctx) WithRequiredPermission(permission *Permission) *Ctx {
|
2021-06-09 16:58:57 +08:00
|
|
|
|
r.RequiredPermission = permission
|
|
|
|
|
|
return r
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-16 00:50:36 +08:00
|
|
|
|
// 不需要token校验
|
|
|
|
|
|
func (r *Ctx) DontNeedToken() *Ctx {
|
2021-06-09 16:58:57 +08:00
|
|
|
|
r.RequiredPermission = &Permission{NeedToken: false}
|
2021-04-16 15:10:07 +08:00
|
|
|
|
return r
|
2021-03-24 17:18:39 +08:00
|
|
|
|
}
|
2021-05-08 18:00:33 +08:00
|
|
|
|
|
|
|
|
|
|
// 处理器拦截器函数
|
2023-01-14 16:29:52 +08:00
|
|
|
|
type HandlerInterceptorFunc func(*Ctx) error
|
2021-05-08 18:00:33 +08:00
|
|
|
|
type HandlerInterceptors []HandlerInterceptorFunc
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
|
beforeHandlers HandlerInterceptors
|
|
|
|
|
|
afterHandlers HandlerInterceptors
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 使用前置处理器函数
|
|
|
|
|
|
func UseBeforeHandlerInterceptor(b HandlerInterceptorFunc) {
|
|
|
|
|
|
beforeHandlers = append(beforeHandlers, b)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用后置处理器函数
|
|
|
|
|
|
func UseAfterHandlerInterceptor(b HandlerInterceptorFunc) {
|
|
|
|
|
|
afterHandlers = append(afterHandlers, b)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 应用指定处理器拦截器,如果有一个错误则直接返回错误
|
2023-06-01 12:31:32 +08:00
|
|
|
|
func ApplyHandlerInterceptor(his HandlerInterceptors, rc *Ctx) any {
|
2021-05-08 18:00:33 +08:00
|
|
|
|
for _, handler := range his {
|
|
|
|
|
|
if err := handler(rc); err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|