diff --git a/router/define.go b/router/define.go index 3576bdc..42aac9b 100644 --- a/router/define.go +++ b/router/define.go @@ -11,3 +11,24 @@ const ( PrefixFuncName = "RouterPrefix" // 路由前缀函数名称 MiddlewareFuncName = "RouterMiddleware" // 路由中间件函数名称 ) + +const ( + TagNamePath = "path" // 接口的请求路径 + TagNameMethod = "method" // 接口的请求方法 + TagNameUriTag = "tag" // 接口的tag + TagNameDesc = "desc" // 接口的描述 + TagNameStrict = "strict" // 接口是否为严格模式 : 不配置, 则为严格模式.严格模式 : POST 仅解析 BODY , GET 仅解析 QUERY +) + +// UriConfig 接口配置 +// +// Author : go_developer@163.com<白茶清欢> +// +// 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 +} diff --git a/router/register.go b/router/register.go index ea5ceea..0d1432b 100644 --- a/router/register.go +++ b/router/register.go @@ -10,11 +10,15 @@ package router import ( "fmt" "reflect" + "strings" + + "git.zhangdeman.cn/zhangdeman/wrapper" "github.com/gin-gonic/gin" ) var ( + Debug = false // 是否开启DEBUG ginRouter = gin.Default() ) @@ -72,6 +76,68 @@ func parseController(controller any) { } fmt.Println(111, middlewareList) } - - fmt.Println(routerPrefix) + for funcIdx := 0; funcIdx < controllerType.NumMethod(); funcIdx++ { + method := controllerType.Method(funcIdx) + // methodValue := controllerValue.Method(funcIdx) + if method.Name == PrefixFuncName || method.Name == MiddlewareFuncName { + continue + } + methodType := method.Type + uriConfig, err := parseUriConfig(methodType, routerPrefix) + if nil != err { + debugLog("parseUriConfig error : %s -> %s", err.Error(), methodType.Kind().String()) + } + if nil == uriConfig { + continue + } + } +} + +// parseUriConfig 解析Uri配置 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:40 2024/7/21 +func parseUriConfig(methodType reflect.Type, routerPrefix string) (*UriConfig, error) { + if methodType.NumIn() != 3 || // 结构体指针 + 两个参数 + methodType.NumOut() != 2 { // 两个返回值 + return nil, nil + } + // 接口logic共计两个参数. 两个返回值, 格式 : func(ctx *gin.Context, formData any[组合Meta]) (any[response], error) + + // 解析第一个参数是 *gin.Context + if methodType.In(1).String() != "*gin.Context" { + return nil, nil + } + // 解析第二个参数是组合Meta的form表单 + formType := methodType.In(2) + if formType.Kind() == reflect.Ptr { + formType = methodType.In(2).Elem() + } + metaField, metaFieldExist := formType.FieldByName("Meta") + if !metaFieldExist { + 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, + } + // 解析第一个返回值 + // 解析第二个返回值 + return uriConfig, nil +} + +// debugLog ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 15:32 2024/7/21 +func debugLog(format string, valList ...any) { + if !Debug { + return + } + fmt.Printf("[DEBUG] "+format+"\n", valList...) } diff --git a/router/register_test.go b/router/register_test.go index bab42f0..08fddf1 100644 --- a/router/register_test.go +++ b/router/register_test.go @@ -26,6 +26,13 @@ func (t *TestController) RouterMiddleware() []gin.HandlerFunc { }, } } +func (t *TestController) Uri(ctx *gin.Context, formData *TestForm) (any, error) { + return nil, nil +} + +type TestForm struct { + Meta `tag:"测试表单" path:"/a/b/c/d" desc:"测试接口" method:"get" strict:"true"` +} func Test_parseController(t *testing.T) { type args struct {