1. 程式人生 > >快速入門beego框架 開發網站

快速入門beego框架 開發網站

快速入門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)