初识beego
目錄
- 初識beego
- bee 工具簡介
- bee工具的安裝
- `new` 命令
- `api` 命令
- `run` 命令
- `pack` 命令
- `version` 命令
- `generate` 命令
- `migrate` 命令
- `dockerize` 命令
- 創建項目
- 運行項目
- 項目路由設置
- controller 邏輯
- model 分析
- View 編寫
- 靜態文件處理
初識beego
bee 工具簡介
bee 工具是一個為了協助快速開發 beego 項目而創建的項目,通過 bee 您可以很容易的進行 beego 項目的創建、熱編譯、開發、測試、和部署。
bee工具的安裝
go get -u github.com/beego/bee/v2安裝完之后,bee 可執行文件默認存放在 $GOPATH/bin 里面,所以您需要把 $GOPATH/bin 添加到您的環境變量中,才可以進行下一步。
new 命令
new 命令是新建一個 Web 項目,我們在命令行下執行 bee new <項目名> 就可以創建一個新的項目。但是注意該命令必須在 $GOPATH/src 下執行。最后會在 $GOPATH/src 相應目錄下生成如下目錄結構的項目:
api 命令
上面的 new 命令是用來新建 Web 項目,不過很多用戶使用 beego 來開發 API 應用。所以這個 api 命令就是用來創建 API 應用的,執行命令之后如下所示:
run 命令
我們在開發 Go 項目的時候最大的問題是經常需要自己手動去編譯再運行,bee run 命令是監控 beego 的項目,通過 fsnotify監控文件系統。但是注意該命令必須在 $GOPATH/src/appname 下執行。
pack 命令
pack 目錄用來發布應用的時候打包,會把項目打包成 zip 包,這樣我們部署的時候直接把打包之后的項目上傳,解壓就可以部署了
version 命令
這個命令是動態獲取 bee、beego 和 Go 的版本,這樣一旦用戶出現錯誤,可以通過該命令來查看當前的版本
generate 命令
這個命令是用來自動化的生成代碼的,包含了從數據庫一鍵生成 model,還包含了 scaffold 的,通過這個命令,讓大家開發代碼不再慢
migrate 命令
這個命令是應用的數據庫遷移命令,主要是用來每次應用升級,降級的SQL管理。
dockerize 命令
這個命令可以通過生成Dockerfile文件來實現docker化你的應用。
例子:
生成一個以1.6.4版本Go環境為基礎鏡像的Dockerfile,并暴露9000端口:
更多幫助信息可執行bee help dockerize
創建項目
bee new quickstart通過一個簡單的命令就創建了一個 beego 項目。他的目錄結構如下所示
quickstart |-- conf | `-- app.conf |-- controllers | `-- default.go |-- main.go |-- models |-- routers | `-- router.go |-- static | |-- css | |-- img | `-- js |-- tests | `-- default_test.go `-- views`-- index.tpl從目錄結構中我們也可以看出來這是一個典型的 MVC 架構的應用,main.go 是入口文件。
運行項目
beego 項目創建之后,我們還需要初始化go.mod文件。進入目錄之后,使用go mod init初始化模塊依賴。
接著我們就開始運行項目,首先進入創建的項目,我們使用 bee run 來運行該項目,這樣就可以做到熱編譯的效果:
cd quickstartbee run項目路由設置
前面我們已經創建了 beego 項目,而且我們也看到它已經運行起來了,那么是如何運行起來的呢?讓我們從入口文件先分析起來吧:
package mainimport (_ "quickstart/routers""github.com/beego/beego/v2/server/web" )func main() {web.Run() }我們看到 main 函數是入口函數,但是我們知道 Go 的執行過程是如下圖所示的方式:
這里我們就看到了我們引入了一個包 _ "quickstart/routers",這個包只引入執行了里面的 init 函數,那么讓我們看看這個里面做了什么事情:
package routersimport ("quickstart/controllers""github.com/beego/beego/v2/server/web" )func init() {web.Router("/", &controllers.MainController{}) }路由包里面我們看到執行了路由注冊 web.Router, 這個函數的功能是映射 URL 到 controller,第一個參數是 URL (用戶請求的地址),這里我們注冊的是 /,也就是我們訪問的不帶任何參數的 URL,第二個參數是對應的 Controller,也就是我們即將把請求分發到那個控制器來執行相應的邏輯,我們可以執行類似的方式注冊如下路由:
web.Router("/user", &controllers.UserController{})web.Run 執行之后,我們看到的效果好像只是監聽服務端口這個過程,但是它內部做了很多事情:
-
解析配置文件
beego 會自動解析在 conf 目錄下面的配置文件 app.conf,通過修改配置文件相關的屬性,我們可以定義:開啟的端口,是否開啟 session,應用名稱等信息。
-
執行用戶的 hookfunc
beego 會執行用戶注冊的 hookfunc,默認的已經存在了注冊 mime,用戶可以通過函數 AddAPPStartHook 注冊自己的啟動函數。
-
是否開啟 session
會根據上面配置文件的分析之后判斷是否開啟 session,如果開啟的話就初始化全局的 session。
-
是否編譯模板
beego 會在啟動的時候根據配置把 views 目錄下的所有模板進行預編譯,然后存在 map 里面,這樣可以有效的提高模板運行的效率,無需進行多次編譯。
-
是否開啟文檔功能
根據 EnableDocs 配置判斷是否開啟內置的文檔路由功能
-
是否啟動管理模塊
beego 目前做了一個很酷的模塊,應用內監控模塊,會在 8088 端口做一個內部監聽,我們可以通過這個端口查詢到 QPS、CPU、內存、GC、goroutine、thread 等統計信息。
-
監聽服務端口
這是最后一步也就是我們看到的訪問 8080 看到的網頁端口,內部其實調用了 ListenAndServe,充分利用了 goroutine 的優勢
controller 邏輯
前面我們了解了如何把用戶的請求分發到控制器,這小節我們就介紹大家如何來寫控制器,首先我們還是從源碼分析入手:
package controllersimport ("github.com/beego/beego/v2/server/web" )type MainController struct {web.Controller }func (this *MainController) Get() {this.Data["Website"] = "beego.vip"this.Data["Email"] = "astaxie@gmail.com"this.TplName = "index.tpl" }上面的代碼顯示首先我們聲明了一個控制器 MainController,這個控制器里面組合了 web.Controller,這就是 Go 的組合方式,也就是 MainController 自動擁有了所有 web.Controller 的方法。
而 web.Controller 擁有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。我們可以通過重寫的方式來實現這些方法,而我們上面的代碼就是重寫了 Get 方法。
model 分析
我們知道 Web 應用中我們用的最多的就是數據庫操作,而 model 層一般用來做這些操作,我們的 bee new 例子不存在 Model 的演示,但是 bee api 應用中存在 model 的應用。說的簡單一點,如果您的應用足夠簡單,那么 Controller 可以處理一切的邏輯,如果您的邏輯里面存在著可以復用的東西,那么就抽取出來變成一個模塊。因此 Model 就是逐步抽象的過程,一般我們會在 Model 里面處理一些數據讀取,如下是一個日志分析應用中的代碼片段:
package modelsimport ("path/filepath""strings" )var (NotPV []string = []string{"css", "js", "class", "gif", "jpg", "jpeg", "png", "bmp", "ico", "rss", "xml", "swf"} )const big = 0xFFFFFFfunc LogPV(urls string) bool {ext := filepath.Ext(urls)if ext == "" {return true}for _, v := range NotPV {if v == strings.ToLower(ext) {return false}}return true }所以如果您的應用足夠簡單,那么就不需要 Model 了;如果你的模塊開始多了,需要復用,需要邏輯分離了,那么 Model 是必不可少的。
View 編寫
在前面編寫 Controller 的時候,我們在 Get 里面寫過這樣的語句 this.TplName = "index.tpl",設置顯示的模板文件,默認支持 tpl 和 html 的后綴名,如果想設置其他后綴你可以調用 beego.AddTemplateExt 接口設置,那么模板如何來顯示相應的數據呢?beego 采用了 Go 語言默認的模板引擎,所以和 Go 的模板語法一樣,Go 模板的詳細使用方法請參考《Go Web 編程》模板使用指南
<!DOCTYPE html><html><head><title>Beego</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><header class="hero-unit" style="background-color:#A9F16C"><div class="container"><div class="row"><div class="hero-text"><h1>Welcome to Beego!</h1><p class="description">Beego is a simple & powerful Go web framework which is inspired by tornado and sinatra.<br />Official website: <a href="http://{{.Website}}">{{.Website}}</a><br />Contact me: {{.Email}}</p></div></div></div></header></body> </html>我們在 Controller 里面把數據賦值給了 data(map 類型),然后我們在模板中就直接通過 key 訪問 .Website 和 .Email 。這樣就做到了數據的輸出。接下來我們講解如何讓靜態文件輸出。
靜態文件處理
前面我們介紹了如何輸出靜態頁面,但是我們的網頁往往包含了很多的靜態文件,包括圖片、JS、CSS 等,剛才創建的應用里面就創建了如下目錄:
├── static│ ├── css│ ├── img│ └── jsbeego 默認注冊了 static 目錄為靜態處理的目錄,注冊樣式:URL 前綴和映射的目錄(在/main.go文件中web.Run()之前加入):
StaticDir["/static"] = "static"用戶可以設置多個靜態文件處理目錄,例如你有多個文件下載目錄 download1、download2,你可以這樣映射(在 /main.go 文件中 web.Run() 之前加入):
web.SetStaticPath("/down1", "download1") web.SetStaticPath("/down2", "download2")這樣用戶訪問 URL http://localhost:8080/down1/123.txt 則會請求 download1 目錄下的 123.txt 文件。
總結
- 上一篇: 该网页无法正常运作xxxx将您重定向的次
- 下一篇: [NFC] 读羊城通卡片信息