?Beego官網(wǎng)本身已經(jīng)整理的非常詳細(xì)了颅悉,但是作為一個(gè)學(xué)習(xí)者隧土,我還是決定自己好好整理一下,這樣在后面使用的時(shí)候自己對(duì)每部分才能非常熟悉攒暇,即使忘記了,也可以迅速定位自己要用的知識(shí)在哪里子房。當(dāng)然也是對(duì)官網(wǎng)的一個(gè)精簡(jiǎn)整理形用,同時(shí)結(jié)合一些例子,更好的理解和學(xué)習(xí)Beego
Beego官網(wǎng)地址:https://beego.me
這次整理也是一個(gè)初步的整理证杭,正好在這個(gè)之后把之前通過(guò)net/http實(shí)現(xiàn)的短url項(xiàng)目通過(guò)beego框架實(shí)現(xiàn)一遍
Beego的安裝
go get github.com/astaxie/beego
bee 工具是一個(gè)為了協(xié)助快速開發(fā) beego 項(xiàng)目而創(chuàng)建的項(xiàng)目田度,通過(guò) bee 您可以很容易的進(jìn)行 beego 項(xiàng)目的創(chuàng)建、熱編譯解愤、開發(fā)镇饺、測(cè)試、和部署琢歇。
go get github.com/beego/bee
當(dāng)我們安裝好bee之后兰怠,bee命令默認(rèn)是放在GOPATH/bin里面,所以需要把GOPATH/bin里面李茫,所以需要把GOPATH/bin 添加到您的環(huán)境變量中
bee常用的命令
bee new <項(xiàng)目名> :創(chuàng)建一個(gè)項(xiàng)目,這樣的項(xiàng)目一般是web項(xiàng)目
需要注意的是這個(gè)命令須在 $GOPATH/src 下執(zhí)行揭保,最后生成的目錄結(jié)構(gòu)為:
├── conf
│? └── app.conf
├── controllers
│? └── default.go
├── main.go
├── models
├── routers
│? └── router.go
├── static
│? ├── css
│? ├── img
│? └── js
│? ? ? └── reload.min.js
├── tests
│? └── default_test.go
└── views
? ? └── index.tpl
bee api myapi : 創(chuàng)建一個(gè)api項(xiàng)目,生成的目錄結(jié)構(gòu)為
├── conf
│? └── app.conf
├── controllers
│? ├── object.go
│? └── user.go
├── main.go
├── models
│? ├── object.go
│? └── user.go
├── routers
│? └── router.go
└── tests
? ? └── default_test.go
bee run 命令是監(jiān)控 beego 的項(xiàng)目魄宏,通過(guò) fsnotify監(jiān)控文件系統(tǒng)秸侣。但是注意該命令必須在 $GOPATH/src/appname 下執(zhí)行。這樣當(dāng)我們?cè)陂_發(fā)過(guò)程中宠互,beego可以實(shí)時(shí)監(jiān)測(cè)我們的代碼文件發(fā)生變化味榛,這樣我們就不用重新編譯運(yùn)行,非常方便我們調(diào)試予跌,我們可以將上面的myweb2項(xiàng)目通過(guò)bee run運(yùn)行起來(lái)
localhost:myweb2 zhaofan$ go run
go run: no go files listed
localhost:myweb2 zhaofan$ bee run
______
| ___ \
| |_/ /? ___? ___
| ___ \ / _ \ / _ \
| |_/ /|? __/|? __/
\____/? \___| \___| v1.9.1
2018/03/19 23:59:20 INFO? ? ? 0001 Using 'myweb2' as 'appname'
2018/03/19 23:59:20 INFO? ? ? 0002 Initializing watcher...
myweb2/controllers
myweb2/routers
myweb2
2018/03/19 23:59:22 SUCCESS? ? 0003 Built Successfully!
2018/03/19 23:59:22 INFO? ? ? 0004 Restarting 'myweb2'...
2018/03/19 23:59:22 SUCCESS? ? 0005 './myweb2' is running...
2018/03/19 23:59:22.572 [I] [asm_amd64.s:2337] http server Running on http://:8080
我們通過(guò)打開瀏覽器訪問(wèn):http://127.0.0.1:8080,可以看到如圖:
Beego 架構(gòu)了解
Beego架構(gòu)圖如:
這就是Beegode 八大獨(dú)立的模塊
Beego的執(zhí)行邏輯,beego 是一個(gè)典型的 MVC 架構(gòu)
我們從上面myweb2的目錄接口也可以看出來(lái):
M(models 目錄)券册、V(views 目錄)和 C(controllers 目錄)的結(jié)構(gòu)
Beego路由設(shè)置
我們看一下Beego的入口函數(shù):
package main
import (
? ? _ "myweb2/routers"
? ? "github.com/astaxie/beego"
)
func main() {
? ? beego.Run()
}
引入了一個(gè)包 _ "myweb2/routers 我們看一下這個(gè)包的內(nèi)容
package routers
import (
? ? "myweb2/controllers"
? ? "github.com/astaxie/beego"
)
func init() {
? ? beego.Router("/", &controllers.MainController{})
}
這里僅僅做了一個(gè)初始化频轿,路由包里面我們看到執(zhí)行了路由注冊(cè) beego.Router, 這個(gè)函數(shù)的功能是映射 URL 到 controller,第一個(gè)參數(shù)是 URL (用戶請(qǐng)求的地址)烁焙,這里我們注冊(cè)的是 /航邢,也就是我們?cè)L問(wèn)的不帶任何參數(shù)的 URL,第二個(gè)參數(shù)是對(duì)應(yīng)的 Controller骄蝇,也就是我們即將把請(qǐng)求分發(fā)到那個(gè)控制器來(lái)執(zhí)行相應(yīng)的邏輯膳殷。這里對(duì)路由設(shè)置的一個(gè)小結(jié):
Router方法設(shè)置url和處理url的controller
程序啟動(dòng)時(shí),路由配置加載好九火,保存在map中
請(qǐng)求處理時(shí)赚窃,通過(guò)請(qǐng)求的url進(jìn)行查找對(duì)應(yīng)的controller,把處理路由到controller進(jìn)行執(zhí)行
我們就只需要編寫自己的controller就好啦
我們看一下controller的代碼:
package controllers
import (
? ? "github.com/astaxie/beego"
)
type MainController struct {
? ? beego.Controller? // 這里可以看做是其他語(yǔ)言中的繼承
}
func (c *MainController) Get() {
? ? c.Data["Website"] = "beego.me"
? ? c.Data["Email"] = "astaxie@gmail.com"
? ? c.TplName = "index.tpl"
}
對(duì)上述代碼進(jìn)行簡(jiǎn)單分析:
用戶的controller嵌套bee.Controller册招, 繼承bee.Controller所有屬性和
方法
Controller默認(rèn)使用restful的風(fēng)格,Get請(qǐng)求對(duì)應(yīng)Get方法
請(qǐng)求處理時(shí)考榨,通過(guò)請(qǐng)求的url進(jìn)行查找對(duì)應(yīng)的controller跨细,把處理路由到 controller進(jìn)行執(zhí)行
通過(guò)業(yè)務(wù)邏輯處理之后,把數(shù)據(jù)賦值給Controller.Data這個(gè)map即可
上述代碼中:c.TplName = "index.tpl"默認(rèn)回去views下面去找模板文件
除了上面的C.Data這種方法之外河质,還有很多方法,如常用的c.ServerJson()這樣就會(huì)去c.Data中尋找key為json的值
用戶設(shè)置了模板之后系統(tǒng)會(huì)自動(dòng)的調(diào)用 Render 函數(shù)(這個(gè)函數(shù)是在 beego.Controller 中實(shí)現(xiàn)的)震叙,所以無(wú)需用戶自己來(lái)調(diào)用渲染掀鹅。
當(dāng)然也可以不使用模版,直接用 this.Ctx.WriteString 輸出字符串媒楼,如:
func (c *MainController) Get() {
? ? ? ? c.Ctx.WriteString("hello")
}
正則路由
beego.Router(“/api/?:id”, &controllers.RController{}) 默認(rèn)匹配 //匹配 /api/123 :id = 123 可以匹配 /api/ 這個(gè)URL
beego.Router(“/api/:id”, &controllers.RController{}) 默認(rèn)匹配 //匹配 /api/123 :id = 123 不可以匹配 /api/ 這個(gè)URL
beego.Router(“/api/:id([0-9]+)“, &controllers.RController{}) 自定義正則匹配 //匹配 /api/123 :id = 123
beego.Router(“/user/:username([\w]+)“, &controllers.RController{}) 正則字符串匹配 //匹配 /user/astaxie :username = astaxie
beego.Router(“/download/*.*”, &controllers.RController{}) *匹配方式 //匹配 /download/file/api.xml :path= file/api :ext=xml
beego.Router(“/download/ceshi/*“, &controllers.RController{}) *全匹配方式 //匹配 /download/ceshi/file/api.json :splat=file/api.json
beego.Router(“/:id:int”, &controllers.RController{}) int 類型設(shè)置方式乐尊,匹配 :id為int 類型,框架幫你實(shí)現(xiàn)了正則 ([0-9]+)
beego.Router(“/:hi:string”, &controllers.RController{}) string 類型設(shè)置方式划址,匹配 :hi 為 string 類型扔嵌。框架幫你實(shí)現(xiàn)了正則 ([\w]+)
beego.Router(“/cms_:id([0-9]+).html”, &controllers.CmsController{}) 帶有前綴的自定義正則 //匹配 :id 為正則類型夺颤。匹配 cms_123.html 這樣的 url :id = 123
可以在 Controller 中通過(guò)如下方式獲取上面的變量:
this.Ctx.Input.Param(":id")
this.Ctx.Input.Param(":username")
this.Ctx.Input.Param(":splat")
this.Ctx.Input.Param(":path")
this.Ctx.Input.Param(":ext")
自定義方法及 RESTful 規(guī)則:
beego.Router("/",&IndexController{},"*:Index")
使用第三個(gè)參數(shù)痢缎,第三個(gè)參數(shù)就是用來(lái)設(shè)置對(duì)應(yīng) method 到函數(shù)名,定義如下
*表示任意的 method 都執(zhí)行該函數(shù)
使用 httpmethod:funcname 格式來(lái)展示
多個(gè)不同的格式使用 ; 分割
多個(gè) method 對(duì)應(yīng)同一個(gè) funcname世澜,method 之間通過(guò) , 來(lái)分割
beego.Router("/api",&RestController{},"get,post:ApiFunc")
可用的 HTTP Method:
*: 包含以下所有的函數(shù)
get: GET 請(qǐng)求
post: POST 請(qǐng)求
put: PUT 請(qǐng)求
delete: DELETE 請(qǐng)求
patch: PATCH 請(qǐng)求
options: OPTIONS 請(qǐng)求
head: HEAD 請(qǐng)求
如果同時(shí)存在 * 和對(duì)應(yīng)的 HTTP Method独旷,那么優(yōu)先執(zhí)行 HTTP Method 的方法
Beego的model
我們知道 Web 應(yīng)用中我們用的最多的就是數(shù)據(jù)庫(kù)操作,而 model 層一般用來(lái)做這些操作寥裂,我們的 bee new 例子不存在 Model 的演示嵌洼,但是 bee api 應(yīng)用中存在 model 的應(yīng)用。說(shuō)的簡(jiǎn)單一點(diǎn)封恰,如果您的應(yīng)用足夠簡(jiǎn)單麻养,那么 Controller 可以處理一切的邏輯,如果您的邏輯里面存在著可以復(fù)用的東西诺舔,那么就抽取出來(lái)變成一個(gè)模塊鳖昌。因此 Model 就是逐步抽象的過(guò)程,
Beego的views層
Beego模板默認(rèn)支持:.tpl和.html兩種后綴
beego.AddTemplateExt增加新的模板后綴
Beego模板用的就是Go官網(wǎng)自帶的模板
靜態(tài)文件
beego 默認(rèn)注冊(cè)了 static 目錄為靜態(tài)處理的目錄混萝,注冊(cè)樣式:URL 前綴和映射的目錄(在/main.go文件中beego.Run()之前加入):StaticDir["/static"] = "static"
Beego默認(rèn)使用static目錄作為靜態(tài)文件目錄
beego.SetStaticPath增加新的靜態(tài)文件目錄
配置文件讀取
默認(rèn)的配置文件內(nèi)容:
appname = myweb2
httpport = 8080
runmode = dev
當(dāng)然前提是你已經(jīng)在自己配置文件中添加了下面這些字段:
beego.AppConfig.String("mysql_user")
beego.AppConfig.String("mysql_pwd")
如果我們將配置文件更改為:
appname = myweb2
httpport = 8080
runmode = dev
[dbconfig]
mysqlhost = 127.0.0.1
mysqlport = 3308
username = root
passwd = 123
我們可以通過(guò)[命名]的方式將配置文件進(jìn)行分組
這樣當(dāng)我們獲取變量的時(shí)候遗遵,可以通過(guò)下面方式獲取:
beego.AppConfig.String("dbconfig::mysql_user")
beego.AppConfig.String("dbconfig::mysql_port")
AppConfig 的方法如下:
Set(key, val string) error
String(key string) string
Strings(key string) []string
Int(key string) (int, error)
Int64(key string) (int64, error)
Bool(key string) (bool, error)
Float(key string) (float64, error)
DefaultString(key string, defaultVal string) string
DefaultStrings(key string, defaultVal []string)
DefaultInt(key string, defaultVal int) int
DefaultInt64(key string, defaultVal int64) int64
DefaultBool(key string, defaultVal bool) bool
DefaultFloat(key string, defaultVal float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
獲取用戶提交的參數(shù)
Controller中的方法獲取
GetString(key string) string
GetStrings(key string) []string
GetInt(key string) (int64, error)
GetBool(key string) (bool, error)
GetFloat(key string) (float64, error)
不管是post還是get的其他方式提交的數(shù)據(jù)都可以通過(guò)上面的方式獲取
如果在平常開發(fā)中肯定設(shè)計(jì)到和其他語(yǔ)言的對(duì)接數(shù)據(jù)逸嘀,這個(gè)時(shí)候?qū)Ψ桨l(fā)過(guò)來(lái)的數(shù)據(jù)可能就是一個(gè)json格式的數(shù)據(jù)车要,如果想要獲取可以通過(guò)下面方法:
直接通過(guò)Ctx.Input.RequestBody獲取原始的數(shù)據(jù)
配置文件里設(shè)置 copyrequestbody = true
這樣就可以通過(guò)c.Ctx.Input.RequestBody 獲取