beego框架基本使⽤知识点整理
beego 官⽹的教程已经整理的⾮常详细了,但作为⼀个刚接触的学习者,还是有必要做⼀下整理,这样在后⾯使⽤的时候遇到了不太熟悉的地⽅,还能反过头来看下⾃⼰整理的内容,快速的把知识再捞回来,下⾯是对官⽹的⼀个精简整理,同时结合⼀些例⼦,更好的理解和使⽤ beego 这个框架去做⼀些 web 开发
beego 与 bee 的安装
//beego 框架
go /astaxie/beego
//bee⼯具
go /beego/bee
bee ⼯具是⼀个为了协助快速开发 beego 项⽬⽽创建的项⽬⼯具,通过 bee 可以很容易的进⾏ beego 项⽬的创建,热编译,开发,测试和部署。
当我们安装好 bee ⼯具后,bee 命令默认是放在 GOPATH/bin ⽬录下
bee 常⽤命令
1)bee new <;项⽬名>
创建⼀个项⽬,这样的项⽬⼀般是 web 项⽬
bee new MyWeb
需要注意的是,这个命令会在 $GOPATH/src ⽬录下⽣成框架代码,⽬录结构是:
├── conf
│└── f
├── controllers
│└──
├──
├── models
├── routers
│└──
其他业务利润├── static
│├── css
│├── img
│└── js
│└── reload.min.js
├── tests
│└──
└── views
└── index.tpl
2)bee api <api项⽬名>
bee api MyAPI
创建⼀个 api 项⽬,⽬录结构是:
├── conf
│└── f
├── controllers
│├──
│└── ur.go
├──
├── models
慢性病申请│├──
│└── ur.go
├── routers
│└──
└── tests
└──
3)bee run
这个命令是监控 beego 的项⽬,通过 fsnotify 监控⽂件系统,但是注意该命令必须在 $GOPATH/src/appname ⽬录下执⾏,否则提⽰:Failed to build the application
这样当我们在开发过程中,beego 可以实时监测我们的代码⽂件发⽣变化,这样我们就不⽤重新编译运⾏,⾮常⽅便调试
通过 bee run 运⾏上⾯创建的 MyWeb 项⽬:
D:\golang_workspace\project\src\MyWeb>bee run金光闪闪类似词语
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.10.0
2019/07/15 22:43:59 INFO ▶ 0001 Using 'MyWeb' as 'appname'
2019/07/15 22:43:59 INFO ▶ 0002
MyWeb/controllers
MyWeb/routers
垃圾分类标准MyWeb
2019/07/15 22:44:02 SUCCESS ▶ 0003 Built Successfully!
2019/07/15 22:44:02 INFO ▶ 0004 Restarting ''...
2019/07/15 22:44:02 SUCCESS ▶ 0005 './'
2019/07/15 22:44:02.644 [I] [asm_amd64.s:1337] http rver Running on :8080
通过浏览器访问:http:127.0.0.1:8080,可以看到下图所⽰:
beego 架构
1)beego 架构图
这是 beego 的 8 个独⽴的模块:
2)beego 执⾏逻辑
由图可知,beego 是⼀个典型的 MVC 架构,
从上⾯的 MyWeb 的⽬录接⼝也可以看出来,M(models)、V(views)和 C(controllers)的结构
beego 路由设置
1)beego main
package main
import (
_ "MyWeb/routers"
"/astaxie/beego"
)
func main() {
beego.Run()
}
引⼊了⼀个包 "MyWeb/routers",下⾯看⼀下这个包的内容
2)routers
这⾥仅仅做了⼀个优化,路由包⾥⾯我们看到了 beego.Router() ⽅法执⾏了路由注册,这个⽅法是映射 url 到 controller
第⼀个参数是 url(⽤户的请求地址),这⾥注册的是 "/",也就是我们访问的根路由,第⼆个参数是对应的 controller,也就是即将把请求分发到哪个控制器来执⾏相应的逻辑package routers
import (
"MyWeb/controllers"
"/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
}
对路由设置的⼀个⼩结:
1. Router() ⽅法设置 url 和 controller
2. 程序启动时,路由配置加载好,保存在 map 中
3. 请求处理时,通过请求的 url 进⾏查找对应的 controller,把请求分发到 controller 执⾏
4. 我们的要做的是在 controller 中编写业务代码即可
3)controller
对下⾯代码进⾏简单分析:
1. ⽤户的 controller 嵌套 beego.Controller,继承 beego.Controller 所有属性和⽅法
2. Controller 默认使⽤ restful 的风格,Get 请求对应 Get() ⽅法
3. 通过对应的业务处理之后,把数据赋值给 Controller.Data 这个 map 即可
c.TplName = "index.tpl" 会默认到 views ⽬录下查找模板⽂件
package controllers
import (
"/astaxie/beego"
)
type MainController struct {
beego.Controller //这⾥可以看做是继承
}
func (c *MainController) Get() {
c.Data["Website"] = ""
c.Data["Email"] = ""
大手拉小手
c.TplName = "index.tpl"
}
除了上⾯的 c.Data 这种⽅法之外,还有其它⽅法返回响应数据,如常⽤的 c.ServerJson() ⽅法,这样就会去 c.Data 中寻找 key 为 json 的值
⽤户设置了模板之后系统会⾃动调⽤ Render() 函数(这个函数是在 beego.Controller 中实现的),所以⽆需⽤户⾃⼰来调⽤渲染nuk奶瓶
当然也可以不使⽤模板,直接⽤ c.Ctx.WriteString() ⽅法输出字符串,如:
func (c *MainController) Get() {
c.Ctx.WriteString("hello")
}
4)正则路由
beego.Router("/api/?:id", &controllers.RController{}) 默认匹配 //匹配 /api/123 :id = 123 可以匹配 /api/
这个URL
beego.Router("/api/:id", &controllers.RController{}) 默认匹配 //匹配 /api/123 :id = 123 不可以匹配 /api/ 这个URL机械翅膀
beego.Router("/api/:id([0-9]+)", &controllers.RController{}) ⾃定义正则匹配 //匹配 /api/123 :id = 123
beego.Router("/ur/:urname([\w]+)", &controllers.RController{}) 正则字符串匹配 //匹配 /ur/astaxie :urname = astaxie
beego.Router("/download/*.*", &controllers.RController{}) *匹配⽅式 //匹配 /download/l :path= file/api :ext=xml
beego.Router("/download/ceshi/*", &controllers.RController{}) *全匹配⽅式 //匹配 /download/ceshi/file/api.json :splat=file/api.json
beego.Router("/:id:int", &controllers.RController{}) int 类型设置⽅式,匹配 :id为int 类型,框架帮你实现了正则 ([0-9]+)
beego.Router("/:hi:string", &controllers.RController{}) string 类型设置⽅式,匹配 :hi 为 string 类型。框架帮你实现了正则 ([\w]+)
beego.Router("/cms_:id([0-9]+).html", &controllers.CmsController{}) 带有前缀的⾃定义正则 //匹配 :id 为正则类型。匹配 cms_123.html 这样的 url :id = 123
可以在 Controller 中通过如下⽅式获取上⾯的变量:
this.Ctx.Input.Param(":id")
this.Ctx.Input.Param(":urname")
this.Ctx.Input.Param(":splat")
this.Ctx.Input.Param(":path")
this.Ctx.Input.Param(":ext")
⾃定义⽅法及 RESTful 规则:
beego.Router("/", &IndexController{}, "*:Index")
使⽤第三个参数,第三个参数就是⽤来设置对应 method 到函数名,定义如下
*表⽰任意的 method 都执⾏该函数
使⽤ httpmethod:funcname 格式来展⽰
多个不同的格式使⽤ ; 分割
多个 method 对应同⼀个 funcname,method 之间通过 , 来分割
beego.Router("/api",&RestController{},"get,post:ApiFunc")
可⽤的 HTTP Method:
*: 包含以下所有的函数
get: GET 请求
post: POST 请求
put: PUT 请求
delete: DELETE 请求
patch: PATCH 请求
options: OPTIONS 请求
head: HEAD 请求
如果同时存在 * 和对应的 HTTP Method,那么优先执⾏ HTTP Method 的⽅法
beego model
web 应⽤中⽤的最多的就是数据库操作,⽽ model 层⼀般⽤来做这些操作,bee new 例⼦不存在 model 的演⽰,但是 bee api 应⽤中存在 model 的应⽤,说的简单⼀点,如果你的应⽤⾜够简单,那么 Controller 可以处理⼀切的逻辑,如果你的逻辑⾥⾯存在着可以复⽤的东西,那么就抽取出来变成⼀个模块,因此 model 是逐步抽象的过程beego views
beego 模板默认⽀持 .tpl 和 .html 两种后缀
beego.AddTemplateExt() ⽅法增加新的模板后缀
beego 模板⽤的就是 Go 官⽹⾃带的模板
beego static
beego 默认注册了 static ⽬录为静态处理的⽬录
注册样式:url 前缀和映射的⽬录(在 / ⽂件中 beego.Run() 之前加⼊)
StaticDir["/static"] = "static"
beego 默认使⽤ static ⽬录作为静态⽂件⽬录
beego.SetStaticPath() ⽅法增加新的静态⽂件⽬录
beego conf(配置⽂件)
默认的配置⽂件内容:
appname = MyWeb
httpport = 8080
runmode = dev
增加配置⽂件内容:
appname = MyWeb
httpport = 8080
runmode = dev
mysqlhost = 127.0.0.1
mysqlport = 3308
urname = root
passwd = 123
获取配置⽂件中变量的值:克雷洛夫寓言有哪些故事
beego.AppConfig.String("mysqlhost")
beego.AppConfig.String("mysqlport")
可以通过 [命名] 的⽅式将配置⽂件进⾏分组,然后在获取变量时,可以通过下⾯的⽅式获取
设置变量的值:
appname = MyWeb
httpport = 8080
runmode = dev
[dbconfig]
mysqlhost = 127.0.0.1
mysqlport = 3308
urname = root
passwd = 123
获取变量的值:
beego.AppConfig.String("dbconfig::mysqlhost")
beego.AppConfig.String("dbconfig::mysqlport")
Appconfig 的⽅法如下:
Set(key, val string) error
String(key string) string
Strings(key string) []string
Int(key string) (int, error)
Int64(key string) (int64, error)
Bool(key string) (bool, error)
Float(key string) (float64, error)
DefaultString(key string, defaultVal string) string
DefaultStrings(key string, defaultVal []string)
DefaultInt(key string, defaultVal int) int
DefaultInt64(key string, defaultVal int64) int64
DefaultBool(key string, defaultVal bool) bool
DefaultFloat(key string, defaultVal float64) float64
DIY(key string) (interface{}, error)
GetSection(ction string) (map[string]string, error)
SaveConfigFile(filename string) error
获取⽤户请求参数
Controller 中的⽅法获取(不论是 post 还是 get 的请求⽅式,都可以通过上⾯的⽅式获取)
1. GetString(key string) string
2. GetStrings(key string) []string
3. GetInt(key string) (int64, error)
4. GetBool(key string) (bool, error)
5. GetFloat(key string) (float64, error)
如果在平常开发中肯定涉及到 json 格式的数据,那么获取 json 格式的数据可以通过下⾯的⽅法:Ctx.Input.RequestBody //获取原始数据
配置⽂件⾥设置 copyrequestbody = true,这样就可以通过 c.Ctx.Input.RequestBody 获取了ending ~