diff --git a/README.MD b/README.MD index 101a42b8b..bad6b1574 100644 --- a/README.MD +++ b/README.MD @@ -5,200 +5,45 @@ go get -u gitee.com/johng/gf ## 使用 ```go -import "gitee.com/johng/gf/g/xxx/xxx" -``` -## 说明 +package main -1. [框架说明](#框架介绍) - - [框架介绍](#框架介绍) - - [源码结构](#源码结构) -1. [Web服务开发](javascript:;) - - [HTTPServer](javascript:;) - - [Web Server](javascript:;) - - [多域名支持](javascript:;) - - [MVC开发模式](javascript:;) - - [Controller](javascript:;) - - [Model](javascript:;) - - [View](javascript:;) - - [服务注册](javascript:;) - - [控制器注册](javascript:;) - - [REST控制器](javascript:;) - - [执行对象注册](javascript:;) - - [回调函数注册](javascript:;) - - [Cookie](javascript:;) - - [Session](javascript:;) - - [路由控制](javascript:;) - - [配置管理](javascript:;) - - [单例管理](javascript:;) - - [数据校验](javascript:;) - - [模板引擎](javascript:;) - - [数据库操作](javascript:;) -1. [网络服务开发](javascript:;) - - [TCPServer](javascript:;) - - [UDPServer](javascript:;) -1. [功能模块设计](javascript:;) - - [缓存模块](javascript:;) - - [日志模块](javascript:;) - - [时间模块](javascript:;) - - [命令行模块](javascript:;) - - [环境变量模块](javascript:;) - - [文件管理模块](javascript:;) - - [并发安全容器](javascript:;) - - [通用编码模块](javascript:;) - - [其他模块简介](javascript:;) +import "gitee.com/johng/gf/g/net/ghttp" -### 框架介绍 -gf(Go Frame)是一款为Web服务及网络服务开发设计的,轻量级的Go语言开发框架。 -gf框架基于模块化设计,实现了通用的HTTP/TCP/UDP Server,并实现了Web服务开发的相关核心组件, -包括:MVC模式、Cookie、Session、模板引擎、路由控制、配置管理、数据校验、数据库操作等等, -并且提供了数十个自行研发的实用模块,包括:缓存模块、日志模块、时间模块、命令行模块、环境变量模块、并发安全容器等等。 - -### 源码结构 - . - ├── g 【框架目录】 - │   ├── container 【常用数据结构】 - │   │   ├── gbtree B+树 - │   │   ├── glist 并发安全的双向链表 - │   │   ├── gmap 并发安全的哈希表 - │   │   └── gset 并发安全的集合 - │   │   - │   ├── database 【数据库操作】 - │   │   └── gdb 通用关系型数据库操作封装(目前仅支持MySQL、PostgreSQL) - │   │   - │   ├── encoding 【数据编码】 - │   │   ├── gbase64 BASE64 - │   │   ├── gbinary 二进制操作 - │   │   ├── gcompress 数据压缩 - │   │   ├── gcrc32 CRC32 - │   │   ├── ghash 常用哈希函数 - │   │   ├── ghtml HTML编码 - │   │   ├── gjson JSON - │   │   ├── gmd5 MD5 - │   │   ├── gsha1 SHA1 - │   │   └── gurl URL - │   │   - │   ├── frame 【开发框架】 - │   │   ├── gcfg 通用配置管理 - │   │   ├── gins 单例对象管理 - │   │   └── gmvc MVC模式封装基类 - │   │   - │   ├── net 【网络通信】 - │   │   ├── ghttp 强大的HTTP客户端及服务端 - │   │   ├── gipv4 IPv4操作 - │   │   ├── gipv6 IPv6操作 - │   │   ├── grouter 路由管理 - │   │   ├── gscanner 端口扫描 - │   │   ├── gsmtp SMTP邮件管理 - │   │   ├── gtcp TCP服务端 - │   │   └── gudp UDP服务端 - │   │   - │   ├── os 【系统管理】 - │   │   ├── gcache 缓存管理 - │   │   ├── gcmd 命令行控制 - │   │   ├── genv 环境变量 - │   │   ├── gfile 文件管理 - │   │   ├── gfilepool 文件指针池 - │   │   ├── gfilespace 文件碎片管理 - │   │   ├── glog 日志管理 - │   │ ├── gmmap MMAP文件内存映射 - │   │   ├── gtime 时间管理 - │   │   └── gview 视图管理(通用的模板管理对象,独立于MVC模块) - │   │   - │   └── util 【常用工具】 - │   ├── gconv 类型转换 - │   ├── grand 随机数 - │   ├── gregx 正则表达式 - │   ├── gvalid 表单校验 - │   └── gutil 其他工具 - │   - ├── geg 【框架示例】 - ├── vendor 【第三方包】 - └── version.go 【版本信息】 - - - -## 配置 -1. 默认读取文件运行目录的config.json文件; -1. 支持多配置文件管理,默认配置文件目录为当前运行目录; -1. config.json配置文件说明: -```json -{ - "viewpath" : "视图文件存放路径", - "routings" : { - "dispatch" : { - "解析匹配规则1" : "解析替换规则1", - "解析匹配规则2" : "解析替换规则2" - }, - "patch" : { - "打包匹配规则1" : "打包替换规则1", - "打包匹配规则2" : "打包替换规则2" - } - }, - "database" : { - "数据库分组名称" : [ - { - "host" : "地址", - "port" : "端口", - "user" : "账号", - "pass" : "密码", - "name" : "数据库名称", - "type" : "数据库类型(mysql|pgsql)", - "role" : "数据库角色(master|slave)", - "charset" : "字符编码", - "priority" : "数据库优先级(负载均衡处理)" - } - ] - } +func main() { + ghttp.GetServer().BindHandler("/", func(r *ghttp.Request){ + r.Response.WriteString("Hello World!") + }) } ``` -1. config.json示例文件: -```json -{ - "viewpath" : "/home/www/templates/", - "routings" : { - "dispatch" : { - "\/list\/page\/(\d+)[\/\?]*" : "/list?page=$1&" - } - }, - "database" : { - "default" : [ - { - "host" : "127.0.0.1", - "port" : "3306", - "user" : "root", - "pass" : "123456", - "name" : "test", - "type" : "mysql", - "role" : "master", - "charset" : "utf8", - "priority" : "100" - }, - { - "host" : "127.0.0.1", - "port" : "3306", - "user" : "root", - "pass" : "123456", - "name" : "test", - "type" : "mysql", - "role" : "slave", - "charset" : "utf8", - "priority" : "100" - } - ], - "ucenter" : [ - { - "host" : "127.0.0.1", - "port" : "3306", - "user" : "root", - "pass" : "123456", - "name" : "ucenter", - "type" : "mysql", - "role" : "master", - "charset" : "utf8", - "priority" : "100" - } - ] - } -} -``` - +## 文档 +* [一、框架介绍](https://www.kancloud.cn/johng/gf/494364) +* [二、Web服务开发](https://www.kancloud.cn/johng/gf/494364) + * [1、Web Server](https://www.kancloud.cn/johng/gf/494366) + * [2、MVC模式](https://www.kancloud.cn/johng/gf/494367) + * [3、服务注册](https://www.kancloud.cn/johng/gf/494368) + * [1)、控制器注册](https://www.kancloud.cn/johng/gf/494369) + * [2)、执行对象注册](https://www.kancloud.cn/johng/gf/494370) + * [3)、回调函数注册](https://www.kancloud.cn/johng/gf/494371) + * [4、Cookie](https://www.kancloud.cn/johng/gf/494372) + * [5、Session](https://www.kancloud.cn/johng/gf/494373) + * [6、输入输出](https://www.kancloud.cn/johng/gf/494374) + * [7、路由控制](https://www.kancloud.cn/johng/gf/494375) + * [8、配置管理](https://www.kancloud.cn/johng/gf/494376) + * [9、单例管理](https://www.kancloud.cn/johng/gf/494377) + * [10、数据校验](https://www.kancloud.cn/johng/gf/494378) + * [11、模板引擎](https://www.kancloud.cn/johng/gf/494379) + * [12、数据库操作](https://www.kancloud.cn/johng/gf/494380) +* 三、网络服务开发 + * [1、TCPServer](https://www.kancloud.cn/johng/gf/494382) + * [2、UDPServer](https://www.kancloud.cn/johng/gf/494383) +* 四、功能模块设计 + * 1)、缓存模块 + * 2)、日志模块 + * 3)、时间模块 + * 4)、JSON模块 + * 5)、命令行模块 + * 6)、环境变量模块 + * 7)、文件管理模块 + * 8)、并发安全容器 + * 9)、通用编码模块 + * 10)、其他模块介绍 diff --git a/geg/frame/mvc/controller/demo/template.go b/geg/frame/mvc/controller/demo/template.go index db72725bb..316fcc1a4 100644 --- a/geg/frame/mvc/controller/demo/template.go +++ b/geg/frame/mvc/controller/demo/template.go @@ -3,8 +3,6 @@ package demo import ( "gitee.com/johng/gf/g/net/ghttp" "gitee.com/johng/gf/g/frame/gmvc" - "gitee.com/johng/gf/g/frame/gins" - "gitee.com/johng/gf/g/os/gview" ) type ControllerTemplate struct { @@ -12,16 +10,15 @@ type ControllerTemplate struct { } func init() { - ghttp.GetServer().BindHandler("/template/handler-info", Info) - ghttp.GetServer().BindControllerMethod("/template/ctl-info", &ControllerTemplate{}, "Info") -} - -func Info(r *ghttp.Request) { - gins.View().SetPath("") + ghttp.GetServer().BindControllerMethod("/template/info", &ControllerTemplate{}, "Info") } func (c *ControllerTemplate) Info() { c.View.Assign("name", "john") + c.View.Assigns(map[string]interface{}{ + "age" : 18, + "score" : 100, + }) c.View.Display("user/index") } diff --git a/geg/frame/mvc/controller/demo/template2.go b/geg/frame/mvc/controller/demo/template2.go new file mode 100644 index 000000000..783540a34 --- /dev/null +++ b/geg/frame/mvc/controller/demo/template2.go @@ -0,0 +1,18 @@ +package demo + +import ( + "gitee.com/johng/gf/g/net/ghttp" + "gitee.com/johng/gf/g/frame/gins" +) + +func init() { + ghttp.GetServer().BindHandler("/template2", func(r *ghttp.Request){ + view := gins.View() + view.SetPath("/home/www/template/") + content, _ := view.Parse("index", map[string]interface{}{ + "id" : 123, + "name" : "john", + }) + r.Response.Write(content) + }) +} \ No newline at end of file diff --git a/geg/net/tcp_server.go b/geg/net/tcp_server.go index 1556e131a..de98915dc 100644 --- a/geg/net/tcp_server.go +++ b/geg/net/tcp_server.go @@ -2,46 +2,16 @@ package main import ( "net" - "fmt" "gitee.com/johng/gf/g/net/gtcp" - "io" - "log" - "time" - "gitee.com/johng/gf/g/util/gutil" ) func main() { gtcp.NewServer(":8999", func(conn net.Conn) { - - - try := 0 - buffersize := 5 - data := make([]byte, 0) for { - buffer := make([]byte, buffersize) - length, err := conn.Read(buffer) - if err != nil { - log.Println(err) - if err != io.EOF { - log.Println("node recieve:", err, "try:", try) - } - if try > 2 { - break; - } - try ++ - time.Sleep(100 * time.Millisecond) - } else { - if length == buffersize { - data = gutil.MergeSlice(data, buffer) - } else { - data = gutil.MergeSlice(data, buffer[0:length]) - break; - } + buffer := make([]byte, 1024) + if length, err := conn.Read(buffer); err == nil { + conn.Write(append([]byte("What you send, what you receive: "), buffer[0 : length]...)) } } - fmt.Println(string(data)) }).Run() - select { - - } } \ No newline at end of file diff --git a/geg/net/udp_server.go b/geg/net/udp_server.go index c4021b883..cd573277e 100644 --- a/geg/net/udp_server.go +++ b/geg/net/udp_server.go @@ -1,19 +1,16 @@ package main import ( - "net" "fmt" + "net" "gitee.com/johng/gf/g/net/gudp" ) func main() { gudp.NewServer(":8999", func(conn *net.UDPConn) { - var buf [1024]byte - count, raddr, err := conn.ReadFromUDP(buf[0:]) - if err != nil { - return + buffer := make([]byte, 1024) + if length, addr, err := conn.ReadFromUDP(buffer); err == nil { + fmt.Println(string(buffer[0 : length]), "from", addr.String()) } - fmt.Println(raddr.String() + ":", string(buf[0:count])) - _, err = conn.WriteToUDP([]byte("hi"), raddr) }).Run() } \ No newline at end of file