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"] = "astaxie@gmail.com"
	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 地址
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值