Beego笔记
以下beego3基于go v1.8+,bee v2.0+,开发工具是goland2022.1
一、Beego安装
1、安装beego和bee
go get github.com/beego/beego(依赖go.mod文件1)
,可能会在goland里面无法使用。
1 2 3 | go get github.com/beego/beego/v2 go get github.com/beego/bee/v2 |
注意:
go get只能下载普通的包,如果下载安装程序需要用go install
1 2 3 | go install github.com/beego/beego/v2 go install github.com/beego/bee/v2 |
安装完之后,bee
可执行文件默认存放在 $GOPATH/bin
里面,所以您需要把 $GOPATH/bin
添加到您的环境变量中,才可以进行下一步。如果你本机设置了 GOBIN
,那么上面的bee
命令就会安装到 GOBIN
目录下。
注意:
如果没有bee命令4:
可以进行进入下载的bee工具源码目录(如:D:\GOPATH\pkg\mod\github.com\beego\bee\v2@v2.0.2):
执行 go build 会生成bee.exe文件,然后将bee.exe拷贝被go的安装目录的bin下。
2)使用goland开发工具:
可以通过以下方法来配置在goland里面使用2:
- 通过goland开发工具打开创建的项目,基于modules管理项目依赖 配置
GOPROXY=https://goproxy.cn,direct
- 执行go mod init projectname生成依赖管理文件go.mod(如果已存在,则省略)(beego 项目创建之后,我们还需要初始化
go.mod
文件。进入目录之后,使用go mod init
初始化模块依赖。) - 执行go mod vendor将依赖包生成到本地
2、bee工具命令
1)bee new
new
命令是新建一个 Web 项目,我们在命令行下执行 bee new <项目名>
就可以创建一个新的项目。但是注意该命令必须在 $GOPATH/src
下执行。在%GOPATH%/src目录下创建一个测试项目,并启动,浏览器输入http://localhost:8080/就可以创建的项目信息
1 2 3 4 | cd %GOPATH%/src bee new hello cd hello bee run hello |
2)bee generate5
这个命令是用来自动化的生成代码的,包含了从数据库一键生成 model,还包含了 scaffold 的,通过这个命令(有多种形式):
bee generate scaffold [scaffoldname] [-fields=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
或者bee generate appcode [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-level=3]让大家开发代码不再慢。
1 | bee generate scaffold user -fields= "id:int64,name:string,gender:int,age:int" -driver=mysql -conn= "root:@tcp(127.0.0.1:3306)/beego" |
3)bee api
上面的 new
命令是用来新建 Web 项目,不过很多用户使用 beego 来开发 API 应用。所以这个 api
命令就是用来创建 API 应用的。
我们可以看到和 Web 项目相比,少了 static 和 views 目录,多了一个 test 模块,用来做单元测试的。
同时,该命令还支持一些自定义参数自动连接数据库创建相关 model 和 controller: bee api [appname] [-tables=""] [-driver=mysql] [-conn="root:<password>@tcp(127.0.0.1:3306)/test"]
如果 conn 参数为空则创建一个示例项目,否则将基于链接信息链接数据库创建项目。
4)bee run
我们在开发 Go 项目的时候最大的问题是经常需要自己手动去编译再运行,bee run
命令是监控 beego 的项目,通过 fsnotify监控文件系统。但是注意该命令必须在 $GOPATH/src/appname
下执行。
5)bee pack
pack
目录用来发布应用的时候打包,会把项目打包成 zip 包,这样我们部署的时候直接把打包之后的项目上传,解压就可以部署了。
6)bee migrate
这个命令是应用的数据库迁移命令,主要是用来每次应用升级,降级的SQL管理。如:bee migrate [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
二、Beego的MVC架构-Controller
C:Controller,体现为各种功能具有以下特性:
(1)路由功能(2)控制器函数(3)CSRF(Cross-Site request forgery)过滤器(4)Session(5)错误处理&日志功能
1、参数配置
todo
2、路由设置
1)基础路由
从 beego 1.2 版本开始支持了基本的 RESTful 函数式路由,应用中的大多数路由都会定义在 routers/router.go
文件中。最简单的 beego 路由由 URI 和闭包函数组成。
(1)基本 GET 路由
1 2 3 | web.Get( "/" , func (ctx *context.Context){ ctx.Output.Body([]byte( "hello world" )) }) |
(2)基本 POST 路由
1 2 3 | web.Post( "/alice" , func (ctx *context.Context){ ctx.Output.Body([]byte( "bob" )) }) |
(3)注册一个可以响应任何 HTTP 的路由
1 2 3 | web.Any( "/foo" , func (ctx *context.Context){ ctx.Output.Body([]byte( "bar" )) }) |
2)Beego的RESTFUL路由
在介绍这三种 beego 的路由实现之前先介绍 RESTful,我们知道 RESTful 是一种目前 API 开发中广泛采用的形式,beego 默认就是支持这样的请求方法,也就是用户 Get 请求就执行 Get 方法,Post 请求就执行 Post 方法。因此默认的路由是这样 RESTful 的请求方式。
3)Beego的正则路由
为了用户更加方便的路由设置,beego 参考了 sinatra 的路由实现,支持多种方式的路由:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package main import ( "fmt" "github.com/beego/beego" ) type RegExpController struct { beego.Controller } func (this *RegExpController) Get() { this.Ctx.WriteString(fmt.Sprintln( "test get" )) id := this.Ctx.Input.Param( ":id" ) this.Ctx.WriteString(fmt.Sprintf( "id is :%s\n" , id)) } func main() { //正则路由,从路径中提取参数,对于URL”/re1/123”可以匹配成功,此时变量”:id”值为”123”,URL”/re1/“可正常匹配 beego.Router( "/re1/?:id" , &RegExpController{}) //正则路由,从路径中提取参数,对于URL”/re2/123”可以匹配成功,此时变量”:id”值为”123”,但URL”/re2/“匹配失败 beego.Router( "/re2/:id" , &RegExpController{})beego.Run( "127.0.0.1:80" ) } |
4)固定路由
固定路由也就是全匹配的路由,如下所示:
1 2 3 4 | web.Router( "/" , &controllers.MainController{}) web.Router( "/admin" , &admin.UserController{}) web.Router( "/admin/index" , &admin.ArticleController{}) web.Router( "/admin/addpkg" , &admin.AddController{}) |
如上所示的路由就是我们最常用的路由方式,一个固定的路由,一个控制器,然后根据用户请求方法不同请求控制器中对应的方法,典型的 RESTful 方式。
5)自定义方法及 RESTful 规则
(1)基本介绍
上面列举的是默认的请求方法名(请求的 method 和函数名一致,例如 GET
请求执行 Get
函数,POST
请求执行 Post
函数),如果用户期望自定义函数名,那么可以使用如下方式:
1 | web.Router( "/" ,&IndexController{}, "*:Index" ) |
使用第三个参数,第三个参数就是用来设置对应 method 到函数名,定义如下:
*
表示任意的 method 都执行该函数- 使用 httpmethod:funcname 格式来展示
1 2 3 4 | web.Router( "/api/food" ,&RestController{}, "get:ListFood" ) web.Router( "/api/food" ,&RestController{}, "post:CreateFood" ) web.Router( "/api/food" ,&RestController{}, "put:UpdateFood" ) web.Router( "/api/food" ,&RestController{}, "delete:DeleteFood" ) |
- 多个不同的 method 对应不同的函数使用
;
分割
1 | web.Router( "/api/food" ,&RestController{}, "get:ListFood;post:CreateFood;put:UpdateFood;delete:DeleteFood" ) |
- 多个 method 对应同一个 funcname,method 之间通过
,
来分割
1 | web.Router( "/api" ,&RestController{}, "get,post:ApiFunc" ) |
(2)可用的 HTTP Method:
- *: 包含以下所有的函数
- get: GET 请求
- post: POST 请求
- put: PUT 请求
- delete: DELETE 请求
- patch: PATCH 请求
- options: OPTIONS 请求
- head: HEAD 请求
如果同时存在 * 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法,例如同时注册了如下所示的路由:
1 | web.Router( "/simple" ,&SimpleController{}, "*:AllFunc;post:PostFunc" ) |
那么执行 POST
请求的时候,执行 PostFunc
而不执行 AllFunc
。
注意:
自定义函数的路由默认不支持 RESTful 的方法,也就是如果你设置了 web.Router("/api",&RestController{},"post:ApiFunc")
这样的路由,如果请求的方法是 POST
,那么不会默认去执行 Post
函数。
6)注解路由
从2.0开始,我们使用配置CommentRouterPath
来配置注解路由的扫描路径。在dev
环境下,我们将自动扫描该配置指向的目录及其子目录,生成路由文件。
生成之后,用户需要显示 Include 相应地 controller。注意, controller 的 method 方法上面须有 router 注释(// @router),详细的使用请看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // CMS API type CMSController struct { web.Controller } func (c *CMSController) URLMapping() { c.Mapping( "StaticBlock" , c.StaticBlock) c.Mapping( "AllBlock" , c.AllBlock) } // @router /staticblock/:key [get] func (this *CMSController) StaticBlock() { } // @router /all/:key [get] func (this *CMSController) AllBlock() { } |
可以在 router.go
中通过如下方式注册路由:
1 | web.Include(&CMSController{}) |
web 自动会进行源码分析,注意只会在 dev 模式下进行生成,生成的路由放在 “/routers/commentsRouter.go” 文件中。
这样上面的路由就支持了如下的路由:
- GET /staticblock/:key
- GET /all/:key
其实效果和自己通过 Router 函数注册是一样的:
1 2 | web.Router( "/staticblock/:key" , &CMSController{}, "get:StaticBlock" ) web.Router( "/all/:key" , &CMSController{}, "get:AllBlock" ) |
同时大家注意到新版本里面增加了 URLMapping 这个函数,这是新增加的函数,用户如果没有进行注册,那么就会通过反射来执行对应的函数,如果注册了就会通过 interface 来进行执行函数,性能上面会提升很多。
3、控制器参数
基于 beego 的 Controller 设计,只需要匿名组合 beego.Controller
就可以了,如下所示:
1 2 3 4 5 6 7 | package your_package import ( "github.com/beego/beego/v2/server/web" ) type xxxController struct { web.Controller } |
1)控制器方法
web.Controller
实现了接口 web.ControllerInterface
,web.ControllerInterface
定义了如下函数(未全部列出):-
Init(ctx *context.Context, controllerName, actionName string, app interface{})
这个函数主要初始化了 Context、相应的 Controller 名称,模板名,初始化模板参数的容器 Data,app 即为当前执行的 Controller 的 reflecttype,这个 app 可以用来执行子类的方法。
-
Prepare()
这个函数主要是为了用户扩展用的,这个函数会在下面定义的这些 Method 方法之前执行,用户可以重写这个函数实现类似用户验证之类。
-
Get()
如果用户请求的 HTTP Method 是 GET,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Get 请求。
-
Post()
如果用户请求的 HTTP Method 是 POST,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Post 请求。
-
Delete()
如果用户请求的 HTTP Method 是 DELETE,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Delete 请求。
-
Put()
如果用户请求的 HTTP Method 是 PUT,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Put 请求.
2)子类扩展
通过子 struct 的方法重写,用户就可以实现自己的逻辑,接下来我们看一个实际的例子:
1 2 3 4 5 6 7 8 9 10 | type AddController struct { web.Controller } func (this *AddController) Prepare() { } func (this *AddController) Get() { this.Data[ "content" ] = "value" this.Layout = "admin/layout.html" this.TplName = "admin/add.tpl" } |
3)提前终止运行
StopRun
来终止执行逻辑,可以在任意的地方执行。1 2 3 4 5 6 7 8 | type RController struct { beego.Controller } func (this *RController) Prepare() { this.Data[ "json" ] = map [string] interface {}{ "name" : "astaxie" } this.ServeJSON() this.StopRun() } |
注意:
调用 StopRun 之后,如果你还定义了 Finish 函数就不会再执行,如果需要释放资源,那么请自己在调用 StopRun 之前手工调用 Finish 函数。
三、Beego的MVC架构-Model
M:Model,即Beego ORM,对象关系映射,以及对象的持久化
(1)特性:支持Go的所有类型存储;更简单的CRUD的风格;完整实现健壮稳定的ORM。(2)支持的数据库:MySQL、PostgreSQL,Sqlite3
1、概述
1)安装ORM
1 | go get github.com/beego/beego/v2/client/orm |
2)已支持数据库驱动
- MySQL:github.com/go-sql-driver/mysql
- PostgreSQL:github.com/lib/pq
- Sqlite3:github.com/mattn/go-sqlite3
3)快速入门
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 | package main import ( "fmt" "github.com/beego/beego/v2/client/orm" _ "github.com/go-sql-driver/mysql" // import your used driver ) // Model Struct type User struct { Id int Name string `orm: "size(100)" ` } func init() { // set default database orm.RegisterDataBase( "default" , "mysql" , "username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8&loc=Local" , 30) // register model orm.RegisterModel(new(User)) // create table orm.RunSyncdb( "default" , false, true) } func main() { o := orm.NewOrm() user := User{Name: "slene" } // insert id, err := o.Insert(&user) fmt.Printf( "ID: %d, ERR: %v\n" , id, err) // update user.Name = "astaxie" num, err := o.Update(&user) fmt.Printf( "NUM: %d, ERR: %v\n" , num, err) // read one u := User{Id: user.Id} err = o.Read(&u) fmt.Printf( "ERR: %v\n" , err) // delete num, err = o.Delete(&u) fmt.Printf( "NUM: %d, ERR: %v\n" , num, err) } |
2、ORM使用方法
1)models.go
2)main.go
3)todo
3、数据库的设置
1)todo
2)todo
3)todo
4、注册模型
1)todo
2)todo
3)todo
5、ORM接口使用
1)todo
2)todo
3)todo
四、Beego的MVC架构-View
V:View,体现为模板,Beego通过处理模板和渲染模板展现视图。
(1)静态文件处理(2)模板处理(3)模板分页处理
五、beego 的模块设计
如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨小小打赏一下吧,如果囊中羞涩,不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南