beego學習筆記與beego+swagger部署極速入門記錄

beego學習筆記

標籤:beego 學習筆記

參考資料:

推薦使用postman進行調試,這是一款很好地API開發工具,能夠比較方便地測試API(以各種參數加在body中,省去了自己寫程序的步驟)。

快速入門

架構概述

beego是MVC結構,其中model主要負責數據庫(逐層抽象),view層爲模版,controller層作路由。

極速上手demo

要求:提前安裝好了go(或者docker跑golang鏡像)

安裝工具:go get github.com/astaxie/beegogo get github.com/beego/bee

創建api項目:bee api apiTest

自動下載swagger文件,自動化文檔,即可在本地瀏覽默認API:http://localhost:8080/swagger/bee run -gendoc=true -downdoc=true

API目錄

├── conf
│   └── app.conf
├── controllers
│   └── object.go
│   └── user.go
├── docs
│   └── doc.go
├── main.go
├── models
│   └── object.go
│   └── user.go
├── routers
│   └── router.go
└── tests
    └── default_test.go

剩下的就是閱讀controllers、models文件下的go文件源代碼

最終效果

result

讓beego運行Https的配置

appname = apiproject
httpport = 8080
runmode = dev
autorender = false
copyrequestbody = true
EnableDocs = true
EnableHTTPS = true
HTTPSCertFile = "cert.crt"
HTTPSKeyFile = "key.key"
sqlconn = 

根目錄爲main.go所在目錄,把CA證書換成自己的即可使用。具體的配置信息參考這裏

核心部分

controller設計

路由設置

beego存在三種方式的路由:固定路由、正則路由和自動路由。

  • 固定路由:就是全匹配的路由,一個路由對應一個控制器,然後根據用戶請求方法不同去請求控制器中的對應的方法。
  • 正則路由:爲了用戶更方便的設置路由,beego參考了sinatra的路由實現,支持多種方式的路由。
  • 自動路由:首先需要把路由的控制器註冊到自動路由中,beego會通過反射獲取該結構體中所有的實現方法,然後可以通過api對應自動調用方法(/:controller/:method匹配,剩餘的url beego會自動化解析爲參數,保存在this.Ctx.Input.Params中)。
  • 註解路由:用戶無需在router中註冊路由,只需要include相應的controller,然後在controller的method方法上寫上router註釋(//@router)就可以了。beego會自動進行源碼分析,注意,只會在dev模式下進行生成,生成的路由會放在/routers/commentsRouter.go文件中。
namespace

通過namespace可以支持更多層次的api,可以前置過濾、條件判斷、無限嵌套namespace。

控制器函數

基於beego的Controller設計可以參考controller文件夾下的文件,只要匿名組合beego.Controller就可以了,如下。而beego.Controller實現了接口beego.ControllerInterface以及一系列的函數。

type xxxController struct {
    beego.Controller
}

提前終止運行:比如用戶登陸邏輯沒有通過,就直接終止進程。使用StopRun可以做到。

type RController struct {
    beego.Controller
}

func (this *RController) Prepare() {
    this.Data["json"] = map[string]interface{}{"name": "astaxie"}
    this.ServeJSON()
    this.StopRun()
}

model設計

安裝ORM:go get github.com/astaxie/beego/orm

簡單例子 models.go:

package main

import (
    "github.com/astaxie/beego/orm"
)

type User struct {
    Id          int
    Name        string
    Profile     *Profile   `orm:"rel(one)"` // OneToOne relation
    Post        []*Post `orm:"reverse(many)"` // 設置一對多的反向關係
}

type Profile struct {
    Id          int
    Age         int16
    User        *User   `orm:"reverse(one)"` // 設置一對一反向關係(可選)
}

type Post struct {
    Id    int
    Title string
    User  *User  `orm:"rel(fk)"`    //設置一對多關係
    Tags  []*Tag `orm:"rel(m2m)"`
}

type Tag struct {
    Id    int
    Name  string
    Posts []*Post `orm:"reverse(many)"`
}

func init() {
    // 需要在init中註冊定義的model
    orm.RegisterModel(new(User), new(Post), new(Profile), new(Tag))
}

main.go

package main

import (
    "fmt"
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)

func init() {
    orm.RegisterDriver("mysql", orm.DRMySQL)

    orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8")
}

func main() {
    o := orm.NewOrm()
    o.Using("default") // 默認使用 default,你可以指定爲其他數據庫

    profile := new(Profile)
    profile.Age = 30

    user := new(User)
    user.Profile = profile
    user.Name = "slene"

    fmt.Println(o.Insert(profile))
    fmt.Println(o.Insert(user))
}

註冊模型

如果使用orm.QuerySeter進行高級查詢的話,這個是必須的。反之,如果只使用Raw查詢和map struct,是無需這一步的。

首先,註冊定義的Model,最佳的設計是有單獨的models.go文件,在它的init函數內完成註冊,比如:

迷你的models.go

package main

import "github.com/astaxie/beego/orm"

type User struct {
    Id   int
    Name string
}

func init(){
    orm.RegisterModel(new(User))
}

可以如前文一樣同時註冊多個model。可以使用RegisterModelWithPrefix,這樣創建的表名會自動帶上前綴。

高級查詢

ORM以QuerySeter來組織查詢,每個返回QuerySeter的方法都會獲得一個新的QuerySeter對象。

QuerySeter使用Filter組織查詢,字段組合的前後順序依照表的關係。字段的分隔符使用__雙下劃線。除了描述字段,expr的尾部可以增加操作符以執行對應的sql操作,比如Profile__Age__gt代表Profile.Age>18的條件查詢。

mysql中shell常用命令

因爲使用的是mysql,而且經常要用到一些命令,所以在這裏記錄一下

登陸mysql -u root -p,或者在mysql shell中輸入\connect [scheme://][user[:password]@]<host[:port]|socket>[/schema][?option=value&option=value...],例如\connect mysql://wty:[email protected]:3306來登陸

使用\sql可以切換到sql模式,這樣子就可以使用常用的sql命令來操作。

遇到的問題

beego中orm怎麼使用

在哪裏定義,是在main裏定義後面使用呢,還是在

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章