From f8f63691b7be40a20486d542ef614b2990eb1316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Sun, 21 Jul 2024 18:49:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=9F=BA=E7=A1=80=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E6=B3=A8=E5=86=8C,=20=E9=81=97=E7=95=99=20:=20form?= =?UTF-8?q?=E8=A1=A8=E5=8D=95,=20any=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/define.go | 13 ++++--- router/register.go | 82 ++++++++++++++++++++++++++++++++++++----- router/register_test.go | 8 ++-- 3 files changed, 86 insertions(+), 17 deletions(-) diff --git a/router/define.go b/router/define.go index 42aac9b..a761be7 100644 --- a/router/define.go +++ b/router/define.go @@ -7,6 +7,8 @@ // Date : 2024-07-20 22:57 package router +import "reflect" + const ( PrefixFuncName = "RouterPrefix" // 路由前缀函数名称 MiddlewareFuncName = "RouterMiddleware" // 路由中间件函数名称 @@ -26,9 +28,10 @@ const ( // // Date : 15:41 2024/7/21 type UriConfig struct { - Path string `json:"path"` // 接口路由, 必须配置 - Method string `json:"method"` // 接口请求方法, 必须配置 - TagList []string `json:"tag_list"` // 接口分组 - Desc string `json:"desc"` // 接口描述 - Strict bool `json:"strict"` // 接口是否为严格模式 : 不配置, 则为严格模式.严格模式 : POST 仅解析 BODY , GET 仅解析 QUERY + Path string `json:"path"` // 接口路由, 必须配置 + Method string `json:"method"` // 接口请求方法, 必须配置 + TagList []string `json:"tag_list"` // 接口分组 + Desc string `json:"desc"` // 接口描述 + Strict bool `json:"strict"` // 接口是否为严格模式 : 不配置, 则为严格模式.严格模式 : POST 仅解析 BODY , GET 仅解析 QUERY + FormDataType reflect.Type `json:"-"` // 表单数据类型 } diff --git a/router/register.go b/router/register.go index 0d1432b..bd433e1 100644 --- a/router/register.go +++ b/router/register.go @@ -9,9 +9,15 @@ package router import ( "fmt" + "net/http" "reflect" "strings" + "git.zhangdeman.cn/zhangdeman/exception" + "git.zhangdeman.cn/zhangdeman/gin/response" + + "git.zhangdeman.cn/zhangdeman/gin/request" + "git.zhangdeman.cn/zhangdeman/wrapper" "github.com/gin-gonic/gin" @@ -37,7 +43,9 @@ func Register(port int, controllerList ...any) { // 忽略空指针 continue } + parseController(controller) } + ginRouter.Run(fmt.Sprintf(":%d", port)) } // parseController 解析controller @@ -74,11 +82,9 @@ func parseController(controller any) { middlewareList = res[0].Interface().([]gin.HandlerFunc) } } - fmt.Println(111, middlewareList) } for funcIdx := 0; funcIdx < controllerType.NumMethod(); funcIdx++ { method := controllerType.Method(funcIdx) - // methodValue := controllerValue.Method(funcIdx) if method.Name == PrefixFuncName || method.Name == MiddlewareFuncName { continue } @@ -90,6 +96,7 @@ func parseController(controller any) { if nil == uriConfig { continue } + registerUri(uriConfig, controllerValue.Method(funcIdx), middlewareList) } } @@ -119,17 +126,74 @@ func parseUriConfig(methodType reflect.Type, routerPrefix string) (*UriConfig, e return nil, nil } uriConfig := &UriConfig{ - Path: strings.TrimRight(routerPrefix, "/") + "/" + strings.TrimLeft(metaField.Tag.Get(TagNamePath), "/"), - Method: strings.ToUpper(metaField.Tag.Get(TagNameMethod)), - TagList: strings.Split(metaField.Tag.Get(TagNameUriTag), "|"), - Desc: metaField.Tag.Get(TagNameDesc), - Strict: wrapper.ArrayType([]string{"", "true"}).Has(strings.ToLower(metaField.Tag.Get(TagNameStrict))) >= 0, + Path: strings.TrimRight(routerPrefix, "/") + "/" + strings.TrimLeft(metaField.Tag.Get(TagNamePath), "/"), + Method: strings.ToUpper(metaField.Tag.Get(TagNameMethod)), + TagList: strings.Split(metaField.Tag.Get(TagNameUriTag), "|"), + Desc: metaField.Tag.Get(TagNameDesc), + Strict: wrapper.ArrayType([]string{"", "true"}).Has(strings.ToLower(metaField.Tag.Get(TagNameStrict))) >= 0, + FormDataType: methodType.In(2).Elem(), } - // 解析第一个返回值 - // 解析第二个返回值 return uriConfig, nil } +// registerUri 注册路由 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 18:00 2024/7/21 +func registerUri(uriConfig *UriConfig, methodValue reflect.Value, middlewareList []gin.HandlerFunc) { + if nil == middlewareList { + middlewareList = make([]gin.HandlerFunc, 0) + } + handlerFunc := func(ctx *gin.Context) { + formDataReceiver := reflect.New(uriConfig.FormDataType) + if err := request.Form.Parse(ctx, formDataReceiver.Interface()); nil != err { + panic(err) + } + + returnValue := methodValue.Call([]reflect.Value{reflect.ValueOf(ctx), formDataReceiver}) + businessData := returnValue[0].Interface() + errData := returnValue[1] + if errData.IsNil() { + response.Success(ctx, businessData) + return + } + err := errData.Interface() + if e, ok := err.(exception.IException); ok { + response.SendWithException(ctx, e, businessData) + return + } else { + response.SendWithException(ctx, exception.NewFromError(-1, errData.Interface().(error)), businessData) + return + } + } + middlewareList = append(middlewareList, handlerFunc) + switch uriConfig.Method { + case http.MethodGet: + ginRouter.GET(uriConfig.Path, middlewareList...) + case http.MethodHead: + ginRouter.HEAD(uriConfig.Path, middlewareList...) + case http.MethodPost: + ginRouter.PUT(uriConfig.Path, middlewareList...) + case http.MethodPut: + ginRouter.PUT(uriConfig.Path, middlewareList...) + case http.MethodPatch: + ginRouter.PATCH(uriConfig.Path, middlewareList...) + case http.MethodDelete: + ginRouter.DELETE(uriConfig.Path, middlewareList...) + case http.MethodConnect: + ginRouter.Handle(http.MethodConnect, uriConfig.Path, middlewareList...) + case http.MethodOptions: + ginRouter.OPTIONS(uriConfig.Path, middlewareList...) + case http.MethodTrace: + ginRouter.Handle(http.MethodTrace, uriConfig.Path, middlewareList...) + case "ANY": + ginRouter.Any(uriConfig.Path, middlewareList...) + default: + panic(uriConfig.Path + " : " + uriConfig.Method + " is not support") + } +} + // debugLog ... // // Author : go_developer@163.com<白茶清欢> diff --git a/router/register_test.go b/router/register_test.go index 08fddf1..838898c 100644 --- a/router/register_test.go +++ b/router/register_test.go @@ -27,17 +27,19 @@ func (t *TestController) RouterMiddleware() []gin.HandlerFunc { } } func (t *TestController) Uri(ctx *gin.Context, formData *TestForm) (any, error) { - return nil, nil + return formData, nil } type TestForm struct { Meta `tag:"测试表单" path:"/a/b/c/d" desc:"测试接口" method:"get" strict:"true"` + Age int `json:"age" form:"age"` + Name string `json:"name" form:"name"` + Test any `json:"test" form:"test"` } func Test_parseController(t *testing.T) { type args struct { controller any } - parseController(TestController{}) - parseController(&TestController{}) + Register(8080, &TestController{}) }