From e4813761d6d2a132917946453cd53aa0c626639d Mon Sep 17 00:00:00 2001 From: john Date: Wed, 17 Oct 2018 16:56:50 +0800 Subject: [PATCH] =?UTF-8?q?Web=20Server=E8=B7=AF=E7=94=B1=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E9=A1=B9=E6=89=93=E5=8D=B0=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/net/ghttp/ghttp_server.go | 76 +++++++++++++++++++++---- g/net/ghttp/ghttp_server_router_hook.go | 5 +- geg/other/test.go | 29 ++++++---- 3 files changed, 87 insertions(+), 23 deletions(-) diff --git a/g/net/ghttp/ghttp_server.go b/g/net/ghttp/ghttp_server.go index 55b4cd065..1b1b6b963 100644 --- a/g/net/ghttp/ghttp_server.go +++ b/g/net/ghttp/ghttp_server.go @@ -27,6 +27,10 @@ import ( "gitee.com/johng/gf/g/os/gtime" "time" "gitee.com/johng/gf/g/os/gfile" + "gitee.com/johng/gf/g/util/gregex" + "gitee.com/johng/gf/g/container/garray" + "github.com/olekukonko/tablewriter" + "bytes" "fmt" ) @@ -267,18 +271,68 @@ func (s *Server) Start() error { // 打印展示路由表 func (s *Server) DumpRoutesMap() { - for _, v := range s.routesMap { - fmt.Println(v.handler.name) - //switch v.handler.rtype { - // case gROUTE_REGISTER_HANDLER: - // fmt.Println(v.handler.name) - // case gROUTE_REGISTER_OBJECT: - // //fmt.Println(v.handler.name) - // case gROUTE_REGISTER_CONTROLLER: - // fmt.Println(v.handler.name) - // - //} + fmt.Println(s.GetRoutesMap()) +} + +// 获得路由表(格式化字符串) +func (s *Server) GetRoutesMap() string { + type tableItem struct { + hook string + domain string + method string + route string + handler string } + + buf := bytes.NewBuffer(nil) + table := tablewriter.NewWriter(buf) + table.SetHeader([]string{"DOMAIN", "METHOD", "ROUTE", "HANDLER", "HOOK"}) + table.SetRowLine(true) + table.SetBorder(false) + table.SetCenterSeparator("|") + + m := make(map[string]*garray.SortedArray) + for k, v := range s.routesMap { + array, _ := gregex.MatchString(`(.*?)%([A-Z]+):(.+)@(.+)`, k) + item := &tableItem{ + hook : array[1], + domain : array[4], + method : array[2], + route : array[3], + handler : v.handler.name, + } + if _, ok := m[item.domain]; !ok { + m[item.domain] = garray.NewSortedArray(100, func(v1, v2 interface{}) int { + item1 := v1.(*tableItem) + item2 := v2.(*tableItem) + r := 0 + if r = strings.Compare(item1.domain, item2.domain); r == 0 { + if r = strings.Compare(item1.route, item2.route); r == 0 { + if r = strings.Compare(item1.method, item2.method); r == 0 { + r = strings.Compare(item1.hook, item2.hook) + } + } + } + return r + }, false) + } + m[item.domain].Add(item) + } + for _, a := range m { + s := make([]string, 5) + for _, v := range a.Slice() { + item := v.(*tableItem) + s[0] = item.domain + s[1] = item.method + s[2] = item.route + s[3] = item.handler + s[4] = item.hook + table.Append(s) + } + } + table.Render() + + return buf.String() } // 阻塞执行监听 diff --git a/g/net/ghttp/ghttp_server_router_hook.go b/g/net/ghttp/ghttp_server_router_hook.go index 31d674eef..66b8a90c4 100644 --- a/g/net/ghttp/ghttp_server_router_hook.go +++ b/g/net/ghttp/ghttp_server_router_hook.go @@ -13,11 +13,14 @@ import ( "gitee.com/johng/gf/g/util/gregex" "gitee.com/johng/gf/g/container/gset" "fmt" + "runtime" + "reflect" ) // 绑定指定的hook回调函数, pattern参数同BindHandler,支持命名路由;hook参数的值由ghttp server设定,参数不区分大小写 func (s *Server)BindHookHandler(pattern string, hook string, handler HandlerFunc) error { - return s.setHandler(pattern, &handlerItem{ + return s.setHandler(pattern, &handlerItem { + name : runtime.FuncForPC(reflect.ValueOf(handler).Pointer()).Name(), ctype : nil, fname : "", faddr : handler, diff --git a/geg/other/test.go b/geg/other/test.go index 4b0149810..f03c18f32 100644 --- a/geg/other/test.go +++ b/geg/other/test.go @@ -1,19 +1,26 @@ package main import ( - "fmt" - "reflect" - "runtime" + "github.com/olekukonko/tablewriter" + "os" ) -type T struct { - -} -func (t *T) Test() { - -} func main() { - t := new(T) - fmt.Println(runtime.FuncForPC(reflect.ValueOf(t.Test).Pointer()).Name()) + data := [][]string{ + []string{"1/1/2014", "Domain name", "2233", "$10.98"}, + []string{"1/1/2014", "January Hosting", "2233", "$54.95"}, + []string{"1/4/2014", "February Hosting", "2233", "$51.00"}, + []string{"1/4/2014", "February Extra Bandwidth1111111111111111111111111111111111", "2233", "$30.00"}, + } + + table := tablewriter.NewWriter(os.Stdout) + table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) + table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer + table.SetCenterSeparator("|") + table.SetAutoMergeCells(true) + table.SetRowLine(true) + table.SetBorder(false) + table.AppendBulk(data) + table.Render() }