184 lines
6.2 KiB
Go
184 lines
6.2 KiB
Go
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
|
||
}
|