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" //绑定数据,可通过<p>{{.title}}</p>渲染到页面上
p.Data["num"] = 12 //绑定数据,可通过<p>{{.num}}</p>渲染到页面上
// <br>
// <p>{{.title}}</p>
// <p>{{.num}}</p>
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上,所以可以获取到
}
// <form action="/user/doadd" method="post">
// 用户名 <input type="text" name="username" /><br><br>
// 密 码 <input type="text" name="password" /><br><br>
// <input type="submit" value="提交">
// </form>
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> <!--绑定Website变量-->
<h2>{{.Email}}</h2> <!--绑定Email变量-->
<h2>{{Article.name}}</h2> <!--绑定结构体Article的name变量-->>
<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}} <!--else if-->
<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> <!--使用unixToDate函数-->
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))
}