第十二节 beego

1环境准备

命令行执行

1.
go get github.com/beego/bee
2.
go get github.com/astaxie/beego

如果抛错超时,则修改host文件,添加以下语句,然后使用ipconfig /flushdns刷新

# github访问
# 69.171.224.40 github.global.ssl.fastly.net
# 185.199.111.153 assets-cdn.github.com
140.82.112.4 github.com
140.82.114.4 www.github.com

如果抛错连接错误。则在环境变量中设置GOPROXY

GOPROXY=https://goproxy.cn,direct

然后下载最新的go压缩包,直接替换掉之前的安装包,重启电脑
安装好这些包后,将GOPATH/bin下的bee.exe路径添加到环境变量

2 设置模板路径

模板路径默认在views,如果需要设置成自定义路径,有两种方式
第一种是在main.go文件中的beego.Run()代码前添加beego.SetViewsPath("html")代码,html路径即为自定义的路径,第二种是在配置文件app.conf中设置,添加一行viewspath=html
如果不需要模板渲染,则可以在配置文件中配置autorender=false或者在main,go中配置beego.BConfig.WebConfig.AutoRender = false
beego.SetStaticPath("/static", "front")设置静态文件位置,此句表示将url为static的指向front文件夹

3模板解析语法

模板解析后端数据使用{{.key}}进行解析,其中的点不可缺失,代表解析的上下文。

4获取get传参

get传参分为query和param两种方式,每种方式都有两种方式获取参数,query型可以使用p.GetString("name")或者p.Input().Get("name")获取name参数的值。param使用p.GetString(":id")和p.Ctx.Input.Param(":id")获取id参数的值

4.1获取query型get传参

传参形式 /param?name=laowang

beego.Router("/param", &controllers.ParamController{})

type ParamController struct {
    beego.Controller
}

func (p *ParamController) Get() {
    //使用key=value形式传参
    name := p.GetString("name")
    name2 := p.Input().Get("name")
    p.Data["json"] = map[string]string{"name": name,
        "input": name2}
    p.ServeJSON()
}

4.2获取param型get传参

传参形式/param/111

# 限制id为int类型
beego.Router("/param/?:id:int", &controllers.ParamController{})
# 不限制id类型
beego.Router("/param/?:id", &controllers.ParamController{})

type ParamController struct {
    beego.Controller
}

func (p *ParamController) Get() {
    //使用key=value形式传参
    //http://127.0.0.1:5000/param/111?name=liyuhu
    id := p.GetString(":id")
    id2 := p.Ctx.Input.Param(":id")
    p.Data["json"] = map[string]string{"id": id, "inputId": id2}
    p.ServeJSON()
}

5获取form表单数据

5.1直接获取form表单数据

直接获取form表单数据,可以通过p.GetString和p.Input()两种方式获取数据。获取字符串使用GetString,获取整型通过GetInt64,获取浮点型通过GetFloat,获取布尔型通过GetBool。除字符串获取外,其他的获取方式都是返回两个值,一个获取的值和error。
如果获取的值与类型不匹配,则会使用默认值(如price前端传参为浮点型,应该使用GetFloat获取,而使用GetInt64去获取,获取的将是0这个默认的int值)。

func (p *ParamController) Post() {
    username := p.GetString("username")
    age := p.Input().Get("age")
    age1, _ := p.GetInt64("age")
    price,_ := p.GetFloat("price")
    price1,_ := p.GetInt64("price")
    is_true,_ := p.GetBool("is_true")
    p.Data["json"] = map[string]string{"username": username,
    "age": age}
    fmt.Println(age1, price, price1, is_true)
    p.ServeJSON()
}

5.2解析数据到结构体

解析form表单数据到结构体,需要先定义结构体,并使用``对其起别名,以保持与前端的传参名一致。
定义好结构体后,使用j.ParseForm获取表单中的数据,并传入结构体类型的变量指针。解析后的值就存入了结构体类型的变量中。

type UserStruct struct {
    Name string `form:"name"`
    Age int `form:"age"`
}

func (j *JsonTestController) Post() {
    user := UserStruct{}
    err := j.ParseForm(&user)
    if (err == nil) {
        fmt.Println(user)
    }
    j.Data["json"] = user
    j.ServeJSON()
}

5.3接收ajax传输的数据

若要接收ajax发送的数据,需要在conf文件夹下的app.conf文件中添加如下设置

copyrequestbody=true

然后控制器中使用如下方式获取数据

# 初始化一个结构体变量
var user UserStruct
# 获取ajax数据(为二进制格式)
body := p.Ctx.Input.RequestBody
# 将二进制数据解析到结构体中
json.Unmarshal(body, &user)

p.Data["json"] = map[string]string{"name":"wang","type":"book"}
p.ServeJSON()

ajax传输数据时,前端需要将数据格式转换为与结构体中字段对应的格式(type),否则获取不到值

5.4其他格式数据传输

5.4.1json格式数据传输

func (p *ParamController) Get() {
    user := UserStruct{Id:1,UserName: "abc", Age: 12}
    p.Data["json"] = &user
    p.ServeJSON()
}

5.4.2xml格式传输

func (p *ParamController) Get() {
    user := UserStruct{Id:1,UserName: "abc", Age: 12}
    p.Data["xml"] = &user
    p.ServeXML()
}

5.4.3jsonp格式

func (p *ParamController) Get() {
    user := UserStruct{Id:1,UserName: "abc", Age: 12}
    p.Data["jsonp"] = &user
    p.ServeJSONP()
}

5.4.4yaml格式

func (p *ParamController) Get() {
    user := UserStruct{Id:1,UserName: "abc", Age: 12}
    p.Data["yaml"] = &user
    p.ServeYAML()
}

6flash格式数据传输

在post中向flash中填入值,在get中获取flash的值并返回不同的界面。

func (p *ParamController) Get() {
    flash := beego.ReadFromRequest(&f.Controller)
    notice := flash.Data("notice")
    err := flash.Data("error")
    if len(err)!=0{
        p.TplName = "error.html"
    } else if  len(notice)!=0 {
        p.TplName = "success.html"
    }
}

func (p *ParamController) Post() {
    flash := beego.NewFlash()
    
    if
    flash.Error("服务错误")
    flash.Notice("返回成功")
    flash.Warning("数据可能有误")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容