Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

My Blog

从此烟雨落金城,一人撑伞两人行。

Beego 框架

1.beego框架 工作流程

beego框架是一个使用Go语言快速开发API、Web及后端服务等各种应用的MVC框架。
beego是一个完整的MVC框架,包括controller、model以及view等MVC必备模板。

50dd6b9c63995eae9dfe5785512f0c71

  • HTTP请求从main函数进入框架

  • 解析url路由,确定执行那个控制器

  • 执行前请求过滤器

  • 执行控制器

  • 执行请求后的过滤器

  • 输出结果

2.beego框架 安装

  • 设置代理

    1
    2
    $ go env -w GO111MODULE=on
    $ go env -w GOPROXY=https://goproxy.cn,direct
  • 安装beego和bee(项目工具)

    1
    $ go get github.com/beego/beego
  • 使用bee创建项目

    1
    bee new 项目名称
  • 项目结构

    image-20220913170626595

  • 运行项目

    1
    bee run 

3.框架使用

使用beego开发go语言项目,需要编写控制器、业务模型以及view等模块。

  • 控制器controller

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 定义一个控制器结构体
    // 一般一个模块定义一个控制器
    type MainController struct {
    beego.Controller
    }
    // 覆盖beego.Controller的Get方法,用于处理 RESTful 请求中的 get 请求
    // beego.Controller 默认支持多种 RESTful方法,例如:Post、Put、Delete等
    func (c *MainController) Get() {
    // Data是继承过来的属性,是 map 类型,可以保存任意类型数据,主要用于保存请求响应数据
    c.Data["Website"] = ""
    c.Data["Email"] = ""
    // 设置需要渲染的模板文件,框架会去 views 目录查找这个模板文件
    c.TplName = "index.html"
    }
  • 设置路由Url

    1
    2
    3
    4
    5
    6
    func init() {
    // 使用 beego.Router 函数,注册路由规则。
    // 第一个参数是url路由,第二个参数是控制器
    // 这里的意思就是将访问 / 这个url的请求,交给controllers.MainController控制器处理。
    beego.Router("/", &controllers.MainController{})
    }

路由规则说明:

​ 只是定义了Url 由哪个控制器执行,但是没有说明 Url 请求由控制器的那个函数执行,一个控制器可以包含多个函数。

  • 编写model业务逻辑

    • 定义表结构

      1
      2
      3
      4
      5
      6
      CREATE TABLE `users` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
      `username` varchar(30) NOT NULL COMMENT '账号',
      `password` varchar(100) NOT NULL COMMENT '密码',
      PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    • 初始化数据库连接

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      package main

      import (
      _ "codebaoku/routers"

      "github.com/astaxie/beego"
      "github.com/astaxie/beego/orm"
      _ "github.com/go-sql-driver/mysql"
      )

      func init() {
      // 这里注册一个default默认数据库,数据库驱动是mysql.
      // 第三个参数是数据库dsn, 配置数据库的账号密码,数据库名等参数
      // dsn参数说明:
      // username - mysql账号
      // password - mysql密码
      // db_name - 数据库名
      // 127.0.0.1:3306 - 数据库的地址和端口
      orm.RegisterDataBase("default", "mysql", "username:password@tcp(主机IP:端口号)/db_name?charset=utf8")
      }
      func main() {
      beego.Run()
      }
    • 创建model

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      // 定义User模型,绑定users表结构, 其实就是用来保存sql查询结果。
      type User struct {
      Id int
      Username string
      Password string
      }
      // 定义User 模型绑定那个表?
      func (u *User) TableName() string {
      // 返回mysql表名
      return "users"
      }
      //初始化函数,可以用来向orm注册model
      func init() {
      // 向orm注册user模型
      orm.RegisterModel(&User{})
      }
      //初始化函数,可以用来向orm注册model
      func init() {
      // 向orm注册user模型
      orm.RegisterModel(&User{})
      }

      // 根据id查询用户信息
      func GetUserById(id int) *User {
      if id == 0 {
      return nil
      }

      // 创建orm对象, 后面都是通过orm对象操作数据库
      o := orm.NewOrm()

      // 初始化一个User模型对象
      user := User{}
      // 设置查询参数
      user.Id = id

      // 调用Read方法,根据user设置的参数,查询一条记录,结果保存到user结构体变量中
      // 默认是根据主键进行查询
      // 等价sql: SELECT `id`, `username`, `password` FROM `users` WHERE `id` = 1
      err := o.Read(&user)

      // 检测查询结果,
      if err == orm.ErrNoRows {
      // 找不到记录
      return nil
      } else if err == orm.ErrMissPK {
      // 找不到住建
      return nil
      }

      return &user
      }

    • 控制器调用model

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      func (c *MainController) Get() {
      c.Data["Website"] = "codebaoku.com"
      c.Data["Email"] = "go@codebaoku.com"

      // 调用model,查询用户id为1 的用户信息
      user := models.GetUserById(1)

      // 然后将user数据保存到Data中, 将参数传给后面的 views 视图模板处理
      c.Data["user"] = user

      // 使用新的视图模板user.tpl
      c.TplName = "user.tpl"
      }
    • 编写view视图

    • 项目打包

      使用 bee 工具打包,bee 工具可以一键将项目需要的相关文件一起打包成一个压缩包,只需要到线上解压即可。

      1
      bee pack

参数配置

beego 默认使用了 INI 格式解析配置文件,通常在项目中会存在很多系统参数、业务参数配置,这些参数通常都是通过配置文件进行配置,而且不是写死在代码里面。

提示:修改配置文件后,需要重启应用,配置才生效,即使使用bee run运行项目也得重启。

  1. 系统参数

    1
    2
    3
    4
    5
    6
    7
    # 这是注释
    #应用名称
    appname = codebaoku
    #http 服务端口
    httpport = 8080
    #运行模式,常用的运行模式有dev, test, prod
    runmode = dev
    参数名 默认值 说明
    AppName beego 应用名
    RunMode dev 程序运行模式,常用模式有dev、test、prod,一般用于区分不同的运行环境
    RouterCaseSensitive true 是否路由忽略大小写匹配
    ServerName beego beego 服务器默认在请求的时候输出 server 头的值。
    RecoverPanic true 是否异常恢复,默认值为 true,即当应用出现异常的情况,通过 recover 恢复回来,而不会导致应用异常退出。
    EnableGzip false 是否开启 gzip 支持
    MaxMemory 64M 文件上传默认内存缓存大小,单位是字节
    AutoRender true 是否模板自动渲染,对于 API 类型的应用,应用需要把该选项设置为 false,不需要渲染模板。
    StaticDir static 静态文件目录设置
    ViewsPath views 模板路径
    Graceful false 是否开启热升级,默认是 false,关闭热升级。
    ServerTimeOut 0 设置 HTTP 的超时时间,默认是 0,不超时。
    HTTPAddr 应用监听地址,默认为空,监听所有的网卡 IP。
    HTTPPort 8080 应用监听端口
    EnableHTTPS false 是否启用 HTTPS,默认是 false 关闭。当需要启用时,先设置 EnableHTTPS = true,并设置 HTTPSCertFile 和 HTTPSKeyFile
    HTTPSAddr https应用监听地址,默认为空,监听所有的网卡 IP。
    HTTPSPort 10443 https应用监听端口
    HTTPSCertFile 开启 HTTPS 后,ssl 证书路径
    HTTPSKeyFile 开启 HTTPS 之后,SSL 证书 keyfile 的路径。
    EnableAdmin false 是否开启进程内监控模块,默认 false 关闭。
    AdminAddr localhost 监控程序监听的地址。
    AdminPort 8088 监控程序监听的地址。
    SessionOn false session 是否开启
    SessionProvider memory session 的引擎, 详情参考session章节的教程
    SessionName beegosessionID 存在客户端的 cookie 名称。
    SessionGCMaxLifetime 3600 session 过期时间, 单位秒。
    SessionProviderConfig 配置信息,根据不同的session引擎设置不同的配置信息,详细的配置请参考session章节的教程
    SessionCookieLifeTime 3600 session 默认存在客户端的 cookie 的时间, 单位秒。
    SessionDomain session cookie 存储域名。
  2. 自定义参数

    可以自定义配置,然后通过beego.AppConfig对象的函数读取配置。

    1
    2
    3
    4
    5
    # 下面是关于mysql数据库的配置参数
    mysql_user = "root"
    mysql_password = "123456"
    mysql_host = "127.0.0.1:3306"
    mysql_dbname = "codebaoku"

    读取配置代码:

    1
    2
    3
    4
    beego.AppConfig.String("mysql_user")
    beego.AppConfig.String("mysql_password")
    beego.AppConfig.String("mysql_host")
    beego.AppConfig.String("mysql_dbname")

评论