beego 使用調研

參考社區 https://beego.me/docs/mvc/model/orm.md

1、 orm 使用 (一對多,外鍵,自定義查詢)

package main

import (
	"github.com/lhtzbj12/sdrms/sysinit"
)

func main () {
	sysinit.InitDatabase()

	/*
		beego orm 框架 使用 可以使用orm.NewOrm()定義好的方法, 也可以直接Raw(sql.Exec()執行

		以下關係入庫,查詢 https://www.jianshu.com/p/4441b8b765ac 也有參照
		`orm:"rel(one)"` 表示one2one
		`orm:"rel(fk)"`  表示one2many
		`orm:"rel(m2m)"` 表示many2many

		`orm:"reverse(one)"` `orm:"reverse(one)"`  標註反向關係
		rel(m2m)、reverse(many) 這一對字段 會生成關係對應表 子表_主表s 主鍵自增
	*/

	// 增加
	//motanDemo := models.MotanDemo{Name:"test006", Desc:"test main 666", Flag:true}
	//models.InsertMotanDemo(&motanDemo)

	// 刪除
	//models.DeleteMotanDemo(3)

	// 修改
	//motanDemo := models.MotanDemo{Id:4, Name:"test006", Desc:"test main 666", Flag:true}
	//models.UpdateMotanDemo(&motanDemo)

	// 查詢
	//models.SelectMotanDemoAll()
}




package models

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

func (a *MotanDemo) TableName() string {
	return MotanDemoTBName()
}


type MotanDemo struct {
	Id      int
	Name    string  `orm:"size(64)"`
	Desc    string  `orm:"size(64)"`
	Flag    bool
}

func InsertMotanDemo(motanDemo *MotanDemo) {
	o := orm.NewOrm()
	fmt.Println(o.Insert(motanDemo))
}

func DeleteMotanDemo(id int) {
	o := orm.NewOrm()
	if num, err := o.Delete(&MotanDemo{Id: id}); err == nil {
		fmt.Println(num)
	}
}

func UpdateMotanDemo(motanDemo *MotanDemo) {
	o := orm.NewOrm()
	o.Update(motanDemo)
}

func SelectMotanDemoAll() {
	o := orm.NewOrm()
	var motanDemos []MotanDemo
	o.Raw("select * from rms_motan_demo").QueryRows(&motanDemos)
	fmt.Println(motanDemos)
}

2、 json 使用

package main

import (
	"encoding/json"
	"fmt"
)

func main() {

	jsonObj1 := jsonObj{
		Encryption: "sha",
		Timestamp: 1482463793,
		Key: "2342874840784a81d4d9e335aaf76260",
		Partnercode: 10025,
	}

	jsons, errs := json.Marshal(jsonObj1) //轉換成JSON返回的是byte[]
	if errs != nil {
		fmt.Println(errs.Error())
	}
	fmt.Println(string(jsons)) //byte[]轉換成string 輸出

	var headers string = `{"encryption":"md5","timestamp":1482463793,"key":"2342874840784a81d4d9e335aaf76260","partnercode":100034}`
	headerObj := jsonObj{}
	json.Unmarshal([]byte(headers), &headerObj)//json解析到結構體裏面
	fmt.Println(headerObj) //輸入結構體
	fmt.Println(headerObj.Key) // 輸出值
}

type jsonObj struct {
	Encryption string `json:"encryption"`
	Timestamp int64 `json:"timestamp"`
	Key string `json:"key"`
	Partnercode int `json:"partnercode"`
}

詳細參考
https://www.bbsmax.com/A/MAzAvroOJ9/

3、格式輸出

-json xml jsonp 模板 yaml str 等

package controllers

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

type MainController struct {
	beego.Controller
}

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

func (c *MainController) TestStr() {
	c.Ctx.WriteString("Hello World!")
}

func (c *MainController) TestJson() {
	mystruct := &Struct{9276, "hello world!!"}
	c.Data["json"] = mystruct
	c.ServeJSON()
}

func (c *MainController) TestXML() {
	mystruct := &Struct{9276, "hello world!!"}
	c.Data["xml"] = mystruct
	c.ServeXML()
}

type Struct struct {
	Code int
	Msg  string
}

4、beego 的模板語法

beego.SetStaticPath("/images",“images”) 註冊後

訪問 /images/login/login.png,那麼就會訪問應用對應的目錄下面的 images/login/login.png 文件

  • 模板語法基本例子 如果有 c.ServeJSON() layout、tplname 無效
// @router /main/staticblock
func (c *MainController) StaticBlock() {
	mystruct := &Struct{9276, "hello world!!"}
	c.Data["json"] = mystruct
	c.TplName = "test.tpl"
	c.Layout = "layout.html"
	//c.ServeJSON()
}


layout.html
<!DOCTYPE html>
<html>
<head>
    <title>佈局頁面</title>
</head>
<body>

<div class="container">
    {{.json}}
</div>
</body>
</html>

test.tpl
{{.json}}

5、 路由方式整理

  • namespace 路由區域劃分
ns :=
beego.NewNamespace("/v1",
    beego.NSNamespace("/shop",
        beego.NSGet("/:id", func(ctx *context.Context) {
            ctx.Output.Body([]byte("shopinfo"))
        }),
    ),
    beego.NSNamespace("/order",
        beego.NSGet("/:id", func(ctx *context.Context) {
            ctx.Output.Body([]byte("orderinfo"))
        }),
    ),
    beego.NSNamespace("/crm",
        beego.NSGet("/:id", func(ctx *context.Context) {
            ctx.Output.Body([]byte("crminfo"))
        }),
    ),
)
  • 固定路由

beego.Router("/admin", &admin.UserController{})

  • 正則路由

beego.Router(“/api/?:id”, &controllers.RController{}) 與 beego.Router(“/api/:id”, &controllers.RController{})

URL”/api/123”可以匹配成功,此時變量”:id”值爲”123”
獲取變量 this.Ctx.Input.Param(":id")

  • 自定義方法

beego.Router("/",&IndexController{},":Index")
beego.Router("/api",&RestController{},“get,post:ApiFunc”)
beego.Router("/simple",&SimpleController{},“get:GetFunc;post:PostFunc”)
beego.Router("/simple",&SimpleController{},"
:AllFunc;post:PostFunc")

  • 自動匹配

beego.AutoRouter(&controllers.ObjectController{})
/object/login 調用 ObjectController 中的 Login 方法
.json .html等後綴無用

  • 註解路由
type CMSController struct {
    beego.Controller
}

func (c *CMSController) URLMapping() {
    c.Mapping("StaticBlock", c.StaticBlock)
    c.Mapping("AllBlock", c.AllBlock)
}


// @router /staticblock/:key [get]
func (this *CMSController) StaticBlock() {

}

// @router /all/:key [get]
func (this *CMSController) AllBlock() {

}

router.go中註冊
beego.Include(&CMSController{})


6、 配置信息系統

  • beego 目前支持 INI、XML、JSON、YAML 格式的配置文件解析 默認會解析當前應用下的 conf/app.conf 文件
  • ioutil gopkg.in/yaml.v2 方式
  • “encoding/xml” “io/ioutil” “os” 讀取操作xml
yaml 讀取

name: 'benben_2015'
website: 'www.csdn.com'
year: 2015

favourite:
  - 'play games'
  - 'programming'
  - 'reading'
  
package main



import ( "fmt"
		 "io/ioutil"
 		 "gopkg.in/yaml.v2" )

type CSDN struct {
	Name string
	WebSite string
	Year int
	Favourite []string
}

func main() {
	content, err := ioutil.ReadFile("./test.yaml")
	if err != nil {
		fmt.Println(err)
	}
	csdn := CSDN{}
	yaml.Unmarshal(content, &csdn)
	fmt.Println(csdn.Name)
	fmt.Println(csdn.Favourite)
}

7、 日誌使用

  • 使用utils下的logs就行
package utils

import (
	"strings"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/logs"
)

// consoleLogs開發模式下日誌
var consoleLogs *logs.BeeLogger

// fileLogs 生產環境下日誌
var fileLogs *logs.BeeLogger

//運行方式
var runmode string

func InitLogs() {
	consoleLogs = logs.NewLogger(1)
	consoleLogs.SetLogger(logs.AdapterConsole)
	consoleLogs.Async() //異步
	fileLogs = logs.NewLogger(10000)
	level := beego.AppConfig.String("logs::level")
	fileLogs.SetLogger(logs.AdapterMultiFile, `{"filename":"logs/rms.log",
		"separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"],
		"level":`+level+`,
		"daily":true,
		"maxdays":10}`)
	fileLogs.Async() //異步
	runmode = strings.TrimSpace(strings.ToLower(beego.AppConfig.String("runmode")))
	if runmode == "" {
		runmode = "dev"
	}
}
func LogEmergency(v interface{}) {
	log("emergency", v)
}
func LogAlert(v interface{}) {
	log("alert", v)
}
func LogCritical(v interface{}) {
	log("critical", v)
}
func LogError(v interface{}) {
	log("error", v)
}
func LogWarning(v interface{}) {
	log("warning", v)
}
func LogNotice(v interface{}) {
	log("notice", v)
}
func LogInfo(v interface{}) {
	log("info", v)
}
func LogDebug(v interface{}) {
	log("debug", v)
}

func LogTrace(v interface{}) {
	log("trace", v)
}

//Log 輸出日誌
func log(level, v interface{}) {
	format := "%s"
	if level == "" {
		level = "debug"
	}
	if runmode == "dev" {
		switch level {
		case "emergency":
			fileLogs.Emergency(format, v)
		case "alert":
			fileLogs.Alert(format, v)
		case "critical":
			fileLogs.Critical(format, v)
		case "error":
			fileLogs.Error(format, v)
		case "warning":
			fileLogs.Warning(format, v)
		case "notice":
			fileLogs.Notice(format, v)
		case "info":
			fileLogs.Info(format, v)
		case "debug":
			fileLogs.Debug(format, v)
		case "trace":
			fileLogs.Trace(format, v)
		default:
			fileLogs.Debug(format, v)
		}
	}
	switch level {
	case "emergency":
		consoleLogs.Emergency(format, v)
	case "alert":
		consoleLogs.Alert(format, v)
	case "critical":
		consoleLogs.Critical(format, v)
	case "error":
		consoleLogs.Error(format, v)
	case "warning":
		consoleLogs.Warning(format, v)
	case "notice":
		consoleLogs.Notice(format, v)
	case "info":
		consoleLogs.Info(format, v)
	case "debug":
		consoleLogs.Debug(format, v)
	case "trace":
		consoleLogs.Trace(format, v)
	default:
		consoleLogs.Debug(format, v)
	}
}


8、 過濾器 & 攔截器

  • beego.InsertFilter(pattern string, position int, filter FilterFunc, params …bool)
參考示例
https://beego.me/docs/mvc/controller/filter.md

9、參數校驗工具

1、直接使用 

u := User{"man", 40}
valid := validation.Validation{}
valid.Required(u.Name, "name")

// 定製錯誤信息
minAge := 18
valid.Min(u.Age, minAge, "age").Message("少兒不宜!")
// 錯誤信息格式化
valid.Min(u.Age, minAge, "age").Message("%d不禁", minAge)

2、StructTag

// 驗證函數寫在 "valid" tag 的標籤裏
// 各個函數之間用分號 ";" 分隔,分號後面可以有空格
// 參數用括號 "()" 括起來,多個參數之間用逗號 "," 分開,逗號後面可以有空格
// 正則函數(Match)的匹配模式用兩斜槓 "/" 括起來
// 各個函數的結果的 key 值爲字段名.驗證函數名
type user struct {
    Id     int
    Name   string `valid:"Required;Match(/^Bee.*/)"` // Name 不能爲空並且以 Bee 開頭
    Age    int    `valid:"Range(1, 140)"` // 1 <= Age <= 140,超出此範圍即爲不合法
    Email  string `valid:"Email; MaxSize(100)"` // Email 字段需要符合郵箱格式,並且最大長度不能大於 100 個字符
    Mobile string `valid:"Mobile"` // Mobile 必須爲正確的手機號
    IP     string `valid:"IP"` // IP 必須爲一個正確的 IPv4 地址
}

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