【笔记】Beego学习笔记

前言

Beego学习笔记

下载依赖

1
go get github.com/astaxie/beego

引入依赖

1
import "github.com/astaxie/beego"

启动服务

  1. 解析配置文件
  2. 检查是否开启Session
  3. 是否预编译HTML模板文件,将HTML模板文件预编译并以Map结构存储到内存中
  4. 监听端口,启动服务
1
beego.Run(":8080")

命令行工具

安装

1
go install github.com/beego/bee/v2@master

创建项目

创建Web项目

<project_name>:项目名

1
2
bee new <project_name>
cd <project_name>

创建API项目

1
2
bee api <project_name>
cd <project_name>

运行项目

1
bee run

打包项目

1
bee pack

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+ conf // 存放配置文件
- app.conf // 核心配置文件
+ controllers // 存放控制器
+ models // 存放实体
+ routers // 存放路由
- router.go // 核心路由文件
+ static // 存放静态资源
+ css // 存放CSS文件
+ img // 存放图片
+ js // 存放JS文件
+ tests // 存放测试文件
- default_test.go // 默认测试文件
+ views // 存放HTML模板
- index.tpl // 默认HTML模板
- go.mod
- main.go

配置文件

修改端口号

conf/app.conf
1
httpport = 8080

读取配置文件

1
beego.AppConfig.String("key")

路由

基础路由

routers/router.go
1
2
3
4
5
6
7
8
9
10
11
12
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Get("/", func(context *context.Context) {})

beego.Post("/", func(context *context.Context) {})
}

固定路由

routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/", &controllers.MainController{})
}
  • 匹配对应请求方法的函数进行处理
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Get() {
...
}

func (c *MainController) Post() {
...
}

正则路由

匹配所有子路由

routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/*", &controllers.MainController{})
}
  • 匹配对应请求方法的函数进行处理
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Get() {
...
}

func (c *MainController) Post() {
...
}
匹配文件
routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/*.*", &controllers.MainController{})
}
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Get() {
// 获取path参数
c.Ctx.Input.Param(":path")
// 获取扩展名
c.Ctx.Input.Param(":ext")
}

匹配path参数

routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/:id", &controllers.MainController{})
}
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Get() {
// 获取path参数
c.Ctx.Input.Param(":id")
}
为参数指定正则表达式

[0-9]+:正则表达式

routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/:id([0-9]+)", &controllers.MainController{})
}
为参数指定数据类型
匹配整型型参数
routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

func init() {
beego.Router("/:id:int", &controllers.MainController{})
}
匹配字符串型参数
routers/router.go
1
2
3
4
5
6
7
8
9
10
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

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

自定义路由

routers/router.go
1
2
3
4
5
6
7
8
9
10
11
12
package routers

import (
"demo-beego-3/controllers"
beego "github.com/beego/beego/v2/server/web"
)

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

beego.Router("/", &controllers.MainController{}, "POST:Insert")
}
  • 匹配指定的函数进行处理
controllers/main_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package controllers

import (
beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
beego.Controller
}

func (c *MainController) Select() {
...
}

func (c *MainController) Insert() {
...
}

Controller

  • 继承beego.Controller
1
2
3
type MainController struct {
beego.Controller
}

接收请求

获取请求参数

Get前缀函数

  • Get前缀函数会优先从query获取请求参数,然后从form获取请求参数,如果同时定义,form请求参数值会覆盖query请求参数值
将参数值转换为字符串
1
2
3
func (c *MainController) Get() {
c.GetString("key")
}
将参数值转换为字符串切片
1
2
3
func (c *MainController) Get() {
c.GetStrings("key")
}
将参数值转换为整型
1
2
3
func (c *MainController) Get() {
c.GetInt("key")
}
1
2
3
func (c *MainController) Get() {
c.GetInt8("key")
}
1
2
3
func (c *MainController) Get() {
c.GetUint8("key")
}
1
2
3
func (c *MainController) Get() {
c.GetInt16("key")
}
1
2
3
func (c *MainController) Get() {
c.GetUint16("key")
}
1
2
3
func (c *MainController) Get() {
c.GetInt32("key")
}
1
2
3
func (c *MainController) Get() {
c.GetUint32("key")
}
1
2
3
func (c *MainController) Get() {
c.GetInt64("key")
}
1
2
3
func (c *MainController) Get() {
c.GetUint64("key")
}
将参数值转换为浮点型
1
2
3
func (c *MainController) Get() {
c.GetFloat("key")
}
将参数值转换为布尔型
1
2
3
func (c *MainController) Get() {
c.GetBool("key")
}

Bind前缀函数

  • Bind前缀函数会将请求参数转换为结构体变量
定义结构体
1
2
type User struct {}
var user = User{}
自动反序列化
  • 根据请求头中的Content-Type自动反序列化
1
2
3
func (c *MainController) Get() {
c.Bind(&user)
}
通过JSON反序列化
1
2
3
func (c *MainController) Get() {
c.BindJSON(&user)
}
通过Form表单反序列化
1
2
3
func (c *MainController) Get() {
c.BindForm(&user)
}
通过YAML反序列化
1
2
3
func (c *MainController) Get() {
c.BindYAML(&user)
}
通过XML反序列化
1
2
3
func (c *MainController) Get() {
c.BindXML(&user)
}
通过Protobuf反序列化
1
2
3
func (c *MainController) Get() {
c.BindProtobuf(&user)
}

获取文件

1
2
3
4
func (c *MainController) Get() {
file, header, err := c.GetFile("key")
defer file.Close()
}

直接保存文件

1
2
3
4
5
func (c *MainController) Get() {
file, header, err := c.GetFile("key")
defer file.Close()
c.SaveToFile("key", "static/upload/" + h.Filename)
}

再次打开文件

1
2
3
4
5
6
7
func (c *MainController) Get() {
file, header, err := c.GetFile("key")
file.Close()
file.Seek(0, 0)
defer file.Close()
c.SaveToFile("key", "static/upload/" + h.Filename)
}

返回响应

响应文本内容

1
2
3
4
5
6
7
func (c *MainController) Get() {
// 定义相应头
c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/plain; charset=utf-8")

// 发送给客户端
c.Ctx.WriteString("文本内容")
}

响应JSON格式字符串

1
2
3
4
5
6
7
func (c *MainController) Get() {
// 定义JSON数据
c.Data["json"] = map[string]interface{}{}

// 发送给客户端
c.ServeJSON()
}

响应HTML文件

index.html
1
2
3
4
5
6
7
8
9
10
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文本内容</title>
</head>
<body>

</body>
</html>
1
2
3
func (c *MainController) Get() {
c.TplName = "index.html"
}

响应HTML模板

1
2
3
4
5
6
7
8
9
10
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{.key}}</title>
</head>
<body>

</body>
</html>
1
2
3
4
5
6
7
func (c *MainController) Get() {
// 定义模板数据
c.Data["key"] = "value"

// 发送给客户端
c.TplName = "index.tpl"
}

请求重定向

1
2
3
func (c *MainController) Get() {
c.Redirect("/", 302)
}

设置Cookie

1
context.SetCookie("key", "value")

maxAge:过期时间,单位为秒,默认为-1,表示不过期
path:Cookie的路径,默认为”/“
domain:Cookie的域名,默认为空字符串
secure:是否只允许HTTPS请求,默认为false
httpOnly:是否只允许HTTP请求,默认为false
sameSite:Cookie的SameSite属性,默认为SameSiteNone

1
context.SetCookie("key", "value", maxAge, path, domain, secure, httpOnly, sameSite)

获取Cookie

1
context.GetCookie("key")

加密Cookie

添加Cookie

1
context.SetSecureCookie("key", "value")

maxAge:过期时间,单位为秒,默认为-1,表示不过期
path:Cookie的路径,默认为”/“
domain:Cookie的域名,默认为空字符串
secure:是否只允许HTTPS请求,默认为false
httpOnly:是否只允许HTTP请求,默认为false
sameSite:Cookie的SameSite属性,默认为SameSiteNone

1
context.SetSecureCookie("key", "value", maxAge, path, domain, secure, httpOnly, sameSite)

获取Cookie

1
context.GetSecureCookie("key")

Session

配置Session

  • 可以使用代码或配置文件配置Session,使用一种方式即可

启用Session

conf/app.conf
1
sessionon = true
main.go
1
beego.BConfig.WebConfig.Session.SessionOn = true

Session数据存储方式

memory:缺省值,使用内存存储Session数据
file:使用文件存储Session数据

conf/app.conf
1
sessionprovider = "memory"
1
beego.BConfig.WebConfig.Session.SessionProvider = "memory"

Session数据存储路径

  • 如果使用文件存储Session数据,可以配置Session数据存储路径
conf/app.conf
1
sessionproviderconfig = "./tmp/"

Session的Cookie名称

conf/app.conf
1
sessionname = ""

Session过期时间

conf/app.conf
1
sessiongcmaxlifetime = 3600

Session的Cookie过期时间

3600:缺省值,单位秒

conf/app.conf
1
sessioncookielifetime = 3600

添加Session

1
c.SetSession("key", "value")

删除Session

1
c.DelSession("key")

获取Session

1
var value = c.GetSession("key")

HTTP模板

条件语句

1
2
3
{{if .key}}
...
{{end}}

日志

  • 日志中可以在字符串中定义%占位符

调试

1
logs.Debug("")

信息

1
logs.Info("")

警告

1
logs.Warn("")

错误

1
logs.Error("")

严重错误

1
logs.Critical("")

完成

参考文献

beegodoc
哔哩哔哩——千锋Go语言学习营