beego入门篇——上

文章目录
  1. 1. beego简介
  2. 2. beego架构
    1. 2.1. beego模块
    2. 2.2. beego执行逻辑
    3. 2.3. beego项目结构
  3. 3. bee工具
  4. 4. 入口文件
  5. 5. 路由
  6. 6. 控制器
  7. 7. 模板引擎
  8. 8. 路径美化
    1. 8.1. 总体设计
    2. 8.2. 路由
    3. 8.3. 控制器
    4. 8.4. 模板
  9. 9. 后记
  10. 10. 书签

beego简介

beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架。

beego架构

beego模块

beego 是基于八大独立的模块构建的,是一个高度解耦的框架。当初设计 beego 的时候就是考虑功能模块化,用户即使不使用 beego 的 HTTP 逻辑,也依旧可以使用这些独立模块。这些模块分别是cache、config、context、httplibs、logs、orm、session和toolbox。

beego执行逻辑

beego 是一个典型的 MVC 架构,它的执行逻辑如下图所示:

beego项目结构

一般的 beego 项目的目录如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
├── conf
│ └── app.conf
├── controllers
│ ├── admin
│ └── default.go
├── main.go
├── models
│ └── models.go
├── static
│ ├── css
│ ├── ico
│ ├── img
│ └── js
├── routers
│ ├── router.go
└── views
├── admin
└── index.tpl

MVC中的M在models目录、V在views目录、C在controllers目录,main.go是入口文件。

bee工具

1、安装bee工具
命令行执行 go get github.com/beego/bee

2、创建新项目vkbeego
命令行执行 bee new vkbeego
$GOPATH/src目录下就生成了vkbeego项目。

3、运行项目
在vkbeego目录下执行 bee run

4、访问项目
浏览器访问 http://localhost:8080

入口文件

main.go是beego项目的入口文件,内容为:

1
2
3
4
5
6
7
8
9
10
package main

import (
_ "vkbeego/routers"
"github.com/astaxie/beego"
)

func main() {
beego.Run()
}

入口文件中引入了routers模块和beego模块,然后在main函数中调用了beego模块的Run()函数。整个初始化过程如下图:

路由

路由模块负责路由转发,转发请求给对应的控制器。beego的入口文件中引入了routers模块,查看routers/router.go文件,内容为:

1
2
3
4
5
6
7
8
9
10
package routers

import (
"vkbeego/controllers"
"github.com/astaxie/beego"
)

func init() {
beego.Router("/", &controllers.MainController{})
}

路由注册beego.Router,这个函数的功能是映射 URL 到 Controller,第一个参数是 URL (用户请求的地址),这里我们注册的是 /,也就是我们访问的不带任何参数的 URL,第二个参数是对应的 Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑,我们可以执行类似的方式注册如下路由:

1
beego.Router("/test", &controllers.TestController{})

控制器

控制器接收到请求后,解析请求参数,负责实现具体的处理逻辑。上面的代码,在router中注册了路由,但是,我们并没有TestController控制器,因此需要创建该控制器。打开controllers/default.go文件,添加:

1
2
3
4
5
6
7
8
9
10
11
type TestController struct {
beego.Controller
}

func (c *TestController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.Data["IsMale"] = true
c.Data["LuckyNumbers"] = [...]int{0,1,3,4}
c.TplName = "test.tpl"
}

新建views/test.tpl文件,内容为:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<p>Test Page</p>
</body>
</html>

浏览器访问 http://localhost:8080/test ,即可看到“Test Page”。

模板引擎

模板引擎负责页面的渲染,比如上面的test.tpl就是一个模板,模板引擎把控制器处理后的数据传递给模板,然后根据模板结构生成html页面。TestController把Website等参数传递给test.tpl,但是test.tpl并没有显示,这里对test.tpl进行改造,显示参数。

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<h2>Test Page</h2>
<p>Website: {{.Website}}</p>
<p>Email: {{.Email}}</p>
<p>
Gender:
{{if .IsMale}}
Male
{{else}}
Female
{{end}}
</p>
<p>
Lucky Numbers:
{{range .LuckyNumbers}}
{{.}}&nbsp;&nbsp;
{{end}}
</p>
</body>
</html>

更多详细的模板语法参考beego 模板语法指南

路径美化

以上,已经实现了基本的页面访问逻辑,但是路径不友好,比如所有的路由都写在routers/router.go中,所有的处理逻辑都写在controller/default.go中,所有的模板都写在views路径下。本节中对路径进行美化,使之看起来更加友好合理。
假设现在要添加两个路由,分别用来显示登录页面和注册页面。以此为例,说明路径该怎样设计。

总体设计

因为登录和注册都属于用户管理,因此可以把它们归类到一个模块user,设计路径结构如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vkbeego
├─controllers
│ │ default.go
│ └─user
│ login.go
│ reg.go
├─routers
│ router.go
│ user.go
└─views
│ index.tpl
│ test.tpl
└─user
login.tpl
reg.tpl

路由

一个模块对应一个路由文件,因此新建routers/user.go文件,内容为:

1
2
3
4
5
6
7
8
9
10
11
package routers

import (
"vkbeego/controllers/user"
"github.com/astaxie/beego"
)

func init() {
beego.Router("/user/login", &user.LoginController{})
beego.Router("/user/reg", &user.RegController{})
}

控制器

一个模块对应一个控制器目录,因此新建controllers/user目录,目录中创建文件login.go和reg.go。

1
2
3
4
5
6
7
8
9
10
11
12
13
package user

import (
"github.com/astaxie/beego"
)

type LoginController struct {
beego.Controller
}

func (c *LoginController) Get() {
c.TplName = "user/login.tpl"
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package user

import (
"github.com/astaxie/beego"
)


type RegController struct {
beego.Controller
}

func (c *RegController) Get() {
c.TplName = "user/reg.tpl"
}

当前login.go和reg.go中,只有一个Get请求的控制器,负责页面显示。在实际项目中,这两个文件中还可以添加Post请求的控制器,用来处理Post请求。

模板

一个模块对应一个视图目录,因此新建views/user目录,目录中创建文件login.tpl和reg.tpl。

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<p>Login Page</p>
</body>
</html>

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
<p>Register Page</p>
</body>
</html>

执行命令 bee run,然后就可以浏览器访问URL了。

后记

本文中,首先学习了beego的模块构成、执行逻辑和项目结构,然后使用bee工具构建了第一个beego项目vkbeego,接着学习了beego的路由、控制器和模板引擎,最后美化了项目路径。接下来,学习使用beego对数据库进行增删查改。

源码分享:v0.0.0

书签

beego官网
beego开发文档