From 14d1e558294987683ea49dd2763fa0eb16ba13a2 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 30 Dec 2017 18:35:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=8E=A7=E5=88=B6=E5=99=A8de?= =?UTF-8?q?mo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/frame/ginstance/ginstance.go | 11 -- g/frame/gmvc/view.go | 2 +- g/g.go | 19 +-- g/net/ghttp/http_server.go | 39 ++++--- g/net/ghttp/http_server_domain.go | 67 +++++++++-- g/net/gtcp/tcp.go | 10 +- g/net/gudp/udp.go | 10 +- g/os/gview/gview.go | 12 ++ geg/database/gmq/gmq.go | 23 ---- geg/database/mysql/mysql.go | 14 +-- geg/database/pgsql/pgsql.go | 16 +-- geg/frame/mvc/controller/demo/hello.go | 18 +++ geg/frame/mvc/controller/demo/rest.go | 40 +++++++ geg/frame/mvc/controller/demo/test.go | 25 ++++ geg/frame/mvc/controller/demo/user.go | 28 +++++ geg/frame/mvc/controller/user/user.go | 43 ------- geg/frame/mvc/main.go | 2 +- geg/net/gluster_client.go | 156 ------------------------- geg/net/http_client.go | 5 +- geg/net/http_server.go | 2 +- 20 files changed, 248 insertions(+), 294 deletions(-) delete mode 100644 geg/database/gmq/gmq.go create mode 100644 geg/frame/mvc/controller/demo/hello.go create mode 100644 geg/frame/mvc/controller/demo/rest.go create mode 100644 geg/frame/mvc/controller/demo/test.go create mode 100644 geg/frame/mvc/controller/demo/user.go delete mode 100644 geg/frame/mvc/controller/user/user.go delete mode 100644 geg/net/gluster_client.go diff --git a/g/frame/ginstance/ginstance.go b/g/frame/ginstance/ginstance.go index c81f564f4..3ad1f03c7 100644 --- a/g/frame/ginstance/ginstance.go +++ b/g/frame/ginstance/ginstance.go @@ -14,7 +14,6 @@ import ( "gitee.com/johng/gf/g/os/genv" "gitee.com/johng/gf/g/os/gview" "gitee.com/johng/gf/g/os/gfile" - "gitee.com/johng/gf/g/net/ghttp" "gitee.com/johng/gf/g/os/gconsole" "gitee.com/johng/gf/g/database/gdb" "gitee.com/johng/gf/g/frame/gconfig" @@ -40,16 +39,6 @@ func Set(k string, v interface{}) { instances.Set(k, v) } -// 核心对象:Server -// 框架支持多服务器对象,通过传入不同的name进行区分 -func Server(names...string) *ghttp.Server { - name := "default" - if len(names) > 0 { - name = names[0] - } - return ghttp.GetServer(name) -} - // 核心对象:View func View() *gview.View { result := Get(FRAME_CORE_COMPONENT_NAME_VIEW) diff --git a/g/frame/gmvc/view.go b/g/frame/gmvc/view.go index 41b46ac4c..fea5aba77 100644 --- a/g/frame/gmvc/view.go +++ b/g/frame/gmvc/view.go @@ -53,7 +53,7 @@ func (view *View) Parse(file string) ([]byte, error) { if err != nil { return nil, err } - // 绑定函数 + // 绑定函数,对基类的include进行覆盖(由于涉及到模板变量的传递) tpl.BindFunc("include", view.funcInclude) // 执行解析 view.mu.RLock() diff --git a/g/g.go b/g/g.go index 24f76ef16..d0f1a18b3 100644 --- a/g/g.go +++ b/g/g.go @@ -14,31 +14,20 @@ import ( // 单例HTTP Server // 框架支持多服务器对象,通过传入不同的name进行区分 +// HTTPServer启动时支持命令行参数: xxx --cfgpath=xxx --viewpath=xxx func HTTPServer(names...string) *ghttp.Server { - name := "default" - if len(names) > 0 { - name = names[0] - } - return ghttp.GetServer(name) + return ghttp.GetServer(names...) } // 单例TCP Server // 框架支持多服务器对象,通过传入不同的name进行区分 func TCPServer(names...string) *gtcp.Server { - name := "default" - if len(names) > 0 { - name = names[0] - } - return gtcp.GetServer(name) + return gtcp.GetServer(names...) } // 单例HTTP Server // 框架支持多服务器对象,通过传入不同的name进行区分 func UDPServer(names...string) *gudp.Server { - name := "default" - if len(names) > 0 { - name = names[0] - } - return gudp.GetServer(name) + return gudp.GetServer(names...) } diff --git a/g/net/ghttp/http_server.go b/g/net/ghttp/http_server.go index 353345c76..1f9c8456a 100644 --- a/g/net/ghttp/http_server.go +++ b/g/net/ghttp/http_server.go @@ -23,6 +23,7 @@ import ( ) const ( + gDEFAULT_SERVER = "default" gDEFAULT_DOMAIN = "default" gDEFAULT_METHOD = "all" gHTTP_METHODS = "GET,PUT,POST,DELETE,PATCH,HEAD,CONNECT,OPTIONS,TRACE" @@ -58,7 +59,11 @@ var serverMapping = gmap.NewStringInterfaceMap() // 获取/创建一个默认配置的HTTP Server(默认监听端口是80) // 单例模式,请保证name的唯一性 -func GetServer(name string) (*Server) { +func GetServer(names...string) (*Server) { + name := gDEFAULT_SERVER + if len(names) > 0 { + name = names[0] + } if s := serverMapping.Get(name); s != nil { return s.(*Server) } @@ -308,7 +313,11 @@ func (s *Server)bindHandlerByMap(m HandlerMap) error { } // 将方法名称按照设定的规则转换为URI并附加到指定的URI后面 -func (s *Server)appendMethodNameToUri(uri string, name string) string { +func (s *Server)appendMethodNameToUriWithPattern(pattern string, name string) string { + // 检测域名后缀 + array := strings.Split(pattern, "@") + // 分离URI(其实可能包含HTTP Method) + uri := array[0] uri = strings.TrimRight(uri, "/") + "/" // 方法名中间存在大写字母,转换为小写URI地址以“-”号链接每个单词 for i := 0; i < len(name); i++ { @@ -317,23 +326,27 @@ func (s *Server)appendMethodNameToUri(uri string, name string) string { } uri += strings.ToLower(string(name[i])) } + // 加上指定域名后缀 + if len(array) > 1 { + uri += "@" + array[1] + } return uri } -// 注意该方法是直接绑定方法的内存地址,执行的时候直接执行该方法,不会存在初始化新的控制器逻辑 +// 注意该方法是直接绑定函数的内存地址,执行的时候直接执行该方法,不会存在初始化新的控制器逻辑 func (s *Server)BindHandler(pattern string, handler HandlerFunc) error { return s.bindHandlerItem(pattern, HandlerItem{nil, "", handler}) } // 绑定对象到URI请求处理中,会自动识别方法名称,并附加到对应的URI地址后面 // 需要注意对象方法的定义必须按照ghttp.HandlerFunc来定义 -func (s *Server)BindObject(uri string, obj interface{}) error { +func (s *Server)BindObject(pattern string, obj interface{}) error { m := make(HandlerMap) v := reflect.ValueOf(obj) t := v.Type() for i := 0; i < v.NumMethod(); i++ { name := t.Method(i).Name - key := s.appendMethodNameToUri(uri, name) + key := s.appendMethodNameToUriWithPattern(pattern, name) m[key] = HandlerItem{nil, "", v.Method(i).Interface().(func(*Server, *ClientRequest, *ServerResponse))} } return s.bindHandlerByMap(m) @@ -341,7 +354,7 @@ func (s *Server)BindObject(uri string, obj interface{}) error { // 绑定对象到URI请求处理中,会自动识别方法名称,并附加到对应的URI地址后面 // 需要注意对象方法的定义必须按照ghttp.HandlerFunc来定义 -func (s *Server)BindObjectRest(uri string, obj interface{}) error { +func (s *Server)BindObjectRest(pattern string, obj interface{}) error { m := make(HandlerMap) v := reflect.ValueOf(obj) t := v.Type() @@ -350,7 +363,7 @@ func (s *Server)BindObjectRest(uri string, obj interface{}) error { if _, ok := s.methodsMap[strings.ToUpper(name)]; !ok { continue } - key := name + ":" + uri + key := name + ":" + pattern m[key] = HandlerItem{nil, "", v.Method(i).Interface().(func(*Server, *ClientRequest, *ServerResponse))} } return s.bindHandlerByMap(m) @@ -358,7 +371,7 @@ func (s *Server)BindObjectRest(uri string, obj interface{}) error { // 绑定控制器,控制器需要实现gmvc.Controller接口 // 这种方式绑定的控制器每一次请求都会初始化一个新的控制器对象进行处理,对应不同的请求会话 -func (s *Server)BindController(uri string, c Controller) error { +func (s *Server)BindController(pattern string, c Controller) error { // 遍历控制器,获取方法列表,并构造成uri m := make(HandlerMap) v := reflect.ValueOf(c) @@ -368,17 +381,17 @@ func (s *Server)BindController(uri string, c Controller) error { if name == "Init" || name == "Shut" { continue } - key := s.appendMethodNameToUri(uri, name) + key := s.appendMethodNameToUriWithPattern(pattern, name) m[key] = HandlerItem{v.Elem().Type(), name, nil} } return s.bindHandlerByMap(m) } -// 绑定控制器,控制器需要实现gmvc.Controller接口 +// 绑定控制器(RESTFul),控制器需要实现gmvc.Controller接口 // 方法会识别HTTP方法,并做REST绑定处理,例如:Post方法会绑定到HTTP POST的方法请求处理,Delete方法会绑定到HTTP DELETE的方法请求处理 // 因此只会绑定HTTP Method对应的方法,其他方法不会自动注册绑定 // 这种方式绑定的控制器每一次请求都会初始化一个新的控制器对象进行处理,对应不同的请求会话 -func (s *Server)BindControllerRest(uri string, c Controller) error { +func (s *Server)BindControllerRest(pattern string, c Controller) error { // 遍历控制器,获取方法列表,并构造成uri m := make(HandlerMap) v := reflect.ValueOf(c) @@ -395,13 +408,13 @@ func (s *Server)BindControllerRest(uri string, c Controller) error { if _, ok := s.methodsMap[strings.ToUpper(name)]; !ok { continue } - key := name + ":" + uri + key := name + ":" + pattern m[key] = HandlerItem{v.Elem().Type(), name, nil} } return s.bindHandlerByMap(m) } -// 绑定方法,pattern支持http method +// 绑定控制器方法,pattern支持http method // pattern的格式形如:/user/list, put:/user, delete:/user // 这种方式绑定的控制器每一次请求都会初始化一个新的控制器对象进行处理,对应不同的请求会话 func (s *Server)BindControllerMethod(pattern string, c Controller, method string) error { diff --git a/g/net/ghttp/http_server_domain.go b/g/net/ghttp/http_server_domain.go index 99780e71f..46f59430c 100644 --- a/g/net/ghttp/http_server_domain.go +++ b/g/net/ghttp/http_server_domain.go @@ -25,7 +25,7 @@ func (s *Server) Domain(domain string) *Domain { if r := domains.Get(domain); r != nil { return r.(*Domain) } - d := &Domain{ + d := &Domain{ s : s, m : make(map[string]bool), } @@ -37,17 +37,64 @@ func (s *Server) Domain(domain string) *Domain { return d } -// 绑定方法 -func (d *Domain) BindControllerMethod(pattern string, c Controller, method string) error { - return d.s.BindControllerMethod(pattern, c, method) -} - -// 绑定控制器 -func (d *Domain) BindController(uri string, c Controller) error { +// 注意该方法是直接绑定方法的内存地址,执行的时候直接执行该方法,不会存在初始化新的控制器逻辑 +func (d *Domain) BindHandler(pattern string, handler HandlerFunc) error { for domain, _ := range d.m { - if err := d.s.BindController(uri + "@" + domain, c); err != nil { + if err := d.s.bindHandlerItem(pattern + "@" + domain, HandlerItem{nil, "", handler}); err != nil { return err } } return nil -} \ No newline at end of file +} + +// 绑定对象到URI请求处理中,会自动识别方法名称,并附加到对应的URI地址后面 +// 需要注意对象方法的定义必须按照ghttp.HandlerFunc来定义 +func (d *Domain) BindObject(pattern string, obj interface{}) error { + for domain, _ := range d.m { + if err := d.s.BindObject(pattern + "@" + domain, obj); err != nil { + return err + } + } + return nil +} + +// 绑定对象到URI请求处理中,会自动识别方法名称,并附加到对应的URI地址后面 +// 需要注意对象方法的定义必须按照ghttp.HandlerFunc来定义 +func (d *Domain) BindObjectRest(pattern string, obj interface{}) error { + for domain, _ := range d.m { + if err := d.s.BindObjectRest(pattern + "@" + domain, obj); err != nil { + return err + } + } + return nil +} + +// 绑定控制器 +func (d *Domain) BindController(pattern string, c Controller) error { + for domain, _ := range d.m { + if err := d.s.BindController(pattern + "@" + domain, c); err != nil { + return err + } + } + return nil +} + +// 绑定控制器(RESTFul) +func (d *Domain) BindControllerRest(pattern string, c Controller) error { + for domain, _ := range d.m { + if err := d.s.BindControllerRest(pattern + "@" + domain, c); err != nil { + return err + } + } + return nil +} + +// 绑定控制器方法 +func (d *Domain) BindControllerMethod(pattern string, c Controller, method string) error { + for domain, _ := range d.m { + if err := d.s.BindControllerMethod(pattern + "@" + domain, c, method); err != nil { + return err + } + } + return nil +} diff --git a/g/net/gtcp/tcp.go b/g/net/gtcp/tcp.go index 11c4d87f5..b1e0b1bd9 100644 --- a/g/net/gtcp/tcp.go +++ b/g/net/gtcp/tcp.go @@ -11,6 +11,10 @@ import ( "gitee.com/johng/gf/g/container/gmap" ) +const ( + gDEFAULT_SERVER = "default" +) + // tcp server结构体 type Server struct { address string @@ -22,7 +26,11 @@ var serverMapping = gmap.NewStringInterfaceMap() // 获取/创建一个空配置的TCP Server // 单例模式,请保证name的唯一性 -func GetServer(name string) (*Server) { +func GetServer(names...string) (*Server) { + name := gDEFAULT_SERVER + if len(names) > 0 { + name = names[0] + } if s := serverMapping.Get(name); s != nil { return s.(*Server) } diff --git a/g/net/gudp/udp.go b/g/net/gudp/udp.go index 3242ce3c7..b2c2f52c9 100644 --- a/g/net/gudp/udp.go +++ b/g/net/gudp/udp.go @@ -11,6 +11,10 @@ import ( "gitee.com/johng/gf/g/container/gmap" ) +const ( + gDEFAULT_SERVER = "default" +) + // tcp server结构体 type Server struct { address string @@ -22,7 +26,11 @@ var serverMapping = gmap.NewStringInterfaceMap() // 获取/创建一个空配置的UDP Server // 单例模式,请保证name的唯一性 -func GetServer(name string) (*Server) { +func GetServer(names...string) (*Server) { + name := gDEFAULT_SERVER + if len(names) > 0 { + name = names[0] + } if s := serverMapping.Get(name); s != nil { return s.(*Server) } diff --git a/g/os/gview/gview.go b/g/os/gview/gview.go index 0dcc91896..997cd2cd3 100644 --- a/g/os/gview/gview.go +++ b/g/os/gview/gview.go @@ -87,6 +87,9 @@ func (view *View) Template(file string) (*Template, error) { content : gfile.GetContents(path), funcmap : make(map[string]interface{}), } + // 绑定内置inluce方法 + t.BindFunc("include", t.funcInclude) + // 将模板对象注册到内部map中 view.tpls.Set(path, t) return t, nil } @@ -134,3 +137,12 @@ func (t *Template) Parse(data map[string]interface{}) ([]byte, error) { return buffer.Bytes(), nil } +// 模板内置方法:include +func (t *Template) funcInclude(file string) template.HTML { + content, err := t.Parse(nil) + if err != nil { + return template.HTML(err.Error()) + } + return template.HTML(content) +} + diff --git a/geg/database/gmq/gmq.go b/geg/database/gmq/gmq.go deleted file mode 100644 index be979edda..000000000 --- a/geg/database/gmq/gmq.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - "gitee.com/johng/gf/g/database/gmq" - "fmt" -) - -func main() { - mq, err := gmq.New("/tmp/gmq") - if err != nil { - fmt.Println(err) - } - - //t1 := gtime.Microsecond() - //for i := 0; i < 10; i++ { - // mq.Group("test").Push([]byte("gmq_message_" + strconv.Itoa(i))) - //} - //fmt.Println("push cost:", gtime.Microsecond() - t1) - fmt.Println(string(mq.Group("test").Pop())) - fmt.Println("length", mq.Group("test").Length()) - //fmt.Println(mq.Group("test").Add([]byte("gmq_message"))) - //fmt.Println(mq.Group("test").Remove(1000)) -} \ No newline at end of file diff --git a/geg/database/mysql/mysql.go b/geg/database/mysql/mysql.go index 344d88fe0..6b63b64bf 100644 --- a/geg/database/mysql/mysql.go +++ b/geg/database/mysql/mysql.go @@ -126,13 +126,13 @@ func create() { // 数据写入 func insert() { fmt.Println("insert:") - r, err := db.Insert("user", &gdb.Map { + r, err := db.Insert("user", gdb.Map { "name": "john", }) if (err == nil) { uid, err2 := r.LastInsertId() if err2 == nil { - r, err = db.Insert("user_detail", &gdb.Map { + r, err = db.Insert("user_detail", gdb.Map { "uid" : uid, "site" : "http://johng.cn", }) @@ -166,7 +166,7 @@ func query() { // replace into func replace() { fmt.Println("replace:") - r, err := db.Save("user", &gdb.Map { + r, err := db.Save("user", gdb.Map { "uid" : 1, "name" : "john", }) @@ -182,7 +182,7 @@ func replace() { // 数据保存 func save() { fmt.Println("save:") - r, err := db.Save("user", &gdb.Map { + r, err := db.Save("user", gdb.Map { "uid" : 1, "name" : "john", }) @@ -198,7 +198,7 @@ func save() { // 批量写入 func batchInsert() { fmt.Println("batchInsert:") - err := db.BatchInsert("user", &gdb.List { + err := db.BatchInsert("user", gdb.List { {"name": "john_" + strconv.FormatInt(time.Now().UnixNano(), 10)}, {"name": "john_" + strconv.FormatInt(time.Now().UnixNano(), 10)}, {"name": "john_" + strconv.FormatInt(time.Now().UnixNano(), 10)}, @@ -213,7 +213,7 @@ func batchInsert() { // 数据更新 func update1() { fmt.Println("update1:") - r, err := db.Update("user", &gdb.Map {"name": "john1"}, "uid=?", 1) + r, err := db.Update("user", gdb.Map {"name": "john1"}, "uid=?", 1) if (err == nil) { fmt.Println(r.LastInsertId()) fmt.Println(r.RowsAffected()) @@ -301,7 +301,7 @@ func linkopUpdate1() { // 通过Map指针方式传参方式 func linkopUpdate2() { fmt.Println("linkopUpdate2:") - r, err := db.Table("user").Data(&gdb.Map{"name" : "john2"}).Condition("name=?", "john").Update() + r, err := db.Table("user").Data(gdb.Map{"name" : "john2"}).Condition("name=?", "john").Update() if (err == nil) { fmt.Println(r.RowsAffected()) } else { diff --git a/geg/database/pgsql/pgsql.go b/geg/database/pgsql/pgsql.go index eb84bce6b..0dde27cf1 100644 --- a/geg/database/pgsql/pgsql.go +++ b/geg/database/pgsql/pgsql.go @@ -14,7 +14,7 @@ var db gdb.Link func init () { gdb.AddDefaultConfigNode(gdb.ConfigNode { Host : "127.0.0.1", - Port : 5432, + Port : "5432", User : "postgres", Pass : "123456", Name : "test", @@ -59,14 +59,14 @@ func create() { // 数据写入 func insert() { fmt.Println("insert:") - r, err := db.Insert("user", &gdb.Map { + r, err := db.Insert("user", gdb.Map { "uid" : 1, "name": "john", }) if (err == nil) { uid, err2 := r.LastInsertId() if err2 == nil { - r, err = db.Insert("user_detail", &gdb.Map { + r, err = db.Insert("user_detail", gdb.Map { "uid" : string(uid), "site" : "http://johng.cn", }) @@ -100,7 +100,7 @@ func query() { // replace into func replace() { fmt.Println("replace:") - r, err := db.Save("user", &gdb.Map { + r, err := db.Save("user", gdb.Map { "uid": "1", "name": "john", }) @@ -116,7 +116,7 @@ func replace() { // 数据保存 func save() { fmt.Println("save:") - r, err := db.Save("user", &gdb.Map { + r, err := db.Save("user", gdb.Map { "uid" : "1", "name" : "john", }) @@ -132,7 +132,7 @@ func save() { // 批量写入 func batchInsert() { fmt.Println("batchInsert:") - err := db.BatchInsert("user", &gdb.List { + err := db.BatchInsert("user", gdb.List { {"name": "john_" + strconv.FormatInt(time.Now().UnixNano(), 10)}, {"name": "john_" + strconv.FormatInt(time.Now().UnixNano(), 10)}, {"name": "john_" + strconv.FormatInt(time.Now().UnixNano(), 10)}, @@ -147,7 +147,7 @@ func batchInsert() { // 数据更新 func update1() { fmt.Println("update1:") - r, err := db.Update("user", &gdb.Map {"name": "john1"}, "uid=?", 1) + r, err := db.Update("user", gdb.Map {"name": "john1"}, "uid=?", 1) if (err == nil) { fmt.Println(r.LastInsertId()) fmt.Println(r.RowsAffected()) @@ -215,7 +215,7 @@ func linkopUpdate1() { // 通过Map指针方式传参方式 func linkopUpdate2() { fmt.Println("linkopUpdate2:") - r, err := db.Table("user").Data(&gdb.Map{"name" : "john2"}).Condition("name=?", "john").Update() + r, err := db.Table("user").Data(gdb.Map{"name" : "john2"}).Condition("name=?", "john").Update() if (err == nil) { fmt.Println(r.RowsAffected()) } else { diff --git a/geg/frame/mvc/controller/demo/hello.go b/geg/frame/mvc/controller/demo/hello.go new file mode 100644 index 000000000..f8a7fe919 --- /dev/null +++ b/geg/frame/mvc/controller/demo/hello.go @@ -0,0 +1,18 @@ +package demo + +import ( + "gitee.com/johng/gf/g" + "gitee.com/johng/gf/g/net/ghttp" +) + + +// 初始化控制器对象,并绑定操作到Web Server +func init() { + // 将URI映射到指定的方法中执行 + g.HTTPServer().BindHandler("/hello", Hello) +} + +// 用于函数映射 +func Hello(s *ghttp.Server, r *ghttp.ClientRequest, w *ghttp.ServerResponse) { + w.WriteString("Hello World!") +} \ No newline at end of file diff --git a/geg/frame/mvc/controller/demo/rest.go b/geg/frame/mvc/controller/demo/rest.go new file mode 100644 index 000000000..700e9d2ad --- /dev/null +++ b/geg/frame/mvc/controller/demo/rest.go @@ -0,0 +1,40 @@ +package demo + +import ( + "gitee.com/johng/gf/g/frame/gmvc" + "gitee.com/johng/gf/g" +) + +// 测试控制器 +type ControllerRest struct { + gmvc.Controller +} + +// 初始化控制器对象,并绑定操作到Web Server +func init() { + // 控制器公开方法中与HTTP Method方法同名的方法将会绑定映射 + g.HTTPServer().BindControllerRest("/user", &ControllerRest{}) +} + +// RESTFul - GET +func (c *ControllerUser) Get() { + c.Response.WriteString("RESTFul HTTP Method GET") +} + +// RESTFul - POST +func (c *ControllerUser) Post() { + c.Response.WriteString("RESTFul HTTP Method POST") +} + +// RESTFul - DELETE +func (c *ControllerUser) Delete() { + c.Response.WriteString("RESTFul HTTP Method DELETE") +} + +// 该方法无法映射,将会无法访问到 +func (c *ControllerUser) Hello() { + c.Response.WriteString("Hello") +} + + + diff --git a/geg/frame/mvc/controller/demo/test.go b/geg/frame/mvc/controller/demo/test.go new file mode 100644 index 000000000..2ddc88bfa --- /dev/null +++ b/geg/frame/mvc/controller/demo/test.go @@ -0,0 +1,25 @@ +package demo + +import ( + "gitee.com/johng/gf/g" + "gitee.com/johng/gf/g/net/ghttp" +) + +// 测试绑定对象 +type T struct {} + +// 初始化控制器对象,并绑定操作到Web Server +func init() { + // 只能通过RESTFul方式访问接口,这里为测试方便,使用的是Get + //g.HTTPServer().BindObject("/test", &T{}) + // 只有localhost域名下才能访问该对象, + // 对应URL为:http://localhost:8199/test/show + // 通过该地址将无法访问到内容:http://127.0.0.1:8199/test/show + g.HTTPServer().Domain("localhost").BindObject("/test", &T{}) +} + +// 用于对象映射 +func (t *T) Show(s *ghttp.Server, r *ghttp.ClientRequest, w *ghttp.ServerResponse) { + w.WriteString("It's show time bibi!") +} + diff --git a/geg/frame/mvc/controller/demo/user.go b/geg/frame/mvc/controller/demo/user.go new file mode 100644 index 000000000..73d0423a2 --- /dev/null +++ b/geg/frame/mvc/controller/demo/user.go @@ -0,0 +1,28 @@ +package demo + +import ( + "gitee.com/johng/gf/g" + "gitee.com/johng/gf/g/frame/gmvc" +) + +// 定义业务相关的控制器对象, +// 建议命名规范中控制器统一使用Controller前缀,后期代码维护时便于区分 +type ControllerUser struct { + gmvc.Controller +} + +// 初始化控制器对象,并绑定操作到Web Server +func init() { + // 绑定控制器到指定URI,所有控制器的公开方法将会映射到指定URI末尾 + // 例如该方法执行后,查看效果可访问:http://127.0.0.1:8199/user/info + g.HTTPServer().BindController("/user", &ControllerUser{}) +} + +// 定义操作逻辑 - 展示模板 +func (c *ControllerUser) Info() { + c.View.Assign("name", "john") + c.View.Display("user/index") +} + + + diff --git a/geg/frame/mvc/controller/user/user.go b/geg/frame/mvc/controller/user/user.go deleted file mode 100644 index 2129930ce..000000000 --- a/geg/frame/mvc/controller/user/user.go +++ /dev/null @@ -1,43 +0,0 @@ -package user - -import ( - "gitee.com/johng/gf/g/net/ghttp" - "gitee.com/johng/gf/g/frame/gmvc" - "gitee.com/johng/gf/g/frame/ginstance" -) - -// 定义业务相关的控制器对象 -type ControllerUser struct { - gmvc.Controller -} - -// 测试绑定对象 -type T struct { - -} - -func (t *T) Test(s *ghttp.Server, r *ghttp.ClientRequest, w *ghttp.ServerResponse) { - w.WriteString("Test") -} - -func (t *T) Get(s *ghttp.Server, r *ghttp.ClientRequest, w *ghttp.ServerResponse) { - w.WriteString("Http Method GET") -} - -// 初始化控制器对象,并绑定操作到Web Server -func init() { - //ghttp.GetServer("johng").Domain("localhost").BindHandler("/user", u.Info) - //ghttp.GetServer("johng").BindHandler("/test", Test) - ginstance.Server().BindObjectRest("/test", &T{}) - ginstance.Server().BindController("/user", &ControllerUser{}) -} - -// 定义操作逻辑 -func (c *ControllerUser) Info() { - c.Response.WriteString("hello world!") - //c.View.Assign("name", "john") - //c.View.Display("user/index") -} - - - diff --git a/geg/frame/mvc/main.go b/geg/frame/mvc/main.go index 8d2c1a770..1f789e03b 100644 --- a/geg/frame/mvc/main.go +++ b/geg/frame/mvc/main.go @@ -2,7 +2,7 @@ package main import ( "gitee.com/johng/gf/g" - _ "gitee.com/johng/gf/geg/frame/mvc/controller/user" + _ "gitee.com/johng/gf/geg/frame/mvc/controller/demo" ) func main() { diff --git a/geg/net/gluster_client.go b/geg/net/gluster_client.go deleted file mode 100644 index ce3317db1..000000000 --- a/geg/net/gluster_client.go +++ /dev/null @@ -1,156 +0,0 @@ -package main - -import ( - "fmt" - "gitee.com/johng/gf/g/net/ghttp" -) - -var kvUrl string = "http://192.168.2.102:4168/kv" -var nodeUrl string = "http://192.168.2.102:4168/node" -var serviceUrl string = "http://192.168.2.102:4168/service" - -// kv操作 -func addKV() { - c := ghttp.NewClient() - r := c.Put(kvUrl, "{\"name1\":\"john1\", \"name2\":\"john2\"}") - fmt.Println("addKV:", r.ReadAll()) -} - -func getAllKV() { - c := ghttp.NewClient() - r := c.Get(kvUrl) - fmt.Println("getAllKV:", r.ReadAll()) -} - -func getOneKV() { - c := ghttp.NewClient() - r := c.Get(kvUrl + "?k=name1") - fmt.Println("getOneKV:", r.ReadAll()) -} - -func editKV() { - c := ghttp.NewClient() - r := c.Post(kvUrl, "{\"name1\":\"john3\", \"name2\":\"john4\"}") - fmt.Println("editKV:", r.ReadAll()) -} - -func removeKV() { - c := ghttp.NewClient() - r := c.Delete(kvUrl, "[\"name1\"]") - fmt.Println("removeKV:", r.ReadAll()) -} - - -// node操作 -func addNode() { - c := ghttp.NewClient() - r := c.Put(nodeUrl, "[\"172.17.42.1\"]") - fmt.Println("addNode:", r.ReadAll()) -} - -func getAllNode() { - c := ghttp.NewClient() - r := c.Get(nodeUrl) - fmt.Println("getAllNode:", r.ReadAll()) -} - -func removeNode() { - c := ghttp.NewClient() - r := c.Delete(nodeUrl, "[\"172.17.42.1\"]") - fmt.Println("removeNode:", r.ReadAll()) -} - - -// service操作 -func getAllService() { - c := ghttp.NewClient() - r := c.Get(serviceUrl) - fmt.Println("getAllService:", r.ReadAll()) -} - -func getOneService() { - c := ghttp.NewClient() - r := c.Get(serviceUrl + "?name=Site Database") - fmt.Println("getOneService:", r.ReadAll()) -} - -func addDatabaseService() { - c := ghttp.NewClient() - s := ` -{ - "name" : "Site Database", - "type" : "mysql", - "list" : [ - {"host":"192.168.2.102", "port":"3306", "user":"root", "pass":"123456", "database":"test"}, - {"host":"192.168.2.124", "port":"3306", "user":"root", "pass":"123456", "database":"tongwujie"} - ] -} - ` - r := c.Put(serviceUrl, s) - fmt.Println("addDatabaseService:", r.ReadAll()) -} - -func editDatabaseService() { - c := ghttp.NewClient() - s := ` -{ - "name" : "Site Database2", - "type" : "mysql", - "list" : [ - {"host":"192.168.2.102", "port":"3306", "user":"root", "pass":"123456", "database":"test"}, - {"host":"192.168.2.124", "port":"3306", "user":"root", "pass":"123456", "database":"tongwujie"} - ] -} - ` - r := c.Post(serviceUrl, s) - fmt.Println("editDatabaseService:", r.ReadAll()) -} - -func removeDatabaseService() { - c := ghttp.NewClient() - r := c.Delete(serviceUrl, "[\"Site Database2\"]") - fmt.Println("removeDatabaseService:", r.ReadAll()) -} - - -func addWebService() { - c := ghttp.NewClient() - s := ` -{ - "name" : "Site", - "type" : "web", - "list" : [ - {"url":"http://baidu.com", "check":"http://itsadeadlink.com"}, - {"url":"http://baidu.com"} - ] -} - ` - r := c.Put(serviceUrl, s) - fmt.Println("addWebService:", r.ReadAll()) -} - -func editWebService() { - c := ghttp.NewClient() - s := ` -{ - "name" : "Site2", - "type" : "web", - "list" : [ - {"url":"http://baidu.com"}, - {"url":"http://baidu.com"} - ] -} - ` - r := c.Post(serviceUrl, s) - fmt.Println("editWebService:", r.ReadAll()) -} - -func removeWebService() { - c := ghttp.NewClient() - r := c.Delete(serviceUrl, "[\"Site2\"]") - fmt.Println("removeWebService:", r.ReadAll()) -} - -func main() { - addWebService() -} diff --git a/geg/net/http_client.go b/geg/net/http_client.go index fba8cef33..36d5a6f1c 100644 --- a/geg/net/http_client.go +++ b/geg/net/http_client.go @@ -7,8 +7,7 @@ import ( func main() { - c := ghttp.NewClient() - r := c.Get("http://192.168.2.124") - + c := ghttp.NewClient() + r, _ := c.Get("http://192.168.2.124") fmt.Println(r.StatusCode) } diff --git a/geg/net/http_server.go b/geg/net/http_server.go index ad6556453..373fe8c31 100644 --- a/geg/net/http_server.go +++ b/geg/net/http_server.go @@ -13,7 +13,7 @@ func HelloServer2(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "hello2\n") } func main() { - s := ghttp.NewServer() + s := ghttp.GetServer() s.SetAddr(":8199") s.SetIndexFolder(true) s.SetServerRoot("/home/john/Workspace/")