十九、Beego框架快速入门

Beego框架快速入门

1.框架了解

  • go语言的web框架:beego,gin,echo等等,那为什么我们选择beego呢?
  • 第一,beego是中国人开发的,开发文档比较详细,beego官网网址: https://beego.me/ 。
  • 第二,现在公司里面用beego的也比较多,比如今日头条,百度云盘,腾讯,阿里等。

2.环境搭建

  • 这里默认大家已经搭建好了go语言的开发环境。
  • 需要安装Beego源码和Bee开发工具:
    • go get -u -v github.com/astaxie/beego
    • go get -u -v github.com/beego/bee
  • Bee开发工具带有很多Bee命令。比如bee new 创建项目, bee run 运行项目等。用bee运行项目,项目自带热更新
  • 安装完之后,bee可执行文件默认存放在KaTeX parse error: Expected 'EOF', got '\bin' at position 7: GOPATH\̲b̲i̲n̲ ̲里面,所以需要把GOPATH\bin 添加到您的环境变量中
  • 安装好之后,运行bee new preojectName 来创建一个项目,注意:通过bee创建的项目代码都是在$GOPATH/src 目录下面的
  • 生成的项目目录结构如下:
quickstart
│
│  main.go                    ##项目的入口文件
│
├─conf                        ##放的是项目有关的配置文件
│      app.conf
│
├─controllers                 ##存放主要的业务代码
│      default.go
│
├─models                      ##存放的是数据库有关内容
├─routers                     ##存放路由文件,路由作用是根据不同的请求指定不同的控制器
│      router.go
│
├─static                      ##存放静态资源,包括图片,html页面,css样式,js文件等
│  ├─css
│  ├─img
│  └─js
│          reload.min.js
│
├─tests                       ##测试文件
│      default_test.go
│
└─views                       ##存放视图有关内容
        index.tpl
  • 进入项目目录 执行bee run 命令,在浏览器输入网址:http://127.0.0.1:8080

3.快速体验

  • 修改controllers\default.go下的:c.TplName = “index.tpl” 为 c.TplName = “test.html”
  • 在views下新建一个test.html
  • c.Data[“Email”] = "[email protected]" 是给视图传递数据,在视图界面里面需要用{{ }} 加上. 才能获取到
  • c.TplName = “index.tpl” 的作用是指定视图。默认指定的界面是tpl结尾,但是打开这个文件分析,发现还是一个html界面。


    

Hello World

{{.Website}}

{{.Email}}

  • 从项目的入口main.go开始
  • 找到router.go文件的Init函数
  • 找到路由指定的控制器文件default.go的Get方法
  • 然后找到指定视图的语法,整个项目就串起来啦。
  • 现在访问:http://127.0.0.1:8080,在浏览器看见的就是自定义的test.html

4.Post请求

  • 修改我们刚才创建的新的视图,为了能够发送post请求,我们在视图中添加一个能发送post请求的控件form
  • 在routers\router.go中加入一行:
    • beego.Router("/index", &controllers.IndexController{})
  • 在controllers\default.go 加入以下代码:
type IndexController struct {
	beego.Controller
}

func (c *IndexController) Post() {
	c.Data["test"] = "区块链"
	c.TplName = "test.html"
}
  • 在test.html中设置一个能接收后台传递过来的数据的标签:

    {{.test}}

  • 现在访问:http://127.0.0.1:8080,在浏览器就可以看见后台渲染页面的数据"区块链"
  • 默认get请求访问Get()方法,post请求访问Post()方法。

5.路由设置

  • 一般在开发过程中,我们基本不使用beego提供的默认请求访问方法,都是自定义相应的方法。
  • 自定义请求方法需要用到Router的第三个参数。这个参数是用来给不同的请求指定不同的方法。具体有如下几种情况。
    • 一个请求访问一个方法(也是最常用的),请求和方法之间用 : 隔开,不同的请求用 ; 隔开:
    • beego.Router("/simple",&SimpleController{},“get:GetFunc;post:PostFunc”)
    • 可以多个请求,访问一个方法 ,请求之间用, 隔开,请求与方法之间用: 隔开:
    • beego.Router("/api",&RestController{},“get,post:ApiFunc”)
    • 所有的请求访问同一个方法,用* 号代表所有的请求,和方法之间用: 隔开:
    • beego.Router("/api/list",&RestController{},"*:ListFood")
    • 如果同时存在 * 和对应的 HTTP请求,那么优先执行 HTTP请求所对应的方法,例如同时注册了如下所示的路由:
    • beego.Router("/simple",&SimpleController{},"*:AllFunc;post:PostFunc")
    • 那么当遇到Post请求的时候,执行PostFunc而不是AllFunc。
  • 如果用了自定义方法之后,默认请求方法Get、Post将不能访问。
5.1正则路由
  • 为了用户更方便的设置路由,还支持正则路由:
  • beego.Router("/api/?:id", &controllers.RController{})
    • 获取/api/*请求的所有值,赋值给id。在Controller里面可以获取:id := c.GetString(":id")
  • beego.Router("/api/:id([0-9]+)", &controllers.RController{})
    • 匹配 /api/123 :id=123
  • beego.Router("/user/:username([\w]+)", &controllers.RController{})
    • 配 /user/astaxie :username=astaxie
  • beego.Router("/download/.", &controllers.RController{})
    • 匹配 /download/file/api.xml :path=file/api :ext=xml
  • beego.Router("/download/ceshi/*", &controllers.RController{})
    • 匹配 /download/ceshi/file/api.json :splat=file/api.json

6.ORM框架

  • Beego中内嵌了ORM框架,用来操作数据库。在 models下新建一个go文件 model.go:
package models

import "github.com/astaxie/beego/orm"

//User这个对象映射到数据库就是一个表
//如果user表不存在,在bee run启动的时候就会自动创建表
//ORM默认会以变量名为Id,类型为int的字段当主键,主键是自增的
type User struct {
	Id     int
	Name   string
	Passwd string
}

func init() {
	//1.连接数据库,第一个参数为数据库别名,也可以理解为数据库的key值,项目中必须有且只能有一个别名为default 的连接
	orm.RegisterDataBase("default", "mysql", "root:root@tcp(180.76.248.109:3306)/golang?charset=utf8")

	//2.注册表,如果有多个表,可以用 , 隔开,多new几个对象
	orm.RegisterModel(new(User))

	//3.生成表
	//3.1 数据库别名
	//3.2 是否强制更新,一般我们写的都是false,如果写true的话,每次项目编译一次数据库就会被清空一次
	//3.3 创建表过程是否可见
	orm.RunSyncdb("default", false, true)
}
  • 因为这里我们把ORM初始化的代码放到了 models包的init()函数里面,所以如果我们想让他执行的话就需要在 main.go里面加入这么一句代码:
package main

import (
	_ "beegodemo/routers"       ##在项目启动之前,会先执行这两个package下面的init()函数
	_ "beegodemo/models"        ##这行代码就是新加的
	"github.com/astaxie/beego"
)

func main() {
	beego.Run()
}
  • 新增一个请求路由:
  • beego.Router("/mysql", &controllers.MysqlController{},“get:GetFunc;post:PostFunc”)
  • 然后在 controllers 下新增一个go文件 MysqlController.go:
package controllers

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

//继承Controller
type MysqlController struct {
	beego.Controller
}

//get请求,测试操作数据库
func (c *MysqlController) GetFunc() {
	db, _ := sql.Open("mysql", "root:root@(180.76.248.109:3306)/golang")
	defer db.Close()
	err := db.Ping()
	if err != nil {
		fmt.Println("数据库连接失败:", err)
		c.Ctx.WriteString("数据库连接失败")
	}

	var id, name string
	rows := db.QueryRow("select * from stu where id=?", 2)
	rows.Scan(&id, &name)
	c.Data["id"] = id
	c.Data["name"] = name
	c.TplName = "index.html"
}

//post请求
func (c *MysqlController) PostFunc() {
	o := orm.NewOrm() //先获取一个ORM对象

	//插入
	var user models.User //定义一个要插入数据库的结构体对象
	//这里不用给Id赋值,因为Id是自增的
	user.Name = "事后诸葛亮"
	user.Passwd = "1q2w3e"
	id, err := o.Insert(&user)
	if err != nil {
		beego.Error("插入失败:", err)
	}
	beego.Info("插入数据成功,ID为:", id)

	//删除
	var u models.User
	u.Id = 1 //删除的对象主键必须有值,如果主键没值,就查询一下。
	count, err := o.Delete(&u)
	if err != nil {
		beego.Info("删除失败", err)
	}
	beego.Info("删除了", count, "行记录,ID为:", u.Id)

	//查询
	user.Id = int(id)
	err = o.Read(&user)
	if err != nil {
		beego.Error("查询失败0", err)
	}
	beego.Info("查询数据:", user)

	//修改
	user.Id = int(id)
	user.Name = "张胜鸿"
	count, err = o.Update(&user)
	if err != nil {
		beego.Error("更新失败", err)
	}
	beego.Info("修改了", count, "行记录,ID为:", user.Id)

	c.Data["id"] = user.Id
	c.Data["name"] = user.Name
	c.TplName = "index.html"
}
  • 在 views\index.html加入代码:
  • 最后,在浏览器中输入:http://127.0.0.1/mysql 测试orm

你可能感兴趣的:(Golang)