快速入門beego框架 開發網站
阿新 • • 發佈:2018-11-19
快速入門beego框架 開發網站
路由
# 使用預設路由 # src/hello/routers/router.go func init() { beego.Router("/", &controllers.MainController{}) // 預設檔案src/hello/controllers/default.go 不管,可以使用為渲染模板或者判斷登陸跳轉 beego.AutoRouter(&wap_login.LoginController{}) // wap_login,使用預設路由,訪問:http://127.0.0.1:8080/login/index beego.AutoRouter(&wap_user.UserController{}) // 其他的一樣的,使用預設路由 } # 預設檔案src/hello/controllers/default.go package controllers import ( "github.com/astaxie/beego" ) type MainController struct { beego.Controller } /** * 預設頁面 * @param {[type]} c *MainController) Get( [description] * @return {[type]} [description] */ func (c *MainController) Get() { // c.TplName = "logincontroller/index.tpl" // 渲染頁面 uid := c.GetSession("uid") if uid == nil { // 重定向 c.Ctx.Redirect(302, "/login/index") } else { c.Ctx.Redirect(302, "/user/index") } } # wap_login控制器 # src/hello/controllers/wap_login/index.go package wap_login import ( "github.com/astaxie/beego" ) type LoginController struct { // 註冊路由對應 beego.Controller } func (c *LoginController) Index() { // 預設渲染的模板檔案:src/hello/views/logincontroller/index.tpl // 這裡渲染一個表單,提交到/login/indexlogin,即提交到下面的IndexLogin(使用的wap_login的預設路由) } func (c *LoginController) IndexLogin() { // 也自己指定渲染的模板檔案:src/hello/views/logincontroller/index.tpl c.TplName = "logincontroller/index.tpl" }
資料庫(連線)
# 使用github.com/astaxie/beego/orm # 新建一個src/hello/controllers/db.go,用來初始化資料庫 package controllers import ( "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql" // 資料庫驅動,必須的,由資料庫而定 ) /** * 匯出一個註冊資料庫的方法 * @return {[type]} [description] */ func Regdb() { // 使用驅動 orm.RegisterDriver("mysql", orm.DRMySQL) // 註冊預設的資料庫連線 orm.RegisterDataBase("default", "mysql", "root:
[email protected](192.168.1.112:3306)/test?charset=utf8") } # 使用 # 只要是使用資料庫的地方,都需要先使用Regdb方法 import ( "hello/controllers" ) // 需要資料庫都需要註冊資料庫 註冊模型RegisterModel必須在init裡面, 但是隻能在模型裡面註冊一次 type Users struct { Id int Name string `orm:"size(100)"` Pass string `orm:"size(100)"` } func init() { controllers.Regdb() orm.RegisterModel(new(Users)) } func (c *LoginController) IndexLogin() { // 使用資料庫 o := orm.NewOrm() o.Using("default") // 例項化 user := new(Users) user.Name = "yonghuming" user.Pass = "yonghuming" // 插入資料 o.Insert(user) }
資料庫(操作)
# 插入資料
# 註冊資料庫後,init裡面註冊模型orm.RegisterModel(new(Users))
type Users struct {
Id int
Name string `orm:"size(100)"`
Pass string `orm:"size(100)"`
}
// 如果type Users與資料庫表名對應不上,自定義表名
func (u *Users) TableName() string {
return "user" // 表名稱
}
o := orm.NewOrm()
o.Using("default")
user := new(Users)
user.Name = "yonghuming"
user.Pass = "yonghuming"
id_key, _ := o.Insert(user)
fmt.Println(id_key) // 返回的是新增的主鍵
# 讀取資料列表
# 模型主鍵查詢Read
# 註冊資料庫後,init裡面註冊模型orm.RegisterModel(new(Users))
o := orm.NewOrm()
user := Users{Id: 1}
err := o.Read(&user)
if err == orm.ErrNoRows {
fmt.Println("查詢不到")
} else if err == orm.ErrMissPK {
fmt.Println("找不到主鍵")
} else {
c.Data["user"] = user
fmt.Println(user.Id, user.Name)
}
# 渲染結構體 區分大小寫Name
{{.info.Name}}
# 原生查詢不需要註冊模型orm.RegisterModel(new(Users))
var maps []orm.Params
num, err := o.Raw("Select * from users where id > ?", 0).Values(&maps)
if err == nil && num > 0 {
c.Data["list"] = maps
// 儲存Cookie,儲存的值是一個字串,使用型別.(string)斷言
c.Ctx.SetCookie("uid", maps[0]["Id"].(string), 60*60*24*365, "/", nil, nil, false) // 主鍵Id首字母大寫
// 或者儲存Session,不需要斷言
// c.SetSession("uid", uid)
c.Ctx.Redirect(302, "/user/index")
}
# 迴圈渲染
{{range .list}}
{{.name}} and {{.pass}}
{{end}}
# 加上索引
{{range $index, $elem := .list}}
{{$index}} - {{$elem.name}} of {{$elem.pass}}/
{{end}}
# 統計條數,就是num
o := orm.NewOrm()
o.Using("default")
var maps []orm.Params
num, err := o.Raw("Select * from users where id > ?", 11).Values(&maps)
if err == nil && num > 0 {
fmt.Println(num)
}
# Update 模型,主鍵更新
user := Users{Id: 13}
if o.Read(&user) == nil {
user.Name = "MyName"
if num, err := o.Update(&user); err == nil {
fmt.Println(num) // 影響的行數
}
}
# Delete 模型,主鍵刪除
o := orm.NewOrm()
if num, err := o.Delete(&Users{Id: 16}); err == nil {
fmt.Println(num) // 影響的行數,大於1才是成功
}
# 例子
package main
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "root:[email protected](192.168.1.112:3306)/test?charset=utf8")
orm.RegisterModel(new(Users))
}
type Users struct {
Id int
Name string
Pass string
}
func main() {
num, err := o.Raw("Select * from users where id > ?", 11).Values(&maps)
if err == nil && num > 0 {
fmt.Println(num)
}
}
請求引數
# method="post"
# 請求方式,加到過濾裡面,驗證post請求
var FilterMethod = func(ctx *context.Context) {
if ctx.Input.IsPost() == false { // post請求
ctx.Redirect(302, "/")
}
}
beego.InsertFilter("/user/ajaxgetuserinfo", beego.BeforeRouter, FilterMethod)
user := c.GetString("user")
if user == "" {
c.Data["errmsg"] = "請輸入使用者名稱!"
}
Session和Cookie
// 儲存Cookie,儲存的值是一個字串,使用型別.(string)斷言
c.Ctx.SetCookie("uid", maps[0]["Id"].(string), 60*60*24*365, "/", nil, nil, false) // 主鍵Id首字母大寫,1年
// 或者儲存Session,不需要斷言,重啟服務就會丟失,記憶體session
// c.SetSession("uid", uid)
// 讀取
uid := c.Ctx.GetCookie("uid")
if uid == "" {
c.Ctx.Redirect(302, "/login/index")
} else {
c.Ctx.Redirect(302, "/user/index")
}
uid := c.GetSession("uid")
if uid == nil {
c.Ctx.Redirect(302, "/login/index")
} else {
c.Ctx.Redirect(302, "/user/index")
}
重定向
c.Ctx.Redirect(302, "/user/index")
過濾器
# 例子,判斷使用者登陸,等級等
# 加到路由之前 src/hello/routers/router.go 裡面init
var FilterUser = func(ctx *context.Context) {
// ctx.Request.RequestURI // 路徑
_, ok := ctx.Input.Session("uid").(int) // 斷言
if !ok {
ctx.Redirect(302, "/login/index")
}
}
// /user/*是user下面的所有路由都要使用此過濾器
beego.InsertFilter("/user/*", beego.BeforeRouter, FilterUser)
var FilterUser = func(ctx *context.Context) {
uid := ctx.GetCookie("uid")
if uid == "" {
ctx.Redirect(302, "/login/index")
}
}
beego.InsertFilter("/user/*", beego.BeforeRouter, FilterUser)
輸出json
# src/hello/controllers/wap_user/index.go
// http://127.0.0.1:8080/user/ajaxgetuserinfo
func (c *UserController) AjaxGetUserInfo() {
uid := c.Ctx.GetCookie("uid")
o := orm.NewOrm()
var maps []orm.Params
num, err := o.Raw("Select * from users where id = ?", uid).Values(&maps)
if err == nil && num == 1 {
// c.Data["json"] = &maps[0]
c.Data["json"] = map[string]interface{}{"code": 1, "msg": "獲取成功!", "data": maps[0]}
c.ServeJSON()
}
}
字串轉換數字
import ("strconv")
uid := "123"
intuid, error := strconv.Atoi(uid) // 字串轉換成整數
if error != nil {
fmt.Println("字串轉換成整數失敗")
} else {
fmt.Println(intuid)
}
var c int = 1234
d := strconv.Itoa(c) //數字變成字串
fmt.Println(d)