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并接收应答、返回应答给浏览器

  1. 浏览器请求到控制器
  2. 控制器想Model要数据
  3. 控制器得到数据后将数据给View,并向View获取视图
  4. 控制器得到视图后将其传递给浏览器

ORM

beego中内嵌了ORM框架,可以将结构体和数据表进行对应,只需要通过结构体和对象就可以对数据表进行操作

O:Object对象

R:Relation关系,对应关系型数据库

M:Mapping映射

  1. 能够通过结构体对象来操作对应的数据库表
  2. 能通过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")
// 映射model数据
orm.RegisterModel(new(User))
// 生成表
orm.RunSyncdb("default", false/*是否强制更新*/, true/*是否可见*/)
}

orm插入

1
2
3
4
5
6
7
8
9
10
11
12
13
//插入
//1. 有ORM对象
o:=orm.NewOrm()
//2. 有插入数据的结构体对象
user:=models.User{}
//3. 对结构体对象赋值
user.Name="夜行书生"
user.Pwd="yexingshusheng"
//4. 插入
_,err:=o.Insert(&user)
if err!=nil{
beego.Info(err)
}

orm查询

1
2
3
4
5
6
7
8
9
10
11
12
13
//查询
//1. 有ORM对象
o:=orm.NewOrm()
//2. 有查询的对象
user:=models.User{}
//3. 指定查询对象字段值
user.Id = 1
//4. 进行查询
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
//更新
//1. 有ORM对象
o:=orm.NewOrm()
//2. 有需要更新的对象
user:=models.User{}
//3. 有需要更新的数据
user.Id = 1
err:=o.Read(&user)
if err!=nil{
beego.Info(err)
return
}
//4. 重新赋值
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
//删除
//1. 有ORM对象
o:=orm.NewOrm()
//2. 有需要删除的对象
user:=models.User{}
//3. 有需要删除的数据
user.Id = 1
//4. 删除数据
_,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{})

//自定义了get请求方法,请求将不会访问默认方法
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() {
//1. 拿到数据
username:=c.GetString("username")
password:=c.GetString("password")
//2. 对数据进行校验
if username == "" || password == ""{
//重定向
c.Redirect("/register",302)
return
}
//3. 插入数据库
o:=orm.NewOrm()
user:=models.User{
Name: username,
Pwd: password,
}
_,err:=o.Insert(&user)
if err!=nil{
//重定向
c.Redirect("/register",302)
return
}
//4. 返回登录界面
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() {
//1. 拿到数据
username := c.GetString("username")
password := c.GetString("password")
//2. 校验数据
if username == "" || password == ""{
//重定向
c.Redirect("/login",302)
return
}
//3. 校验数据库
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状态码)是跳转,不能传递数据,速度快