golang入门笔记—Beego从入门到放弃

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))
}

参考链接

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值