Beego框架

beego框架 #

beego框架了解 #

Beego框架是go语言开发的web框架。

beego是中国人开发的,开发文档比较详细

beego网址

MVC架构 #

Beego是MVC架构。MVC 是一种应用非常广泛的体系架构,几乎所有的编程语言都会使用到,而且所有的程序员在工作中都会遇到!用 MVC 的方式开发程序,可以让程序的结构更加合理和清晰。 我们画图说明

环境搭建 #

这里默认大家已经搭建好了go语言的开发环境。

  • 需要安装Beego
go get -u github.com/beego/bee/v2@master
go install github.com/beego/bee/v2@master  //上面没用就试试这个
  • 而后运行
bee version
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v2.0.2

├── Beego     : Beego is not installed. Please do consider installing it first: https://github.com/beego/beego/v2. If you are using go mod, and you don't install the beego under $GOPATH/src/github.com/beego, just ignore this.
├── GoVersion : go1.16
├── GOOS      : linux
├── GOARCH    : amd64
├── NumCPU    : 12
├── GOPATH    : /home/xxx/go
├── GOROOT    : /home/aaa/bbb/go
├── Compiler  : gc
└── Published : 2020-12-16
  • 创建项目
bee new hello //创建项目
cd hello
go mod tidy
bee run  //运行项目
2021/03/31 23:29:19 SUCCESS  ▶ 0004 Built Successfully!
2021/03/31 23:29:19 INFO     ▶ 0005 Restarting 'hello'...
2021/03/31 23:29:19 SUCCESS  ▶ 0006 './hello' is running...
2021/03/31 23:29:22.016 [I] [parser.go:413]  generate router from comments
2021/03/31 23:29:22.016 [I] [server.go:241]  http server Running on http://:8080

用bee运行项目,项目自带热更新(是现在后台程序常用的一种技术,即在服务器运行期间,可以不停服替换静态资源。替换go文件时会自动重新编译。)

安装好之后,运行bee new preojectName来创建一个项目,注意:通过bee创建的项目代码都是在$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

8 directories, 4 files

beego的项目结构分析 #

quickstart
|-- conf
|   `-- app.conf
|-- controllers
|   `-- default.go
|-- main.go
|-- models
|-- routers
|   `-- router.go
|-- static
|   |-- css
|   |-- img
|   `-- js
|-- tests
|   `-- default_test.go
|-- views
    `-- index.tpl

conf文件夹:放的是项目有关的配置文件

controllers:存放主要的业务代码

main.go:项目的入口文件

models:存放的是数据库有关内容

routers:存放路由文件,路由作用是根据不同的请求指定不同的控制器

static:存放静态资源,包括图片,html页面,css样式,js文件等

tests:测试文件

**views:**存放视图有关内容

Beego运行流程分析 #

  • 浏览器发出请求

  • 路由拿到请求,并给相应的请求指定相应的控制器

  • 找到指定的控制器之后,控制器看是否需要查询数据库

  • 如果需要查询数据库就找model取数据

  • 如果不需要数据库,直接找view要视图

  • 控制器拿到视图页面之后,把页面返回给浏览器

    根据文字流程分析代码流程

  • 从项目的入口main.go开始

  • 找到router.go文件的Init函数

  • 找到路由指定的控制器文件default.go的Get方法

  • 然后找到指定视图的语法,整个项目就串起来啦。

路由的简单设置 #

路由的作用:根据不同的请求指定不同的控制器

路由函数:beego.Router("/path",&controller.MainController{})

函数参数:

先分析一下Url地址由哪几部分组成? 同一资源定位符

http://192.168.110.71:8080/index

**http://地址:端口/资源路径 **

第一个参数:资源路径,也就是/后面的内容

第二个参数:需要指定的控制器指针

了解上面的内容之后我们来看几个简单的例子:

beego.Router("/", &controllers.MainController{})
beego.Router("/index", &controllers.IndexController{})
beego.Router("/login", &controllers.LoginController{})

高级路由设置 #

一般在开发过程中,我们基本不使用beego提供的默认请求访问方法,都是自定义相应的方法。那我们来看一下如何来自定义请求方法。

自定义请求方法需要用到Router的第三个参数。这个参数是用来给不同的请求指定不同的方法。具体有如下几种情况。

  • 一个请求访问一个方法(也是最常用的),请求和方法之间用 : 隔开,不同的请求用 ; 隔开:

    beego.Router("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")
    
  • 可以多个请求,访问一个方法 ,请求之间用,隔开,请求与方法之间用:隔开:

    beego.Router("/api",&RestController{},"get,post:ApiFunc")
    
  • 所有的请求访问同一个方法,用*号代表所有的请求,和方法之间用:隔开:

    beego.Router("/api/list",&RestController{},"*:ListFood")
    
  • 如果同时存在 * 和对应的 HTTP请求,那么优先执行 HTTP请求所对应的方法,例如同时注册了如下所示的路由:

    beego.Router("/simple",&SimpleController{},"*:AllFunc;post:PostFunc")
    

    那么当遇到Post请求的时候,执行PostFunc而不是AllFunc。

    如果用了自定义方法之后,默认请求将不能访问。

ORM框架 #

Beego中内嵌了ORM框架,用来操作数据库。我们用图来表示:

ORM初始化 #

  • 首先要导包

    import "github.com/astaxie/beego/orm"
    
  • 然后要定义一个结构体

    type User struct{
        Id int
        Name string
        PassWord string
    }
    

    思考:如果表名和字段名为小写会发生什么结果?

    注意观察数据库表中的字段和结构体中的字段是否一样?

  • 然后向数据库中注册表,这一步又分为三步:

    • 连接数据库

      用RegisterDataBase()函数,第一个参数为数据库别名,也可以理解为数据库的key值,项目中必须有且只能有一个别名为default的连接,第二个参数是数据库驱动,这里我们用的是MySQL数据库,所以以MySQL驱动为例,第三个参数是连接字符串,和传统操作数据库连接字符串一样,格式为:用户名:密码@tcp(ip:port)/数据库名称?编码方式,代码如下:

      orm.RegisterDataBase("default","mysql","root:123456@tcp(127.0.0.1:3306)/class1?charset=utf8")
      

      注意:ORM只能操作表,不能操作数据库,所以我们连接的数据库要提前在MySQL终端创建好。

    • 注册数据库表

      用orm.RegisterModel()函数,参数是结构体对象,如果有多个表,可以用 ,隔开,多new几个对象:

      orm.RegisterModel(new(User))
      
    • 生成表

      用orm.RunSyncdb()函数,这个函数有三个参数,

      第一个参数是数据库的别名和连接数据库的第一个参数相对应。

      第二个参数是是否强制更新,一般我们写的都是false,如果写true的话,每次项目编译一次数据库就会被清空一次,fasle的话会在数据库发生重大改变(比如添加字段)的时候更新数据库。

      第三个参数是用来说,生成表过程是否可见,如果我们写成课件,那么生成表的时候执行的SQL语句就会在终端看到。反之看不见。代码如下:

      orm.RunSyncdb("default",false,true)
      

完整代码如下:

import "github.com/astaxie/beego/orm"

type User struct {
	Id int
	Name string
	Passwd string
}

func init(){
	//1.连接数据库
	orm.RegisterDataBase("default","mysql","root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
	//2.注册表
	orm.RegisterModel(new(User))
	//3.生成表
	//1.数据库别名
	//2.是否强制更新
	//3.创建表过程是否可见
	orm.RunSyncdb("default",false,true)
}

因为这里我们把ORM初始化的代码放到了 models包的init()函数里面,所以如果我们想让他执行的话就需要在main.go里面加入这么一句代码:

import _ "classOne/models"

简单的ORM增删改查操作 #

在执行ORM的操作之前需要先把ORM包导入,但是GoLand会自动帮我们导包,也可以手动导包

import "github.com/astaxie/beego/orm"

插入

  • 先获取一个ORM对象,用orm.NewOrm()即可获得

    o := orm.NewOrm()
    
  • 定义一个要插入数据库的结构体对象

    var user User
    
  • 给定义的对象赋值

    user.Name = "itcast"
    user.Passwd = "heima"
    

    这里不用给Id赋值,因为建表的时候我们没有指定主键,ORM默认会以变量名为Id,类型为int的字段当主键,至于如何指定主键,我们明天详细介绍。

  • 执行插入操作,o.Insert()插入,参数是结构体对象,返回值是插入的id和错误信息。

    id, err := o.Insert(&user)
    if err == nil {
        fmt.Println(id)
    }
    

查询

  • 也是要先获得一个ORM对象

    o := orm.NewOrm()
    
  • 定义一个要获取数据的结构体对象

    var user User
    
  • 给结构体对象赋值,相当于给查询条件赋值

    user.Name = "itcast"
    
  • 查询,用o.Read(),第一个参数是对象地址,第二个参数是指定查询字段,返回值只有错误信息。

    err := o.Read(&user,"Name")
    if err != nil{
    		beego.Info("查询数据错误",err)
    		return
    	}
    

    如果查询字段是查询对象的主键的话,可以不用指定查询字段

更新

  • 一样的套路,先获得ORM对象

    o := orm.NewOrm()
    
  • 定义一个要更新的结构体对象

    var user User
    
  • 给结构体对象赋值,相当于给查询条件赋值

    user.Name = "itcast"
    
  • 查询要更新的对象是否存在

    err := o.Read(&user)
    if err != nil{
    	beego.Info("查询数据错误",err)
    	return
    }
    
  • 如果查找到了要更新的对象,就给这个对象赋新值

    user.Passwd = "itheima"
    
  • 执行更新操作,用o.Update()函数,参数是结构体对象指针,返回值是更新的条目数和错误信息

    count,err=o.Update(&user)
    if err != nil{
    	beego.Info("更新数据错误",err)
    	return
    }
    

删除

  • 同样的,获取ORM对象,获取要删除的对象

    o := orm.NewOrm()
    var user User
    
  • 给删除对象赋值,删除的对象主键必须有值,如果主键没值,就查询一下。我们这里直接给主键赋值。

    user.Id = 1
    
  • 执行删除操作,用的方法是o.Delete(),参数是删除的结构体对象,返回值是删除的条目数和错误信息

    num, err := o.Delete(&User{Id: 1})
    if err == nil {
        fmt.Println(num)
    }