一个计算机技术爱好者与学习者

0%

好好学Golang:beego入门篇——上

1. beego简介

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

2. beego架构

2.1. beego模块

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

2.2. beego执行逻辑

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

2.3. 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是入口文件。

3. beego安装

1、安装beego安装包
go get github.com/astaxie/beego

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

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

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

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

4. 入口文件

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

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

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

func main() {
beego.Run()
}

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

5. 路由

路由模块负责路由转发,转发请求给对应的控制器。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{})

6. 控制器

控制器接收到请求后,解析请求参数,负责实现具体的处理逻辑。上面的代码,在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”。

7. 模板引擎

模板引擎负责页面的渲染,比如上面的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 模板语法指南

8. 路径美化

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

8.1. 总体设计

因为登录和注册都属于用户管理,因此可以把它们归类到一个模块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

8.2. 路由

一个模块对应一个路由文件,因此新建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{})
}

8.3. 控制器

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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请求。

8.4. 模板

一个模块对应一个视图目录,因此新建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了。

9. 后记

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

源码分享:v0.0.0

10. 书签

beego官网
beego开发文档
GoWeb开发实战(Beego框架实现项目)
Qihoo360/wayne

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-beego-start-0/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~