您需要安装 Go 1.1+ 以确保所有功能的正常使用。
安装或者升级 Beego 和 Bee 的开发工具:
$ go get -u github.com/astaxie/beego
$ go get -u github.com/beego/bee
安装完之后,bee 可执行文件默认存放在 $GOPATH/bin 里面,所以需要把 $GOPATH/bin 添加到您的环境变量中。
myproject
├── conf
│ └── app.conf
├── controllers
│ └── default.go
├── main.go
├── models
├── routers
│ └── router.go
├── static
│ ├── css
│ ├── img
│ └── js
├── tests
│ └── default_test.go
└── views
└── index.tpl
apiproject
├── conf
│ └── app.conf
├── controllers
│ └── object.go
│ └── user.go
├── docs
│ └── doc.go
├── main.go
├── models
│ └── object.go
│ └── user.go
├── routers
│ └── router.go
└── tests
└── default_test.go
从上面的目录我们可以看到和 Web 项目相比,少了 static 和 views 目录;同时,该命令还支持一些自定义参数自动连接数据库创建相关 model 和 controller:
bee api [appname] [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
如果 conn 参数为空则创建一个示例项目,否则将基于链接信息链接数据库创建项目,能够在models文件夹下生成数据表对应的go文件,并简单实现了表的增删改查功能
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.10.0
2018/11/01 09:44:06 INFO ▶ 0001 Packaging application on '/root/go/src/ww'...
2018/11/01 09:44:06 INFO ▶ 0002 Building application...
2018/11/01 09:44:06 INFO ▶ 0003 Using: GOOS=linux GOARCH=amd64
2018/11/01 09:44:13 SUCCESS ▶ 0004 Build Successful!
2018/11/01 09:44:13 INFO ▶ 0005 Writing to output: /root/go/src/ww/ww.tar.gz
2018/11/01 09:44:13 INFO ▶ 0006 Excluding relpath prefix: .
2018/11/01 09:44:13 INFO ▶ 0007 Excluding relpath suffix: .go:.DS_Store:.tmp
2018/11/01 09:44:13 SUCCESS ▶ 0008 Application packed!
bee generate appcode [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-level=3]
generate appcode based on an existing database
-tables: a list of table names separated by ',', default is empty, indicating all tables
-driver: [mysql | postgres | sqlite], the default is mysql
-conn: the connection string used by the driver.
default for mysql: root:@tcp(127.0.0.1:3306)/test
default for postgres: postgres://postgres:[email protected]:5432/postgres
-level: [1 | 2 | 3], 1 = models; 2 = models,controllers; 3 = models,controllers,router
以上为提高效率所介绍的bee工具
下面这个示例程序将会在浏览器中打印 “Hello world”。
package main
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get() {
this.Ctx.WriteString("hello world")
}
func main() {
beego.Router("/", &MainController{})
beego.Run()
}
把上面的代码保存为 hello.go,然后通过命令行进行编译并执行:
$ go build -o hello hello.go
$ ./hello
通过这个地址浏览 http://127.0.0.1:8080 返回 “hello world”。
简要介绍代码功能:
beego 是一个典型的 MVC 架构,它的执行逻辑如下图所示
下面采用bee工具从头开始创建一个项目:
进入 $GOPATH/src 所在的目录:
[root@orbbec src]# bee new demo
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.10.0
2018/11/02 09:20:48 INFO ▶ 0001 Creating application...
create /root/go/src/demo/
create /root/go/src/demo/conf/
create /root/go/src/demo/controllers/
create /root/go/src/demo/models/
create /root/go/src/demo/routers/
create /root/go/src/demo/tests/
create /root/go/src/demo/static/
create /root/go/src/demo/static/js/
create /root/go/src/demo/static/css/
create /root/go/src/demo/static/img/
create /root/go/src/demo/views/
create /root/go/src/demo/conf/app.conf
create /root/go/src/demo/controllers/default.go
create /root/go/src/demo/views/index.tpl
create /root/go/src/demo/routers/router.go
create /root/go/src/demo/tests/default_test.go
create /root/go/src/demo/main.go
2018/11/02 09:20:48 SUCCESS ▶ 0002 New application successfully created!
目录结构如下:
├── conf
│ └── app.conf
├── controllers
│ └── default.go
├── main.go
├── models
├── routers
│ └── router.go
├── static
│ ├── css
│ ├── img
│ └── js
├── tests
│ └── default_test.go
└── views
└── index.tpl
从目录结构中我们也可以看出来这是一个典型的 MVC 架构的应用,main.go 是入口文件。
beego 项目创建之后,我们就开始运行项目,首先进入创建的项目,我们使用 bee run 来运行该项目,这样就可以做到热编译的效果:
[root@orbbec demo]# bee run demo
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.10.0
2018/11/02 09:26:27 INFO ▶ 0001 Using 'demo' as 'appname'
2018/11/02 09:26:27 INFO ▶ 0002 Initializing watcher...
2018/11/02 09:26:28 SUCCESS ▶ 0003 Built Successfully!
2018/11/02 09:26:28 INFO ▶ 0004 Restarting 'demo'...
2018/11/02 09:26:28 SUCCESS ▶ 0005 './demo' is running...
2018/11/02 09:26:28.611 [I] [asm_amd64.s:1333] http server Running on http://:9080
如果运行bee run 时提示端口被占用ListenAndServe: listen tcp :8080: bind: address already in use,可以在 conf/app.conf修改默认端口
访问http://localhost:9080可以看到效果图:
根据如下代码分析
package routers
import (
"demo/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
}
路由包里面我们看到执行了路由注册 beego.Router, 这个函数的功能是映射 URL 到 controller,第一个参数是 URL (用户请求的地址),这里我们注册的是 /,也就是我们访问的不带任何参数的 URL,第二个参数是对应的 Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑。
首先我们还是从源码分析入手:
package controllers
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get() {
this.Data["Website"] = "beego.me"
this.Data["Email"] = "[email protected]"
this.TplName = "index.tpl"
}
上面的代码显示首先声明了一个控制器 MainController,这个控制器里面内嵌了 beego.Controller,这就是 Go 的嵌入方式,也就是 MainController 自动拥有了所有 beego.Controller 的方法。
而 beego.Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。
beego.Controller并没有处理ControllerInterface接口定义的具体方法逻辑,所以需要通过重写这些方法获得具体的逻辑
通过bee generate appcode 创建好的数据表生成models处理代码,下面是一个简单示例:
[root@orbbec demo]# bee generate appcode -driver=mysql -conn="usename:password@tcp(127.0.0.1:3306)/children_song" -level=1
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.10.0
2018/11/02 10:13:05 INFO ▶ 0001 Using 'mysql' as 'SQLDriver'
2018/11/02 10:13:05 INFO ▶ 0002 Using 'root:1@tcp(127.0.0.1:3306)/children_song' as 'SQLConn'
2018/11/02 10:13:05 INFO ▶ 0003 Using '' as 'Tables'
2018/11/02 10:13:05 INFO ▶ 0004 Using '1' as 'Level'
2018/11/02 10:13:05 INFO ▶ 0005 Analyzing database tables...
2018/11/02 10:13:05 INFO ▶ 0006 Creating model files...
create /root/go/src/demo/models/listen_record.go
create /root/go/src/demo/models/migrations.go
create /root/go/src/demo/models/score.go
create /root/go/src/demo/models/user.go
2018/11/02 10:13:05 SUCCESS ▶ 0007 Appcode successfully generated!
在models文件夹下生成如下文件:
├── listen_record.go
├── migrations.go
├── score.go
└── user.go
简单分析listen_record.go ,生成了数据表增删改查的基本代码,具体函数代码已省略,相关函数功能说明在注释中体现
package models
import (
"errors"
"fmt"
"reflect"
"strings"
"time"
"github.com/astaxie/beego/orm"
)
type ListenRecord struct {
Id int `orm:"column(id);auto"`
UserId int `orm:"column(user_id)" description:"用户ID"`
SongId int `orm:"column(song_id)" description:"歌曲ID"`
Count int `orm:"column(count)" description:"点击值"`
CreateTime time.Time `orm:"column(create_time);type(datetime);null" description:"创建时间"`
UpdateTime time.Time `orm:"column(update_time);type(datetime);null" description:"更新时间"`
}
func (t *ListenRecord) TableName() string {
return "listen_record"
}
func init() {
orm.RegisterModel(new(ListenRecord))
}
// AddListenRecord将新的ListenRecord插入数据库并返回
// 最后插入Id成功.
func AddListenRecord(m *ListenRecord) (id int64, err error) {
o := orm.NewOrm()
id, err = o.Insert(m)
return
}
// GetListenRecordById通过Id检索ListenRecord。如果Id不存在返回错误
func GetListenRecordById(id int) (v *ListenRecord, err error) {
...
}
// GetAllListenRecord检索所有ListenRecord匹配的特定条件。如果不存在记录,则返回空列表
func GetAllListenRecord(query map[string]string, fields []string, sortby []string, order []string,
offset int64, limit int64) (ml []interface{}, err error) {
...
}
// UpdateListenRecord按Id更新ListenRecord,如果要更新的记录不存在,则返回错误
func UpdateListenRecordById(m *ListenRecord) (err error) {
...
}
// DeleteListenRecord按Id删除ListenRecord,如果
要删除的记录不存在,则返回错误
func DeleteListenRecord(id int) (err error) {
...
}
Beego
Welcome to Beego!
Beego is a simple & powerful Go web framework which is inspired by tornado and sinatra.
Official website: {{.Website}}
Contact me: {{.Email}}
在 Controller 里面把数据赋值给了 data(map 类型),然后我们在模板中就直接通过 key 访问 .Website 和 .Email 。这样就做到了数据的输出。
以上简单介绍了bee工具的使用,以提高开发效率,并根据beego的MVC架构简单介绍了beego的入门知识。