Go语言Beego框架详细教程

Beego是一个全栈MVC框架,用于快速开发Go语言Web应用程序。它集成了多种功能模块,包括ORM、缓存、日志、配置管理等,适合构建各种规模的Web应用。

目录

  1. 安装与设置
  2. 项目结构
  3. 路由与控制器
  4. 模型与ORM
  5. 视图与模板
  6. 表单处理与验证
  7. 会话与Cookie
  8. 中间件
  9. 配置管理
  10. 日志系统
  11. 测试
  12. 部署
  13. 高级特性
  14. 最佳实践

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. 最佳实践

  1. 项目组织

    • 按功能模块组织代码
    • 控制器保持精简,业务逻辑放在服务层
    • 使用依赖注入
  2. 错误处理
   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()
   }
  1. 安全实践

    • 启用XSRF保护:web.BConfig.WebConfig.EnableXSRF = true
    • 使用HTTPS
    • 验证所有用户输入
  2. 性能优化

    • 启用模板缓存:web.BConfig.WebConfig.TemplateLeft = "<<<"
    • 使用数据库连接池
    • 合理使用缓存
  3. 日志记录
   // 配置日志级别
   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的核心概念,可以开始构建自己的应用了。









results matching ""

    No results matching ""