From b95d464c8908e4f53f8486558821d91813b15b4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 28 Feb 2025 16:48:22 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=8C=85=E8=A3=85handler=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E5=90=8E=E8=A7=A6=E5=8F=91=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/define.go | 26 +++++++++++++++++++++++++- router/handler.go | 37 ++++++++++++++++++++++++++++--------- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/router/define.go b/router/define.go index 605f26e..79723a3 100644 --- a/router/define.go +++ b/router/define.go @@ -7,7 +7,10 @@ // Date : 2024-07-20 22:57 package router -import "reflect" +import ( + "reflect" + "sync" +) const ( PrefixFuncName = "RouterPrefix" // 路由前缀函数名称 @@ -63,3 +66,24 @@ type UriParam struct { const ( FieldNameMeta = "Meta" // 元信息字段 ) + +const ( + LogicAfterResponseKey = "__logic_after_response__" +) + +type LogicAfterResponse struct { + SuccessHookFuncList []func() `json:"-"` // 请求最后需要执行的成功hook函数 + FailureHookFuncList []func() `json:"-"` // 请求最后需要执行的失败hook函数 + Lock *sync.RWMutex `json:"-"` // 逻辑锁 +} + +func (logic *LogicAfterResponse) AddSuccessHook(f func()) { + logic.Lock.Lock() + defer logic.Lock.Unlock() + logic.SuccessHookFuncList = append(logic.SuccessHookFuncList, f) +} +func (logic *LogicAfterResponse) AddFailureHook(f func()) { + logic.Lock.Lock() + defer logic.Lock.Unlock() + logic.FailureHookFuncList = append(logic.FailureHookFuncList, f) +} diff --git a/router/handler.go b/router/handler.go index 5f85d45..b3e6a7f 100644 --- a/router/handler.go +++ b/router/handler.go @@ -13,6 +13,7 @@ import ( "git.zhangdeman.cn/zhangdeman/gin/response" "github.com/gin-gonic/gin" "reflect" + "sync" ) // RequestHandler 获取请求处理方法 @@ -45,6 +46,15 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { return } + // 初始化响应之后logic + logicAfterResponse := &LogicAfterResponse{ + SuccessHookFuncList: make([]func(), 0), + FailureHookFuncList: make([]func(), 0), + Lock: &sync.RWMutex{}, + } + // 此处暴露出去,是为了使用方可以获取到对应数据 + ctx.Set(LogicAfterResponseKey, logicAfterResponse) + // 执行逻辑 inputValue := reflect.ValueOf(formValue) if uriCfg.FormDataType.Kind() != reflect.Ptr { @@ -54,22 +64,31 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { if resList[1].IsNil() { // 请求成功 response.Success(ctx, resList[0].Interface()) + // 执行成功之后的逻辑 + for _, item := range logicAfterResponse.SuccessHookFuncList { + if item != nil { + item() + } + } return } // 请求失败 if e, ok = resList[1].Interface().(exception.IException); ok { - response.SendWithException(ctx, e, nil) - return - } - if err, ok = resList[1].Interface().(error); ok { + // 本身就是exception.IException + } else if err, ok = resList[1].Interface().(error); ok { e = exception.NewFromError(-1, err) - response.SendWithException(ctx, e, nil) - return + } else { + e = exception.NewWithCodeAndData(-1, map[string]any{ + "err": resList[1].Interface(), + }) } - e = exception.NewWithCodeAndData(-1, map[string]any{ - "err": resList[1].Interface(), - }) response.SendWithException(ctx, e, nil) + // 执行失败之后的逻辑 + for _, item := range logicAfterResponse.FailureHookFuncList { + if item != nil { + item() + } + } return } } From 9decd12ee8e403fa525d10d7008ae6697c77d8e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 28 Feb 2025 16:53:02 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=84=E7=BB=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- define/response.go | 22 ++++++++++++++++++++++ router/define.go | 21 --------------------- router/handler.go | 5 +++-- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/define/response.go b/define/response.go index 3ff6e63..5829670 100644 --- a/define/response.go +++ b/define/response.go @@ -10,6 +10,7 @@ package define import ( "git.zhangdeman.cn/zhangdeman/consts" "git.zhangdeman.cn/zhangdeman/wrapper" + "sync" ) var ( @@ -124,3 +125,24 @@ func GetHttpHandleConfig() *HttpHandleConfig { ).Value(), } } + +const ( + LogicAfterResponseKey = "__logic_after_response__" +) + +type LogicAfterResponse struct { + SuccessHookFuncList []func() `json:"-"` // 请求最后需要执行的成功hook函数 + FailureHookFuncList []func() `json:"-"` // 请求最后需要执行的失败hook函数 + Lock *sync.RWMutex `json:"-"` // 逻辑锁 +} + +func (logic *LogicAfterResponse) AddSuccessHook(f func()) { + logic.Lock.Lock() + defer logic.Lock.Unlock() + logic.SuccessHookFuncList = append(logic.SuccessHookFuncList, f) +} +func (logic *LogicAfterResponse) AddFailureHook(f func()) { + logic.Lock.Lock() + defer logic.Lock.Unlock() + logic.FailureHookFuncList = append(logic.FailureHookFuncList, f) +} diff --git a/router/define.go b/router/define.go index 79723a3..785307b 100644 --- a/router/define.go +++ b/router/define.go @@ -66,24 +66,3 @@ type UriParam struct { const ( FieldNameMeta = "Meta" // 元信息字段 ) - -const ( - LogicAfterResponseKey = "__logic_after_response__" -) - -type LogicAfterResponse struct { - SuccessHookFuncList []func() `json:"-"` // 请求最后需要执行的成功hook函数 - FailureHookFuncList []func() `json:"-"` // 请求最后需要执行的失败hook函数 - Lock *sync.RWMutex `json:"-"` // 逻辑锁 -} - -func (logic *LogicAfterResponse) AddSuccessHook(f func()) { - logic.Lock.Lock() - defer logic.Lock.Unlock() - logic.SuccessHookFuncList = append(logic.SuccessHookFuncList, f) -} -func (logic *LogicAfterResponse) AddFailureHook(f func()) { - logic.Lock.Lock() - defer logic.Lock.Unlock() - logic.FailureHookFuncList = append(logic.FailureHookFuncList, f) -} diff --git a/router/handler.go b/router/handler.go index b3e6a7f..71dd4a7 100644 --- a/router/handler.go +++ b/router/handler.go @@ -9,6 +9,7 @@ package router import ( "git.zhangdeman.cn/zhangdeman/exception" + "git.zhangdeman.cn/zhangdeman/gin/define" "git.zhangdeman.cn/zhangdeman/gin/request" "git.zhangdeman.cn/zhangdeman/gin/response" "github.com/gin-gonic/gin" @@ -47,13 +48,13 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { } // 初始化响应之后logic - logicAfterResponse := &LogicAfterResponse{ + logicAfterResponse := &define.LogicAfterResponse{ SuccessHookFuncList: make([]func(), 0), FailureHookFuncList: make([]func(), 0), Lock: &sync.RWMutex{}, } // 此处暴露出去,是为了使用方可以获取到对应数据 - ctx.Set(LogicAfterResponseKey, logicAfterResponse) + ctx.Set(define.LogicAfterResponseKey, logicAfterResponse) // 执行逻辑 inputValue := reflect.ValueOf(formValue) From 0d981b32c6d9a4ffb31a1a71c0c2fba3648d1f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 28 Feb 2025 16:57:02 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96logic?= =?UTF-8?q?=20after=20response=E5=AE=9E=E4=BE=8B=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- request/wrapper.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/request/wrapper.go b/request/wrapper.go index 85cc7f1..4749e94 100644 --- a/request/wrapper.go +++ b/request/wrapper.go @@ -8,10 +8,12 @@ package request import ( + "git.zhangdeman.cn/zhangdeman/gin/define" "git.zhangdeman.cn/zhangdeman/gin/request/parse_body" "git.zhangdeman.cn/zhangdeman/wrapper" "github.com/gin-gonic/gin" "strings" + "sync" ) var ( @@ -268,3 +270,25 @@ func (wh *wrapperHandle) ParseCookie(ctx *gin.Context) map[string]string { } return cookieData } + +// GetLogicAfterResponse ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:54 2025/2/28 +func (wh *wrapperHandle) GetLogicAfterResponse(ctx *gin.Context) *define.LogicAfterResponse { + if nil == ctx || nil == ctx.Request { + return nil + } + l, exist := ctx.Get(define.LogicAfterResponseKey) + if !exist || nil == l { + l = &define.LogicAfterResponse{ + SuccessHookFuncList: make([]func(), 0), + FailureHookFuncList: make([]func(), 0), + Lock: &sync.RWMutex{}, + } + ctx.Set(define.LogicAfterResponseKey, l) + } + // 就这么写, key值如果被其他人覆盖成非法值, 此处会直接panic + return l.(*define.LogicAfterResponse) +} From 9ae310782bc1d2b3e46737378bf46d8754d5bee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 28 Feb 2025 17:04:36 +0800 Subject: [PATCH 4/5] fix --- router/define.go | 1 - 1 file changed, 1 deletion(-) diff --git a/router/define.go b/router/define.go index 785307b..bc49eb7 100644 --- a/router/define.go +++ b/router/define.go @@ -9,7 +9,6 @@ package router import ( "reflect" - "sync" ) const ( From c826166256ba82d2783e53cec8a09776dadbf1c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 28 Feb 2025 18:18:03 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dlogic=20after=20response?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E6=98=AF=E5=90=8C=E6=AD=A5=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/handler.go | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/router/handler.go b/router/handler.go index 71dd4a7..f0a28dc 100644 --- a/router/handler.go +++ b/router/handler.go @@ -47,6 +47,7 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { return } + isSuccess := false // 初始化响应之后logic logicAfterResponse := &define.LogicAfterResponse{ SuccessHookFuncList: make([]func(), 0), @@ -55,7 +56,24 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { } // 此处暴露出去,是为了使用方可以获取到对应数据 ctx.Set(define.LogicAfterResponseKey, logicAfterResponse) - + defer func() { + go func() { + defer recover() + if isSuccess { + for _, itemFunc := range logicAfterResponse.SuccessHookFuncList { + if nil != itemFunc { + itemFunc() + } + } + } else { + for _, itemFunc := range logicAfterResponse.FailureHookFuncList { + if nil != itemFunc { + itemFunc() + } + } + } + }() + }() // 执行逻辑 inputValue := reflect.ValueOf(formValue) if uriCfg.FormDataType.Kind() != reflect.Ptr { @@ -64,13 +82,8 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { resList := uriCfg.ApiLogicFunc.Func.Call([]reflect.Value{uriCfg.ApiStructValue, reflect.ValueOf(ctx), inputValue}) if resList[1].IsNil() { // 请求成功 + isSuccess = true response.Success(ctx, resList[0].Interface()) - // 执行成功之后的逻辑 - for _, item := range logicAfterResponse.SuccessHookFuncList { - if item != nil { - item() - } - } return } // 请求失败 @@ -84,12 +97,6 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { }) } response.SendWithException(ctx, e, nil) - // 执行失败之后的逻辑 - for _, item := range logicAfterResponse.FailureHookFuncList { - if item != nil { - item() - } - } return } }