参考社区 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 的模板语法
- 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 地址
}