• 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

  • 相关阅读:
    【协议分析】Wireshark 过滤表达式实例
    学习Javascript闭包(Closure)
    如何解决 touchstart 事件与 click 事件的冲突
    JS实现控制HTML5背景音乐播放暂停
    $.ajax()方法详解
    js将汉字转为相应的拼音
    js 滚动到一定位置导航定位在页面最顶部
    javascript获取网页地址栏的id
    jquery 上传图片转为base64,ajax提交到后台
    jquery 图片转为base64
  • 原文地址:https://www.cnblogs.com/oneapple/p/13406712.html
Copyright © 2020-2023  润新知