1、beego介绍
Beego 是一个开源的、高性能的Go语言框架,用于快速开发RESTful API、Web应用、后端服务等各种类型的软件。它由国人Asta Xie创建,并得到了广泛的社区支持。Beego的设计理念是让开发者能够以最少的时间和代码量来完成Web应用的开发。
以下是Beego的一些主要特点:
-
全栈框架:Beego是一个全栈框架,包含了大多数Web开发所需的功能模块,如路由处理、模板渲染、ORM、缓存、日志等。
-
模块化设计:Beego由多个模块组成,每个模块都可以独立使用,也可以整合在一起使用,提供了很高的灵活性。
-
自动化工具:Beego提供了命令行工具
bee
,可以自动生成项目结构、管理依赖、热重载、自动化测试等功能。 -
RESTful支持:Beego原生支持RESTful风格的URL路由设计,方便构建API服务。
-
ORM:Beego内置了ORM模块,支持多种数据库,简化了数据库操作。
-
缓存支持:Beego支持多种缓存系统,如Memcache、Redis等。
-
配置管理:Beego提供了强大的配置管理功能,支持多种配置文件格式,如INI、XML、JSON、YAML等。
-
性能监控:Beego内置了性能监控模块,可以实时监控应用的运行状态。
-
安全性:Beego提供了一系列的安全措施,如XSS攻击防护、SQL注入防护等。
-
社区支持:Beego有着活跃的社区,提供了大量的文档、教程和第三方插件。
BEEGO架构图
Beego uses a standard Model-View-Controller (MVC) architecture for logic execution.
beego是标准的mvc的模式,下图就是整个流程的加载顺序。
2、操作介绍
1.代理设置
GOPROXY=https://goproxy.cn
2.创建项目
bee new beego-project
3.下载依赖
go mod tidy
这个命令会做以下几件事情:
- 添加缺失的模块提供导入的包。
- 移除不用的模块不提供导入的包。
- 更新go.mod文件中的依赖项到最新的兼容版本。
- 下载所有需要的依赖到本地缓存(默认是$GOPATH/pkg/mod目录)。
如果你的go.mod文件已经是最新的,并且你想直接下载所有依赖,而不对go.mod文件进行任何修改,你可以使用以下命令:
go mod download
这个命令会下载go.mod文件中列出的所有依赖,但是不会添加或删除任何依赖项。
3、目录结构
conf:放置一些配置文件等
appname = bee-project
httpport = 8081
runmode = dev
controller:控制器
db_user.go
package controllers
import (
// 注意这里的bee-project是go.mod里面的名称 而不是项目名称
"bee-project/models"
beego "github.com/beego/beego/v2/server/web"
)
type DbUserController struct {
beego.Controller
}
func (c *DbUserController) DoAdd() {
models.Add()
c.Ctx.WriteString("保存数据成功!")
}
func (c *DbUserController) DoDelete() {
models.Delete()
c.Ctx.WriteString("删除数据成功!")
}
func (c *DbUserController) DoUpdate() {
models.Update()
c.Ctx.WriteString("更新数据成功!")
}
func (c *DbUserController) Get() {
models.Find()
c.Ctx.WriteString("查询数据成功!")
}
default.go
package controllers
import (
beego "github.com/beego/beego/v2/server/web"
)
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
c.Data["Website"] = "beego.vip"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
goods.go
package controllers
import (
"encoding/json"
beego "github.com/beego/beego/v2/server/web"
)
type GoodsController struct {
beego.Controller
}
func (c *GoodsController) Get() {
c.Data["title"] = "你好beego goods"
c.Data["num"] = 12
c.TplName = "goods.tpl"
}
func (c *GoodsController) DoAdd() {
c.Ctx.WriteString("增加商品")
}
type Product struct {
Name string `json:"name"`
Price int `json:"price"`
}
// 将接收到的body参数以json格式返回出去
func (c *GoodsController) DoEdit() {
var product Product
err := json.NewDecoder(c.Ctx.Request.Body).Decode(&product)
if err != nil {
c.Ctx.ResponseWriter.WriteHeader(400)
c.Ctx.WriteString("error parsing request body")
return
}
c.Data["json"] = &product
c.ServeJSON()
}
func (c *GoodsController) DoDelete() {
c.Ctx.WriteString("删除商品")
}
hello.go
package controllers
import (
beego "github.com/beego/beego/v2/server/web"
)
type HelloController struct {
beego.Controller
}
func (c *HelloController) Get() {
c.Data["msg"] = "hello beego frank set value to hello views"
c.TplName = "hello.tpl"
}
user.go
package controllers
import (
"fmt"
beego "github.com/beego/beego/v2/server/web"
"strconv"
)
type UserController struct {
beego.Controller
}
func (c *UserController) Get() {
c.Ctx.WriteString("用户中心")
}
func (c *UserController) AddUser() {
c.TplName = "userAdd.tpl"
}
//处理post请求
func (c *UserController) DoAddUser() {
id, err := c.GetInt("id")
if err != nil {
c.Ctx.WriteString("id必须是int类型")
return
}
username := c.GetString("username")
password := c.GetString("password")
hobby := c.GetStrings("hobby")
fmt.Printf("爱好值:%v-------------类型:%T", hobby, hobby)
// id 是int 类型的 需要转换成string类型
c.Ctx.WriteString("用户中心:" + strconv.Itoa(id) + " " + username + " " + password)
}
func (c *UserController) EditUser() {
c.TplName = "userEdit.tpl"
}
type User struct {
// form 表示form表单提交的username和这里的Username映射,json 表示返回的字段Username使用username替换展示
Username string `form:"username" json:"username"`
Password string `form:"password" json:"password"`
Hobby []string `form:"hobby" json:"hobby"`
}
func (c *UserController) DoEditUser() {
u := User{}
if err := c.ParseForm(&u); err != nil {
c.Ctx.WriteString("post提交数据失败!")
}
fmt.Printf("%#v", u)
c.Ctx.WriteString("解析post请求数据成功!")
}
func (c *UserController) GetUser() {
u := User{
Username: "张三",
Password: "121312",
Hobby: []string{"1","2"},
}
c.Data["json"] = u
c.ServeJSON()
}
models:数据库对象等
DbUser.go
package models
import (
"fmt"
"github.com/beego/beego/v2/client/orm"
"time"
//匿名引入mysql驱动
_ "github.com/go-sql-driver/mysql"
)
type User struct {
Id int `orm:"auto"`
Name string `orm:"column(name)"`
Age int `orm:"column(age)"`
Created time.Time `orm:"auto_now_add;type(datetime)"`
Updated time.Time `orm:"auto_now;type(datetime)"`
}
var ORM orm.Ormer
func init() {
// 注册 User 结构体模型
orm.RegisterModel(new(User))
orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3307)/beego?charset=utf8")
orm.SetMaxIdleConns("default", 30)
ORM = orm.NewOrm()
}
func Add() {
user := new(User)
user.Name = "贾元春"
user.Age = 25
// 添加数据
ORM.Insert(user)
}
func Delete() {
var user = User{Id: 7}
c, er := ORM.Delete(&user)
if er != nil {
fmt.Println(er)
}
fmt.Println(c)
}
func Update() {
user := User{Id: 6, Name: "贾宝玉", Age: 24}
//默认通过id 更新所有字段
c, er := ORM.Update(&user)
if er != nil {
fmt.Println(er)
}
fmt.Println(c)
user2 := User{Id: 8, Name: "史湘云", Age: 22}
//根据id做条件只更新name字段
ORM.Update(&user2, "name")
}
func Find() User {
//user := &User{Id: 8}
//通过主键id 查询
//o.Read(user)
user := &User{Name: "贾宝玉"}
//非主键查询
ORM.Read(user, "Name")
fmt.Println(user)
return *user
}
routers:路由设置
router.go
package routers
import (
"bee-project/controllers"
beego "github.com/beego/beego/v2/server/web"
)
func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/hello", &controllers.HelloController{})
// 默认是get请求
beego.Router("/user", &controllers.UserController{})
beego.Router("/user/add", &controllers.UserController{}, "get:AddUser")
beego.Router("/user/doAdd", &controllers.UserController{}, "post:DoAddUser")
// 用户
beego.Router("/user/edit", &controllers.UserController{}, "get:EditUser")
beego.Router("/user/doEdit", &controllers.UserController{}, "post:DoEditUser")
beego.Router("/user/getUser", &controllers.UserController{}, "get:GetUser")
// 商品 restful-api
beego.Router("/goods", &controllers.GoodsController{})
beego.Router("/goods", &controllers.GoodsController{}, "post:DoAdd")
beego.Router("/goods", &controllers.GoodsController{}, "put:DoEdit")
beego.Router("/goods", &controllers.GoodsController{}, "delete:DoDelete")
// 操作数据库
beego.Router("/dbUser", &controllers.DbUserController{})
beego.Router("/dbUser", &controllers.DbUserController{}, "post:DoAdd")
beego.Router("/dbUser", &controllers.DbUserController{}, "delete:DoDelete")
beego.Router("/dbUser", &controllers.DbUserController{}, "put:DoUpdate")
}
static:静态文件、css、js、图片等
tests:测试文件
views:界面文件
goods.tpl
<!DOCTYPE html>
<html>
<head>
<title>goods Beego</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1>商品模块</h1>
</body>
</html>
hello.tpl
<!DOCTYPE html>
<html>
<head>
<title>hello Beego</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1 class="logo">hello Beego</h1>
<h2>{
{.msg}}</h2>
</body>
</html>
index.tpl
<!DOCTYPE html>
<html>
<head>
<title>Beego</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFNTdGOTA3OTczQTgxMUU0QTlEQUM0NEYyRkI1NEQxQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFNTdGOTA3QTczQTgxMUU0QTlEQUM0NEYyRkI1NEQxQiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1N0Y5MDc3NzNBODExRTRBOURBQzQ0RjJGQjU0RDFCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1N0Y5MDc4NzNBODExRTRBOURBQzQ0RjJGQjU0RDFCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+lsWdMwAAIvtJREFUeNrke3d8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