快速入门beego框架 开发网站

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/HD2killers/article/details/84106787

快速入门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:19961129@tcp(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:19961129@tcp(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)
展开阅读全文

没有更多推荐了,返回首页