Beego框架學習--(核心:數據交互)

Beego框架學習記錄

1、beego簡介

beego 是一個快速開發 Go 應用的 HTTP 框架,他可以用來快速開發 API、Web 及後端服務等各種應用,是一個 RESTful 的框架,主要設計靈感來源於 tornado、sinatra 和 flask 這三個框架,但是結合了 Go 本身的一些特性(interface、struct 嵌入等)而設計的一個框架。

參考文檔:開發文檔

1.1、beego整體架構

beego 是基於八大獨立的模塊構建的,是一個高度解耦的框架。當初設計 beego 的時候就是考慮功能模塊化,用戶即使不使用 beego 的 HTTP 邏輯,也依舊可以使用這些獨立模塊,例如:你可以使用 cache 模塊來做你的緩存邏輯;使用日誌模塊來記錄你的操作信息;使用 config 模塊來解析你各種格式的文件。所以 beego 不僅可以用於 HTTP 類的應用開發,在你的 socket 遊戲開發中也是很有用的模塊,這也是 beego 爲什麼受歡迎的一個原因。大家如果玩過樂高的話,應該知道很多高級的東西都是一塊一塊的積木搭建出來的,而設計 beego 的時候,這些模塊就是積木,高級機器人就是 beego。

1.2、beego執行邏輯

1、beego框架安裝

前置條件:已安裝go

  • 安裝beego和bee

    $ export GO111MODULE=on
    $ export GOPROXY=https://goproxy.io
    $ go get github.com/beego/bee
    $ go get github.com/astaxie/beego
    

    安裝完之後,bee 可執行文件默認存放在 $GOPATH/bin 裏面,所以需要把 $GOPATH/bin 添加到環境變量中

2、新建項目

#查看bee相關命令
$ bee
#新建項目 beegojingjinji
$ bee new beegojingjinji

#查看項目結構
$ tree beegojingjinji

beegojingjinji/
├── beegojingjinji
├── conf
│   └── app.conf
├── controllers
│   └── default.go
├── go.mod
├── go.sum
├── main.go
├── models
├── routers
│   └── router.go
├── static
│   ├── css
│   ├── img
│   └── js
│       └── reload.min.js
├── tests
│   └── default_test.go
└── views
    └── index.tpl

10 directories, 10 files

#運行項目
$ cd beegojingjinji
$ bee run
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.11.0
2020/10/22 11:00:11 INFO     ▶ 0001 Using 'beegojingjinji' as 'appname'
2020/10/22 11:00:11 INFO     ▶ 0002 Initializing watcher...
2020/10/22 11:00:13 SUCCESS  ▶ 0003 Built Successfully!
2020/10/22 11:00:13 INFO     ▶ 0004 Restarting 'beegojingjinji'...
2020/10/22 11:00:13 SUCCESS  ▶ 0005 './beegojingjinji' is running...
2020/10/22 11:00:13.083 [I] [asm_amd64.s:1373]  http server Running on http://:8080

採用MVC的架構(model,view,controller),main.go是主入口

文件內容解析:

  • conf:存放配置文件,各種配置項,如監聽端口,是否開啓session,運行模式等
  • controllers:控制層,實現業務邏輯
  • models:模型層,數據邏輯
  • routers:路由,實現路由跳轉
  • static:存放靜態文件
  • tests:存放測試文件
  • views:視圖層,存放前端頁面
  • go.mod:控制依賴
  • main.go:主文件入口

3、啓動工作解析

main 函數裏面的 beego.Runbeego.Run 執行之後,看到的效果好像只是監聽服務端口這個過程,但是它內部做了很多事情

  • 解析配置文件

    beego 會自動解析在 conf 目錄下面的配置文件 app.conf,通過修改配置文件相關的屬性,我們可以定義:開啓的端口,是否開啓 session,應用名稱等信息。

  • 執行用戶的 hookfunc

    beego 會執行用戶註冊的 hookfunc,默認的已經存在了註冊 mime,用戶可以通過函數 AddAPPStartHook 註冊自己的啓動函數。

  • 是否開啓 session

    會根據上面配置文件的分析之後判斷是否開啓 session,如果開啓的話就初始化全局的 session。

  • 是否編譯模板

    beego 會在啓動的時候根據配置把 views 目錄下的所有模板進行預編譯,然後存在 map 裏面,這樣可以有效的提高模板運行的效率,無需進行多次編譯。

  • 是否開啓文檔功能

    根據 EnableDocs 配置判斷是否開啓內置的文檔路由功能

  • 是否啓動管理模塊

    beego 目前做了一個很酷的模塊,應用內監控模塊,會在 8088 端口做一個內部監聽,我們可以通過這個端口查詢到 QPS、CPU、內存、GC、goroutine、thread 等統計信息。

  • 監聽服務端口

    這是最後一步也就是我們看到的訪問 8080 看到的網頁端口,內部其實調用了 ListenAndServe,充分利用了 goroutine 的優勢

一旦 run 起來之後,我們的服務就監聽在兩個端口了,一個服務端口 8080 作爲對外服務,另一個 8088 端口實行對內監控。

4、路由設置

參照如下鏈接,解析的十分詳細

https://beego.me/docs/mvc/controller/router.md

5、數據交互

5.1、字符串渲染

func (c *MainController) Get() {
	c.Data["Website"] = "beego.me"
	c.Data["Email"] = "[email protected]"
	c.TplName = "index.tpl"
}

數據默認存儲在Data中,只需要在html頁面中使用"{{ }}"即可,如{{.Website}}

5.2、重設模板路徑

//方法一:
//在beego.run()之前
beego.SetViewsPath("新文件夾名")

//方法二:
//在配置文件中設置
viewspath = 新文件夾名

5.3、前端向後端傳遞數據

獲取用戶傳遞的數據,包括 Get、POST 等方式的請求,beego 裏面會自動解析這些數據,可以通過如下方式獲取數據

  • GetString(key string) string

  • GetStrings(key string) []string

  • GetInt(key string) (int64, error)

  • GetBool(key string) (bool, error)

  • GetFloat(key string) (float64, error)

//對於url中如下形式:local:8080/user?username=aaa
//獲取參數username
func (this *MainController) Post() {
   //方法一:
    username := this.GetString("username")
    //方法二:
    username := this.Input().Get("username")
}


//對於url中如下形式:local:8080/user/aaaa
//獲取參數aaaa
//首先設置路由爲:
beego.Router("/user/?:id, &controllers.MainController{})
 //獲取數據
 func (this *MainController) Post() {
   //方法一:
     id := this.GetString(":id")
    //方法二:
    username := this.Ctx.Input.Param("username")
}

5.4、接收表單數據

<form action="/addIns" method="post" name="addForm">
          <div class="top">
            <div class="left">
                <p>
                    <span>機構名稱:</span>
                    <span>
                      <input type="text" name="name" class="input_text" tabindex="1" onfocus="if(this.placeholder=='機構名稱'){this.placeholder='';}this.className ='input_text input_text_focus'" onblur="if(this.value==''){this.placeholder='機構名稱';this.className ='input_text'}" accesskey="n" type="text" placeholder="機構名稱" size="25" autocomplete="off">
                    </span>
                </p>
</form>
  • 讀取到字符串
//根據表單中name名,讀取對應值
func (this *MainController) Post() {
     name := this.GetString("name")
}
  • 讀取到結構體
type User struct {
    name string 'form:"username"'         //定義與表單對應的名稱
}
func (this *MainController) Post() {
    user := User{}
    if err :=  this.ParseForm(&user); err != nil{
        return
    }
    fmt.Println(user.name)
}

5.5、Ajax獲取數據

  • 定義前段頁面Ajax交互內容

     var name = document.getElementById("name").value;
     var code = document.getElementById("code").value;
     var certNo = document.getElementById("certNo").value;
     var address = document.getElementById("address").value;
     var legalRepresentative = document.getElementById("legalRepresentative").value; 
    $.ajax({
                    url:"/addIns",
                    type: "post",
                    data: JSON.stringify({                     //前端使用JSON傳遞數據
                        "name":name,
                        "code":code,
                        "certNo":certNo,
                        "address":address,
                        "legalRepresentative":legalRepresentative,
                    }),
                    dataType:"JSON",                          //定義傳遞格式
                    success:function (data) {
                        var code = data["code"]
                        if (code==400.3){
                            var inner = document.getElementById("tiptext");
                            inner.innerHTML = "您已申請機構認證,請勿重複操作!如需更新,請進入更新機構認證頁面";
                            $('#popout').css('display','');
                        }else if (code==200){
                            var inner = document.getElementById("tiptext");
                            inner.innerHTML = "您的認證申請已通過,請稍後查詢上鍊結果!";
                            $('#popout').css('display','');
                        }else{
                            var inner = document.getElementById("tiptext");
                            inner.innerHTML = "未知錯誤,請聯繫工作人員";
                            $('#popout').css('display','');
                        }
                    },
                    error:function (data){
                        alert("login failed, unknown failed")
                    }
             })
    
  • 實現後端Ajax接收數據

    func (a *AddInsController) Put() {
    	ins := models.ChaincodeIns{}
    	body := a.Ctx.Input.RequestBody                     //通過內置函數接收Ajax數據
    	json.Unmarshal(body, &ins)                               //反序列化解析到結構體中
    	logs.Informational("Data from addIns html:" + ins.Name + " " + ins.CertNo + " " + ins.Address + " " + ins.LegalRepresentative)
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章