beego快速入门

安装 您需要安装 Go 1.1+ 以确保所有功能的正常使用。
安装或者升级 Beego 和 Bee 的开发工具:

$ go get -u github.com/astaxie/beego $ go get -u github.com/beego/bee

bee工具使用 安装完之后,bee 可执行文件默认存放在 $GOPATH/bin 里面,所以需要把 $GOPATH/bin 添加到您的环境变量中。
  • new
    new 命令是新建一个 Web 项目,我们在命令行下执行 bee new <项目名> 就可以创建一个新的项目。但是注意该命令必须在 $GOPATH/src 下执行。最后会在 $GOPATH/src 相应目录下生成如下目录结构的项目:
myproject ├── conf │└── app.conf ├── controllers │└── default.go ├── main.go ├── models ├── routers │└── router.go ├── static │├── css │├── img │└── js ├── tests │└── default_test.go └── views └── index.tpl

  • api
    api 命令就是用来创建 API 应用,项目结构如下:
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文件,并简单实现了表的增删改查功能
  • run
    bee run 命令是监控 beego 的项目,该命令必须在 $GOPATH/src/appname 下执行。能够启动热编译。
  • pack
    pack 目录用来发布应用的时候打包,会把项目打包成tar.gz 包,这样我们部署的时候直接把打包之后的项目上传,解压就可以部署了。
______ | ___ \ | |_/ /______ | ___ \ / _ \ / _ \ | |_/ /|__/|__/ \____/\___| \___| 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!

  • generate
    bee generate appcode 可以在项目创建好之后根据level等级生成models,controllers,router代码
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:postgres@127.0.0.1:5432/postgres -level:[1 | 2 | 3], 1 = models; 2 = models,controllers; 3 = models,controllers,router

以上为提高效率所介绍的bee工具
简单示例 下面这个示例程序将会在浏览器中打印 “Hello world”。
package mainimport ( "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”。
简要介绍代码功能:
  1. 首先我们导入了包 github.com/astaxie/beego。 Go 语言里面被导入的包会按照深度优先的顺序去执行导入包的初始化(变量和 init 函数,更多详情),beego 包中会初始化一个 BeeAPP 的应用和一些参数。
  2. 定义 Controller,这里我们定义了一个 struct 为 MainController,充分利用了 Go 语言的组合的概念,匿名包含了 beego.Controller,这样我们的 MainController 就拥有了 beego.Controller 的所有方法。
  3. 定义 RESTful 方法,通过匿名组合之后,其实目前的 MainController 已经拥有了 Get、Post、Delete、Put 等方法,这些方法是分别用来对应用户请求的 Method 函数,如果用户发起的是 POST 请求,那么就执行 Post 函数。所以这里我们定义了 MainController 的 Get 方法用来重写继承的 Get 函数,这样当用户发起 GET 请求的时候就会执行该函数。
  4. 定义 main 函数,所有的 Go 应用程序和 C 语言一样都是 main 函数作为入口,所以我们这里定义了我们应用的入口。
  5. Router 注册路由,路由就是告诉 beego,当用户来请求的时候,该如何去调用相应的 Controller,这里我们注册了请求 / 的时候,请求到 MainController。这里我们需要知道,Router 函数的两个参数函数,第一个是路径,第二个是 Controller 的指针。
  6. Run 应用,最后一步就是把在步骤 1 中初始化的 BeeApp 开启起来,其实就是内部监听了 8080 端口:Go 默认情况会监听你本机所有的 IP 上面的 8080 端口。
beego 是一个典型的 MVC 架构,它的执行逻辑如下图所示
beego快速入门
文章图片

下面采用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可以看到效果图:
beego快速入门
文章图片

项目路由设置
根据如下代码分析
package routersimport ( "demo/controllers" "github.com/astaxie/beego" )func init() { beego.Router("/", &controllers.MainController{}) }

路由包里面我们看到执行了路由注册 beego.Router, 这个函数的功能是映射 URL 到 controller,第一个参数是 URL (用户请求的地址),这里我们注册的是 /,也就是我们访问的不带任何参数的 URL,第二个参数是对应的 Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑。
controller 逻辑
首先我们还是从源码分析入手:
package controllersimport ( "github.com/astaxie/beego" )type MainController struct { beego.Controller }func (this *MainController) Get() { this.Data["Website"] = "beego.me" this.Data["Email"] = "astaxie@gmail.com" this.TplName = "index.tpl" }

上面的代码显示首先声明了一个控制器 MainController,这个控制器里面内嵌了 beego.Controller,这就是 Go 的嵌入方式,也就是 MainController 自动拥有了所有 beego.Controller 的方法。
而 beego.Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。
beego.Controller并没有处理ControllerInterface接口定义的具体方法逻辑,所以需要通过重写这些方法获得具体的逻辑
model 分析
通过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 modelsimport ( "errors" "fmt" "reflect" "strings" "time""github.com/astaxie/beego/orm" )type ListenRecord struct { Idint`orm:"column(id); auto"` UserIdint`orm:"column(user_id)" description:"用户ID"` SongIdint`orm:"column(song_id)" description:"歌曲ID"` Countint`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) { ... }

view 渲染
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 。这样就做到了数据的输出。
【beego快速入门】以上简单介绍了bee工具的使用,以提高开发效率,并根据beego的MVC架构简单介绍了beego的入门知识。

    推荐阅读