Beego介绍:
Beego是一个开源的基于Golang的MVC框架,主要用于Golang Web开发。Beego可以用来快速开发API、Web、后端服务等各种应用。
MVC简单介绍:MVC全名是Model View Controller,是模型(model)—视图
(view)—控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
Model:主要用于处理应用程序的业务逻辑,以及和数据库打交道,是把要复用的部分提取出来作为一个模块
View:是应用程序数据显示的部分
Controller:控制器作用与模型和视图上。它可以把我们在Model模型上面获取的数据显示到View视图上面,也可以把View传递的数据流向模型对象。它使视图与模型分离。
Beego web开发流程:
1)规划好url
2)添加路由
3)开发controller 继承beego.Controller
4)测试
beego工具包安装:
go get -u github.com/astaxie/beego
go get -u github.com/astaxie/beego
简单的beego演示
beego会默认解析conf/app.conf下的配置信息
app.conf
httpaddr="127.0.0.1"
httpport=9092
appname=web
autorender=true #是否自动渲染模板,默认true,api类型应用要记得改成false
runmode="${ProRunMode||dev}" #环境变量来确保线上和线下配置一样
[dev]
redis_address=10.237.39.19:8080 #线下配置s
[prod]
redis_addr=redis.exemple.com:8080 #线上配置
index.go
package IndexController
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
)
type IndexController struct {
beego.Controller
}
func (p *IndexController) Index() {
logs.Debug("enter index controller")
p.TplName = "index/index.html"
}
main.go
package main
import (
_ "test/web/router"
"github.com/astaxie/beego"
)
func main() {
beego.Run()
}
router.go
package router
import (
"test/web/controller/IndexController"
"github.com/astaxie/beego"
)
func init() {
package router
import (
"test/pratice/controller/Appcontroller"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/index", &Appcontroller.AppController{}, "*:Index") //localhost/index页面的所有请求,都交给Index方法去处理
//beego.Router("/add",&Appcontroller.AppController{},"get:AddArticle")//对localhost/add发送的get请求时交给AddArticle方法处理
}
}
Controller
//展示数据
func (p *IndexController) Index() {
logs.Debug("enter index controller")
// p.TplName = "index/index.html"
m := make(map[string]interface{})
m["code"] = 200
m["message"] = "success"
p.Data["json"] = m
//除了json之外,还有xml、jsonp等形式输出
p.ServeJSON(true)
}
//接收Post传过来的XML数据
//注意:在配置文件里设置copyrequestbody=true
func (p *IndexController) XML(){
p:=Product{}
str:=string(c.Ctx.Input.RequestBody)
beego.Info(str)
c.Ctx.WriteString(str)
err:=xml.Unmarshal(c.Ctx.Input.RequestBody,&p)
}
package router
import (
"test/pratice/controller/Appcontroller"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/index", &Appcontroller.AppController{}, "*:Index") //localhost/index页面的所有请求,都交给Index方法去处理
beego.Router("/add", &Appcontroller.AppController{}, "get:AddArticle") //对localhost/add发送的get请求时交给AddArticle方法处理
beego.Router("/user", &Appcontroller.AppController{})
beego.Router("/user/add", &Appcontroller.AppController{}, "get:AddUser")
beego.Router("/user/doadd", &Appcontroller.AppController{}, "post:DoAddUser")
beego.Router("/api/:id", &Appcontroller.AppController{}, "get:Get") //动态路由
beego.Router("/cms_id([0-9]+).html", &Appcontroller.AppController{}, "get:Get") //正则路由,按照正则表达式匹配
}
//此外,html的多选框获取到的是字符串切片
//此外,html的多选框获取到的是字符串切片
package Appcontroller import ( "strconv" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" ) type AppController struct { beego.Controller } func (p *AppController) Index() { logs.Debug("enter index controller") p.Data["title"] = "你好beego" //绑定数据,可通过
{{.title}}渲染到页面上 p.Data["num"] = 12 //绑定数据,可通过
{{.num}}渲染到页面上 // //
{{.title}}//
{{.num}}p.Ctx.WriteString("顺利进入") //直接页面打印 p.TplName = "index.html" } func (p *AppController) AddArticle() { id, err := p.GetInt("id") if err != nil { beego.Info(err) p.Ctx.WriteString("传入参数错误") } p.Ctx.WriteString("增加新闻" + strconv.Itoa(id)) //输入http://127.0.0.1:9092/add?id=123后会传入id } func (p *AppController) AddUser() { p.TplName = "user.html" //get请求时会用user.html来显示表单 } //处理post请求,获取post提交的数据 func (p *AppController) DoAddUser() { username := p.GetString("username") password := p.GetString("password") //执行跳转 p.Redirect("/index", 302) //302表示临时重定向,301表示永久重定向 //p.Ctx.Redict(302,"/index") p.Ctx.WriteString("用户中心" + username + password) //由于user.html上提交的数据post到doadd上,所以可以获取到 } //
// 用户名 // 密 码 // // type User struct { Username string `form:"username"` Password string `form:"password"` Hobby []string `form:"hobby"` } func (p *AppController) DoEditUser() { u := User{} if err := p.ParseForm(&u); err != nil { p.Ctx.WriteString("post提交失败") return } } func (p *AppController) Get() { //获取动态路由的值 id := p.Ctx.Input.Param(":id") p.Ctx.WriteString("获取id" + id) }
//Tap标签进行解析
type User struct{
Username string `form:"username"`
Password string `form:"password"`
Hobby []string `form:"hobby"`
}
func (p *AppController) DoEditUser(){
u:=User{}
if err:=p.ParseForm(&u);err!=nil{
p.Ctx.WriteString("post提交失败")
return
}
}
views
beego支持layout设计,例如在管理系统中,整个管理界面是固定的,只会变化中间的部分,那么就可以在layout.html中添加{{.LayoutContent}}
变量的绑定:
<title>{{.Website}}</title>
<h2>{{.Email}}</h2>
<h2>{{Article.name}}</h2>
<h2>{{range $key,$val:=.sliceList}}</h2>
切片的遍历
{{range $key,$val:=.sliceList}}
<Li>{{$key}---{{$val}}}</Li>
{{end}}
结构体切片的遍历
<ul>
{{range $key,$val := .articleList}}
<li>
{{$key}--{$val.Tile}--{$val.Name}}
</li>
模板中条件判断
{{if .isLogin}}
<p>isLogin等于true</p>
{{else}}
<p>isLogin等于false</p>
{{end}}
自定义代码块
{{define "aaa"}}
<h4>这是一个自定义代码块</h4>
<p>111</p>
<p>222221</p>
{{end}}
<div>
{{template "aaa".}}
</div>
Model
func main() {
beego.Run()
beego.AddFuncMap("unixToDate",model.unixToDate)//将unixToDate函数绑定为unixToDate
}
<p>{{.unix|unixToDate}}</p>
md5加密
package main
import (
"crypto/md5"
"fmt"
"io"
)
func main() {
h := md5.New()
io.WriteString(h, "The fog is getting thicker!")
io.WriteString(h, "And Leon's getting laaarger!")
fmt.Printf("%x", h.Sum(nil))
}
文章来源于互联网:golang入门笔记—Beego从入门到放弃