beego框架入门一:几个有趣的接口

1,727 阅读3分钟

这是我参与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环境变量下的目录执行,没有则手动创建

gopath.png

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文件

bee_run.png

go_run.png

go_build.png

路由设置

  • 先来看一下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 拥有很多方法,其中包括 InitPreparePostGetDeleteHead 等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。

localhost8080.png

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",设置显示的模板文件,默认支持tplhtml的后缀名,如果想设置其他后缀名也可以调用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}}的方式访问。

view.png

  • 几个好玩的路由
    • 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"
}

download.png

hello world.png

  • 控制台399次请求,并返回params
for (var i=1;i<400;i++){ console.log(i);window.location.href="http://localhost:8080/params?i="+String(i);};

params.png

仓库地址 beego_pro1

参考文档 topgoer beego框架