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:[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”。
简要介绍代码功能:

  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快速入门_第1张图片
下面采用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快速入门_第2张图片

项目路由设置

根据如下代码分析

package routers

import (
    "demo/controllers"
    "github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{})
}

路由包里面我们看到执行了路由注册 beego.Router, 这个函数的功能是映射 URL 到 controller,第一个参数是 URL (用户请求的地址),这里我们注册的是 /,也就是我们访问的不带任何参数的 URL,第二个参数是对应的 Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑。

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接口定义的具体方法逻辑,所以需要通过重写这些方法获得具体的逻辑

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 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) {
       ...
}

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 。这样就做到了数据的输出。


以上简单介绍了bee工具的使用,以提高开发效率,并根据beego的MVC架构简单介绍了beego的入门知识。

你可能感兴趣的:(beego快速入门)