使用Beego構建一個web專案

晦若晨曦發表於2017-12-14

學習go語言也有一段時間了,正好手頭自己家公司的官網,算一個無關緊要的小專案,就用go語言來練練手,實戰一個。

在框架上選擇了成熟的beego專案。

Beego

Beego提供了完整的MVC解決方案和專案構建工具,通過bee命令可以簡單地建立、編譯、執行、釋出一個WEB或者API專案。官方的文件相當完整詳盡而且全是中文,真是好得不要不要的。


###建立專案

第一步當然是建立一個新專案。此處基本是按照文件的走。

首先安裝beego

go get github.com/astaxie/beego
複製程式碼

beego的安裝路徑是在GOPATH/bin目錄中。官方建議將此目錄新增到path,其實不新增也一樣可以用。

專案目標路徑位於GOPATH/src/xohome,新建專案的命令如下:

src$ ../bin/bee new xohome
複製程式碼

然後會自動在src/xohome下生成響應的專案結構,具體結構請參照文件,在此不細說了。

至此專案就已經可以執行了,在xohome下執行命令

../../bin/bee run
複製程式碼

然後訪問預設的8080埠,就可以看到beego的logo了。


###Controller與模板

在新建好的專案中,已經有了預設的controller,位於controller目錄下的default.go檔案。還有預設的router.go檔案。

type MainController struct {
	beego.Controller
}

func (c *MainController) Get() {
	c.Data["Website"] = "beego.me"
	c.Data["Email"] = "astaxie@gmail.com"
	c.TplName = "index.tpl"

}
複製程式碼

default.go檔案的預設內容如上。beego基於go語言自帶的模板對頁面進行渲染。在預設建立的目錄結構中,模板檔案位於views目錄下,而靜態資源則位於static目錄下。若要訪問靜態資源,直接訪問/static/...即可。

很多時候都是通過對controller結構體進行賦值來進行操作。這一點上與java的基於方法進行操作有較大的不同。當然也有很多常見的方法。比如下面這個用來提交表單的controller:

type SubmitController struct {
	beego.Controller
}

func (c *SubmitController) Get(){
	c.TplName = "start.tpl"
}

type ResultJson struct {
	State int
	Message string
}

func (c *SubmitController) Post(){
	var project = models.Projects{};
	project.Money = c.GetString("money","")
	project.About = c.GetString("about","")
	project.Time = c.GetString("time","")
	project.Contact = c.GetString("contact","")
	project.Name = c.GetString("name","")
	project.Type,_ = c.GetInt("type",0)

	o := orm.NewOrm()
	o.Using("xohome")

	_,e := o.Insert(&project)

	if(e == nil){
		res := ResultJson{State:0,Message:"success"}
		c.Data["json"] = res
		c.ServeJSON()
		return
	}else{
		res := ResultJson{State:1,Message:"處理髮生錯誤"}
		c.Data["json"] = res
		fmt.Print(e.Error())
		c.ServeJSON()
		return
	}


}
複製程式碼

程式碼很簡單,走Get方法的時候返回個頁面,走Post方法的時候儲存至資料庫並返回一個json。

controller需要在router中進行註冊,預設案例如下:


func init() {
    beego.Router("/", &controllers.MainController{})
    beego.Router("/start", &controllers.SubmitController{})
}
複製程式碼

在init()方法中進行註冊,在預設的main.go檔案中,有如下引用:

_ "xohome/routers"
複製程式碼

來執行此方法。


###資料庫操作

有眼尖的朋友已經見到上一部分中的資料庫操作。這是beego提供的orm模組。

這個orm模組用起來也是很簡單,首先需要引入一個資料庫驅動,比如mysql的驅動:

_ "github.com/go-sql-driver/mysql"
複製程式碼

然後找個地方初始化一下orm的配置:

func init() {
	orm.RegisterDriver("mysql", orm.DRMySQL)
	orm.RegisterDataBase("default", "mysql", "username:password@tcp(mysql.com:3449)/xohome?charset=utf8")
}
複製程式碼

我將這兩行程式碼放在了main.go檔案中,其實只要能夠保證一開始就執行,放在哪都差不多。

然後的操作程式碼就如上一段所示

o := orm.NewOrm()
o.Using("default")
_,e := o.Insert(&project)

複製程式碼

是不是特別的簡單呢?插入的表就是project結構體的名稱。beego還支援一對多,多對多等對映,自定義表名,事務控制等高階功能,可以去檢視官方文件進一步學習。


###專案部署

beego提供了打包的工具,只要執行命令如下:

GOOS=linux ../../bin/bee pack
複製程式碼

看過我之前的文章應當知道,GOOS是go語言跨平臺編譯的引數,指定為linux就可以打包成linux下可用的tar.gz檔案。然後直接上傳上去解壓執行即可。繼承了go語言部署簡單的傳統。


###結束語

恩,沒有了。

本來就是一個非常簡單,只有兩個頁面的展示性首頁。但是充分展示了go語言開發web應用的潛力。go完整的工具鏈,簡潔的api風格,方便的部署方式相信也有所體會。

接下來還要繼續去研究我的檔案服務,這個東西就到此為止了。

相關文章