## 内部使用基于go-chi的web框架 # 框架引入 > go get -u github.com/ouxuanserver/osmanthuswine # 开始 ... + /config.json 配置文件 ```json { "port": "8808", "host": "0.0.0.0", "cross_domain": "*", "post_max_memory": 1024000, "update_path": "new_exe", "api_router": "/Api/*", "db": { "host": "", "port": "", "user": "", "password": "", "name": "", "max_open_conn": 500 } } ``` + /main.go文件 ``` package main import ( "./app/index" "github.com/ouxuanserver/osmanthuswine" "github.com/ouxuanserver/osmanthuswine/src/core" ) func main() { //注册index控制器 core.GetInstanceRouterManage().Registered(&index.Index{}) //主程序执行 osmanthuswine.Run() } ``` + /index/index.go文件 ``` package index import ( "github.com/ouxuanserver/osmanthuswine/src/core" ) type Index struct { core.Controller } /* * 访问url:http://{host}:{port}/{api_router}/{包名首字母大写}/{结构名首字母大写}/{方法名首字母小写}.json * 例:http://127.0.0.1:8808/Api/Index/Index/index.json */ func (that *Index) Index() { that.DisplayByData(that.Request.REQUEST) } ``` ## core.Controller.Request 使用说明 #### 输入参数 + that.Request.GET["参数"] //类型:map[string]string + that.Request.POST["参数"] //类型:map[string]string + that.Request.REQUEST["参数"] //类型:map[string]string , 为GET以及POST的合并值,当出现值冲突时GET参数会被覆盖 #### session与cookie获取 + that.Request.SESSION["参数"] //类型:map[string]string + that.Request.COOKIE["参数"] //类型:map[string]string #### header信息获取 + that.Request.HEADER["参数"] //类型:map[string]string #### 该取值一般以POST-RAW形式传入原始数据,有可能 + that.Request.BODY //类型:string #### 快速获取上传的文件 + that.Request.FILE //类型:*multipart.FileHeader #### 获取上传的所有文件 + that.Request.FILES //类型:map[string][]*multipart.FileHeader ## core.Controller 使用说明 #### 输出显示 > 即使输出时不处于函数结尾,也无需return + that.DisplayByData(data interface{}) ``` { "code":0, "data":data, "msg":"" } ``` - - - + that.DisplayBySuccess(msg string) ``` { "code":0, "data":null, "msg":msg } ``` - - - + that.DisplayByError(msg string, code int) ``` { "code":code, "data":null, "msg":msg } ``` - - - + that.Display(data interface{}, msg string, code int) ``` { "code":code, "data":data, "msg":msg } ``` - - - + that.DisplayByString(data string) ``` data //直接输出data以string形式 ``` - - - + that.DisplayByRaw(data []byte) ``` data //直接输出data以[]byte形式,可用于直接输出二进制文件 ``` - - - ##### 20190416新增 + that.CheckErrDisplayByError(err error,msg...) ``` err //错误信息,自动判断是否等于nil,如果等于nil该语句会被忽略 msg //错误文案提示,不填直接输出err.Error() ``` #### session操作 > 目前session实现基于securecookie,以加密形式储存在cookie中,注意不要存放大量数据,以免超过cookie的最大储存值 + that.SetSession(name string, value string) //设置session + that.DeleteSession(name string) //删除session + that.ClearSession() //清空session #### cookie操作 > 尽量以session的形式操作 + that.SetCookie(name string, value string) ## 数据库操作 > 目前框架中集成gorm与xorm框架 + core.GetXormAuto() //获取xorm实例 + core.GetGormAuto() //获取gorm实例 #### 数据库配置 ``` 实例的数据库配置来自于相同目录下的config.json或者private.json文件 { ...其他配置 "db": { "host": "", "port": "", "user": "", "password": "", "name": "", "prefix": "", "max_open_conn": 500 } } prefix为表前缀 max_open_conn为可支持最大连接数(未测试是否可用 ``` ## 支持WebSocket > 当传入core.GetInstanceRouterManage().Registered的对象继承自core.WebSocket时,协议升级为websocket,路由地址忽略最后方法名 #### 集成melody库,使用详情https://github.com/olahol/melody ``` package index import ( "github.com/ouxuanserver/osmanthuswine/src/core" "gopkg.in/olahol/melody.v1" ) type Index struct { core.WebSocket } func (that *Wstest) HandleConnect(session *melody.Session) { //implement } func (that *Wstest) HandlePong(session *melody.Session) { //implement } func (that *Wstest) HandleMessage(session *melody.Session, data []byte) { that.GetMelody().Broadcast(data) //implement } func (that *Wstest) HandleMessageBinary(session *melody.Session, data []byte) { //implement } func (that *Wstest) HandleSentMessage(session *melody.Session, data []byte) { //implement } func (that *Wstest) HandleSentMessageBinary(session *melody.Session, data []byte) { //implement } func (that *Wstest) HandleDisconnect(session *melody.Session) { //implement } func (that *Wstest) HandleError(session *melody.Session, err error) { //implement } ``` ``` //javascript var ws = new WebSocket("ws://127.0.0.1/Api/Index/Index") ``` > PS:不同url对应不同的melody实例 ## 杂项 > 热更新,仅支持linux ``` 默认情况下,检测同路径下的<文件名_update>,如果该文件与当前文件不一致,则进行热更,已连接的连接无需断连 可在config.json中配置检测的文件名 { ...其他配置 "update_path": "需要检测的文件路径" } 备注:需要检测的文件路径最好不要与当前运行的文件路径相同 ```