beego使用(1)-基本说明

工作接触的第一个项目是用golang语言基于beego框架写的,算是一个比较容易上手的框架,比较适合一些简单的应用。这里记录一下自己的使用。其主要特点如下:
1、beego是一个典型的mvc框架;
2、实现了一些常用的模块,比如缓存,session,日志,orm等;
3、可以自动生成API文档;
4、其支持Restful格式接口。

安装

1、首先beego安装需要有git,所以需要先安装git,这里使用yum安装。需要注意的是yum在内网使用需要配置代理。方式如下:vim /etc/yum.conf,然后在末尾加上proxy=代理地址。
2、接下来安装,这里使用go的get指令安装beego
go get github.com/astaxie/beego
3、然后需要安装bee
go get githum.com/beego/bee

使用

1、创建项目
bee new project
该指令只能在$GOPATH/src下面使用
2、运行
bee run
在项目目录下,即main.go所在目录运行

目录结构

下面给出一个目录结构:

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
|-- app_err
| |-- err.go
|-- conf
| |-- app-dev.conf
| |-- app-pro.conf
| |-- app.conf(软连接)
|-- controllers
| |-- base.go
| |-- default.go
|-- models
| |-- base.go
|-- routers
| |-- router.go
| |-- commentsRouter_controllers.go
|-- static
| |-- css/
| |-- fonts/
| |-- img/
| |-- js/
|-- swagger/
|-- tests
| |-- base.go
|-- views
| |-- index.html
|-- main.go

这个结构中大部分是通过bee new project的命令生成的,下面做详细说明。
1、app_err目录。自己创建,因为在我们开发过程中需要定义一些错误,所以单独创建一个目录去定义。
2、conf目录。默认生成。beego会使用里面的app.conf文件,默认这不是一个软连接文件,但是在实际开发中,我们开发、测试、线上可能需要的环境(如数据库等)不同,所以可以使用软连接指向不同的conf文件,从而能够灵活适应不同环境的部署。
3、controllers目录。默认目录,控制层,用于获取api参数,并调用model层。
4、models目录。默认目录,主要是用于编写struct,一般我们会将一些公共的东西写在base.go中,这个文件是自己定义的。
5、routers目录。默认目录。其中router.go需要自己定义路由和控制器的关系,commentsRouter_controllers.go文件是通过controller中的注解路由生成的。
6、static目录。这个目录是默认的,主要用于存放view层,即前端的一些文件。
7、swagger目录。通过生成api文档生成,用于存放api文档显示的内容的文件。
8、tests目录。默认生成。用于编写测试文件。
9、views目录。默认生成。存放首页文件。
10、main.go。程序入口,程序运行也是通过启动该文件。

简单例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main import (
"github.com/astaxie/beego"
)

type HelloController struct {
beego.Controller
}

func (this *HelloController) Get() {
this.Ctx.WriteString("hello world")
}

func main() {
beego.Router("/", &HelloController{})
beego.Run()
}

这个例子是一个单文件的例子,只需要使用go build编译后运行即可。
首先看看路由,这里通过beego.Router函数将controller和route联系起来,这里绑定的语句可以放在router.go文件中。beego官方文档上说明了go的初始化方式,顺次查找包,然后调用init函数。所以这里只需要导入router.go就可以了,go中导入一个包时如果只使用init函数则需要在包前加下划线”_”。

下面看看controller,HelloController通过继承了beego.Controller,我们可以通过某一个BaseController继承Controller,然后其它控制器再继承这个,在BaseController中可以重写一些函数。这里实现了Get函数,这是Restful格式的函数,也可以使用Post,Put,Delete等。main函数是程序的入口,这点和C/C++类似。

流程

下面是官网给出的流程,可以看到这里的主要步骤是通过路由解析,然后执行初始化Init,然后调用控制器的Prepare函数,然后调用Controller逻辑函数,然后执行Finish函数。其中可能在返回结果前执行Render函数。