131 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package router ...
 | |
| //
 | |
| // Description : router ...
 | |
| //
 | |
| // Author : go_developer@163.com<白茶清欢>
 | |
| //
 | |
| // Date : 2025-01-27 19:42
 | |
| package router
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"reflect"
 | |
| 	"sync"
 | |
| 
 | |
| 	"git.zhangdeman.cn/zhangdeman/consts"
 | |
| 	"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"
 | |
| )
 | |
| 
 | |
| func getFormInitValue(ctx *gin.Context, uriCfg UriConfig) (any, error) {
 | |
| 	var (
 | |
| 		formParam reflect.Value
 | |
| 		formValue any
 | |
| 		err       error
 | |
| 	)
 | |
| 
 | |
| 	if uriCfg.FormDataType.Kind() == reflect.Ptr {
 | |
| 		formParam = reflect.New(uriCfg.FormDataType.Elem())
 | |
| 	} else {
 | |
| 		// 表单解析
 | |
| 		formParam = reflect.New(uriCfg.FormDataType)
 | |
| 	}
 | |
| 	formValue = formParam.Interface()
 | |
| 	if err = request.Form.Parse(ctx, formValue); nil != err {
 | |
| 		// 格式化验证错误的信息
 | |
| 		err = GetValidateErr(formValue, err)
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	return formValue, nil
 | |
| }
 | |
| 
 | |
| // RequestHandler 获取请求处理方法
 | |
| func RequestHandler(uriCfg UriConfig) gin.HandlerFunc {
 | |
| 	return func(ctx *gin.Context) {
 | |
| 		var (
 | |
| 			err       error
 | |
| 			ok        bool
 | |
| 			e         exception.IException
 | |
| 			formValue any
 | |
| 		)
 | |
| 
 | |
| 		if formValue, err = getFormInitValue(ctx, uriCfg); nil != err {
 | |
| 			e = exception.NewFromError(400, err)
 | |
| 			response.SendWithException(ctx, e, &define.ResponseOption{
 | |
| 				ContentType: consts.MimeTypeJson,
 | |
| 			})
 | |
| 			ctx.Abort()
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		isSuccess := false
 | |
| 		// 初始化响应之后logic
 | |
| 		logicAfterResponse := &define.LogicAfterResponse{
 | |
| 			SuccessHookFuncList: make([]func(), 0),
 | |
| 			FailureHookFuncList: make([]func(), 0),
 | |
| 			Lock:                &sync.RWMutex{},
 | |
| 		}
 | |
| 		// 此处暴露出去,是为了使用方可以获取到对应数据
 | |
| 		ctx.Set(define.LogicAfterResponseKey, logicAfterResponse)
 | |
| 		defer func() {
 | |
| 			go func() {
 | |
| 				// 执行响应之后的相关逻辑
 | |
| 				defer func() {
 | |
| 					if r := recover(); r != nil {
 | |
| 
 | |
| 					}
 | |
| 				}()
 | |
| 				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 {
 | |
| 			inputValue = inputValue.Elem()
 | |
| 		}
 | |
| 		var firstParam reflect.Value
 | |
| 		if uriCfg.CtxType == CustomContextType {
 | |
| 			customCtx := ctx.MustGet(define.CustomContextKey)
 | |
| 			firstParam = reflect.ValueOf(customCtx)
 | |
| 		} else {
 | |
| 			firstParam = reflect.ValueOf(ctx)
 | |
| 		}
 | |
| 		resList := uriCfg.ApiLogicFunc.Func.Call([]reflect.Value{uriCfg.ApiStructValue, firstParam, inputValue})
 | |
| 		if resList[1].IsNil() {
 | |
| 			// 请求成功
 | |
| 			isSuccess = true
 | |
| 			response.SuccessWithExtension(ctx, resList[0].Interface(), &define.ResponseOption{ContentType: "application/json;charset=utf-8"})
 | |
| 			return
 | |
| 		}
 | |
| 		// 请求失败
 | |
| 		if ok = errors.As(resList[1].Interface().(error), &e); ok {
 | |
| 			// 本身就是exception.IException
 | |
| 		} else if err, ok = resList[1].Interface().(error); ok {
 | |
| 			e = exception.NewFromError(-1, err)
 | |
| 		} else {
 | |
| 			e = exception.NewWithCodeAndData(-1, map[string]any{
 | |
| 				"err": resList[1].Interface(),
 | |
| 			})
 | |
| 		}
 | |
| 		response.SendWithException(ctx, e, &define.ResponseOption{
 | |
| 			ContentType: "application/json;charset=utf-8",
 | |
| 		})
 | |
| 		return
 | |
| 	}
 | |
| }
 |