一个使用 Go 的思维来帮助您构建并开发 Go 应用程序的开源框架

Beego简介

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

官网:https://beego.me

Beego架构

beego 的整体设计架构如下所示:

beego

Beego 的执行逻辑

beego_flow

Beego项目结构

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

从上面的目录结构我们可以看出来 M(models 目录)、V(views 目录)和 C(controllers 目录)的结构, main.go 是入口文件。

安装beego和bee工具

1go get -u github.com/astaxie/beego
2go get -u github.com/beego/bee

新建项目

使用bee工具可以很方便的创建一个项目

 1bee new myapp
 2______
 3| ___ \
 4| |_/ /  ___   ___
 5| ___ \ / _ \ / _ \
 6| |_/ /|  __/|  __/
 7\____/  \___| \___| v1.10.0
 82020/03/16 13:03:02 WARN     ▶ 0001 You current workdir is not inside $GOPATH/src.
 92020/03/16 13:03:02 INFO     ▶ 0002 Creating application...
10	create	 /Users/jerry/go/src/myapp/
11	create	 /Users/jerry/go/src/myapp/conf/
12	create	 /Users/jerry/go/src/myapp/controllers/
13	create	 /Users/jerry/go/src/myapp/models/
14	create	 /Users/jerry/go/src/myapp/routers/
15	create	 /Users/jerry/go/src/myapp/tests/
16	create	 /Users/jerry/go/src/myapp/static/
17	create	 /Users/jerry/go/src/myapp/static/js/
18	create	 /Users/jerry/go/src/myapp/static/css/
19	create	 /Users/jerry/go/src/myapp/static/img/
20	create	 /Users/jerry/go/src/myapp/views/
21	create	 /Users/jerry/go/src/myapp/conf/app.conf
22	create	 /Users/jerry/go/src/myapp/controllers/default.go
23	create	 /Users/jerry/go/src/myapp/views/index.tpl
24	create	 /Users/jerry/go/src/myapp/routers/router.go
25	create	 /Users/jerry/go/src/myapp/tests/default_test.go
26	create	 /Users/jerry/go/src/myapp/main.go
272020/03/16 13:03:02 SUCCESS  ▶ 0003 New application successfully created!

执行上面的命令会在$GOPATH/src下创建myapp的web服务,如果是api服务则使用

 1bee api myapi
 2______
 3| ___ \
 4| |_/ /  ___   ___
 5| ___ \ / _ \ / _ \
 6| |_/ /|  __/|  __/
 7\____/  \___| \___| v1.10.0
 82020/03/16 13:04:05 WARN     ▶ 0001 You current workdir is not inside $GOPATH/src.
 92020/03/16 13:04:05 INFO     ▶ 0002 Creating API...
10	create	 /Users/jerry/go/src/myapi
11	create	 /Users/jerry/go/src/myapi/conf
12	create	 /Users/jerry/go/src/myapi/controllers
13	create	 /Users/jerry/go/src/myapi/tests
14	create	 /Users/jerry/go/src/myapi/conf/app.conf
15	create	 /Users/jerry/go/src/myapi/models
16	create	 /Users/jerry/go/src/myapi/routers/
17	create	 /Users/jerry/go/src/myapi/controllers/object.go
18	create	 /Users/jerry/go/src/myapi/controllers/user.go
19	create	 /Users/jerry/go/src/myapi/tests/default_test.go
20	create	 /Users/jerry/go/src/myapi/routers/router.go
21	create	 /Users/jerry/go/src/myapi/models/object.go
22	create	 /Users/jerry/go/src/myapi/models/user.go
23	create	 /Users/jerry/go/src/myapi/main.go
242020/03/16 13:04:05 SUCCESS  ▶ 0003 New API successfully created!

快速启动

 1cd $GOPATH/src/myapp
 2go mod init
 3bee run
 4______
 5| ___ \
 6| |_/ /  ___   ___
 7| ___ \ / _ \ / _ \
 8| |_/ /|  __/|  __/
 9\____/  \___| \___| v1.10.0
102020/03/16 13:05:31 INFO     ▶ 0001 Using 'myapp' as 'appname'
112020/03/16 13:05:31 INFO     ▶ 0002 Initializing watcher...
12go: finding module for package github.com/astaxie/beego
13go: found github.com/astaxie/beego in github.com/astaxie/beego v1.12.1
14go: finding module for package github.com/shiena/ansicolor
15go: found github.com/shiena/ansicolor in github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644
162020/03/16 13:05:42 SUCCESS  ▶ 0003 Built Successfully!
172020/03/16 13:05:42 INFO     ▶ 0004 Restarting 'myapp'...
182020/03/16 13:05:42 SUCCESS  ▶ 0005 './myapp' is running...
192020/03/16 13:05:43.906 [I] [asm_amd64.s:1373]  http server Running on http://:8080

程序会自动下载依赖包,并监听8080端口

ORM

程序自带orm功能

 1package main
 2
 3import (
 4    "github.com/astaxie/beego/orm"
 5    _ "github.com/go-sql-driver/mysql"
 6)
 7
 8type User struct {
 9    Id          int
10    Name        string
11    Age         int
12}
13
14func init() {
15	  // 注册驱动
16    orm.RegisterDriver("mysql", orm.DRMySQL)
17    // 连接数据库
18    orm.RegisterDataBase("default", "mysql", "root:root@tcp(127.0.0.1:3306)/orm_test?charset=utf8")
19    orm.RegisterModel(new(User))
20    // 自动建表
21    orm.RunSyncdb("default", false, true)
22}
23

RegisterDriver

支持3中数据库类型

1orm.DRMySQL
2orm.DRSqlite
3orm.DRPostgres

RegisterDataBase

ORM 必须注册一个别名为 default 的数据库,作为默认使用。

SetMaxIdleConns

根据数据库的别名,设置数据库的最大空闲连接

1orm.SetMaxIdleConns("default", 30)

SetMaxOpenConns

根据数据库的别名,设置数据库的最大数据库连接 (go >= 1.2)

1orm.SetMaxOpenConns("default", 30)

时区设置

ORM 默认使用 time.Local 本地时区

  • 作用于 ORM 自动创建的时间
  • 从数据库中取回的时间转换成 ORM 本地时间

如果需要的话,你也可以进行更改

1// 设置为 UTC 时间
2orm.DefaultTimeLoc = time.UTC

ORM 在进行 RegisterDataBase 的同时,会获取数据库使用的时区,然后在 time.Time 类型存取时做相应转换,以匹配时间系统,从而保证时间不会出错。

CURD

Create 新增

1o := orm.NewOrm()
2user := new(User)
3user.Name = "jerry"
4
5fmt.Println(o.Insert(user))

Read 查询

1o := orm.NewOrm()
2user := User{Id: 1}
3
4err := o.Read(&user)
5if err !=nil {
6  log.Println("查不到")
7}

Update 修改

1o := orm.NewOrm()
2user := User{Id: 1}
3
4user.Name = "Your"
5fmt.Println(o.Update(user))

Delete 删除

1o := orm.NewOrm()
2user := User{Id: 1}
3
4fmt.Println(o.Delete(user))

缓存模块

beego 的 cache 模块是用来做数据缓存的,设计思路来自于 database/sql,目前支持 file、memcache、memory 和 redis 四种引擎,安装方式如下:

1go get github.com/astaxie/beego/cache

并且在使用的时候导入对应的驱动

1import _ "github.com/astaxie/beego/cache/memcache" # memcache
2import _ "github.com/astaxie/beego/cache/redis"    # redis

其中redis的连接格式

1{"key":"collectionName","conn":"127.0.0.1:6379","dbNum":"0","password":"thePassWord"}
  • key: Redis collection 的名称
  • conn: Redis 连接信息
  • dbNum: 连接 Redis 时的 DB 编号. 默认是0.
  • password: 用于连接有密码的 Redis 服务器.

基本操作

1bm.Put("jerry", 1, 3600*time.Second)
2bm.Get("jerry")
3bm.IsExist("jerry")
4bm.Delete("jerry")

一些经常需要查询到但是又比较少变化的,通常使用缓存缓存起来,效率更高效并且缓解数据库的压力。

Session控制

开启session需要修改配置文件或者在main函数中修改

修改配置文件conf/app.conf

1sessionon = true

或者在main函数入口设置

1beego.BConfig.WebConfig.Session.SessionOn = true

session 有几个方便的方法:

  • SetSession(name string, value interface{}) # 设置session
  • GetSession(name string) interface{} # 获取session
  • DelSession(name string) # 删除session
  • SessionRegenerateID()
  • DestroySession()

通常用在保存用户会话。

过滤器

beego 支持自定义过滤中间件,例如安全验证,强制跳转等。

过滤器函数如下所示:

1beego.InsertFilter(pattern string, position int, filter FilterFunc, params ...bool)

InsertFilter 函数的三个必填参数,一个可选参数

  • pattern 路由规则,可以根据一定的规则进行路由,如果你全匹配可以用 *
  • position 执行 Filter 的地方,五个固定参数如下,分别表示不同的执行过程
    • BeforeStatic 静态地址之前
    • BeforeRouter 寻找路由之前
    • BeforeExec 找到路由之后,开始执行相应的 Controller 之前
    • AfterExec 执行完 Controller 逻辑之后执行的过滤器
    • FinishRouter 执行完逻辑之后执行的过滤器
  • filter filter 函数 type FilterFunc func(*context.Context)

示例:验证用户是否已经登录,应用于全部的请求

1var FilterUser = func(ctx *context.Context) {
2    _, ok := ctx.Input.Session("uid").(int)
3    if !ok && ctx.Request.RequestURI != "/login" {
4        ctx.Redirect(302, "/login")
5    }
6}
7
8beego.InsertFilter("/*",beego.BeforeRouter,FilterUser)

以上介绍的都是一些比较常用的模块,更多详细的信息,可以上官网查看。