89、Beego框架(上)——2020年07月30日22:05:40

89、Beego框架(上)

2020年07月29日14:46:59

https://beego.me/docs/mvc/controller/router.md

![image-20200729150123094](/Users/apple/Library/Application Support/typora-user-images/image-20200729150123094.png)

1、go get配置

配置使得下载包快一点——国内源
export GO111MODULE=on

export GOPROXY=https://goproxy.io

2、下载beego和bee

下载包
go get -u github.com/astaxie/beego
go get -u github.com/beego/bee
 ✘ ⚙  ~/go/bin  export GO111MODULE=on
 ⚙  ~/go/bin  export GOPROXY=https://goproxy.io
 ⚙  ~/go/bin  go get -u github.com/astaxie/beego
 
go: finding github.com/astaxie/beego v1.12.2
go: downloading github.com/astaxie/beego v1.12.2
go: extracting github.com/astaxie/beego v1.12.2
go: downloading github.com/prometheus/client_golang v1.7.0
go: downloading golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
go: downloading github.com/hashicorp/golang-lru v0.5.4
go: downloading github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644
go: downloading gopkg.in/yaml.v2 v2.2.8
go: extracting github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644
go: extracting github.com/hashicorp/golang-lru v0.5.4
go: extracting gopkg.in/yaml.v2 v2.2.8
go: extracting github.com/prometheus/client_golang v1.7.0
go: downloading github.com/prometheus/common v0.10.0
go: downloading github.com/prometheus/client_model v0.2.0
go: downloading github.com/golang/protobuf v1.4.2
go: downloading github.com/prometheus/procfs v0.1.3
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/cespare/xxhash/v2 v2.1.1
go: downloading golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1
go: extracting github.com/prometheus/client_model v0.2.0
go: extracting github.com/prometheus/common v0.10.0
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1
go: extracting github.com/beorn7/perks v1.0.1
go: extracting github.com/cespare/xxhash/v2 v2.1.1
go: extracting github.com/golang/protobuf v1.4.2
go: downloading google.golang.org/protobuf v1.23.0
go: extracting github.com/matttproud/golang_protobuf_extensions v1.0.1
go: extracting github.com/prometheus/procfs v0.1.3
go: extracting golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
go: extracting google.golang.org/protobuf v1.23.0
go: downloading golang.org/x/net v0.0.0-20190620200207-3b0461eec859
go: extracting golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1
go: extracting golang.org/x/net v0.0.0-20190620200207-3b0461eec859
go: downloading golang.org/x/text v0.3.0
go: extracting golang.org/x/text v0.3.0
go: finding github.com/beorn7/perks v1.0.1
go: finding github.com/prometheus/client_model v0.2.0
go: finding golang.org/x/sys latest
go: finding github.com/hashicorp/golang-lru v0.5.4
go: finding golang.org/x/net latest
go: finding github.com/golang/protobuf v1.4.2
go: finding github.com/prometheus/common v0.10.0
go: finding github.com/prometheus/procfs v0.1.3
go: finding gopkg.in/yaml.v2 v2.3.0
go: finding golang.org/x/crypto latest
go: finding github.com/prometheus/client_golang v1.7.1
go: finding github.com/shiena/ansicolor latest
go: finding github.com/cespare/xxhash/v2 v2.1.1
go: finding google.golang.org/protobuf v1.25.0
go: finding github.com/matttproud/golang_protobuf_extensions v1.0.1
go: finding golang.org/x/text v0.3.3
go: downloading github.com/prometheus/client_golang v1.7.1
go: downloading golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
go: downloading gopkg.in/yaml.v2 v2.3.0
go: extracting gopkg.in/yaml.v2 v2.3.0
go: extracting github.com/prometheus/client_golang v1.7.1
go: downloading google.golang.org/protobuf v1.25.0
go: extracting google.golang.org/protobuf v1.25.0
go: downloading golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1
go: extracting golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
go: downloading golang.org/x/net v0.0.0-20200707034311-ab3426394381
go: extracting golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1
go: extracting golang.org/x/net v0.0.0-20200707034311-ab3426394381
go: downloading golang.org/x/text v0.3.3
.......

3、配置环境——重要

//编辑配置文件
vi ~/.bash_profile

//加入以下语句
# bee
PATH="${GOPATH}/bin:${PATH}"
export PATH

//运行命令生效:
source ~/.bash_profile

4、新建项目

image-20200729150142873

image-20200729150159684

bee new beego2

2020/07/29 15:16:07 INFO     ▶ 0001 generate new project support go modules.
2020/07/29 15:16:07 INFO     ▶ 0002 Creating application...
	create	 /Users/apple/go/src/beego2/go.mod
	create	 /Users/apple/go/src/beego2/
	create	 /Users/apple/go/src/beego2/conf/
	create	 /Users/apple/go/src/beego2/controllers/
	create	 /Users/apple/go/src/beego2/models/
	create	 /Users/apple/go/src/beego2/routers/
	create	 /Users/apple/go/src/beego2/tests/
	create	 /Users/apple/go/src/beego2/static/
	create	 /Users/apple/go/src/beego2/static/js/
	create	 /Users/apple/go/src/beego2/static/css/
	create	 /Users/apple/go/src/beego2/static/img/
	create	 /Users/apple/go/src/beego2/views/
	create	 /Users/apple/go/src/beego2/conf/app.conf
	create	 /Users/apple/go/src/beego2/controllers/default.go
	create	 /Users/apple/go/src/beego2/views/index.tpl
	create	 /Users/apple/go/src/beego2/routers/router.go
	create	 /Users/apple/go/src/beego2/tests/default_test.go
	create	 /Users/apple/go/src/beego2/main.go
2020/07/29 15:16:07 SUCCESS  ▶ 0003 New application successfully created!
bee run

______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.11.0
2020/07/29 15:16:18 INFO     ▶ 0001 Using 'beego2' as 'appname'
2020/07/29 15:16:18 INFO     ▶ 0002 Initializing watcher...
go: downloading gopkg.in/yaml.v2 v2.2.1
go: finding github.com/shiena/ansicolor latest
go: extracting gopkg.in/yaml.v2 v2.2.1
go: finding github.com/astaxie/beego v1.12.1
go: finding golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
go: finding gopkg.in/yaml.v2 v2.2.1
go: finding golang.org/x/net v0.0.0-20190620200207-3b0461eec859
go: finding golang.org/x/text v0.3.0
golang.org/x/text/transform
github.com/astaxie/beego/config
github.com/astaxie/beego/utils
gopkg.in/yaml.v2
github.com/astaxie/beego/logs
github.com/astaxie/beego/session
github.com/astaxie/beego/grace
github.com/astaxie/beego/toolbox
golang.org/x/crypto/acme
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm
golang.org/x/text/secure/bidirule
golang.org/x/net/idna
github.com/astaxie/beego/context
golang.org/x/crypto/acme/autocert
github.com/astaxie/beego/context/param
github.com/astaxie/beego
beego2/controllers
beego2/routers
beego2
2020/07/29 15:16:29 SUCCESS  ▶ 0003 Built Successfully!
2020/07/29 15:16:29 INFO     ▶ 0004 Restarting 'beego2'...
2020/07/29 15:16:29 SUCCESS  ▶ 0005 './beego2' is running...
2020/07/29 15:16:29.860 [I] [asm_amd64.s:1357]  http server Running on http://:8080
2020/07/29 15:16:44.140 [D] [server.go:2802]  |            ::1| 200 |   2.579479ms|   match| GET      /     r:/
2020/07/29 15:16:44.929 [D] [server.go:2802]  |            ::1| 200 |    173.159µs|   match| GET      /static/js/reload.min.js

image-20200729151834400

4、参数配置及路由

4.1 配置

Beego默认会解析当前应用下的conf/app.conf文件

image-20200729152028663

4.2 路由

参考文章:

https://beego.me/docs/mvc/controller/router.md

RESTful Controller 路由

自定义方法及 RESTful 规则

如果用户期望自定义函数名,那么可以使用如下方式:

beego.Router("/",&IndexController{},"*:Index")

使用第三个参数,第三个参数就是用来设置对应 method 到函数名,定义如下

  • *表示任意的 method 都执行该函数
  • 使用 httpmethod:funcname 格式来展示
  • 多个不同的格式使用 ; 分割
  • 多个 method 对应同一个 funcname,method 之间通过 , 来分割

以下是一个 RESTful 的设计示例:

beego.Router("/api/list",&RestController{},"*:ListFood")
beego.Router("/api/create",&RestController{},"post:CreateFood")
beego.Router("/api/update",&RestController{},"put:UpdateFood")
beego.Router("/api/delete",&RestController{},"delete:DeleteFood")

以下是多个 HTTP Method 指向同一个函数的示例:

beego.Router("/api",&RestController{},"get,post:ApiFunc")

以下是不同的 method 对应不同的函数,通过 ; 进行分割的示例:

beego.Router("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")

可用的 HTTP Method:

  • *: 包含以下所有的函数
  • get: GET 请求
  • post: POST 请求
  • put: PUT 请求
  • delete: DELETE 请求
  • patch: PATCH 请求
  • options: OPTIONS 请求
  • head: HEAD 请求

如果同时存在 * 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法,例如同时注册了如下所示的路由:

beego.Router("/simple",&SimpleController{},"*:AllFunc;post:PostFunc")

那么执行 POST 请求的时候,执行 PostFunc 而不执行 AllFunc

自定义函数的路由默认不支持 RESTful 的方法,也就是如果你设置了 beego.Router("/api",&RestController{},"post:ApiFunc") 这样的路由,如果请求的方法是 POST,那么不会默认去执行 Post 函数。

5、Controller

beego.Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head等 方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。

我们可以通过各种方式获取数据,然后赋值到 this.Data 中,这是一个用来存储输出数据的 map,可以赋值任意类型的值,这里我们只是简单举例输出两个字符串。

最后一个就是需要去渲染的模板,this.TplName 就是需要渲染的模板,这里指定了 index.tpl,如果用户不设置该参数,那么默认会去到模板目录的 Controller/<方法名>.tpl 查找,例如上面的方法会去 maincontroller/get.tpl(文件、文件夹必须小写)。

用户设置了模板之后系统会自动的调用 Render 函数(这个函数是在 beego.Controller 中实现的),所以无需用户自己来调用渲染。

5.1 新建一个controller

//test.go
package controllers

import (
   "github.com/astaxie/beego"
)

type TestController struct {
   beego.Controller
}

func (c *TestController) Get1(){
   c.Ctx.WriteString("hello xiaoye")
}

5.2 写好路由

//router.go

package routers

import (
	"beego2/controllers"
	"github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{},"post:Get1")
	  beego.Router("/test", &controllers.TestController{},"get:Get1")
}

image-20200729161850044

6、请求数据处理

image-20200729163500292

6.1 get显示form,并将数据展示出来

//testInput.go
type User struct{
	Username string
	Password string
}

func (c *TestInputController) Get1(){
	//id := c.GetString("id")
	//c.Ctx.WriteString(id)
	//name := c.Input().Get("name")
	//c.Ctx.WriteString(name + "</html>")

	c.Ctx.WriteString(`<html><form action="http://127.0.0.1:8083/testinput" method="post"> 
							<input type="text" name="Username"/>
							<input type="password" name="Password"/>
							<input type="submit" value="提交"/>
					   </form></html>`)
}

func (c *TestInputController) Post1(){
	u := User{}
	if err:=c.ParseForm(&u) ; err != nil{
		//process error
	}

	c.Ctx.WriteString("Username:" + u.Username + " Password:" + u.Password)
}
//router.go

package routers

import (
	"beego2/controllers"
	"github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{},"post:Get1")
	beego.Router("/test", &controllers.TestController{},"get:Get1")
	beego.Router("/testinput", &controllers.TestInputController{},"get:Get1;post:Post1")

}

直接解析到struct
func (c *TestInputController) Post1(){
	u := User{}
	if err:=c.ParseForm(&u) ; err != nil{
		//process error
	}

	c.Ctx.WriteString("Username:" + u.Username + " Password:" + u.Password)
}

6.2 获取Request Body里的内容

在配置文件里设置 copyrequestbody = true

func (this *ObjectController) Poost(){
	var ob models.Object
	json.Unmarshal(this.Ctx.Input.RequestBody,&ob)
	objectid:=models.AddOne(ob)
	this.Data["json"]="{\"ObjectId\":\""+objectid+"\"}"
	this.ServeJSON()
}

7、cookie与session

beego 内置了 session 模块,目前 session 模块支持的后端引擎包括 memory、cookie、file、mysql、redis、couchbase、memcache、postgres,用户也可以根据相应的 interface 实现自己的引擎。

7.1 cookie保存及清除

//testlogin.go

package controllers

import (
	"github.com/astaxie/beego"
)

type TestloginController struct {
	beego.Controller
}

type UserInfo struct{
	Username string
	Password string
}

func (c *TestloginController) Login() {

	name := c.Ctx.GetCookie("name")
	password := c.Ctx.GetCookie("password")

	if name != "" {
		c.Ctx.WriteString("Username:" + name + " Password:" + password)

	} else {
		c.Ctx.WriteString(`<html><form action="http://127.0.0.1:8080/test_login" method="post"> 
							<input type="text" name="Username"/>
							<input type="password" name="Password"/>
							<input type="submit" value="提交"/>
					   </form></html>`)
	}
}

func (c *TestloginController) Post1(){
	u := UserInfo{}
	if err:=c.ParseForm(&u) ; err != nil{
		//process error
	}
  
	c.Ctx.SetCookie("name", u.Username, 100, "/")
	c.Ctx.SetCookie("password", u.Password, 100, "/")

  
	c.Ctx.WriteString("Username:" + u.Username + " Password:" + u.Password)
}

7.2 session

beego 中使用 session 相当方便,只要在 main 入口函数中设置如下:

beego.BConfig.WebConfig.Session.SessionOn = true

或者通过配置文件配置如下:

sessionon=true
使用session

从testlogin.go这个文件进入,然后通过post请求提交数据。最后又刷新了testinput.go的get页面

//testlogin.go

package controllers

import (
	"github.com/astaxie/beego"
)

type TestloginController struct {
	beego.Controller
}

type UserInfo struct{
	Username string
	Password string
}

func (c *TestloginController) Login() {

	name := c.Ctx.GetCookie("name")
	password := c.Ctx.GetCookie("password")

	if name != "" {
		c.Ctx.WriteString("Username:" + name + " Password:" + password)

	} else {
		c.Ctx.WriteString(`<html><form action="http://127.0.0.1:8080/test_login" method="post"> 
							<input type="text" name="Username"/>
							<input type="password" name="Password"/>
							<input type="submit" value="提交"/>
					   </form></html>`)
	}
}

func (c *TestloginController) Post1(){
	u := UserInfo{}
	if err:=c.ParseForm(&u) ; err != nil{
		//process error
	}
	c.Ctx.SetCookie("name", u.Username, 100, "/")
	c.Ctx.SetCookie("password", u.Password, 100, "/")
	c.SetSession("name", u.Username)
	c.SetSession("password", u.Password)

	c.Ctx.WriteString("Username:" + u.Username + " Password:" + u.Password)
}

//testInput.go

package controllers

import (
	"github.com/astaxie/beego"
)

type TestInputController struct {
	beego.Controller
}

type User struct{
	Username string
	Password string
}

func (c *TestInputController) Get(){


	name := c.GetSession("name")
	password := c.GetSession("password")

	if nameString, ok := name.(string); ok && nameString != ""{
		c.Ctx.WriteString("Name:" + name.(string) + " password:" + password.(string))
	}else{
		c.Ctx.WriteString(`<html><form action="http://127.0.0.1:8080/test_input" method="post"> 
							<input type="text" name="Username"/>
							<input type="password" name="Password"/>
							<input type="submit" value="提交"/>
					   </form></html>`)
	}
}


func (c *TestInputController) Post(){
	u := User{}
	if err:=c.ParseForm(&u) ; err != nil{
		//process error
	}

	c.Ctx.WriteString("Username:" + u.Username + " Password:" + u.Password)
}

8、model1——数据库等

数据库

beego ORM 是一个强大的 Go 语言 ORM 框架。她的灵感主要来自 Django ORM 和 SQLAlchemy。

image-20200730153952884

8.1 数据库设置

先下载库
go get github.com/astaxie/beego/orm
数据库设置
"github.com/go-sql-driver/mysql"
image-20200730154623862
//数据库登录
/usr/local/MySQL/bin/mysql -u root -p
password
image-20200730160849286 image-20200730160929232
创建表user_info

id,username,password

链接数据库
orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30)
    
orm.RegisterModel(new(User))    

8.2 插入数据库一条数据

package controllers

import (
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)

//由于model这个名字叫 UserInfo 那么操作的表其实 user_info
type UserInfo struct{ 
	Id int64
	Username string
	Password string
}

type TestModelController struct {
	beego.Controller
}

func (c *TestModelController) Get() {
	orm.RegisterDataBase("default", "mysql", "root:123@tcp(127.0.0.1:3306)/mytest?charset=utf8", 30)
	orm.RegisterModel(new(UserInfo))

	o := orm.NewOrm()
	//下面是插入
	user := UserInfo{Username:"zhangsan", Password:"123456"}
	id,err := o.Insert(&user)

	c.Ctx.WriteString(fmt.Sprintf("id: %d  err: %v ",id,err))
}

9、model2

开启调试模式

调试模式下会打印出sql语句

orm.Debug=true

image-20200730212121299

原生读取
	//下面是原生读取
/*	var users []UserInfo
	o.Raw("select * from user_info").QueryRows(&users)
	c.Ctx.WriteString(fmt.Sprintf("user info:%v", users))*/
	

9.1 构造查询——QueryBuilder

QueryBuilder 提供了一个简便,流畅的SQL查询构造器。在不影响代码可读性的前提下用来快速的建立SQL语句

type QueryBuilder interface {
    Select(fields ...string) QueryBuilder
    From(tables ...string) QueryBuilder
    InnerJoin(table string) QueryBuilder
    LeftJoin(table string) QueryBuilder
    RightJoin(table string) QueryBuilder
    On(cond string) QueryBuilder
    Where(cond string) QueryBuilder
    And(cond string) QueryBuilder
    Or(cond string) QueryBuilder
    In(vals ...string) QueryBuilder
    OrderBy(fields ...string) QueryBuilder
    Asc() QueryBuilder
    Desc() QueryBuilder
    Limit(limit int) QueryBuilder
    Offset(offset int) QueryBuilder
    GroupBy(fields ...string) QueryBuilder
    Having(cond string) QueryBuilder
    Subquery(sub string, alias string) string
    String() string
}

链式查询方法
	func (c *TestModelController) Get() {
    
	orm.Debug = true // 是否开启调试模式 调试模式下会打印出sql语句
	orm.RegisterDataBase("default", "mysql", "root:123@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
	orm.RegisterModel(new(UserInfo))

	o := orm.NewOrm()
	//采用queryBuilder方式进行读取
	var users []UserInfo

	qb, _:=orm.NewQueryBuilder("mysql")

	qb.Select("password").From("user_info").Where("username= 'lisi'").And("id").In("1").Limit(1)

	sql := qb.String()
	o.Raw(sql).QueryRows(&users)

	c.Ctx.WriteString(fmt.Sprintf("user info:%v", users))
    
	}

10、Controller调用model

//user.go

package models

import (
	_ "github.com/go-sql-driver/mysql"
	"github.com/astaxie/beego/orm"
)

var (
	db orm.Ormer
)

//由于model这个名字叫 UserInfo 那么操作的表其实 user_info
type UserInfo struct{ 
	Id int64
	Username string
	Password string
}

func init() {
	orm.Debug = true // 是否开启调试模式 调试模式下会打印出sql语句
	orm.RegisterDataBase("default", "mysql", "root:123@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
	orm.RegisterModel(new(UserInfo))
	db = orm.NewOrm()
}

func AddUser(user_info *UserInfo)(int64,error){
	id,err := db.Insert(user_info)
	return id,err
}

func ReadUserInfo(users *[]UserInfo){
	qb, _:=orm.NewQueryBuilder("mysql")

	qb.Select("*").From("user_info")

	sql := qb.String()
	db.Raw(sql).QueryRows(users)
}


//testModel.go

package controllers

import (
	"web/models"
	"github.com/astaxie/beego"
)

type TestModelController struct {
	beego.Controller
}

func (c *TestModelController) Get() {
	user := models.UserInfo{Username:"liusi", Password:"7654321"}
	models.AddUser(&user)

	c.Ctx.WriteString("call model success!")
}

END

2020年07月30日22:05:07

猜你喜欢

转载自www.cnblogs.com/oneapple/p/13406712.html