uniugm/admin/lib/web/group.go

184 lines
6.2 KiB
Go
Raw Normal View History

2025-04-18 17:17:23 +08:00
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
}