1. 程式人生 > >Beego框架學習--(核心:資料互動)

Beego框架學習--(核心:資料互動)

# Beego框架學習記錄 ## 1、beego簡介 beego 是一個快速開發 Go 應用的 HTTP 框架,他可以用來快速開發 API、Web 及後端服務等各種應用,是一個 RESTful 的框架,主要設計靈感來源於 tornado、sinatra 和 flask 這三個框架,但是結合了 Go 本身的一些特性(interface、struct 嵌入等)而設計的一個框架。 參考文件:[開發文件](https://beego.me/docs/intro/) ### 1.1、beego整體架構 ![](https://beego.me/docs/images/architecture.png) beego 是基於八大獨立的模組構建的,是一個高度解耦的框架。當初設計 beego 的時候就是考慮功能模組化,使用者即使不使用 beego 的 HTTP 邏輯,也依舊可以使用這些獨立模組,例如:你可以使用 cache 模組來做你的快取邏輯;使用日誌模組來記錄你的操作資訊;使用 config 模組來解析你各種格式的檔案。所以 beego 不僅可以用於 HTTP 類的應用開發,在你的 socket 遊戲開發中也是很有用的模組,這也是 beego 為什麼受歡迎的一個原因。大家如果玩過樂高的話,應該知道很多高階的東西都是一塊一塊的積木搭建出來的,而設計 beego 的時候,這些模組就是積木,高階機器人就是 beego。 ### 1.2、beego執行邏輯 ![](https://beego.me/docs/images/flow.png) ## 1、beego框架安裝 前置條件:已安裝go - 安裝beego和bee ```shell $ export GO111MODULE=on $ export GOPROXY=https://goproxy.io $ go get github.com/beego/bee $ go get github.com/astaxie/beego ``` 安裝完之後,`bee` 可執行檔案預設存放在 `$GOPATH/bin` 裡面,所以需要把 `$GOPATH/bin` 新增到環境變數中 ## 2、新建專案 ```shell #檢視bee相關命令 $ bee #新建專案 beegojingjinji $ bee new beegojingjinji #檢視專案結構 $ tree beegojingjinji beegojingjinji/ ├── beegojingjinji ├── conf │   └── app.conf ├── controllers │   └── default.go ├── go.mod ├── go.sum ├── main.go ├── models ├── routers │   └── router.go ├── static │   ├── css │   ├── img │   └── js │   └── reload.min.js ├── tests │   └── default_test.go └── views └── index.tpl 10 directories, 10 files #執行專案 $ cd beegojingjinji $ bee run | ___ \ | |_/ / ___ ___ | ___ \ / _ \ / _ \ | |_/ /| __/| __/ \____/ \___| \___| v1.11.0 2020/10/22 11:00:11 INFO ▶ 0001 Using 'beegojingjinji' as 'appname' 2020/10/22 11:00:11 INFO ▶ 0002 Initializing watcher... 2020/10/22 11:00:13 SUCCESS ▶ 0003 Built Successfully! 2020/10/22 11:00:13 INFO ▶ 0004 Restarting 'beegojingjinji'... 2020/10/22 11:00:13 SUCCESS ▶ 0005 './beegojingjinji' is running... 2020/10/22 11:00:13.083 [I] [asm_amd64.s:1373] http server Running on http://:8080 ``` 採用MVC的架構(model,view,controller),main.go是主入口 檔案內容解析: - conf:存放配置檔案,各種配置項,如監聽埠,是否開啟session,執行模式等 - controllers:控制層,實現業務邏輯 - models:模型層,資料邏輯 - routers:路由,實現路由跳轉 - static:存放靜態檔案 - tests:存放測試檔案 - views:檢視層,存放前端頁面 - go.mod:控制依賴 - main.go:主檔案入口 ## 3、啟動工作解析 main 函式裡面的 `beego.Run`, `beego.Run` 執行之後,看到的效果好像只是監聽服務埠這個過程,但是它內部做了很多事情 - 解析配置檔案 beego 會自動解析在 conf 目錄下面的配置檔案 `app.conf`,通過修改配置檔案相關的屬性,**我們可以定義:開啟的埠,是否開啟 session,應用名稱等資訊。** - 執行使用者的 hookfunc beego 會執行使用者註冊的 hookfunc,預設的已經存在了註冊 mime,使用者可以通過函式 `AddAPPStartHook` 註冊自己的啟動函式。 - 是否開啟 session 會根據上面配置檔案的分析之後判斷是否開啟 session,如果開啟的話就初始化全域性的 session。 - 是否編譯模板 beego 會在啟動的時候根據配置把 views 目錄下的所有模板進行預編譯,然後存在 map 裡面,這樣可以有效的提高模板執行的效率,無需進行多次編譯。 - 是否開啟文件功能 根據 EnableDocs 配置判斷是否開啟內建的文件路由功能 - 是否啟動管理模組 beego 目前做了一個很酷的模組,應用內[監控模組](https://beego.me/docs/advantage/monitor.md),會在 8088 埠做一個內部監聽,我們可以通過這個埠查詢到 QPS、CPU、記憶體、GC、goroutine、thread 等統計資訊。 - 監聽服務埠 這是最後一步也就是我們看到的訪問 8080 看到的網頁埠,內部其實呼叫了 `ListenAndServe`,充分利用了 goroutine 的優勢 一旦 run 起來之後,我們的服務就監聽在兩個埠了,一個服務埠 8080 作為對外服務,另一個 8088 埠實行對內監控。 ## 4、路由設定 參照如下連結,解析的十分詳細 https://beego.me/docs/mvc/controller/router.md ## 5、資料互動 ### 5.1、字串渲染 ```go func (c *MainController) Get() { c.Data["Website"] = "beego.me" c.Data["Email"] = "[email protected]" c.TplName = "index.tpl" } ``` 資料預設儲存在Data中,只需要在html頁面中使用"{{ }}"即可,如{{.Website}} ### 5.2、重設模板路徑 ```go //方法一: //在beego.run()之前 beego.SetViewsPath("新資料夾名") //方法二: //在配置檔案中設定 viewspath = 新資料夾名 ``` ### 5.3、前端向後端傳遞資料 獲取使用者傳遞的資料,包括 Get、POST 等方式的請求,beego 裡面會自動解析這些資料,可以通過如下方式獲取資料 - GetString(key string) string - GetStrings(key string) []string - GetInt(key string) (int64, error) - GetBool(key string) (bool, error) - GetFloat(key string) (float64, error) ```go //對於url中如下形式:local:8080/user?username=aaa //獲取引數username func (this *MainController) Post() { //方法一: username := this.GetString("username") //方法二: username := this.Input().Get("username") } //對於url中如下形式:local:8080/user/aaaa //獲取引數aaaa //首先設定路由為: beego.Router("/user/?:id, &controllers.MainController{}) //獲取資料 func (this *MainController) Post() { //方法一: id := this.GetString(":id") //方法二: username := this.Ctx.Input.Param("username") } ``` ### 5.4、接收表單資料 ```html

機構名稱:

``` - 讀取到字串 ```go //根據表單中name名,讀取對應值 func (this *MainController) Post() { name := this.GetString("name") } ``` - 讀取到結構體 ```go type User struct { name string 'form:"username"' //定義與表單對應的名稱 } func (this *MainController) Post() { user := User{} if err := this.ParseForm(&user); err != nil{ return } fmt.Println(user.name) } ``` 5.5、Ajax獲取資料 - 定義前段頁面Ajax互動內容 ```javascript var name = document.getElementById("name").value; var code = document.getElementById("code").value; var certNo = document.getElementById("certNo").value; var address = document.getElementById("address").value; var legalRepresentative = document.getElementById("legalRepresentative").value; $.ajax({ url:"/addIns", type: "post", data: JSON.stringify({ //前端使用JSON傳遞資料 "name":name, "code":code, "certNo":certNo, "address":address, "legalRepresentative":legalRepresentative, }), dataType:"JSON", //定義傳遞格式 success:function (data) { var code = data["code"] if (code==400.3){ var inner = document.getElementById("tiptext"); inner.innerHTML = "您已申請機構認證,請勿重複操作!如需更新,請進入更新機構認證頁面"; $('#popout').css('display',''); }else if (code==200){ var inner = document.getElementById("tiptext"); inner.innerHTML = "您的認證申請已通過,請稍後查詢上鍊結果!"; $('#popout').css('display',''); }else{ var inner = document.getElementById("tiptext"); inner.innerHTML = "未知錯誤,請聯絡工作人員"; $('#popout').css('display',''); } }, error:function (data){ alert("login failed, unknown failed") } }) ``` - 實現後端Ajax接收資料 ```go func (a *AddInsController) Put() { ins := models.ChaincodeIns{} body := a.Ctx.Input.RequestBody //通過內建函式接收Ajax資料 json.Unmarshal(body, &ins) //反序列化解析到結構體中 logs.Informational("Data from addIns html:" + ins.Name + " " + ins.CertNo + " " + ins.Address + " " + ins.LegalRepresentative) } ```