beego是一個使用Go語言開發(fā)的應(yīng)用Web框架,目的是為大家提供一個高效率的Web應(yīng)用開發(fā)框架,該框架采用模塊封裝。beego可以用來快速開發(fā)API、Web、后端服務(wù)等各種應(yīng)用,是一個RESTFul的框架,主要設(shè)計靈感來源于tornado、sinatra、flask這三個框架,但是結(jié)合了Go本身的一些特性(interface、struct繼承等)而設(shè)計的一個框架。
本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。
1. Beego簡介
1.1 beego是什么
Beego是一個使用Go語言開發(fā)的應(yīng)用Web框架,框架開始于2012年,目的是為大家提供一個高效率的Web應(yīng)用開發(fā)框架,該框架采用模塊封裝,使用簡單,容易學(xué)習(xí)。對程序員來說,beego掌握起來非常簡單,只需要關(guān)注業(yè)務(wù)邏輯實現(xiàn)即可,框架自動為項目需求提供不同的模塊功能。
beego可以用來快速開發(fā)API、Web、后端服務(wù)等各種應(yīng)用,是一個RESTFul的框架,主要設(shè)計靈感來源于tornado、sinatra、flask這三個框架,但是結(jié)合了Go本身的一些特性(interface、struct繼承等)而設(shè)計的一個框架。
特性
- 簡單化:支持RESTful風(fēng)格、MVC模型;可以使用bee工具類提高開發(fā)效率,比如監(jiān)控代碼修改進行熱編譯,自動化測試代碼以及自動化打包部署等豐富的開發(fā)調(diào)試功能。
- 智能化:beego框架封裝了路由模塊、支持智能路由、智能監(jiān)控,并可以監(jiān)控內(nèi)存消耗,CPU使用以及goroutine的運行狀況,方便開發(fā)者對線上應(yīng)用進行監(jiān)控分析。
- 模塊化:beego根據(jù)功能對代碼進行了解耦封裝,形成了Session、Cache、Log、配置解析、性能監(jiān)控、上下文操作、ORM等獨立的模塊,方便開發(fā)者進行使用
- 高性能:beego采用Go原生的http請求,goroutine的并發(fā)效率應(yīng)付大流量的Web應(yīng)用和API引用。
1.2 命令行工具Bee
bee
bee是一個開發(fā)工具,協(xié)助Beego框架開發(fā)項目是進行創(chuàng)建項目、運行項目、熱部署等相關(guān)的項目管理的工具,beego是源碼負責(zé)開發(fā)、bee是工具負責(zé)構(gòu)建和管理項目。
USAGE bee command [arguments] AVAILABLE COMMANDS version Prints the current Bee version // 打印當前bee版本 migrate Runs database migrations // 運行數(shù)據(jù)庫的 api Creates a Beego API application // 構(gòu)建一個beego的API應(yīng)用 bale Transforms non-Go files to Go source files// 轉(zhuǎn)義非go的文件到go的src中區(qū) fix Fixes your application by making it compatible with newer versions of Beego // 通過使得新版本的beego兼容來修復(fù)應(yīng)用 pro Source code generator// 源代碼生成器 dev Commands which used to help to develop beego and bee// 輔助開發(fā)beego和bee的 dlv Start a debugging session using Delve// 使用delve進行debbugging dockerize Generates a Dockerfile for your Beego application // 為beego應(yīng)用生成dockfile generate Source code generator// 源代碼生成器 hprose Creates an RPC application based on Hprose and Beego frameworks new Creates a Beego application// 創(chuàng)建beego應(yīng)用 pack Compresses a Beego application into a single file // 壓縮beego項目文件 rs Run customized scripts// 運行自定義腳本 run Run the application by starting a local development server // 通過啟動本地開發(fā)服務(wù)器運行應(yīng)用 server serving static content over HTTP on port// 通過HTTP在端口上提供靜態(tài)內(nèi)容 update Update Bee// 更新bee
// 創(chuàng)建一個beego項目 bee new FirstBeego // 運行beego項目 bee run
2. 安裝beego
// 下載beego的安裝包 go get -u github.com/beego/beego/v2@v2.0.0 // 可能會與遇到錯誤,如下圖所示,然后開啟set GO111MODULE=on即可,go env可以看環(huán)境變量配置,mac/Linux使用export GO111MODULE=on即可 set GO111MODULE=on
如果安裝還是沒有反應(yīng)
set GO111MODULE=on set GOPROXY=https://goproxy.io // 然后再執(zhí)行,即可完成安裝beego和bee $ go get -u github.com/beego/beego/v2 $ go get -u github.com/beego/bee/v2
3. Beego啟動流程分析
3.1 程序入口
import ( _ "FirstBeego/routers" beego "github.com/beego/beego/v2/server/web" ) func main() { beego.Run() } // -------------------routers------------------- import ( "FirstBeego/controllers" beego "github.com/beego/beego/v2/server/web" ) func init() {// 會先執(zhí)行init()函數(shù) beego.Router("/", &controllers.MainController{}) } // -------------------MainController------------------- type MainController struct { beego.Controller } func (c *MainController) Get() { c.Data["Website"] = "beego.me" c.Data["Email"] = "astaxie@gmail.com" c.TplName = "index.tpl" }
Go語言執(zhí)行順序
Beego的beego.Run()邏輯
執(zhí)行完init()方法之后,程序繼續(xù)向下執(zhí)行,到main函數(shù),此時在main函數(shù)中執(zhí)行
beego.Run()
,主要做了以下幾件事:
- 解析配置文件,即app.conf文件,獲取其中的端口、應(yīng)用名稱等信息
- 檢查是否開啟session,如果開啟了session,會初始化一個session對象
- 是否編譯模板,beego框架會在項目啟動的時候根據(jù)配置把views目錄下的所有模板進行預(yù)編譯,然后存放在map中,這樣可以有效的提高模板運行的效率,不需要進行多次編譯
- 監(jiān)聽服務(wù)端口,根據(jù)app.conf文件配置端口,啟動監(jiān)聽
4. Beego組織架構(gòu)
項目配置:conf
控制器:controllers
該目錄是存放控制器文件的目錄,所謂控制器就是控制應(yīng)用調(diào)用哪些業(yè)務(wù)邏輯,由controllers處理完HTTP請求以后,并負責(zé)返回給前端調(diào)用者。
數(shù)據(jù)層:models
models層可以解釋為實體層或者數(shù)據(jù)層,在models層中實現(xiàn)用戶和業(yè)務(wù)數(shù)據(jù)的處理,主要和數(shù)據(jù)庫表相關(guān)的一些操作會放在這個目錄中實現(xiàn),然后將執(zhí)行后的結(jié)果數(shù)據(jù)返回給controller層。增刪改查的操作都是在models中實現(xiàn)。
路由層:routers
路由層,即分發(fā),對進來的后天的請求進行分發(fā)操作,當瀏覽器進行一個http請求達到后臺的web項目的時候,必須要讓程序能夠根據(jù)瀏覽器的請求url進行不同的業(yè)務(wù)處理,從接受前端請求到判斷執(zhí)行具體的業(yè)務(wù)邏輯的過程的工作,就讓routers來實現(xiàn)。
靜態(tài)資源目錄:static
在static目錄下,存放的是web項目的靜態(tài)資源文件,主要有css、img、js、html這幾類文件。html中會存放應(yīng)用的靜態(tài)頁面文件。
視圖模板:views
views中存放的就是應(yīng)用存放html模板頁面的目錄,所謂模板,就是頁面框架和布局是已經(jīng)用html寫好了的,只需要在進行訪問和展示的時候,將獲取到的數(shù)據(jù)動態(tài)填充到頁面中,能夠提高渲染效率。因此,模板文件是非常常見的一種方式。
整個項目的架構(gòu)就是MVC的運行模式。
5. beego框架路由設(shè)置
在beego框架中,支持四種路由設(shè)置,分別是:基礎(chǔ)路由、固定路由、正則路由和自動路由
基礎(chǔ)路由
直接給過beego.Get()
、beego.Post()
、beego.Put()
,beego.Delete()
等方法進行路由的映射,。
beego.Get("",func) // 表示Get beego.Post("",func) // 表示Post
固定路由
beego.Router("/",controller)
Get請求就會對應(yīng)到Get方法,Post對應(yīng)到post方法,Delete對應(yīng)到Delete方法,Header方法對應(yīng)到Header方法。
正則路由
正則路由是指可以在進行固定路由的基礎(chǔ)上,支持匹配一定格式的正則表達式,比如
:id
、:username
自定義正則,file的路徑和后綴切換以及全匹配等操作。
自定義路由
在開發(fā)的時候用固定匹配想要直接執(zhí)行對應(yīng)的邏輯控制方法,因此beego提供了可以自定義的自定義路由配置。
beego.Router("/",&IndexController{},"") // Router adds a patterned controller handler to BeeApp. // it's an alias method of HttpServer.Router. // usage: // simple router // beego.Router("/admin", &admin.UserController{}) // beego.Router("/admin/index", &admin.ArticleController{}) // // regex router // // beego.Router("/api/:id([0-9]+)", &controllers.RController{}) // // custom rules // beego.Router("/api/list",&RestController{},"*:ListFood") // beego.Router("/api/create",&RestController{},"post:CreateFood") // beego.Router("/api/update",&RestController{},"put:UpdateFood") // beego.Router("/api/delete",&RestController{},"delete:DeleteFood")
6. 靜態(tài)文件的設(shè)置
在go的web項目中,一些靜態(tài)資源文件,如果用戶要訪問靜態(tài)資源文件,則我們也是能夠訪問到的,這需要我們的項目中進行靜態(tài)資源設(shè)置。
beego.SetStaticPath("/down1","download1")
這里的download目錄是指的非go web項目的static目錄下目錄,而是開發(fā)者重新新建的另外的目錄。
7. Beego博客項目
beego的orm是可以自動創(chuàng)建表的,與python的django框架有的一拼。
在Go中Object類型的數(shù)據(jù)使用interface{}
空的接口類型來代替。
如果有js文件失效,注意清除緩存之后再來玩,否則添加的js不會生效。
// 首頁顯示內(nèi)容,f func MakeHomeBlocks(articles []Article, isLogin bool) template.HTML { htmlHome := "" // for index, value := range objects{} 實現(xiàn)遍歷 for _, art := range articles { // 轉(zhuǎn)換為模板所需要的數(shù)據(jù) homePageParam := HomeBlockParam{} homePageParam.Id = art.Id homePageParam.Title = art.Title homePageParam.Tags = createTagsLinks(art.Tags) homePageParam.Short = art.Short homePageParam.Content = art.Content homePageParam.Author = art.Author homePageParam.CreateTime = utils.SwitchTimeStampToData(art.CreateTime) homePageParam.Link = "/article/" + strconv.Itoa(art.Id) homePageParam.UpdateLink = "/article/update?id=" + strconv.Itoa(art.Id) homePageParam.DeleteLink = "/article/delete?id=" + strconv.Itoa(art.Id) homePageParam.IsLogin = isLogin // 處理變量,利用ParseFile解析該文件,用于插入變量 t, _ := template.ParseFiles("views/block/home_block.html") buffer := bytes.Buffer{} t.Execute(&buffer, homePageParam) htmlHome += buffer.String() } fmt.Println("htmlHome ===>", htmlHome) return template.HTML(htmlHome) } // 這里可以實現(xiàn)html模板的渲染和追加 最后以html代碼的形式插入到具體的前端html展示頁面
博客項目大概做了三天吧。就搞完了?;镜拇a都是MVC結(jié)構(gòu),跟Java比較像,不過對HTML的支持,感覺beego做的更好一些。讓人使用起來就很舒服的感覺。其他的就下面總結(jié)一下吧:
beego的項目目錄結(jié)構(gòu)如下:
負責(zé)和數(shù)據(jù)庫交互的是model,model主要存放實體類和承接具體的數(shù)據(jù)請求等相關(guān)的方法操作,提供數(shù)據(jù)給controller層。
路由的話主要有四種:
-
默認路由:beego自帶模塊Post、Put、Delete、Head、Get等網(wǎng)絡(luò)請求類型的對應(yīng)方法
-
自動路由:自動實現(xiàn)映射到Post、Put、Delete、Get等
-
正則表達式路由:
"/article/:id"
接收參數(shù)的時候需要idStr := this.Ctx.Input.Param(":id")
-
自定義路由:在博客開發(fā)中基本就是自定義路由了
/article/add
Session的處理:
- 配置文件中配置session相關(guān)的配置
- 代碼中通過SessionConfig進行參數(shù)配置
操作session
- SetSession:設(shè)置session值
- GetSession:獲取session值
- DelSession:刪除session值
View視圖模板:
controller.TplName
指定渲染當前頁面的模板文件全稱- 模板文件中通過
{{.param}}
實現(xiàn)變量數(shù)據(jù)的獲取操作 controller.Data["param"]=xxx
實現(xiàn)對頁面的需要使用的變量進行賦值操作
項目打包運行
// 項目可以部署在linux上面,一般通過bee來實現(xiàn)直接打包,打包命令為 bee pack -be GOOS=linux // linux上可以沒有g(shù)o的環(huán)境
如果直接通過這個命令打包的話,會生成一個
tar.gz
的壓縮文件,此時我們可以tar -zxvf xxx.tar.gz
進行解壓縮。然后對項目文件賦予執(zhí)行權(quán):
chmod +x myblog
即可配置到執(zhí)行權(quán)。如果現(xiàn)在直接執(zhí)行的話會報錯:beego panic: err: go command required, not found: exec: “go”: executable file not found in $PATH: stderr:
解決辦法是把
conf
中的runmode=dev
修改為runmode=prod
即可實現(xiàn)執(zhí)行。
【