Go语言Beego框架详细教程
Beego是一个全栈MVC框架,用于快速开发Go语言Web应用程序。它集成了多种功能模块,包括ORM、缓存、日志、配置管理等,适合构建各种规模的Web应用。
目录
- 安装与设置
- 项目结构
- 路由与控制器
- 模型与ORM
- 视图与模板
- 表单处理与验证
- 会话与Cookie
- 中间件
- 配置管理
- 日志系统
- 测试
- 部署
- 高级特性
- 最佳实践
1. 安装与设置
安装Beego和Bee工具
# 安装Beego框架
go get -u github.com/beego/beego/v2
# 安装Bee开发工具
go get -u github.com/beego/bee/v2
# 验证安装
bee version
创建新项目
bee new myapp
cd myapp
运行项目
bee run
默认情况下,应用会在http://localhost:8080
运行。
2. 项目结构
典型的Beego项目结构:
myapp/
conf/ # 配置文件
app.conf # 主配置文件
controllers/ # 控制器
models/ # 数据模型
routers/ # 路由定义
tests/ # 测试代码
static/ # 静态资源
css/
js/
img/
views/ # 视图模板
main.go # 应用入口
3. 路由与控制器
基本路由
在routers/router.go
中定义路由:
package routers
import (
"myapp/controllers"
"github.com/beego/beego/v2/server/web"
)
func init() {
web.Router("/", &controllers.MainController{})
web.Router("/hello", &controllers.MainController{}, "get:Hello")
web.Router("/user/:id", &controllers.UserController{}, "get:GetUser")
}
创建控制器
在controllers
目录下创建user_controller.go
:
package controllers
import (
"github.com/beego/beego/v2/server/web"
)
type UserController struct {
web.Controller
}
func (c *UserController) GetUser() {
id := c.Ctx.Input.Param(":id")
c.Data["json"] = map[string]string{"id": id}
c.ServeJSON()
}
RESTful路由
web.Namespace("/api",
web.NSRouter("/user", &controllers.UserController{}, "get:ListUsers;post:CreateUser"),
web.NSRouter("/user/:id", &controllers.UserController{}, "get:GetUser;put:UpdateUser;delete:DeleteUser"),
)
4. 模型与ORM
Beego内置了强大的ORM系统。
定义模型
在models
目录下创建user.go
:
package models
import (
"time"
"github.com/beego/beego/v2/client/orm"
)
type User struct {
Id int `orm:"auto"`
Name string `orm:"size(100)"`
Email string `orm:"size(100);unique"`
Password string `orm:"size(100)"`
Created time.Time `orm:"auto_now_add;type(datetime)"`
Updated time.Time `orm:"auto_now;type(datetime)"`
}
func init() {
orm.RegisterModel(new(User))
}
初始化ORM
在main.go
中:
import (
_ "github.com/go-sql-driver/mysql"
"github.com/beego/beego/v2/client/orm"
)
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "user:password@/dbname?charset=utf8")
orm.RunSyncdb("default", false, true)
}
使用ORM
func (c *UserController) ListUsers() {
o := orm.NewOrm()
var users []models.User
_, err := o.QueryTable("user").All(&users)
if err != nil {
c.Abort("500")
}
c.Data["json"] = users
c.ServeJSON()
}
5. 视图与模板
创建视图
在views
目录下创建user/index.tpl
:
<!DOCTYPE html>
<html>
<head>
<title>User List</title>
</head>
<body>
<h1>Users</h1>
<ul>
{{range .users}}
<li>{{.Name}} - {{.Email}}</li>
{{end}}
</ul>
</body>
</html>
运行 HTML
渲染视图
func (c *UserController) ListUsers() {
o := orm.NewOrm()
var users []models.User
o.QueryTable("user").All(&users)
c.Data["users"] = users
c.TplName = "user/index.tpl"
}
模板语法
Beego使用Go标准模板语法:
<!-- 变量 -->
<p>{{.user.Name}}</p>
<!-- 条件判断 -->
{{if .isAdmin}}
<button>Delete</button>
{{end}}
<!-- 循环 -->
{{range .items}}
<li>{{.Name}}</li>
{{end}}
<!-- 包含子模板 -->
{{template "header.html" .}}
<!-- 模板继承 -->
{{extend "base.html"}}
{{block "content"}}
<h1>Page Content</h1>
{{end}}
运行 HTML
6. 表单处理与验证
表单处理
type UserForm struct {
Name string `form:"name"`
Email string `form:"email"`
Password string `form:"password"`
}
func (c *UserController) CreateUser() {
var form UserForm
if err := c.ParseForm(&form); err != nil {
c.Abort("400")
}
user := models.User{
Name: form.Name,
Email: form.Email,
Password: form.Password,
}
o := orm.NewOrm()
if _, err := o.Insert(&user); err != nil {
c.Abort("500")
}
c.Redirect("/users", 302)
}
数据验证
Beego提供了验证模块:
func (c *UserController) CreateUser() {
var form UserForm
if err := c.ParseForm(&form); err != nil {
c.Abort("400")
}
// 验证
c.Data["json"] = c.Validation
if !c.Validation.Required(form.Name).Ok {
c.Validation.SetError("name", "Name is required")
}
if !c.Validation.Email(form.Email).Ok {
c.Validation.SetError("email", "Invalid email")
}
if c.Validation.HasErrors() {
c.Data["form"] = form
c.TplName = "user/new.tpl"
return
}
// 处理表单...
}
7. 会话与Cookie
会话使用
// 设置会话
c.SetSession("username", "john")
// 获取会话
username := c.GetSession("username")
// 删除会话
c.DelSession("username")
Cookie操作
// 设置Cookie
c.Ctx.SetCookie("theme", "dark", 3600, "/")
// 获取Cookie
theme := c.Ctx.GetCookie("theme")
8. 中间件
Beego的中间件称为过滤器。
内置过滤器
web.InsertFilter("/*", web.BeforeRouter, web.EnableAdmin)
自定义过滤器
var AuthFilter = func(ctx *context.Context) {
if ctx.Input.Session("user") == nil && ctx.Input.URL() != "/login" {
ctx.Redirect(302, "/login")
}
}
// 注册过滤器
web.InsertFilter("/*", web.BeforeRouter, AuthFilter)
9. 配置管理
Beego支持多种配置格式,默认使用app.conf
:
appname = myapp
httpport = 8080
runmode = dev
[db]
dbname = mydb
user = root
password =
host = 127.0.0.1
port = 3306
读取配置:
// 读取字符串
port := web.AppConfig.DefaultString("httpport", "8080")
// 读取整数
maxConn := web.AppConfig.DefaultInt("db::maxconn", 100)
// 读取布尔值
debug := web.AppConfig.DefaultBool("debug", false)
10. 日志系统
Beego内置了日志系统:
// 常规日志
web.BeeLogger.Info("Application started")
web.BeeLogger.Error("Something went wrong: %v", err)
// 控制器中的日志
c.Ctx.Output.Logger.Info("Processing request")
// 配置日志
web.BConfig.Log.AccessLogs = true
web.BConfig.Log.FileLineNum = true
web.SetLogger("file", `{"filename":"logs/test.log"}`)
11. 测试
Beego支持测试:
package controllers
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/beego/beego/v2/server/web"
)
func TestUserController(t *testing.T) {
web.TestBeegoInit("myapp")
req, _ := http.NewRequest("GET", "/user/1", nil)
w := httptest.NewRecorder()
web.BeeApp.Handlers.ServeHTTP(w, req)
if w.Code != http.StatusOK {
t.Errorf("Expected status 200, got %d", w.Code)
}
}
运行测试:
go test ./...
12. 部署
生产配置
修改conf/app.conf
:
runmode = prod
httpport = 8080
EnableDocs = false
构建应用
go build -o myapp main.go
使用Nginx反向代理
Nginx配置示例:
nginx
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
13. 高级特性
缓存
// 设置缓存
if err := web.Cache.Put("key", "value", 3600); err != nil {
web.BeeLogger.Error("Cache put error: %v", err)
}
// 获取缓存
value, err := web.Cache.Get("key")
任务队列
web.AppConfig.DefaultStrings("task::queues", []string{"default"})
tk1 := task.NewTask("task1", func() error {
// 执行任务
return nil
})
task.AddTask("task1", tk1)
task.StartTask()
API文档生成
// 在控制器方法前添加注释
// @Title GetUser
// @Description get user by id
// @Param id path int true "User ID"
// @Success 200 {object} models.User
// @Failure 400 invalid user id
// @Failure 404 user not found
// @router /user/:id [get]
func (c *UserController) GetUser() {
// ...
}
生成文档:
bee generate docs
14. 最佳实践
项目组织:
- 按功能模块组织代码
- 控制器保持精简,业务逻辑放在服务层
- 使用依赖注入
- 错误处理:
func (c *UserController) GetUser() {
id, err := c.GetInt(":id")
if err != nil {
c.Abort("400")
}
o := orm.NewOrm()
user := models.User{Id: id}
if err := o.Read(&user); err != nil {
if err == orm.ErrNoRows {
c.Abort("404")
}
c.Abort("500")
}
c.Data["json"] = user
c.ServeJSON()
}
安全实践:
- 启用XSRF保护:
web.BConfig.WebConfig.EnableXSRF = true
- 使用HTTPS
- 验证所有用户输入
- 启用XSRF保护:
性能优化:
- 启用模板缓存:
web.BConfig.WebConfig.TemplateLeft = "<<<"
- 使用数据库连接池
- 合理使用缓存
- 启用模板缓存:
- 日志记录:
// 配置日志级别
web.BConfig.Log.Level = web.LevelInformational
// 结构化日志
web.BeeLogger.Info("User login: %s", map[string]interface{}{
"username": username,
"ip": c.Ctx.Input.IP(),
})
Beego是一个功能全面的框架,适合构建各种规模的Web应用程序。通过本教程,你应该已经掌握了Beego的核心概念,可以开始构建自己的应用了。