1
0
mirror of https://github.com/astaxie/beego.git synced 2024-06-29 08:24:14 +00:00
Beego/docs/zh/Quickstart.md
2013-04-14 23:20:38 +08:00

7.6 KiB
Raw Blame History

快速入门

你对beego一无所知没关系这篇文档会很好的详细介绍beego的各个方面看这个文档之前首先确认你已经安装了beego如果你没有安装的话请看这篇安装指南

导航

最小应用

一个最小最简单的应用如下代码所示:

package main

import (
	"github.com/astaxie/beego"
)

type MainController struct {
	beego.Controller
}

func (this *MainController) Get() {
	this.Ctx.WriteString("hello world")
}

func main() {
	beego.Router("/", &MainController{})
	beego.Run()
}

把上面的代码保存为hello.go然后通过命令行进行编译并执行

$ go build main.go
$ ./hello

这个时候你可以打开你的浏览器,通过这个地址浏览http://127.0.0.1:8080返回“hello world”

那么上面的代码到底做了些什么呢?

1、首先我们引入了包github.com/astaxie/beego,我们知道Go语言里面引入包会深度优先的去执行引入包的初始化(变量和init函数更多)beego包中会初始化一个BeeAPP的应用初始化一些参数。

2、定义Controller这里我们定义了一个struct为MainController充分利用了Go语言的组合的概念匿名包含了beego.Controller,这样我们的MainController就拥有了beego.Controller的所有方法。

3、定义RESTFul方法通过匿名组合之后其实目前的MainController已经拥有了GetPostDeletePut等方法这些方法是分别用来对应用户请求的Method函数如果用户发起的是POST请求,那么就执行Post函数。所以这里我们定义了MainControllerGet方法用来重写继承的Get函数,这样当用户GET请求的时候就会执行该函数。

4、定义main函数所有的Go应用程序和C语言一样都是Main函数作为入口所以我们这里定义了我们应用的入口。

5、Router注册路由路由就是告诉beego当用户来请求的时候该如何去调用相应的Controller这里我们注册了请求/的时候,请求到MainController。这里我们需要知道Router函数的两个参数函数第一个是路径第二个是Controller的指针。

6、Run应用最后一步就是把在1中初始化的BeeApp开启起来其实就是内部监听了8080端口:Go默认情况会监听你本机所有的IP上面的8080端口

停止服务的话,请按ctrl+c

新建项目

通过如下命令创建beego项目首先进入gopath目录

bee create hello

这样就建立了一个项目hello目录结构如下所示

.
├── conf
│   └── app.conf
├── controllers
│   └── default.go
├── main.go
├── models
├── static
│   ├── css
│   ├── img
│   └── js
└── views
    └── index.tpl

开发模式

通过bee创建的项目beego默认情况下是开发模式。

我们可以通过如下的方式改变我们的模式:

beego.RunMode = "pro"

或者我们在conf/app.conf下面设置如下

runmode = pro

以上两种效果一样。

开发模式中

  • 开发模式下如果你的目录不存在views目录那么会出现类似下面的错误提示

      2013/04/13 19:36:17 [W] [stat views: no such file or directory]
    
  • 模板会自动重新加载不缓存。

  • 如果服务端出错,那么就会在浏览器端显示如下类似的截图:

路由设置

路由的主要功能是实现从请求地址到实现方法beego中封装了Controller,所以路由是从路径到ControllerInterface的过程,ControllerInterface的方法有如下:

type ControllerInterface interface {
	Init(ct *Context, cn string)
	Prepare()
	Get()
	Post()
	Delete()
	Put()
	Head()
	Patch()
	Options()
	Finish()
	Render() error
}

这些方法beego.Controller都已经实现了所以只要用户定义struct的时候匿名包含就可以了。当然更灵活的方法就是用户可以去自定义类似的方法然后实现自己的逻辑。

用户可以通过如下的方式进行路由设置:

beego.Router("/", &controllers.MainController{})
beego.Router("/admin", &admin.UserController{})
beego.Router("/admin/index", &admin.ArticleController{})
beego.Router("/admin/addpkg", &admin.AddController{})

为了用户更加方便的路由设置beego参考了sinatra的路由实现支持多种方式的路由

  • beego.Router("/api/:id([0-9]+)", &controllers.RController{})
    自定义正则匹配 //匹配 /api/123 :id= 123

  • beego.Router("/news/:all", &controllers.RController{})
    全匹配方式 //匹配 /news/path/to/123.html :all= path/to/123.html

  • 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

  • beego.Router("/🆔int", &controllers.RController{})
    int类型设置方式 //匹配 :id为int类型框架帮你实现了正则([0-9]+)

  • beego.Router("/:hi:string", &controllers.RController{})
    string类型设置方式 //匹配 :hi为string类型。框架帮你实现了正则([\w]+)

静态文件

Go语言内部其实已经提供了http.ServeFile通过这个函数可以实现静态文件的服务。beego针对这个功能进行了一层封装通过下面的方式进行静态文件注册

beego.SetStaticPath("/static","public")
  • 第一个参数是路径url路径信息
  • 第二个参数是静态文件目录(相对应用所在的目录)

beego支持多个目录的静态文件注册用户可以注册如下的静态文件目录

beego.SetStaticPath("/images","images")
beego.SetStaticPath("/css","css")
beego.SetStaticPath("/js","js")

设置了如上的静态目录之后,用户访问/images/login/login.png,那么就会访问应用对应的目录下面的images/login/login.png文件。如果是访问/static/img/logo.png,那么就访问public/img/logo.png文件。

过滤和中间件

beego支持自定义过滤中间件例如安全验证强制跳转等

如下例子所示验证用户名是否是admin应用于全部的请求

var FilterUser = func(w http.ResponseWriter, r *http.Request) {
    if r.URL.User == nil || r.URL.User.Username() != "admin" {
        http.Error(w, "", http.StatusUnauthorized)
    }
}

beego.Filter(FilterUser)

还可以通过参数进行过滤,如果匹配参数就执行

beego.Router("/:id([0-9]+)", &admin.EditController{})
beego.FilterParam("id", func(rw http.ResponseWriter, r *http.Request) {
    dosomething()
})

当然你还可以通过前缀过滤

beego.FilterPrefixPath("/admin", func(rw http.ResponseWriter, r *http.Request) {
    dosomething()
})

模板处理

request处理

跳转和错误

response处理

Sessions

Cache设置

安全的Map

日志处理

第三方应用集成

部署编译应用