參考社區 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 的模板語法
- https://beego.me/docs/mvc/view/view.md 社區文檔參考
- 靜態文件訪問
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 地址
}