ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

go语言beego web框架学习

2022-01-22 15:01:25  阅读:198  来源: 互联网

标签:web beego Ctx controllers go Router id


beego安装

beego 安装及部署 http://www.dingyucong.cn/article/4

$ cd ~
$ vim ./bashrc

export GOROOT="/usr/local/go" # 引号内设置为你自己的go安装目录
export GOBIN=$GOPATH/bin
export GOPATH="/home/ling/goproject" #// 引号内设置为自己的go项目的工作区间
export PATH=$PATH:$GOPATH/bin    #// 原路径后用冒号连接新路径

$ source .bashrc

conf文件夹:放的是项目有关的配置文件
Controllers:存放主要的业务代码
main.go:项目的入口文件****
Models:存放的是数据库有关内容
routers:存放路由文件,路由作用是根据不同的请求指定不同的控制器
static:存放静态资源,包括图片,html页面,css样式,js文件等
tests:测试文件
Views:存放视图有关内容

创建项目bee new 项目名

初始化项目模块:go mod init 项目名

运行项目 :bee run

控制器

get

c.Data["name"] = "ling"	//绑定数据
c.Data["age"] = 11
c.TplName = "goods.tpl"	//跳转到指定界面,也可以是html,右下角改格式

直接给页面返回数据 c.Ctx.WriteString("执行增加操作")

访问控制器里默认的Get方法:beego.Router("/article", &controllers.ArticleController{})

访问自定义方法:beego.Router("/article/add", &controllers.ArticleController{}, "get:AddArticle")

Get传值获取值:

id := c.GetString("id")

id, err := c.GetInt("id")
	if err == nil {
		beego.Info(err)
	}

post

定义一个结构体

type User struct {
	Username string   `form:"username" json:"username"`
	Pwd      string   `form:"pwd" json:"password"`
	Hobby    []string `form:"hobby" json:"hobby"`
}
func (c *UserController) DoEditUser() {
	u := User{}
//获取post传过来的值
	if err := c.ParseForm(&u); err != nil {
		c.Ctx.WriteString("post提交失败")
		return
	}
	fmt.Printf("%#v", u)
	c.Ctx.WriteString("解析post数据成功")
}
func (c *UserController) GetUser() {
	u := User{
		Username: "接啊外",
		Pwd:      "493fdsjh",
		Hobby:    []string{"1", "2"},
	}
	// 返回一个json数据
	c.Data["json"] = u
	c.ServeJSON()
}

xml

在配置文件里面: copyrequestbody = true

func (c *GoodsController) Xml() {

	P := Product{}
	var err error
	str := string(c.Ctx.Input.RequestBody)
	beego.Info(str)
	c.Ctx.WriteString(str)

	if e := xml.Unmarshal(c.Ctx.Input.RequestBody, &P); e != nil {
		c.Data["json"] = err.Error()
		c.ServeJSON()
	} else {
		c.Data["json"] = P
		c.ServeJSON()
	}
}

动态路由/正则路由

beego.Router("/api/:id", &controllers.ApiController{})

伪静态正则路由

beego.Router("/cms_:id([0-9]+).html", &controllers.CmsController{})

重定向

方式一
// 执行跳转
// c.Redirect("/", 302)
// c.Ctx.Redirect(302, "success.html")

方式二
中间页面进行跳转
<meta http-equiv="refresh" content="3; url=/">

models

封装公共的功能,和数据库交互。

封装md5方法

models/tools.go

package models

import (
	"crypto/md5"
	"fmt"
)

func Md5Str(str string) string {
	data := []byte(str)
	return fmt.Sprintf("%x\n", md5.Sum(data))
}

api.go

package controllers

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"

	"github.com/astaxie/beego"
)

type ApiController struct {
	beego.Controller
}

func (c *ApiController) Get() {
	//获取动态路由的值
	// id := c.Ctx.Input.Param(":id")
	// c.Ctx.WriteString("api接口---------" + id)

	// fmt.Println(models.Md5Str("123456"))
	id := c.Ctx.Input.Param(":id")
	data := []byte(id)
	m := md5.Sum(data)
	fmt.Printf("%X\n", md5.Sum(data))

	encodedStr := hex.EncodeToString(m[:])
	c.Ctx.WriteString("api接口---------" + encodedStr)

}

配置路由

beego.Router("/api/:id", &controllers.ApiController{})

package routersimport (	"beegodemo01/controllers"	"github.com/astaxie/beego")func init() {	beego.Router("/", &controllers.MainController{})	beego.Router("/article", &controllers.ArticleController{})	beego.Router("/article/add", &controllers.ArticleController{}, "get:AddArticle")	beego.Router("/article/edit", &controllers.ArticleController{}, "get:EditArticle")	beego.Router("/user", &controllers.UserController{})	beego.Router("/user/add", &controllers.UserController{}, "get:AddUser")	beego.Router("/user/doAdd", &controllers.UserController{}, "post:DoAddUser")	beego.Router("/user/edit", &controllers.UserController{}, "get:EditUser")	beego.Router("/user/doEdit", &controllers.UserController{}, "post:DoEditUser")	beego.Router("/user/getUser", &controllers.UserController{}, "get:GetUser")	beego.Router("/goods", &controllers.GoodsController{})	beego.Router("/goods/edit", &controllers.GoodsController{}, "put:DoEdit")	beego.Router("/goods/delete", &controllers.GoodsController{}, "delete:DoDelete")	beego.Router("/goods/add", &controllers.GoodsController{}, "delete:DoDelete")	beego.Router("/goods/xml", &controllers.GoodsController{}, "post:Xml")	// beego.Router("/api", &controllers.ApiController{})	beego.Router("/api/:id", &controllers.ApiController{})	beego.Router("/cms_:id([0-9]+).html", &controllers.CmsController{})	beego.Router("/login", &controllers.LoginController{})	beego.Router("/doLogin", &controllers.LoginController{}, "post:DoLogin")}

线程安全

Golang1.9版本后,增加了并发安全的sync.Map。相比原生map加互斥锁的解决方案,性能稍微高一点。去读下代码,就知道这个东西虽然也用了锁,但还是做了一些优化。

至于原生map为什么不是并发安全,这个很好理解。并发安全是有代价的。如果原生map保证并发安全,那么一些不需要并发的场景,会有不小的性能损耗。

cookie

image-20210826151619508

加密cookie(建议用这个)

image-20210826152014701

session

分布式存到redis mysql里面,防止session过期

key加密

设置session

bee.controller c.SetSession("username","张三")

获取session

  1. c.GetSession("username")
  2. c.Ctx.Input.Session("username")

swagger

生成swagger文档

bee run -gendoc=true -downdoc=true

需要把生成的swagger目录所有文件,复制到挂载的目录里面

标签:web,beego,Ctx,controllers,go,Router,id
来源: https://www.cnblogs.com/gdf456/p/15833995.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有