Beego框架快速入门
1.框架了解
- go语言的web框架:beego,gin,echo等等,那为什么我们选择beego呢?
- 第一,beego是中国人开发的,开发文档比较详细,beego官网网址: https://beego.me/ 。
- 第二,现在公司里面用beego的也比较多,比如今日头条,百度云盘,腾讯,阿里等。
2.环境搭建
- 这里默认大家已经搭建好了go语言的开发环境。
- 需要安装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
3.快速体验
- 修改controllers\default.go下的:c.TplName = “index.tpl” 为 c.TplName = “test.html”
- 在views下新建一个test.html
- c.Data[“Email”] = "astaxie@gmail.com" 是给视图传递数据,在视图界面里面需要用{{ }} 加上. 才能获取到
- c.TplName = “index.tpl” 的作用是指定视图。默认指定的界面是tpl结尾,但是打开这个文件分析,发现还是一个html界面。
<html>
<body>
<center>
<h1>Hello World</h1>
<h1>{{.Website}}</h1>
<h1>{{.Email}}</h1>
</center>
</body>
</html>
- 从项目的入口main.go开始
- 找到router.go文件的Init函数
- 找到路由指定的控制器文件default.go的Get方法
- 然后找到指定视图的语法,整个项目就串起来啦。
- 现在访问:http://127.0.0.1:8080,在浏览器看见的就是自定义的test.html
4.Post请求
- 修改我们刚才创建的新的视图,为了能够发送post请求,我们在视图中添加一个能发送post请求的控件form
<form method="post" action="/index">
<input type="submit">
</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中设置一个能接收后台传递过来的数据的标签:<h1>{{.test}}</h1>
- 现在访问: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{})
- 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"
}
<form method="post" action="/mysql">
<input type="submit">
</form>