Not everything that counts can be counted and not everything that`s counted truly counts.
并不是每一件算出來的事情,都有意義,也不是每一件有意義的事情都能夠被算出來脸候。
----Albert Einstein
1 簡介
2 參數(shù)配置
beego
默認(rèn)會解析conf/app.conf
文件
-
系統(tǒng)參數(shù)
httpport
表示當(dāng)前監(jiān)聽的端口-
runmode
表示運行模式- 配置不同的標(biāo)簽,同一個變量在不同的標(biāo)簽下取不同的值
appname = WEB runmode = dev // runmode = prod // runmode = test [dev] httpport = 8080 [prod] httpport = 8088 [test] httpport = 8888
通過
beego.BConfig
來訪問和修改系統(tǒng)參數(shù)的值
-
應(yīng)用參數(shù)
-
mysql
相關(guān)配置
mysqladrr = "127.0.0.1" mysqlport = "3306" mysqluser = "root" mysqlpassword = "root"
- 通過
beego.AppConfig.String("dev::mysqluser")
進(jìn)行修改和讀取-
dev
表示讀取哪個標(biāo)簽 -
mysqluse
r表示讀取某個具體的參數(shù)值
-
-
3 路由配置
- 基礎(chǔ)路由
beego.Router("/",&controller.MainController{})
beego.Router("/index",&controller.UserController{})
beego.Router("/admin",&controller.ArticleController{})
- 直接路由
beego.Get("/outpur",func(ctx *context.Context){
ctx.Output.Body([]byte("hello world"))
})
- 自定義方法及
RESTful
規(guī)則-
beego.Router
的第三個參數(shù)表示使用的httpmethod
以及對應(yīng)的functionname
- 不同的
functionname
之間使用;
隔開 - 同一個
functionname
的不同的httpmethod
使用使用,
隔開寒矿,可以使用*表示所有httpmethod
-
beego.Router("/output",&PutController,"get:Creater;post:Post")
beego.Router("/getlist",&GetController,"get,post:GetList")
需要說明的是炒考,在瀏覽器中訪問,如無特殊說明熔酷,一般默認(rèn)都是Get請求秽之,如果訪問Post方法的函數(shù)可能出現(xiàn)不匹配的情況当娱,可以使用curl -b "a=1" "url"
的方式使用post訪問網(wǎng)站
- 注解路由
4 Controller
- 要實現(xiàn)Controller需要匿名組合
beego.Controller
。
type xxxController struct{
beego.Controller
}
-
beego.Controller
有很多方法考榨,包括Init
,Prepare
,Post
,Get
,Delete
,Head
等方法跨细,也可以通過重寫的方式來實現(xiàn)這些方法。*例如使用bee new XXX
新生成的項目中的Get方法河质。package controllers import "github.com/astaxie/beego" type DemoController struct{ beego.Controller } func (c *DemoController) Get(){ this.Data["Website"] = "beego.me" c.TplName = "index.tpl" }
this.Data
是一個用來存儲輸出數(shù)據(jù)的map冀惭,可以賦值任意類型的值,可以將獲取到的數(shù)據(jù)賦值到this.Data
中掀鹅。最后
beego
會去渲染模板散休,this.TplName
就是需要渲染的模板。如果用戶不設(shè)置該參數(shù)乐尊,程序就會默認(rèn)去Controller/<方法名>.tpl
中查找戚丸。
5 models
-
注冊數(shù)據(jù)庫
-
注冊驅(qū)動
orm.RegisterDriver("mysql",orm.DRMySQL)
-
注冊數(shù)據(jù)庫
orm.RegisterDataBase("default","mysql","root:root@/orm_test?charset=utf8")
-
-
操作數(shù)據(jù)庫
-
指定使用的數(shù)據(jù)庫
o := orm.NewOrm() o.Using("default")
-
使用提供的接口
-
ORM
以QuerySeter
來組織查詢,QuerySeter
方法會返回一個新的QUerySeter
對象
o := orm.NewOrm() // 獲取QuerySeter對象扔嵌,user為表名 qs := o.QueryTable("user") // 也可以直接使用對象作為表名 userInfo := new(User) qs = o.Querytable(user)
-
增
var user models.User{} _ , err := o.Insert(&billRecord)
-
刪
if o.Read(&user) == nil{ _ , err := o.Delete(&record) if err != nil{ //... } }
-
改
user.id = "1" user.name = "konglinghang" if o.Read(&user) == nil{ _ , err := o.Update(&user) if err != nil{ //... } }
-
查
var user User{} _ , err := o.QueryTable("user").Filter("id",user.id).Add(&user) // One(&user)
-
-
-
使用sql語句
o := NewOrm() var r RawSeter r := o.Raw("select ...")
6 View
6.1 表示數(shù)據(jù)
- 使用{{ }}在
tpl
表示數(shù)據(jù) - .獲取當(dāng)前位置上下文數(shù)據(jù)
- $獲取根目錄上下文數(shù)據(jù)
6.2 if 和 range
type User struct{
id int
name string
}
func main(){
var user []User{}
// ...賦值
len := 1
}
{{if .user.id==1}}
{{.user.name}}
{{else }}
{{.user.id}}
{{end}}
{{rang .user.id}}
{{.user.name}} {{$.len}}
{{end}}
7 Cookie與session
7.1 Cookie的設(shè)置和獲取
this.Ctx.SetCookie("name",name,maxage,"/")
this.Ctx.SetCookie("pwd",Md5([]byte(pwd)),maxage,"/")
this.Ctx.GetCookie("name")
7.2 session的設(shè)置和獲取
SetSession("username", uname)
GetSession("username")
8 httplib
8.1 發(fā)送數(shù)據(jù)
url := "http://127.0.0.1:8080/hello"
rep := httplib.Get(url).Debug(true)
8.2 獲取數(shù)據(jù)
beego
框架可以自動解析Get , Post等方式的請求
- 可以通過如下方式獲取數(shù)據(jù):
GetString(key string)
GetStrings(key string)[]string
GetInt(key string)(int64 , error)
GetBool(key string)(bool , error)
GetFloat(key string)(float64 , error)
- 通過
Input()
的方式獲取數(shù)據(jù)
func (dc *DemoController) Post(){
id := dc.Input().Get("id")
intid , err := strconv.Atoi(id)
if err != nil{
//...
}
}
- 使用
ParseForm()
將數(shù)據(jù)直接解析到結(jié)構(gòu)體中
func (dc *DemoController) Post(){
u := UserInfo{}
if err := c.ParseForm(&u) ; err != nil{
// ...
}
}
-
獲取Request Body里的內(nèi)容
配置文件中設(shè)置
copyrequestbody = true
, 在Controller中使用json.Unmarshal()
進(jìn)行解析var ob models.Object json.Unmarshal(this.Ctx.RequestBody , &ob)