1. 程式人生 > >Beego框架學習筆記01--初識Beego

Beego框架學習筆記01--初識Beego

1.導言

本來在go語言的基礎語法學習結束的時候,打算學gee框架。但是偶然聽朋友提到了beego,發現beego和前端的Vu e.js,python的dJungle還有flask都好像。這對於有php、python或者web基礎的開發者來說是一個很棒的入門優勢。所以左右框架什麼的都不太瞭解,所以最終敲定先從相對可能會有些熟悉的beego看看。(據說beego的開發者謝孟軍自己也承認這個框架是東抄抄西寫寫湊出來的,讓人簡直淡定不能)

2.Beego框架概述

beego是提供給go語言進行網站開發的web後臺框架,其官網是:https://beego.me/。目前使用beego框架公司相對比較多,類似於今日頭條,百度雲盤,騰訊,阿里這些公司。學習beego框架其實從某種意義上來講也能說是為了去區塊鏈開發做準備的一個內容,畢竟區塊鏈本質上也不過是一個後臺儲存的技術(當然裡面具體有啥咱還不知道),而既然是資料儲存,那麼使用者必然看不到。那麼如果需要一個能夠管理資料的平臺之類的,beego就可以提供相當的便利。

beego採用了非常經典的傳統MVC架構設計模式(別提MVW,MV啥都是從MVC來的),即

       【使用者請求】->【c層控制器截獲,並分析需求】

                              ->【去M層獲取資料】->【返回c層】

                              ->【去V層渲染檢視】->【返回c層】

                              ->【返回給使用者檢視】。

3.Beego框架環境搭建

可以說從學習程式設計這行開始到現在,beego的安裝是本人最曲折的一次。雖然beego框架在安裝完畢後來看堪稱是簡單到可憐,但是網上找到的教程眾說紛紜,讓我著實踩了不少的坑。本文的前提是我們已經安裝了go語言環境Homebrew工具,並且成功配置了GOPATH、GOROOTGOBIN以及環境變數PATH

    ··go dmg下載地址:https://golang.google.cn/dl/

    ··go終端測試安裝成功指令 ~$ go version檢視go語言當前版本

    ··Homebrew官網地址(官網內附安裝教程):https://brew.sh/,或者也可以參考我的部落格:homebrew安裝實戰

    ··go 環境變數配置,可以參考我的部落格:mac環境下go環境變數配置

(1)框架原始碼下載

執行指令~$ go get -u -v github.com/astaxie/beego下載beego的框架原始碼,其中-u是檢查版本並下載,-v是顯示下載過程。

(2)框架工具包下載

執行指令~$ go get -u -v github.com/beego/bee下載beego的框架工具包

具體下載到了哪呢?框架工具下載到了goRoot內,而框架原始碼下載到了goPath中

(3)測試beego是否安裝完成。

如果上述兩個步驟能夠成功安裝,那麼在你的GOPATH中的bin、pkg和src資料夾中想必已經出現了一大堆看起來奇奇怪怪得東西。沒關係,雖然還不認識他們,但是這能夠確認的一點就是我們已經把beego環境安裝完畢了,下面就是簡單動手建立一個beego專案來測試一下。

      執行指令 【~$ bee new 專案名稱】,例如:~$ bee new project01,這條指令會在goPath路徑下的src資料夾中建立go環境的初始配置。這裡說明下雖然這條指令在根目錄下執行指令也沒啥問題,beego會自動尋找goPath去建立工程專案。但是我們最好在終端中先進入goPath再建立,這是考慮到可能會路徑出錯之類的問題

______

| ___ \

| |_/ /  ___   ___

| ___ \ / _ \ / _ \

| |_/ /|  __/|  __/

\____/  \___| \___| v1.10.0

2018/12/03 09:57:29 WARN     ▶ 0001 You current workdir is not inside $GOPATH/src.

2018/12/03 09:57:29 INFO     ▶ 0002 Creating application...

create /Users/***/Desktop/goLearn/src/project01/

create /Users/***/Desktop/goLearn/src/project01/conf/

create /Users/***/Desktop/goLearn/src/project01/controllers/

create /Users/***/Desktop/goLearn/src/project01/models/

create /Users/***/Desktop/goLearn/src/project01/routers/

create /Users/***/Desktop/goLearn/src/project01/tests/

create /Users/***/Desktop/goLearn/src/project01/static/

create /Users/***/Desktop/goLearn/src/project01/static/js/

create /Users/***/Desktop/goLearn/src/project01/static/css/

create /Users/***/Desktop/goLearn/src/project01/static/img/

create /Users/***/Desktop/goLearn/src/project01/views/

create /Users/***/Desktop/goLearn/src/project01/conf/app.conf

create /Users/***/Desktop/goLearn/src/project01/controllers/default.go

create /Users/***/Desktop/goLearn/src/project01/views/index.tpl

create /Users/***/Desktop/goLearn/src/project01/routers/router.go

create /Users/***/Desktop/goLearn/src/project01/tests/default_test.go

create /Users/***/Desktop/goLearn/src/project01/main.go

2018/12/03 09:57:29 SUCCESS ▶ 0003 New application successfully created!

看到上面的輸出後,表示專案建立完成。

        然後在工程路徑下呼叫執行指令(工程路徑就是剛剛建立的那個工程project01。能夠證明你查詢成功的標誌就是ls的時候能夠看到一個名為main.go的檔案)然後執行指令【~$ bee run】。此時終端會列印日誌並提示伺服器已經開啟

______

| ___ \

| |_/ /  ___   ___

| ___ \ / _ \ / _ \

| |_/ /|  __/|  __/

\____/  \___| \___| v1.10.0

2018/12/03 10:05:26 INFO     ▶ 0001 Using 'project01' as 'appname'

2018/12/03 10:05:26 INFO     ▶ 0002 Initializing watcher...

project01/controllers

project01/routers

project01

2018/12/03 10:05:30 SUCCESS ▶ 0003 Built Successfully!

2018/12/03 10:05:30 INFO     ▶ 0004 Restarting 'project01'...

2018/12/03 10:05:30 SUCCESS ▶ 0005 './project01' is running...

2018/12/03 10:05:30.676 [I] [asm_amd64.s:1333]  http server Running on http://:8080

這時去瀏覽器中,輸入localhost:8080/或者127.0.0.1:8080/ 會看到welcome to Beego標誌,這就測試完成了。此時如果想要關閉伺服器,那麼直接在終端裡按下^C就可以了。

(4)簡單分析專案目錄

開啟goland,然後進入我們剛才建立的工程project01,然後能夠看到一系列剛才bee new出來的初始檔案。其中

conf        資料夾中放的是專案的配置檔案
controllers 資料夾存放主要的業務邏輯模組
modules     資料夾存放主要的資料庫業務模組
routers     路由資料夾存放【不同的請求,查詢不同的內容】
static      資料夾存放靜態資源,例如css,js,img等(通常不和資料庫打交道的部分)
tests       資料夾存放測試檔案,開發一般不動這個
view        資料夾存放檢視顯示html檔案
project01   這是bee run編譯出來的.a檔案
main.go     程式主入口檔案

4.簡單Beego上手

(1)變更controller檔案

開啟controllers控制器資料夾中的default.go檔案。然後找到

        c.TplName = "index.tpl"

這條指令的意思是開啟指定view檔案。將其修改為:

        c.TplName = “test.html”//test.html是隨便寫的,此時還沒有建立這個檔案

(2)建立對應view檢視檔案

開啟views資料夾,在內部建立剛剛controllers檔案內編輯的對應名稱的檔案test.html。然後隨便在html中寫點什麼比如helloworld之類的東西。最後在goland編輯器下方的的terminal中執行指令 ~$ bee run。當伺服器開啟後去瀏覽器輸入localhost:8080,完成!

        ·在controllers資料夾的default.go檔案中,使用c.Data[“xxx”] = yyy 來對頁面提供資料,然後在views資料夾的頁面中使用{{.xxx}}來獲取提供的資料。

        ·我們每次對go檔案編輯後的儲存之後,伺服器會自動進行熱更新!類似vue的熱更新功能。

(3)路由設定請求

路由是用來協調【使用者請求】與【controller檔案函式】之間工作的。在beego框架中路由處理請求的方式通常有下列四種表現形式:

/*
1.預設方法,即get請求呼叫get方法,post請求呼叫post方法。一般不用這種
*/

/*
2.一個請求對應一個方法
  Beego路由一旦指定了訪問請求,那麼除了指定的請求之外,其餘的請求全部都不會自動定址。
  下列指令的含義是:
  (1)接受使用者傳送到【localhost:8080/index】Url地址的get請求,
     並交給IndexController下的ShowIndex方法來處理
  (2)接受使用者傳送到【localhost:8080/index】Url地址的post請求,
     並交給IndexController下的Post方法來處理
*/
beego.Router("/index", &controllers.IndexController{},"get:ShowIndex;post:Post")
/*

3.多個請求對應一個方法
  下列指令的含義是:
  (1)接受使用者傳送到【localhost:8080/index】Url地址的get和post請求,
     並將他們均交給IndexController下的ShowIndex方法來處理
*/
beego.Router("/index", &controllers.IndexController{},"get,post:ShowIndex")

/*
4.所有請求對應一個方法
  下列指令的含義是:
  (1)接受使用者傳送到【localhost:8080/index】Url地址的所有型別請求,
     並將他們均交給IndexController下的ShowIndex方法來處理
*/
beego.Router("/index", &controllers.IndexController{},”*:ShowIndex")

/*
4.1當請求設定衝突時,小範圍生效(就近原則)
  下列指令的含義是:
  (1)接受使用者傳送到【localhost:8080/index】Url地址的所有型別請求,
     並將他們均交給IndexController下的ShowIndex方法來處理
  (2)但是如果使用者傳送來的請求型別是post型別的請求,那麼將請求交給
     IndexController下的Post方法來處理
*/
beego.Router("/index",&controllers.IndexController{},”*:ShowIndex;post:Post”)

5.配置MySQL資料庫

雖然我們說beego是一個用來處理go語言web端的後端框架,但是畢竟beego還是用來為go語言服務的,因此操作資料庫的情況必然存在。在實際開發過程中使用的資料庫種類各種各樣,像什麼mysql、oracle、redis之類的不勝列舉。而在學習階段我選擇了一個最容易上手,坑也相對較少的資料庫,也就是mysql。

事實上我小看了mysql環境配置時候坑的數量!千萬不要盲目相信網路上面的任何一款所謂的XXX安裝教程!包括我這個!因為別人的工程環境和自己的未必相同,產生的bug簡直五花八門讓人慾仙欲死。我在配置mysql環境的時候至少參考了5種不同型別的所謂mac版本的mysql環境配置教程,當然得到的結果就是一肚子悶氣。最後逼的我沒有辦法,果斷用最暴力直接的模式homebrew搞起,結果...兩句指令下去,搞定了(我真的懵逼了好一會)。事實證明,你得有相信自己的勇氣。廢話不多說了,直接上說明。

本篇章還是以你已經安裝好了homebrew的前提來介紹的,如果你還沒有安裝homebrew,那麼請先安裝homebrew之後再回來看就好。

(1)安裝mac下MySQL環境

開啟終端,輸入指令【~/$ brew install mysql】。安裝的時候會要求你輸入一大堆內容,目前我還沒發現他們的作用,已知唯一有用的就是要求輸入的資料庫管理員密碼。這個東西西藥在安裝的時候特殊儲存一下就行。

安裝完成後終端繼續輸入指令【~/$ mysql.server start】啟動資料庫,得到啟動成功的資訊就證明安裝成功了。

(2)基本MySQL終端指令

登入本地資料庫:【mysql -uroot -p】,而後需要輸入管理員密碼(就是剛才安裝的時候要你記的那玩意)

建立本地資料庫:【create database 資料庫名 charset=utf8;

檢視本地資料庫:【show databases;

檢視本地資料表:【show tables;

檢視本地資料表結構:【 desc 表名;

檢視本地資料表資訊:【 select * from 表名;

使用本地資料庫:【 use 資料庫名;

刪除本地資料庫:【 drop database 資料庫名;

刪除本地資料表:【 drop table 表名;

6.Beego原生連結資料庫操作

(1)啟動models模組

在main.go中新增 _”project01/models”,讓專案啟動的時候直接自動執行models中的init函式。不然模組不回自動載入。

(2)建立資料庫連結

在init函式內新增語句:Open("資料庫名""連結字串(使用者名稱:使用者密碼@tcp(127.0.0.1:3306)/資料庫名稱?charset=utf8)")。本條指令能夠在沒有【資料庫名】的資料庫時建立一個數據庫,而後直接建立對應的資料庫連線。而如果已經存在這個資料庫的話,就會直接建立對應的資料庫連線。

con,err:=sql.Open("mysql","root:[email protected](127.0.0.1:3306)/test?charset=utf8")

然後不要忘記在開啟資料庫後新增關閉指令判斷指令

defer con.Close()

if err!=nil{

beego.Error("資料庫連結失敗");

}

(3)建立建立表

res,err := con.Exec("create table user(name VARCHAR(40), pwd VARCHAR(40))")

if err!=nil{

    beego.Error("資料庫中的表建立失敗");

}

count,_ := res.RowsAffected()

beego.Info("受影響行數",count);

(4)beego對資料庫的增刪改查操作

插入表資訊

res, err := con.Exec("insert into user(name,pwd) values(?,?)","frank","112233")
if err!=nil{
    beego.Error("beego插入資料失敗",err);
}
count,_ := res.RowsAffected()
beego.Info("受影響的行數",count);

刪除表資訊

res, err := con.Exec("delete from user where name=?","lulu")
if err!=nil{
    beego.Error("beego刪除資料失敗",err);
}
count,_ := res.RowsAffected()
beego.Info("受影響的行數",count);

修改表資訊

res,err := con.Exec("update user set name=?,pwd=? where name=?","franky","123321","frank")
if err!=nil{
    beego.Error("資料庫更新資訊失敗");
}
count,_ := res.RowsAffected()
beego.Info("受影響行數",count);

查詢表資訊

res,err := con.Query("select name from user where 1")
if err!=nil{
    beego.Error("查詢錯誤",err);
}
var name string
for res.Next(){
    res.Scan(&name)
    beego.Info(name);
}

7.Beego ORM的資料庫操作概述

ORM,即物件關係對映(ormobject-relationship-mapping)。在go語言中o指的是struct結構體物件、r指的是relationship關係型資料庫、m指的是【結構體物件內容】與【關係型資料庫欄位】之間的對映關係。ORM是beego框架在操作資料庫時經常會用到的一個非常優秀的管理工具,它能夠把繁瑣的資料庫操作變得像go的面向物件程式設計一樣清晰簡單。ORM中最核心的兩個功能分別是:

    ·orm能夠通過結構體物件操作相同結構的資料庫表

    ·orm能夠通過結構體物件建立相同結構的資料庫表

(1)欄位問題

使用ORM定義結構體欄位的時候,如果結構體欄位的首位字母大寫,在資料庫生成表的時候,會自動將表中對應欄位的字母變為小寫。而如果命名採用駝峰命名去處理結構體欄位,資料庫欄位會將對應欄位的字母變為小寫,並且用_下劃線連結。

(2)主鍵key問題

使用ORM在定義結構體欄位的時候,習慣性使用Id作為表的primaryKey。如果不使用可能會出現warning警告。

(3)使用ORM框架建立資料庫連結

type Class struct {
    Id int //primary key
    Name string
    Num int
}
func init(){
    //orm註冊資料庫(連結資料庫),首個引數位對資料庫註冊別名,方便後面orm操作使用
    orm.RegisterDataBase("default","mysql","root:[email protected](127.0.0.1:3306)/test?charset=utf8")
    //orm註冊資料庫表
    orm.RegisterModel(new(Class)/*,new(Class),...可以一次建立多個表*/);
    //執行,第一個引數位註冊的別名,第二個引數是否強制更新一般都寫false(true是每次啟動初始化表),第三個引數位初始化過程可見
    orm.RunSyncdb("default",false,true);

}

感謝go語言優秀的包倒入系統,我們在使用任何一個包中對應的模組的時候不需要像傳統語言一樣先引入標頭檔案或者匯入包名,而是伴隨著你使用對應的包中的模組,go語言會自動幫你倒入任何一個你所使用到的模組所依賴的包。

8.Beego ORM連結資料庫操作

使用beego框架中提供的orm包進行資料庫操作的時候,必須先通過orm與資料庫建立連結,也就是上面我們init函式中寫的三條語句。

插入表資訊

//(1)獲取orm物件
o := orm.NewOrm()
//(2)獲取要插入的物件
var cl Class
//(3)給插入的物件賦值
cl.Name = "frank自學教室"
cl.Num = 100
cl.Girl = "陳豆豆"//此時orm智慧的地方就體現出來了,對資料表新增原本不存在的欄位資訊的時候,orm會幫你自動插入一條欄位,而不是報錯。
//(4)執行插入操作
o.Insert(&cl)

刪除表資訊

//(1)獲取orm物件
o := orm.NewOrm()
//(2)獲取刪除物件
var cl Class
//(3)指定刪除物件的值
cl.Id = 1
//(4)直接刪除,orm
count,err := o.Delete(&cl)
if err!=nil{
    beego.Error("刪除失敗")//beego.Error是beego提供的後臺終端的輸出命令,紅色字樣
}
beego.Info("刪除條目",count)//beego.Info是beego提供的後臺終端的輸出命令,綠色字樣

修改資料

//(1)獲取orm物件
o := orm.NewOrm()
//(2)獲取更新物件
var cl Class
//(3)先查詢更新物件,如果db中不存在則不更新
cl.Id = 1
err := o.Read(&cl)//如果查詢條件是primarykey,則可以不指定
if err!=nil{
    beego.Error("修改資料時,查詢失敗,該條資料不存在,更新失敗");
}
//(4)給指定欄位更新賦值
cl.Girl = "被插入的girl是陳靜涵"
//(5)更新操作
o.Update(&cl)

//查詢資料

//(1)獲取orm物件
o := orm.NewOrm()
//(2)獲取查詢結果存放物件
var cl Class
//(3)賦值查詢條件
cl.Id = 2
//(4)查詢資料orm中查詢不再使用select,而是read
o.Read(&cl,"Id")
beego.Info(cl)