add SaveToFile & docs
Showing
2 changed files
with
347 additions
and
261 deletions
| ... | @@ -6,10 +6,12 @@ import ( | ... | @@ -6,10 +6,12 @@ import ( |
| 6 | "encoding/xml" | 6 | "encoding/xml" |
| 7 | "github.com/astaxie/beego/session" | 7 | "github.com/astaxie/beego/session" |
| 8 | "html/template" | 8 | "html/template" |
| 9 | "io" | ||
| 9 | "io/ioutil" | 10 | "io/ioutil" |
| 10 | "mime/multipart" | 11 | "mime/multipart" |
| 11 | "net/http" | 12 | "net/http" |
| 12 | "net/url" | 13 | "net/url" |
| 14 | "os" | ||
| 13 | "path" | 15 | "path" |
| 14 | "strconv" | 16 | "strconv" |
| 15 | "strings" | 17 | "strings" |
| ... | @@ -197,6 +199,21 @@ func (c *Controller) GetFile(key string) (multipart.File, *multipart.FileHeader, | ... | @@ -197,6 +199,21 @@ func (c *Controller) GetFile(key string) (multipart.File, *multipart.FileHeader, |
| 197 | return c.Ctx.Request.FormFile(key) | 199 | return c.Ctx.Request.FormFile(key) |
| 198 | } | 200 | } |
| 199 | 201 | ||
| 202 | func (c *Controller) SaveToFile(fromfile, tofile string) error { | ||
| 203 | file, _, err := c.Ctx.Request.FormFile(fromfile) | ||
| 204 | if err != nil { | ||
| 205 | return err | ||
| 206 | } | ||
| 207 | defer file.Close() | ||
| 208 | f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) | ||
| 209 | if err != nil { | ||
| 210 | return err | ||
| 211 | } | ||
| 212 | defer f.Close() | ||
| 213 | io.Copy(f, file) | ||
| 214 | return nil | ||
| 215 | } | ||
| 216 | |||
| 200 | func (c *Controller) StartSession() (sess session.SessionStore) { | 217 | func (c *Controller) StartSession() (sess session.SessionStore) { |
| 201 | sess = GlobalSessions.SessionStart(c.Ctx.ResponseWriter, c.Ctx.Request) | 218 | sess = GlobalSessions.SessionStart(c.Ctx.ResponseWriter, c.Ctx.Request) |
| 202 | return | 219 | return | ... | ... |
| 1 | # 快速入门 | 1 | # 快速入门 |
| 2 | 你对beego一无所知?没关系,这篇文档会很好的详细介绍beego的各个方面,看这个文档之前首先确认你已经安装了beego,如果你没有安装的话,请看这篇[安装指南](Install.md) | 2 | 你对beego一无所知?没关系,这篇文档会很好的详细介绍beego的各个方面,看这个文档之前首先确认你已经安装了beego,如果你没有安装的话,请看这篇[安装指南](Install.md) |
| 3 | 3 | ||
| 4 | **导航** | 4 | **导航** |
| 5 | 5 | ||
| 6 | - [最小应用](#-1) | 6 | - [最小应用](#-1) |
| 7 | - [新建项目](#-2) | 7 | - [新建项目](#-2) |
| 8 | - [开发模式](#-3) | 8 | - [开发模式](#-3) |
| 9 | - [路由设置](#-4) | 9 | - [路由设置](#-4) |
| 10 | - [静态文件](#-5) | 10 | - [静态文件](#-5) |
| 11 | - [过滤和中间件](#-6) | 11 | - [过滤和中间件](#-6) |
| 12 | - [模板处理](#-7) | 12 | - [模板处理](#-7) |
| 13 | - [request处理](#-8) | 13 | - [request处理](#-8) |
| 14 | - [跳转和错误](#-9) | 14 | - [跳转和错误](#-9) |
| 15 | - [response处理](#-10) | 15 | - [response处理](#-10) |
| 16 | - [Sessions](#-11) | 16 | - [Sessions](#-11) |
| 17 | - [Cache设置](#-12) | 17 | - [Cache设置](#-12) |
| 18 | - [安全的Map](#-13) | 18 | - [安全的Map](#-13) |
| 19 | - [日志处理](#-14) | 19 | - [日志处理](#-14) |
| 20 | - [第三方应用集成](#-15) | 20 | - [第三方应用集成](#-15) |
| 21 | - [部署编译应用](#-16) | 21 | - [部署编译应用](#-16) |
| 22 | 22 | ||
| 23 | ## 最小应用 | 23 | ## 最小应用 |
| 24 | 一个最小最简单的应用如下代码所示: | 24 | 一个最小最简单的应用如下代码所示: |
| 25 | 25 | ||
| 26 | package main | 26 | package main |
| 27 | 27 | ||
| 28 | import ( | 28 | import ( |
| 29 | "github.com/astaxie/beego" | 29 | "github.com/astaxie/beego" |
| 30 | ) | 30 | ) |
| 31 | 31 | ||
| 32 | type MainController struct { | 32 | type MainController struct { |
| 33 | beego.Controller | 33 | beego.Controller |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | func (this *MainController) Get() { | 36 | func (this *MainController) Get() { |
| 37 | this.Ctx.WriteString("hello world") | 37 | this.Ctx.WriteString("hello world") |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | func main() { | 40 | func main() { |
| 41 | beego.Router("/", &MainController{}) | 41 | beego.Router("/", &MainController{}) |
| 42 | beego.Run() | 42 | beego.Run() |
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | 把上面的代码保存为hello.go,然后通过命令行进行编译并执行: | 45 | 把上面的代码保存为hello.go,然后通过命令行进行编译并执行: |
| 46 | 46 | ||
| 47 | $ go build main.go | 47 | $ go build main.go |
| 48 | $ ./hello | 48 | $ ./hello |
| 49 | 49 | ||
| 50 | 这个时候你可以打开你的浏览器,通过这个地址浏览[http://127.0.0.1:8080](http://127.0.0.1:8080)返回“hello world” | 50 | 这个时候你可以打开你的浏览器,通过这个地址浏览[http://127.0.0.1:8080](http://127.0.0.1:8080)返回“hello world” |
| 51 | 51 | ||
| 52 | 那么上面的代码到底做了些什么呢? | 52 | 那么上面的代码到底做了些什么呢? |
| 53 | 53 | ||
| 54 | 1、首先我们引入了包`github.com/astaxie/beego`,我们知道Go语言里面引入包会深度优先的去执行引入包的初始化(变量和init函数,[更多](https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/02.3.md#maininit)),beego包中会初始化一个BeeAPP的应用,初始化一些参数。 | 54 | 1、首先我们引入了包`github.com/astaxie/beego`,我们知道Go语言里面引入包会深度优先的去执行引入包的初始化(变量和init函数,[更多](https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/02.3.md#maininit)),beego包中会初始化一个BeeAPP的应用,初始化一些参数。 |
| 55 | 55 | ||
| 56 | 2、定义Controller,这里我们定义了一个struct为`MainController`,充分利用了Go语言的组合的概念,匿名包含了`beego.Controller`,这样我们的`MainController`就拥有了`beego.Controller`的所有方法。 | 56 | 2、定义Controller,这里我们定义了一个struct为`MainController`,充分利用了Go语言的组合的概念,匿名包含了`beego.Controller`,这样我们的`MainController`就拥有了`beego.Controller`的所有方法。 |
| 57 | 57 | ||
| 58 | 3、定义RESTFul方法,通过匿名组合之后,其实目前的`MainController`已经拥有了`Get`、`Post`、`Delete`、`Put`等方法,这些方法是分别用来对应用户请求的Method函数,如果用户发起的是`POST`请求,那么就执行`Post`函数。所以这里我们定义了`MainController`的`Get`方法用来重写继承的`Get`函数,这样当用户`GET`请求的时候就会执行该函数。 | 58 | 3、定义RESTFul方法,通过匿名组合之后,其实目前的`MainController`已经拥有了`Get`、`Post`、`Delete`、`Put`等方法,这些方法是分别用来对应用户请求的Method函数,如果用户发起的是`POST`请求,那么就执行`Post`函数。所以这里我们定义了`MainController`的`Get`方法用来重写继承的`Get`函数,这样当用户`GET`请求的时候就会执行该函数。 |
| 59 | 59 | ||
| 60 | 4、定义main函数,所有的Go应用程序和C语言一样都是Main函数作为入口,所以我们这里定义了我们应用的入口。 | 60 | 4、定义main函数,所有的Go应用程序和C语言一样都是Main函数作为入口,所以我们这里定义了我们应用的入口。 |
| 61 | 61 | ||
| 62 | 5、Router注册路由,路由就是告诉beego,当用户来请求的时候,该如何去调用相应的Controller,这里我们注册了请求`/`的时候,请求到`MainController`。这里我们需要知道,Router函数的两个参数函数,第一个是路径,第二个是Controller的指针。 | 62 | 5、Router注册路由,路由就是告诉beego,当用户来请求的时候,该如何去调用相应的Controller,这里我们注册了请求`/`的时候,请求到`MainController`。这里我们需要知道,Router函数的两个参数函数,第一个是路径,第二个是Controller的指针。 |
| 63 | 63 | ||
| 64 | 6、Run应用,最后一步就是把在1中初始化的BeeApp开启起来,其实就是内部监听了8080端口:`Go默认情况会监听你本机所有的IP上面的8080端口` | 64 | 6、Run应用,最后一步就是把在1中初始化的BeeApp开启起来,其实就是内部监听了8080端口:`Go默认情况会监听你本机所有的IP上面的8080端口` |
| 65 | 65 | ||
| 66 | 停止服务的话,请按`ctrl+c` | 66 | 停止服务的话,请按`ctrl+c` |
| 67 | 67 | ||
| 68 | ## 新建项目 | 68 | ## 新建项目 |
| 69 | 69 | ||
| 70 | 通过如下命令创建beego项目,首先进入gopath目录 | 70 | 通过如下命令创建beego项目,首先进入gopath目录 |
| 71 | 71 | ||
| 72 | bee create hello | 72 | bee create hello |
| 73 | 73 | ||
| 74 | 这样就建立了一个项目hello,目录结构如下所示 | 74 | 这样就建立了一个项目hello,目录结构如下所示 |
| 75 | 75 | ||
| 76 | . | 76 | . |
| 77 | ├── conf | 77 | ├── conf |
| 78 | │ └── app.conf | 78 | │ └── app.conf |
| 79 | ├── controllers | 79 | ├── controllers |
| 80 | │ └── default.go | 80 | │ └── default.go |
| 81 | ├── main.go | 81 | ├── main.go |
| 82 | ├── models | 82 | ├── models |
| 83 | ├── static | 83 | ├── static |
| 84 | │ ├── css | 84 | │ ├── css |
| 85 | │ ├── img | 85 | │ ├── img |
| 86 | │ └── js | 86 | │ └── js |
| 87 | └── views | 87 | └── views |
| 88 | └── index.tpl | 88 | └── index.tpl |
| 89 | 89 | ||
| 90 | ## 开发模式 | 90 | ## 开发模式 |
| 91 | 91 | ||
| 92 | 通过bee创建的项目,beego默认情况下是开发模式。 | 92 | 通过bee创建的项目,beego默认情况下是开发模式。 |
| 93 | 93 | ||
| 94 | 我们可以通过如下的方式改变我们的模式: | 94 | 我们可以通过如下的方式改变我们的模式: |
| 95 | 95 | ||
| 96 | beego.RunMode = "pro" | 96 | beego.RunMode = "pro" |
| 97 | 97 | ||
| 98 | 或者我们在conf/app.conf下面设置如下: | 98 | 或者我们在conf/app.conf下面设置如下: |
| 99 | 99 | ||
| 100 | runmode = pro | 100 | runmode = pro |
| 101 | 101 | ||
| 102 | 以上两种效果一样。 | 102 | 以上两种效果一样。 |
| 103 | 103 | ||
| 104 | 开发模式中 | 104 | 开发模式中 |
| 105 | 105 | ||
| 106 | - 开发模式下,如果你的目录不存在views目录,那么会出现类似下面的错误提示: | 106 | - 开发模式下,如果你的目录不存在views目录,那么会出现类似下面的错误提示: |
| 107 | 107 | ||
| 108 | 2013/04/13 19:36:17 [W] [stat views: no such file or directory] | 108 | 2013/04/13 19:36:17 [W] [stat views: no such file or directory] |
| 109 | 109 | ||
| 110 | - 模板会自动重新加载不缓存。 | 110 | - 模板会自动重新加载不缓存。 |
| 111 | - 如果服务端出错,那么就会在浏览器端显示如下类似的截图: | 111 | - 如果服务端出错,那么就会在浏览器端显示如下类似的截图: |
| 112 | 112 | ||
| 113 |  | 113 |  |
| 114 | 114 | ||
| 115 | ## 路由设置 | 115 | ## 路由设置 |
| 116 | 116 | ||
| 117 | 路由的主要功能是实现从请求地址到实现方法,beego中封装了`Controller`,所以路由是从路径到`ControllerInterface`的过程,`ControllerInterface`的方法有如下: | 117 | 路由的主要功能是实现从请求地址到实现方法,beego中封装了`Controller`,所以路由是从路径到`ControllerInterface`的过程,`ControllerInterface`的方法有如下: |
| 118 | 118 | ||
| 119 | type ControllerInterface interface { | 119 | type ControllerInterface interface { |
| 120 | Init(ct *Context, cn string) | 120 | Init(ct *Context, cn string) |
| 121 | Prepare() | 121 | Prepare() |
| 122 | Get() | 122 | Get() |
| 123 | Post() | 123 | Post() |
| 124 | Delete() | 124 | Delete() |
| 125 | Put() | 125 | Put() |
| 126 | Head() | 126 | Head() |
| 127 | Patch() | 127 | Patch() |
| 128 | Options() | 128 | Options() |
| 129 | Finish() | 129 | Finish() |
| 130 | Render() error | 130 | Render() error |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | 这些方法`beego.Controller`都已经实现了,所以只要用户定义struct的时候匿名包含就可以了。当然更灵活的方法就是用户可以去自定义类似的方法,然后实现自己的逻辑。 | 133 | 这些方法`beego.Controller`都已经实现了,所以只要用户定义struct的时候匿名包含就可以了。当然更灵活的方法就是用户可以去自定义类似的方法,然后实现自己的逻辑。 |
| 134 | 134 | ||
| 135 | 用户可以通过如下的方式进行路由设置: | 135 | 用户可以通过如下的方式进行路由设置: |
| 136 | 136 | ||
| 137 | beego.Router("/", &controllers.MainController{}) | 137 | beego.Router("/", &controllers.MainController{}) |
| 138 | beego.Router("/admin", &admin.UserController{}) | 138 | beego.Router("/admin", &admin.UserController{}) |
| 139 | beego.Router("/admin/index", &admin.ArticleController{}) | 139 | beego.Router("/admin/index", &admin.ArticleController{}) |
| 140 | beego.Router("/admin/addpkg", &admin.AddController{}) | 140 | beego.Router("/admin/addpkg", &admin.AddController{}) |
| 141 | 141 | ||
| 142 | 为了用户更加方便的路由设置,beego参考了sinatra的路由实现,支持多种方式的路由: | 142 | 为了用户更加方便的路由设置,beego参考了sinatra的路由实现,支持多种方式的路由: |
| 143 | 143 | ||
| 144 | - beego.Router("/api/:id([0-9]+)", &controllers.RController{}) | 144 | - beego.Router("/api/:id([0-9]+)", &controllers.RController{}) |
| 145 | 自定义正则匹配 //匹配 /api/123 :id= 123 | 145 | 自定义正则匹配 //匹配 /api/123 :id= 123 |
| 146 | 146 | ||
| 147 | - beego.Router("/news/:all", &controllers.RController{}) | 147 | - beego.Router("/news/:all", &controllers.RController{}) |
| 148 | 全匹配方式 //匹配 /news/path/to/123.html :all= path/to/123.html | 148 | 全匹配方式 //匹配 /news/path/to/123.html :all= path/to/123.html |
| 149 | 149 | ||
| 150 | - beego.Router("/user/:username([\w]+)", &controllers.RController{}) | 150 | - beego.Router("/user/:username([\w]+)", &controllers.RController{}) |
| 151 | 正则字符串匹配 //匹配 /user/astaxie :username = astaxie | 151 | 正则字符串匹配 //匹配 /user/astaxie :username = astaxie |
| 152 | 152 | ||
| 153 | - beego.Router("/download/*.*", &controllers.RController{}) | 153 | - beego.Router("/download/*.*", &controllers.RController{}) |
| 154 | *匹配方式 //匹配 /download/file/api.xml :path= file/api :ext=xml | 154 | *匹配方式 //匹配 /download/file/api.xml :path= file/api :ext=xml |
| 155 | 155 | ||
| 156 | - beego.Router("/download/ceshi/*", &controllers.RController{}) | 156 | - beego.Router("/download/ceshi/*", &controllers.RController{}) |
| 157 | *全匹配方式 //匹配 /download/ceshi/file/api.json :splat=file/api.json | 157 | *全匹配方式 //匹配 /download/ceshi/file/api.json :splat=file/api.json |
| 158 | 158 | ||
| 159 | - beego.Router("/:id:int", &controllers.RController{}) | 159 | - beego.Router("/:id:int", &controllers.RController{}) |
| 160 | int类型设置方式 //匹配 :id为int类型,框架帮你实现了正则([0-9]+) | 160 | int类型设置方式 //匹配 :id为int类型,框架帮你实现了正则([0-9]+) |
| 161 | 161 | ||
| 162 | - beego.Router("/:hi:string", &controllers.RController{}) | 162 | - beego.Router("/:hi:string", &controllers.RController{}) |
| 163 | string类型设置方式 //匹配 :hi为string类型。框架帮你实现了正则([\w]+) | 163 | string类型设置方式 //匹配 :hi为string类型。框架帮你实现了正则([\w]+) |
| 164 | 164 | ||
| 165 | ## 静态文件 | 165 | ## 静态文件 |
| 166 | Go语言内部其实已经提供了`http.ServeFile`,通过这个函数可以实现静态文件的服务。beego针对这个功能进行了一层封装,通过下面的方式进行静态文件注册: | 166 | Go语言内部其实已经提供了`http.ServeFile`,通过这个函数可以实现静态文件的服务。beego针对这个功能进行了一层封装,通过下面的方式进行静态文件注册: |
| 167 | 167 | ||
| 168 | beego.SetStaticPath("/static","public") | 168 | beego.SetStaticPath("/static","public") |
| 169 | 169 | ||
| 170 | - 第一个参数是路径,url路径信息 | 170 | - 第一个参数是路径,url路径信息 |
| 171 | - 第二个参数是静态文件目录(相对应用所在的目录) | 171 | - 第二个参数是静态文件目录(相对应用所在的目录) |
| 172 | 172 | ||
| 173 | beego支持多个目录的静态文件注册,用户可以注册如下的静态文件目录: | 173 | beego支持多个目录的静态文件注册,用户可以注册如下的静态文件目录: |
| 174 | 174 | ||
| 175 | beego.SetStaticPath("/images","images") | 175 | beego.SetStaticPath("/images","images") |
| 176 | beego.SetStaticPath("/css","css") | 176 | beego.SetStaticPath("/css","css") |
| 177 | beego.SetStaticPath("/js","js") | 177 | beego.SetStaticPath("/js","js") |
| 178 | 178 | ||
| 179 | 设置了如上的静态目录之后,用户访问`/images/login/login.png`,那么就会访问应用对应的目录下面的`images/login/login.png`文件。如果是访问`/static/img/logo.png`,那么就访问`public/img/logo.png`文件。 | 179 | 设置了如上的静态目录之后,用户访问`/images/login/login.png`,那么就会访问应用对应的目录下面的`images/login/login.png`文件。如果是访问`/static/img/logo.png`,那么就访问`public/img/logo.png`文件。 |
| 180 | 180 | ||
| 181 | ## 过滤和中间件 | 181 | ## 过滤和中间件 |
| 182 | beego支持自定义过滤中间件,例如安全验证,强制跳转等 | 182 | beego支持自定义过滤中间件,例如安全验证,强制跳转等 |
| 183 | 183 | ||
| 184 | 如下例子所示,验证用户名是否是admin,应用于全部的请求: | 184 | 如下例子所示,验证用户名是否是admin,应用于全部的请求: |
| 185 | 185 | ||
| 186 | var FilterUser = func(w http.ResponseWriter, r *http.Request) { | 186 | var FilterUser = func(w http.ResponseWriter, r *http.Request) { |
| 187 | if r.URL.User == nil || r.URL.User.Username() != "admin" { | 187 | if r.URL.User == nil || r.URL.User.Username() != "admin" { |
| 188 | http.Error(w, "", http.StatusUnauthorized) | 188 | http.Error(w, "", http.StatusUnauthorized) |
| 189 | } | 189 | } |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | beego.Filter(FilterUser) | 192 | beego.Filter(FilterUser) |
| 193 | 193 | ||
| 194 | 还可以通过参数进行过滤,如果匹配参数就执行 | 194 | 还可以通过参数进行过滤,如果匹配参数就执行 |
| 195 | 195 | ||
| 196 | beego.Router("/:id([0-9]+)", &admin.EditController{}) | 196 | beego.Router("/:id([0-9]+)", &admin.EditController{}) |
| 197 | beego.FilterParam("id", func(rw http.ResponseWriter, r *http.Request) { | 197 | beego.FilterParam("id", func(rw http.ResponseWriter, r *http.Request) { |
| 198 | dosomething() | 198 | dosomething() |
| 199 | }) | 199 | }) |
| 200 | 200 | ||
| 201 | 当然你还可以通过前缀过滤 | 201 | 当然你还可以通过前缀过滤 |
| 202 | 202 | ||
| 203 | beego.FilterPrefixPath("/admin", func(rw http.ResponseWriter, r *http.Request) { | 203 | beego.FilterPrefixPath("/admin", func(rw http.ResponseWriter, r *http.Request) { |
| 204 | dosomething() | 204 | dosomething() |
| 205 | }) | 205 | }) |
| 206 | 206 | ||
| 207 | ## 模板处理 | 207 | ## 模板处理 |
| 208 | ### 模板目录 | 208 | ### 模板目录 |
| 209 | beego中默认的模板目录是`views`,用户可以把你的模板文件放到该目录下,beego会自动在该目录下的所有模板文件进行解析并缓存,开发模式下会每次重新解析,不做缓存。当然用户可以通过如下的方式改变模板的目录: | 209 | beego中默认的模板目录是`views`,用户可以把你的模板文件放到该目录下,beego会自动在该目录下的所有模板文件进行解析并缓存,开发模式下会每次重新解析,不做缓存。当然用户可以通过如下的方式改变模板的目录: |
| 210 | 210 | ||
| 211 | beego.ViewsPath = "/myviewpath" | 211 | beego.ViewsPath = "/myviewpath" |
| 212 | ### 自动渲染 | 212 | ### 自动渲染 |
| 213 | beego中用户无需手动的调用渲染输出模板,beego会自动的在调用玩相应的method方法之后调用Render函数,当然如果你的应用是不需要模板输出的,那么你可以在配置文件或者在main.go中设置关闭自动渲染。 | 213 | beego中用户无需手动的调用渲染输出模板,beego会自动的在调用玩相应的method方法之后调用Render函数,当然如果你的应用是不需要模板输出的,那么你可以在配置文件或者在main.go中设置关闭自动渲染。 |
| 214 | 214 | ||
| 215 | 配置文件配置如下: | 215 | 配置文件配置如下: |
| 216 | 216 | ||
| 217 | autorender = false | 217 | autorender = false |
| 218 | 218 | ||
| 219 | main.go文件中设置如下: | 219 | main.go文件中设置如下: |
| 220 | 220 | ||
| 221 | beego.AutoRender = false | 221 | beego.AutoRender = false |
| 222 | ### 模板名称 | 222 | ### 模板名称 |
| 223 | beego采用了Go语言内置的模板引擎,所有模板的语法和Go的一模一样,至于如何写模板文件,详细的请参考[模板教程](https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/07.4.md)。 | 223 | beego采用了Go语言内置的模板引擎,所有模板的语法和Go的一模一样,至于如何写模板文件,详细的请参考[模板教程](https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/07.4.md)。 |
| 224 | 224 | ||
| 225 | 用户通过在Controller的对应方法中设置相应的模板名称,beego会自动的在viewpath目录下查询该文件并渲染,例如下面的设置,beego会在admin下面找add.tpl文件进行渲染: | 225 | 用户通过在Controller的对应方法中设置相应的模板名称,beego会自动的在viewpath目录下查询该文件并渲染,例如下面的设置,beego会在admin下面找add.tpl文件进行渲染: |
| 226 | 226 | ||
| 227 | this.TplNames = "admin/add.tpl" | 227 | this.TplNames = "admin/add.tpl" |
| 228 | 228 | ||
| 229 | 我们看到上面的模板后缀名是tpl,beego默认情况下支持tpl和html后缀名的模板文件,如果你的后缀名不是这两种,请进行如下设置: | 229 | 我们看到上面的模板后缀名是tpl,beego默认情况下支持tpl和html后缀名的模板文件,如果你的后缀名不是这两种,请进行如下设置: |
| 230 | 230 | ||
| 231 | beego.AddTemplateExt("你文件的后缀名") | 231 | beego.AddTemplateExt("你文件的后缀名") |
| 232 | 232 | ||
| 233 | 当你设置了自动渲染,然后在你的Controller中没有设置任何的TplNames,那么beego会自动设置你的模板文件如下: | 233 | 当你设置了自动渲染,然后在你的Controller中没有设置任何的TplNames,那么beego会自动设置你的模板文件如下: |
| 234 | 234 | ||
| 235 | c.TplNames = c.ChildName + "/" + c.Ctx.Request.Method + "." + c.TplExt | 235 | c.TplNames = c.ChildName + "/" + c.Ctx.Request.Method + "." + c.TplExt |
| 236 | 236 | ||
| 237 | 也就是你对应的Controller名字+请求方法名.模板后缀,也就是如果你的Controller名是`AddController`,请求方法是`POST`,默认的文件后缀是`tpl`,那么就会默认请求`/viewpath/AddController/POST.tpl`文件。 | 237 | 也就是你对应的Controller名字+请求方法名.模板后缀,也就是如果你的Controller名是`AddController`,请求方法是`POST`,默认的文件后缀是`tpl`,那么就会默认请求`/viewpath/AddController/POST.tpl`文件。 |
| 238 | 238 | ||
| 239 | ### lauout设计 | 239 | ### lauout设计 |
| 240 | 240 | beego支持layout设计,例如你在管理系统中,其实整个的管理界面是固定的,支会变化中间的部分,那么你可以通过如下的设置: | |
| 241 | ### 模板函数 | 241 | |
| 242 | 242 | this.Layout = "admin/layout.html" | |
| 243 | ## request处理 | 243 | this.TplNames = "admin/add.tpl" |
| 244 | 244 | ||
| 245 | ## 跳转和错误 | 245 | 在layout.html中你必须设置如下的变量: |
| 246 | 246 | ||
| 247 | ## response处理 | 247 | {{.LayoutContent}} |
| 248 | 248 | ||
| 249 | ## Sessions | 249 | beego就会首先解析TplNames指定的文件,获取内容赋值给LayoutContent,然后最后渲染layout.html文件。 |
| 250 | 250 | ||
| 251 | ## Cache设置 | 251 | 目前采用首先把目录下所有的文件进行缓存,所以用户还可以通过类似这样的方式实现layout: |
| 252 | 252 | ||
| 253 | ## 安全的Map | 253 | {{template "header.html"}} |
| 254 | 254 | 处理逻辑 | |
| 255 | ## 日志处理 | 255 | {{template "footer.html"}} |
| 256 | 256 | ||
| 257 | ## 第三方应用集成 | 257 | ### 模板函数 |
| 258 | 258 | beego支持用户定义模板函数,但是必须在`beego.Run()`调用之前,设置如下: | |
| 259 | ## 部署编译应用 | 259 | |
| 260 | 260 | func hello(in string)(out string){ | |
| 261 | - [beego介绍](README.md) | 261 | out = in + "world" |
| 262 | return | ||
| 263 | } | ||
| 264 | |||
| 265 | beego.AddFuncMap("hi",hello) | ||
| 266 | |||
| 267 | 定义之后你就可以在模板中这样使用了: | ||
| 268 | |||
| 269 | {{.Content | hi}} | ||
| 270 | |||
| 271 | 目前beego内置的模板函数有如下: | ||
| 272 | |||
| 273 | * markdown | ||
| 274 | |||
| 275 | 实现了把markdown文本转化为html信息,使用方法{{markdown .Content}} | ||
| 276 | * dateformat | ||
| 277 | |||
| 278 | 实现了时间的格式化,返回字符串,使用方法{{dateformat .Time "2006-01-02T15:04:05Z07:00"}} | ||
| 279 | * date | ||
| 280 | |||
| 281 | 实现了类似PHP的date函数,可以很方便的根据字符串返回时间,使用方法{{date .T "Y-m-d H:i:s"}} | ||
| 282 | * compare | ||
| 283 | |||
| 284 | 实现了比较两个对象的比较,如果相同返回true,否者false,使用方法{{compare .A .B}} | ||
| 285 | * substr | ||
| 286 | |||
| 287 | 实现了字符串的截取,支持中文截取的完美截取,使用方法{{substr .Str 0 30}} | ||
| 288 | * html2str | ||
| 289 | |||
| 290 | 实现了把html转化为字符串,剔除一些script、css之类的元素,返回纯文本信息,使用方法{{html2str .Htmlinfo}} | ||
| 291 | * str2html | ||
| 292 | |||
| 293 | 实现了把相应的字符串当作HTML来输出,不转义,使用方法{{str2html .Strhtml}} | ||
| 294 | * htmlquote | ||
| 295 | |||
| 296 | 实现了基本的html字符转义,使用方法{{htmlquote .quote}} | ||
| 297 | * htmlunquote | ||
| 298 | |||
| 299 | 实现了基本的反转移字符,使用方法{{htmlunquote .unquote}} | ||
| 300 | |||
| 301 | ## request处理 | ||
| 302 | 我们经常需要获取用户传递的数据,包括Get、POST等方式的请求,beego里面会自动解析这些数据,你可以通过如下方式获取数据 | ||
| 303 | |||
| 304 | - GetString | ||
| 305 | - GetInt | ||
| 306 | - GetBool | ||
| 307 | |||
| 308 | |||
| 309 | ### 文件上传 | ||
| 310 | |||
| 311 | - GetFile | ||
| 312 | - SaveToFile | ||
| 313 | |||
| 314 | ## 跳转和错误 | ||
| 315 | |||
| 316 | ## response处理 | ||
| 317 | |||
| 318 | ## Sessions | ||
| 319 | |||
| 320 | ## Cache设置 | ||
| 321 | |||
| 322 | ## 安全的Map | ||
| 323 | |||
| 324 | ## 日志处理 | ||
| 325 | |||
| 326 | ## 第三方应用集成 | ||
| 327 | |||
| 328 | ## 部署编译应用 | ||
| 329 | |||
| 330 | - [beego介绍](README.md) | ||
| 262 | - [一步一步开发应用](Tutorial.md) | 331 | - [一步一步开发应用](Tutorial.md) |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or sign in to post a comment