package web type routeGroupInterface interface { Use(middlewares ...HandlerFunc) Group(path string, handlers ...HandlerFunc) routeGroupInterface Get(path string, desc string, req any, handlers ...HandlerFunc) routeGroupInterface Post(path string, desc string, req any, handlers ...HandlerFunc) routeGroupInterface Put(path string, desc string, req any, handlers ...HandlerFunc) routeGroupInterface Delete(path string, desc string, req any, handlers ...HandlerFunc) routeGroupInterface } type Group struct { coreRouter routeGroupInterface DirectRoutes map[string]*RouteDescInfo GroupRoutes map[string]*Group } func newGroup(coreRouter routeGroupInterface) *Group { g := &Group{ coreRouter: coreRouter, DirectRoutes: make(map[string]*RouteDescInfo), GroupRoutes: make(map[string]*Group), } return g } func (e *Group) Use(middlewares ...HandlerFunc) { e.coreRouter.Use(middlewares...) } func (e *Group) Group(path string, handlers ...HandlerFunc) *Group { path = pathBeTheSame(path) routeGroup := e.coreRouter.Group(path, handlers...) group := newGroup(routeGroup) e.GroupRoutes[path] = group return group } // Get 注册get方法路由,根据request请求体优先从body中以json格式解析参数,如果没有body,则从uri参数中解析出请求参数 // // path:路径 // desc:路由的一个简短描述 // request:请求结构体 // 格式: // type struct { // F1 int `json:"f1" desc:"字段描述" default:"234" required:"true"` // } // tag描述: // json:字段名 // desc:字段简短描述,没有可以不写 // default:默认值,没有可以不写 // required:是否必填字段,没有要求可以不写 // 注意,get、post注册的request结构字段,如果是uri参数方式类型只支持golang基础类型以及基础类型的切片,不能是结构体类型, // 例如: // type Field struct { // A int // B bool // } // type Request struct { // F1 *Field // } // F1字段就是非法的,无法解析,会报错 // handlers:路由处理函数,如果没有请求体,就是func(ctx),否则就是func(ctx, request) func (e *Group) Get(path string, desc string, access AccessMode, request any, handler HandlerFunc) { path = pathBeTheSame(path) old, find := e.DirectRoutes[path] if !find { e.DirectRoutes[path] = newRouteDescInfo(path, desc, "GET", access, request) } else { old.Method = append(old.Method, "GET") e.DirectRoutes[path] = old } e.coreRouter.Get(path, desc, request, handler) } // Post 注册post方法路由,根据request请求体优先从body中以json格式解析参数,如果没有body,则从uri参数中解析出请求参数 // // path:路径 // desc:路由的一个简短描述 // request:请求结构体 // 格式: // type struct { // F1 int `json:"f1" desc:"字段描述" default:"234" required:"true"` // } // tag描述: // json:字段名 // desc:字段简短描述,没有可以不写 // default:默认值,没有可以不写 // required:是否必填字段,没有要求可以不写 // 注意,get、post注册的request结构字段,如果是uri参数方式类型只支持golang基础类型以及基础类型的切片,不能是结构体类型, // 例如: // type Field struct { // A int // B bool // } // type Request struct { // F1 *Field // } // F1字段就是非法的,无法解析,会报错 // handlers:路由处理函数,如果没有请求体,就是func(ctx),否则就是func(ctx, request) func (e *Group) Post(path, desc string, access AccessMode, request any, handler HandlerFunc) { path = pathBeTheSame(path) old, find := e.DirectRoutes[path] if !find { e.DirectRoutes[path] = newRouteDescInfo(path, desc, "POST", access, request) } else { old.Method = append(old.Method, "POST") e.DirectRoutes[path] = old } e.coreRouter.Post(path, desc, request, handler) } func (e *Group) Put(path, desc string, access AccessMode, request any, handler HandlerFunc) { path = pathBeTheSame(path) old, find := e.DirectRoutes[path] if !find { e.DirectRoutes[path] = newRouteDescInfo(path, desc, "PUT", access, request) } else { old.Method = append(old.Method, "PUT") e.DirectRoutes[path] = old } e.coreRouter.Put(path, desc, request, handler) } func (e *Group) Delete(path, desc string, access AccessMode, request any, handler HandlerFunc) { path = pathBeTheSame(path) old, find := e.DirectRoutes[path] if !find { e.DirectRoutes[path] = newRouteDescInfo(path, desc, "DELETE", access, request) } else { old.Method = append(old.Method, "DELETE") e.DirectRoutes[path] = old } e.coreRouter.Delete(path, desc, request, handler) } // GetAndPost 注册get&post方法路由,根据request请求体优先从body中以json格式解析参数,如果没有body,则从uri参数中解析出请求参数 // // path:路径 // desc:路由的一个简短描述 // request:请求结构体 // 格式: // type struct { // F1 int `json:"f1" desc:"字段描述" default:"234" required:"true"` // } // tag描述: // json:字段名 // desc:字段简短描述,没有可以不写 // default:默认值,没有可以不写 // required:是否必填字段,没有要求可以不写 // 注意,get、post注册的request结构字段,如果是uri参数方式类型只支持golang基础类型以及基础类型的切片,不能是结构体类型, // 例如: // type Field struct { // A int // B bool // } // type Request struct { // F1 *Field // } // F1字段就是非法的,无法解析,会报错 // handlers:路由处理函数,如果没有请求体,就是func(ctx),否则就是func(ctx, request) func (e *Group) GetAndPost(path, desc string, access AccessMode, request any, handler HandlerFunc) { path = pathBeTheSame(path) record := newRouteDescInfo(path, desc, "GET", access, request) record.Method = append(record.Method, "POST") e.DirectRoutes[path] = record e.coreRouter.Get(path, desc, request, handler) e.coreRouter.Post(path, desc, request, handler) } func (e *Group) TravelPathTree() map[string]*RouteDescInfo { m := make(map[string]*RouteDescInfo) for k, route := range e.DirectRoutes { m[k] = route } for k, subG := range e.GroupRoutes { gm := subG.TravelPathTree() for k1, v1 := range gm { m[k+k1] = v1 } } return m }