mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
完善示例及说明
This commit is contained in:
231
README.MD
231
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)、其他模块介绍
|
||||
|
||||
@ -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")
|
||||
}
|
||||
|
||||
|
||||
18
geg/frame/mvc/controller/demo/template2.go
Normal file
18
geg/frame/mvc/controller/demo/template2.go
Normal file
@ -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)
|
||||
})
|
||||
}
|
||||
@ -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 {
|
||||
|
||||
}
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
Reference in New Issue
Block a user