Beego框架学习
beego框架是go语言开发的web框架
官网:beego.me
创建项目
1 2 3
| 1. bee new "项目名称" #在GOPATH/src下创建 2. bee run #进入项目目录执行 3. 使用GOLand打开文件 #若使用了代理下载Beego和bee,需要Go环境配置,我配置的是https://goproxy.io/
|
MVC
M:Model模型,数据库操作、增删改查
V:View视图,接受C传输的数据、组织html界面
C:Controller控制器,接收数据、数据处理、传输数据给M和V并接收应答、返回应答给浏览器
- 浏览器请求到控制器
- 控制器想Model要数据
- 控制器得到数据后将数据给View,并向View获取视图
- 控制器得到视图后将其传递给浏览器
ORM
beego中内嵌了ORM框架,可以将结构体和数据表进行对应,只需要通过结构体和对象就可以对数据表进行操作
O:Object对象
R:Relation关系,对应关系型数据库
M:Mapping映射
- 能够通过结构体对象来操作对应的数据库表
- 能通过ORM生成结构体相对应的数据库表
orm表创建过程
1 2 3 4 5 6 7 8
| func init () { orm.RegisterDataBase("default", "mysql", "root:@tcp(127.0.0.1:3306)/test1?charset=utf8mb4") orm.RegisterModel(new(User)) orm.RunSyncdb("default", false, true) }
|
orm插入
1 2 3 4 5 6 7 8 9 10 11 12 13
|
o:=orm.NewOrm()
user:=models.User{}
user.Name="夜行书生" user.Pwd="yexingshusheng"
_,err:=o.Insert(&user) if err!=nil{ beego.Info(err) }
|
orm查询
1 2 3 4 5 6 7 8 9 10 11 12 13
|
o:=orm.NewOrm()
user:=models.User{}
user.Id = 1
err:=o.Read(&user) if err!=nil{ beego.Info(err) return }
|
orm更新
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
o:=orm.NewOrm()
user:=models.User{}
user.Id = 1 err:=o.Read(&user) if err!=nil{ beego.Info(err) return }
user.Name = "夜行书生1" _,err = o.Update(&user) if err!=nil{ beego.Info(err) return }
|
orm删除
1 2 3 4 5 6 7 8 9 10 11 12 13
|
o:=orm.NewOrm()
user:=models.User{}
user.Id = 1
_,err:=o.Delete(&user) if err!=nil{ beego.Info(err) return }
|
表属性设置
1 2 3 4 5 6 7 8 9 10 11 12 13
| 设置主键 `pk` 设置自增`auto` 当 Field 类型为 int, int32, int64, uint, uint32, uint64 时,可以设置字段为自增健,当模型定义里没有主键时,符合上述类型且名称为 Id 的 Field 将被视为自增健. 设置默认值 `default(11)` 设置长度`orm:size(100)` 设置允许为空`null`,数据库默认是非空,设置null之后就可以变为`ALLOW NULL` 设置唯一`orm:"unique"` 设置浮点数精度`orm:"digits(12);decimals(4)"` 总共12位,四位是小数位 设置时间:`orm:"auto_now_add;type(datetime)"` `orm:"auto_now;type(date)"` auto_now 每次 model 保存时都会对时间自动更新 auto_now_add 第一次保存时才设置时间 设置时间的格式:type
|
GET请求和POST请求
GET请求
1 2 3
| 1. 添加要实现的路由在router.go 2. 重写get方法 3. 返回一个视图
|
POST请求
1 2 3 4
| 1. 用form表单发送post请求 2. 在router.go中实现对应路由 3. 重写post方法 4. 返回一个视图
|
注册登录简单实现
router路由定义
1 2 3 4 5 6
| func init() { beego.Router("/register",&controllers.MainController{})
beego.Router("/login",&controllers.MainController{},"get:Login;post:HandleLogin") }
|
注册登录html实现
1 2 3 4 5 6 7
| <h1>注册页面</h1> <form method="post" action="/register"> 用户名 : <input type="text" name="username"> 密码 : <input type="password" name="password"> <input type="submit" value="注册"> </form>
|
注册
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| func (c *MainController) Get() { c.TplName = "register.html" }
func (c *MainController) Post() { username:=c.GetString("username") password:=c.GetString("password") if username == "" || password == ""{ c.Redirect("/register",302) return } o:=orm.NewOrm() user:=models.User{ Name: username, Pwd: password, } _,err:=o.Insert(&user) if err!=nil{ c.Redirect("/register",302) return } c.TplName = "login.html" }
|
登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| func (c *MainController) Login() { c.TplName = "login.html" }
func (c *MainController) HandleLogin() { username := c.GetString("username") password := c.GetString("password") if username == "" || password == ""{ c.Redirect("/login",302) return } o:=orm.NewOrm() user:=models.User{} user.Name = username user.Pwd = password err := o.Read(&user,"Name","Pwd") if err != nil { c.Redirect("/login",302) return } c.Ctx.WriteString("登录成功") }
|
c.TplName和c.Redirect的区别
1 2
| c.TplName("视图文件")可以指定试图文件,同时给这个视图用c.Data传递一些数据 c.Redirect("URL地址",HTTP状态码)是跳转,不能传递数据,速度快
|