github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/server/core/web/router.go (about) 1 package web 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/easysoft/zendata/internal/server/core/middleware" 8 "github.com/easysoft/zendata/internal/server/core/module" 9 "github.com/easysoft/zendata/pkg/utils/vari" 10 11 "github.com/kataras/iris/v12" 12 "github.com/kataras/iris/v12/context" 13 "github.com/kataras/iris/v12/core/router" 14 "github.com/kataras/iris/v12/middleware/pprof" 15 "github.com/snowlyg/helper/arr" 16 ) 17 18 // InitRouter 初始化模块路由 19 func (webServer *WebServer) InitRouter() error { 20 webServer.app.UseRouter(middleware.CrsAuth()) 21 22 app := webServer.app.Party("/").AllowMethods(iris.MethodOptions) 23 { 24 app.Use(middleware.InitCheck()) 25 26 if vari.Verbose { 27 debug := DebugParty() 28 app.PartyFunc(debug.RelativePath, debug.Handler) 29 } 30 31 webServer.initModule() 32 33 err := webServer.app.Build() 34 if err != nil { 35 return fmt.Errorf("build router %w", err) 36 } 37 38 return nil 39 } 40 } 41 42 // GetSources 获取web服务需要认证的权限 43 func (webServer *WebServer) GetSources() []map[string]string { 44 routeLen := len(webServer.app.GetRoutes()) 45 ch := make(chan map[string]string, routeLen) 46 for _, r := range webServer.app.GetRoutes() { 47 r := r 48 // 去除非接口路径 49 handerNames := context.HandlersNames(r.Handlers) 50 if !arr.InArrayS([]string{"GET", "POST", "PUT", "DELETE"}, r.Method) || 51 !arr.InArrayS(strings.Split(handerNames, ","), "github.com/snowlyg/multi.(*Verifier).Verify") { 52 routeLen-- 53 continue 54 } 55 go func(r *router.Route) { 56 route := map[string]string{ 57 "path": r.Path, 58 "name": r.Name, 59 "act": r.Method, 60 } 61 ch <- route 62 }(r) 63 } 64 65 routes := make([]map[string]string, routeLen) 66 for i := 0; i < routeLen; i++ { 67 routes[i] = <-ch 68 } 69 return routes 70 } 71 72 // initModule 初始化web服务模块,包括子模块 73 func (webServer *WebServer) initModule() { 74 if len(webServer.modules) > 0 { 75 for _, mod := range webServer.modules { 76 mod := mod 77 webServer.wg.Add(1) 78 79 sub := webServer.app.PartyFunc(mod.RelativePath, mod.Handler) 80 if len(mod.Modules) > 0 { 81 for _, subModule := range mod.Modules { 82 sub.PartyFunc(subModule.RelativePath, subModule.Handler) 83 } 84 } 85 webServer.wg.Done() 86 } 87 webServer.wg.Wait() 88 } 89 } 90 91 // Party 调试模块 92 func DebugParty() module.WebModule { 93 handler := func(index iris.Party) { 94 index.Get("/", func(ctx iris.Context) { 95 ctx.HTML("<h1>请点击<a href='/debug/pprof'>这里</a>打开调试页面") 96 }) 97 index.Any("/pprof", pprof.New()) 98 index.Any("/pprof/{action:path}", pprof.New()) 99 } 100 return module.NewModule("/debug", handler) 101 }