# gogo **Repository Path**: x-git/gogo ## Basic Information - **Project Name**: gogo - **Description**: 一行代码搞定RESTFul的轻量web框架。不需要ORM,Go语言 - **Primary Language**: Go - **License**: MIT - **Default Branch**: v1.1.2 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 29 - **Created**: 2018-06-25 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![GoGo Logo](https://gitee.com/konyshe/gogo/raw/v1.1.2/logo.jpg "GoGo") Go语言轻量web开发框架,特点是一行代码搞定RESTFul,不依赖第三方ORM,也不需要生成一堆的controllers和models文件,快速使用。 ## 背景 公司数据库有100多张表,用BeeGo等框架,需要生成controllers和models等文件共200多个,鼠标滑都滑不过来。每次表字段一有修改,代码就要统统跟着修改,想想都恐怖,于是就有了这个项目。目前只支持查询请求,同时集成了轻量的web开发框架。 ## 快速使用 ```go package main import ( "net/http" "gitee.com/konyshe/gogo" ) func main() { dataSourceName := "数据库用户名:数据库密码@tcp(数据库地址:数据库端口)/表名?charset=utf8" if err := gogo.SQLInit("mysql", dataSourceName, 100, 5); err != nil { gogo.Log().Error(err.Error()) return } gogo.GET("/restful/:tablename/:columnname", func(ctx *gogo.HTTPContext) { queryData, err := gogo.SQLQueryByMap( ctx.GetPathParam(":columnname"), ctx.GetString("feilds"), ctx.GetPathParam(":tablename"), ctx.GetString("where"), ctx.GetString("order"), ctx.GetInt("offset", 0), ctx.GetInt("count", 10)) if err != nil { gogo.Log().Error(err.Error()) ctx.WriteString(err.Error()) } else { ctx.WriteJSON(queryData) } }) gogo.GET("/ping", func(ctx *gogo.HTTPContext) { l, err := gogo.SQLQueryByMap("aid", "*", "dede_sysconfig", "", "", 0, 100) if err == nil { ctx.WriteExecute(l, "views/ping.tmpl", "views/include/foot.tmpl", "views/include/head.tmpl") return } gogo.Log().Error(err.Error()) }) gogo.POST("/api", func(ctx *gogo.HTTPContext) { //w := ctx.GetW() //r := ctx.GetR() ctx.WriteByte(ctx.GetPostBody()) }) gogo.STATUS(http.StatusNotFound, func(ctx *gogo.HTTPContext) { ctx.WriteString("Not Found") }) gogo.Run(":3001") } ``` ## 数据库表结构 ```mysql mysql> desc dede_sysconfig; +---------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+----------------------+------+-----+---------+-------+ | aid | smallint(8) unsigned | NO | | 0 | | | varname | varchar(20) | NO | PRI | | | | info | varchar(100) | NO | | | | | groupid | smallint(6) | NO | | 1 | | | type | varchar(10) | NO | | string | | | value | text | YES | | NULL | | +---------+----------------------+------+-----+---------+-------+ 6 rows in set ``` ## Windows ``` go build -o app.exe app.exe ``` ## Linux/MacOS ``` go build -o app ./app ``` ## 浏览器访问测试 ``` http://localhost:3001/ping http://localhost:3001/restful/dede_sysconfig/aid http://localhost:3001/restful/dede_sysconfig/aid?order=-aid&&offset=10&&count=100 http://localhost:3001/restful/dede_sysconfig/varname http://localhost:3001/notfound ``` ## Start using it 1. Download and install it: ```sh $ go get github.com/go-sql-driver/mysql $ go get github.com/phachon/go-logger $ go get gitee.com/konyshe/gogo ``` 2. Import it in your code: ```go import "gitee.com/konyshe/gogo" ``` 3. (Optional) Import `net/http`. This is required for example if using constants such as `http.StatusOK`. ```go import "net/http" ``` ## 示例中的方法介绍,更全的请看代码中的注释 ```go // 系统会优先判断是否命中固定URL,当固定URL无法命中的情况下,才会去判断是否命中正则URL(开发中部分支持) gogo.GET("/restful/:table_name", func(ctx *gogo.HTTPContext) // 注册没有命中任何URL规则时进入的函数 // 进入该函数的时候,GoGo已经帮你在Header中写入了404的STATUS gogo.STATUS(http.StatusNotFound, func(ctx *gogo.HTTPContext) // SQLInit 初始化数据库操作句柄,这里要提供: // driverName string: 数据库类型,例如mysql、sqlite等,参考github.com/go-sql-driver/mysql官方介绍 // dataSourceName string: 数据库地址,参考github.com/go-sql-driver/mysql官方介绍 // MaxOpenConns int: 最大缓存连接数,这个数值包含了MaxIdleConns // MaxIdleConns int:预备的最大空闲连接数 gogo.SQLInit(driverName string, dataSourceName string, maxOpenConns int, maxIdleConns int) error // SQLQueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回 // columnName string: 作为索引的字段名称 // feilds string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*" // tableName string: 查询的表名 // where string: 过滤条件,就是where后面跟着的部分 // order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序 // offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count // count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count gogo.SQLQueryByMap(columname, feilds, tableName, where, order string, offset, count int) (interface{}, error) // 输出日志到运行目录下的log目录下,同时控制台输出,还会根据日志级别显示不同颜色 // gogo.Log()返回的是go-logger的指针,后面的.Error()是go-logger的方法,具体使用参考github.com/phachon/go-logger // content string: 需要输出的日志内容 // 如果你不喜欢,可以直接删掉LOGUtils.go文件 gogo.Log().Error(content string) // 3001就是端口号了,这里和官方HTTP接口方法一致 gogo.Run(":3001") // GetW 获取原始的http.ResponseWriter指针 (ctx *HTTPContext) GetW() http.ResponseWriter // GetR 获取原始的http.Request (ctx *HTTPContext) GetR() *http.Request // GetPathParam 获取GET请求路径中的String格式参数值,例如/restful/:table_name/:id // key string: 参数名称 (ctx *HTTPContext) GetPathParam(key string) string // GetPostBody 获取POST请求的内容 (ctx *HTTPContext) GetPostBody() []byte // WriteExecute 将官方原始的ParseFiles和Execute接口做了合并 // data interface{}: 渲染模板需要的数据 // filenames ...string: 模板文件路径 (ctx *HTTPContext) WriteExecute(data interface{}, filenames ...string) error // WriteByte 将[]byte格式的数据输出给HTTP客户端 // content []byte: 需要输出HTTP客户端的[]byte格式数据 (ctx *HTTPContext) WriteByte(content []byte) // WriteString 将String格式的数据输出给HTTP客户端 // content string: 需要输出HTTP客户端的String格式数据 (ctx *HTTPContext) WriteString(content string) // WriteJSON 将Struct结构体的数据转换成Json输出给HTTP客户端 // v interface{}: 需要输出HTTP客户端的Struct结构体数据 (ctx *HTTPContext) WriteJSON(v interface{}) error ``` ## GoGo v1.1.2 - [x] add sql for 支持SQL,一行代码搞定RESTFul,无需一堆的controllers和models文件。还支持以表中任何一个字段作为MAP索引输出,方便客户端调用 ## GoGo v1.0.0 - [x] add router for GET, POST - [x] add router for STATUS - [x] add router for 解析URL,例如: /:table_name/:id