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  }