这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
beego安装
beego安装是典型的Go安装包的形式
go get github.com/astaxie/beego
Beego升级
- 方式一
go get -u github.com/astaxie/beego
- 方式二
go install github.com/astaxie/beego
bee工具的使用
bee工具安装
go get github.com/beego/bee
bee工具命令
- 命令需要在
GOPATH
环境变量下的目录执行,没有则手动创建
bee # 查看所有命令
bee new myproject # 新疆web项目
bee api apiapplication # 创建api应用
bee run # 编译运行
go get myproject # bee run error情况下执行该指令(编译项目)
- beego项目结果
myproject
├── conf
│ └── app.conf
├── controllers
│ └── default.go
├── main.go
├── models
├── routers
│ └── router.go
├── static
│ ├── css
│ ├── img
│ └── js
├── tests
│ └── default_test.go
└── views
└── index.tpl
8 directories, 4 files
新建项目
创建项目
bee new beego_pro1
运行项目
bee run
或 go run main.go
或者 go build main.go 编译后执行 beego_pro1.exe文件
路由设置
- 先来看一下main.go
package main
import (
_ "beego_pro1/routers"
"github.com/astaxie/beego"
)
func main() {
beego.Run()
}
可以看到入口函数main
中引入了一个包_ "beego_pro1/routers"
- routers/router.go
可以看到创建了一个跟路由
/
,映射到了controller
自定义路由user
,这样用户就可以通过访问/user
去执行UserController
的逻辑。
beego.Router("/user", &controllers.UserController{})
package routers
import (
"beego_pro1/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
}
controller运行机制
- controllers/default.go
package controllers
import (
"fmt"
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
首先声明了一个控制器 MainController
,这个控制器里面内嵌了 beego.Controller
,这就是Go
的嵌入方式,也就是 MainController
自动拥有了所有 beego.Controller
的方法。
而 beego.Controller
拥有很多方法,其中包括 Init
、Prepare
、Post
、Get
、Delete
、Head
等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。
Model逻辑
- 我们的
bee new
例子不存在Model
的演示,但是bee api
应用中存在model
的应用。 - apiproject/models/object.go
package models
import (
"errors"
"strconv"
"time"
)
var (
Objects map[string]*Object
)
type Object struct {
ObjectId string
Score int64
PlayerName string
}
func init() {
Objects = make(map[string]*Object)
Objects["hjkhsbnmn123"] = &Object{"hjkhsbnmn123", 100, "astaxie"}
Objects["mjjkxsxsaa23"] = &Object{"mjjkxsxsaa23", 101, "someone"}
}
func AddOne(object Object) (ObjectId string) {
object.ObjectId = "astaxie" + strconv.FormatInt(time.Now().UnixNano(), 10)
Objects[object.ObjectId] = &object
return object.ObjectId
}
func GetOne(ObjectId string) (object *Object, err error) {
if v, ok := Objects[ObjectId]; ok {
return v, nil
}
return nil, errors.New("ObjectId Not Exist")
}
func GetAll() map[string]*Object {
return Objects
}
func Update(ObjectId string, Score int64) (err error) {
if v, ok := Objects[ObjectId]; ok {
v.Score = Score
return nil
}
return errors.New("ObjectId Not Exist")
}
func Delete(ObjectId string) {
delete(Objects, ObjectId)
}
View编写
-
在前面
Controller
的时候,重写GET
方法的时候,写过这样的语句this.TplName = "index.tpl"
,设置显示的模板文件,默认支持tpl
和html
的后缀名,如果想设置其他后缀名也可以调用beego.AddTemplatExt
接口设置。 -
routers/router.go
package routers
import (
"beego_pro1/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
...
beego.Router("/index", &controllers.Index{})
}
- controllers/default.go
package controllers
import (
"fmt"
"github.com/astaxie/beego"
)
type Index struct {
beego.Controller
}
func (c *Index) Get() {
// 传参
c.Data["name"] = "阿九筒的春天"
c.Data["email"] = "Joe@gmail.com"
c.TplName = "index.html"
}
- views/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<span>第一个go页面</span><br><br>
<span>{{.name}}</span><br><br>
<span>{{.email}}</span><br><br>
</div>
</body>
</html>
静态文件的导入
- 使用
bee new project
的时候,就创建了static
文件夹,目录如下:
├── static
│ ├── css
│ ├── img
│ └── js
- 新建文件夹
down
,再创建123.xls
用于测试下载文件 - 在main.go中
beego.Run()
前添加
beego.SetStaticPath("/static", "static") // 静态文件
beego.SetStaticPath("/down", "down") // 文件下载
这样用户可以访问https://localhost:8080/down/123.xls
则会请求到down
文件夹下的123.xls
文件。
index.html
...
// 导入static/css文件夹下的index.css文件
<link href="/static/css/index.css" rel="stylesheet">
<div>
<span>第一个go页面</span><br><br>
<span>{{.name}}</span><br><br>
<span>{{.email}}</span><br><br>
<a href="/down/123.xls"><button>点击下载《123.xls》</button></a>
</div>
...
static/css/index.css
div {
font-size: 20px;
color: brown;
margin: 20px;
padding: 10px;
}
routers/router.go
func init() {
beego.Router("/", &controllers.MainController{})
...
beego.Router("/index", &controllers.Index{})
}
controllers/default.go
type Index struct {
beego.Controller
}
func (c *Index) Get() {
// 传参
c.Data["name"] = "阿九筒的春天"
c.Data["email"] = "Joe@gmail.com"
c.TplName = "index.html"
}
注意 controller
使用c.Data["key"]
赋值,前端模板使用{{.key}}
的方式访问。
- 几个好玩的路由
- router
package routers
import (
"beego_pro1/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/hello", &controllers.HelloWorld{})
beego.Router("/params", &controllers.ParamsTest{})
beego.Router("/index", &controllers.Index{})
}
- controller
package controllers
import (
"fmt"
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
type HelloWorld struct {
beego.Controller
}
func (c *HelloWorld) Get() {
// hello world
c.Ctx.WriteString("hello world")
}
type ParamsTest struct {
beego.Controller
}
func (c *ParamsTest) Get() {
// 获取params参数
var b string = c.Ctx.Request.RequestURI
fmt.Println(b)
c.Ctx.WriteString(b)
}
type Index struct {
beego.Controller
}
func (c *Index) Get() {
// 传参
c.Data["name"] = "阿九筒的春天"
c.Data["email"] = "Joe@gmail.com"
c.TplName = "index.html"
}
- 控制台399次请求,并返回params
for (var i=1;i<400;i++){ console.log(i);window.location.href="http://localhost:8080/params?i="+String(i);};
仓库地址 beego_pro1
参考文档 topgoer beego框架