2019-02-25

?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)


這就是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 獲取



產(chǎn)考的文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市崭倘,隨后出現(xiàn)的幾起案子翼岁,更是在濱河造成了極大的恐慌类垫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琅坡,死亡現(xiàn)場(chǎng)離奇詭異悉患,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)榆俺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門售躁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人茴晋,你說(shuō)我怎么就攤上這事陪捷。” “怎么了诺擅?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵市袖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我烁涌,道長(zhǎng)苍碟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任撮执,我火速辦了婚禮微峰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘二打。我一直安慰自己县忌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布继效。 她就那樣靜靜地躺著症杏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瑞信。 梳的紋絲不亂的頭發(fā)上厉颤,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音凡简,去河邊找鬼逼友。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秤涩,可吹牛的內(nèi)容都是我干的帜乞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼筐眷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黎烈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤照棋,失蹤者是張志新(化名)和其女友劉穎资溃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烈炭,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溶锭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了符隙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趴捅。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖霹疫,靈堂內(nèi)的尸體忽然破棺而出驻售,到底是詐尸還是另有隱情,我是刑警寧澤更米,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站毫痕,受9級(jí)特大地震影響征峦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜消请,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一栏笆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧臊泰,春花似錦蛉加、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至需频,卻和暖如春丁眼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昭殉。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工苞七, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挪丢。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓蹂风,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親乾蓬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惠啄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 不知道是不是失去了就會(huì)覺(jué)得異常珍貴,看著曾經(jīng)的禮物,感嘆自己的無(wú)知礁阁。如今巧号,又是一場(chǎng)接一場(chǎng)的混亂和鬧劇,我始終不是一...
    曹兮淳閱讀 250評(píng)論 0 0
  • 在這個(gè)世界上有一種愛(ài)永不褪色–父愛(ài)! “昨晚住在朋友家姥闭,我徹夜未眠丹鸿。我這個(gè)朋友和我從小一起長(zhǎng)大,他比我還小兩歲棚品。如...
    123現(xiàn)在閱讀 488評(píng)論 0 9