Beego框架学习--(核心:数据交互)
Beego框架学习记录
1、beego简介
beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架。
参考文档:开发文档
1.1、beego整体架构

beego 是基于八大独立的模块构建的,是一个高度解耦的框架。当初设计 beego 的时候就是考虑功能模块化,用户即使不使用 beego 的 HTTP 逻辑,也依旧可以使用这些独立模块,例如:你可以使用 cache 模块来做你的缓存逻辑;使用日志模块来记录你的操作信息;使用 config 模块来解析你各种格式的文件。所以 beego 不仅可以用于 HTTP 类的应用开发,在你的 socket 游戏开发中也是很有用的模块,这也是 beego 为什么受欢迎的一个原因。大家如果玩过乐高的话,应该知道很多高级的东西都是一块一块的积木搭建出来的,而设计 beego 的时候,这些模块就是积木,高级机器人就是 beego。
1.2、beego执行逻辑

1、beego框架安装
前置条件:已安装go
安装beego和bee
$ export GO111MODULE=on
$ export GOPROXY=https://goproxy.io
$ go get github.com/beego/bee
$ go get github.com/astaxie/beego
安装完之后,
bee可执行文件默认存放在$GOPATH/bin里面,所以需要把$GOPATH/bin添加到环境变量中
2、新建项目
#查看bee相关命令
$ bee
#新建项目 beegojingjinji
$ bee new beegojingjinji
#查看项目结构
$ tree beegojingjinji
beegojingjinji/
├── beegojingjinji
├── conf
│ └── app.conf
├── controllers
│ └── default.go
├── go.mod
├── go.sum
├── main.go
├── models
├── routers
│ └── router.go
├── static
│ ├── css
│ ├── img
│ └── js
│ └── reload.min.js
├── tests
│ └── default_test.go
└── views
└── index.tpl
10 directories, 10 files
#运行项目
$ cd beegojingjinji
$ bee run
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.11.0
2020/10/22 11:00:11 INFO 0001 Using 'beegojingjinji' as 'appname'
2020/10/22 11:00:11 INFO 0002 Initializing watcher...
2020/10/22 11:00:13 SUCCESS 0003 Built Successfully!
2020/10/22 11:00:13 INFO 0004 Restarting 'beegojingjinji'...
2020/10/22 11:00:13 SUCCESS 0005 './beegojingjinji' is running...
2020/10/22 11:00:13.083 [I] [asm_amd64.s:1373] http server Running on http://:8080
采用MVC的架构(model,view,controller),main.go是主入口
文件内容解析:
- conf:存放配置文件,各种配置项,如监听端口,是否开启session,运行模式等
- controllers:控制层,实现业务逻辑
- models:模型层,数据逻辑
- routers:路由,实现路由跳转
- static:存放静态文件
- tests:存放测试文件
- views:视图层,存放前端页面
- go.mod:控制依赖
- main.go:主文件入口
3、启动工作解析
main 函数里面的 beego.Run, beego.Run 执行之后,看到的效果好像只是监听服务端口这个过程,但是它内部做了很多事情
解析配置文件
beego 会自动解析在 conf 目录下面的配置文件
app.conf,通过修改配置文件相关的属性,我们可以定义:开启的端口,是否开启 session,应用名称等信息。执行用户的 hookfunc
beego 会执行用户注册的 hookfunc,默认的已经存在了注册 mime,用户可以通过函数
AddAPPStartHook注册自己的启动函数。是否开启 session
会根据上面配置文件的分析之后判断是否开启 session,如果开启的话就初始化全局的 session。
是否编译模板
beego 会在启动的时候根据配置把 views 目录下的所有模板进行预编译,然后存在 map 里面,这样可以有效的提高模板运行的效率,无需进行多次编译。
是否开启文档功能
根据 EnableDocs 配置判断是否开启内置的文档路由功能
是否启动管理模块
beego 目前做了一个很酷的模块,应用内监控模块,会在 8088 端口做一个内部监听,我们可以通过这个端口查询到 QPS、CPU、内存、GC、goroutine、thread 等统计信息。
监听服务端口
这是最后一步也就是我们看到的访问 8080 看到的网页端口,内部其实调用了
ListenAndServe,充分利用了 goroutine 的优势
一旦 run 起来之后,我们的服务就监听在两个端口了,一个服务端口 8080 作为对外服务,另一个 8088 端口实行对内监控。
4、路由设置
参照如下链接,解析的十分详细
https://beego.me/docs/mvc/controller/router.md
5、数据交互
5.1、字符串渲染
func (c *MainController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
数据默认存储在Data中,只需要在html页面中使用"{{ }}"即可,如{{.Website}}
5.2、重设模板路径
//方法一:
//在beego.run()之前
beego.SetViewsPath("新文件夹名")
//方法二:
//在配置文件中设置
viewspath = 新文件夹名
5.3、前端向后端传递数据
获取用户传递的数据,包括 Get、POST 等方式的请求,beego 里面会自动解析这些数据,可以通过如下方式获取数据
GetString(key string) string
GetStrings(key string) []string
GetInt(key string) (int64, error)
GetBool(key string) (bool, error)
GetFloat(key string) (float64, error)
//对于url中如下形式:local:8080/user?username=aaa
//获取参数username
func (this *MainController) Post() {
//方法一:
username := this.GetString("username")
//方法二:
username := this.Input().Get("username")
}
//对于url中如下形式:local:8080/user/aaaa
//获取参数aaaa
//首先设置路由为:
beego.Router("/user/?:id, &controllers.MainController{})
//获取数据
func (this *MainController) Post() {
//方法一:
id := this.GetString(":id")
//方法二:
username := this.Ctx.Input.Param("username")
}
5.4、接收表单数据
<form action="/addIns" method="post" name="addForm">
<div class="top">
<div class="left">
<p>
<span>机构名称:</span>
<span>
<input type="text" name="name" class="input_text" tabindex="1" onfocus="if(this.placeholder=='机构名称'){this.placeholder='';}this.className ='input_text input_text_focus'" onblur="if(this.value==''){this.placeholder='机构名称';this.className ='input_text'}" accesskey="n" type="text" placeholder="机构名称" size="25" autocomplete="off">
</span>
</p>
</form>
- 读取到字符串
//根据表单中name名,读取对应值
func (this *MainController) Post() {
name := this.GetString("name")
}
- 读取到结构体
type User struct {
name string 'form:"username"' //定义与表单对应的名称
}
func (this *MainController) Post() {
user := User{}
if err := this.ParseForm(&user); err != nil{
return
}
fmt.Println(user.name)
}
5.5、Ajax获取数据
定义前段页面Ajax交互内容
var name = document.getElementById("name").value;
var code = document.getElementById("code").value;
var certNo = document.getElementById("certNo").value;
var address = document.getElementById("address").value;
var legalRepresentative = document.getElementById("legalRepresentative").value;
$.ajax({
url:"/addIns",
type: "post",
data: JSON.stringify({ //前端使用JSON传递数据
"name":name,
"code":code,
"certNo":certNo,
"address":address,
"legalRepresentative":legalRepresentative,
}),
dataType:"JSON", //定义传递格式
success:function (data) {
var code = data["code"]
if (code==400.3){
var inner = document.getElementById("tiptext");
inner.innerHTML = "您已申请机构认证,请勿重复操作!如需更新,请进入更新机构认证页面";
$('#popout').css('display','');
}else if (code==200){
var inner = document.getElementById("tiptext");
inner.innerHTML = "您的认证申请已通过,请稍后查询上链结果!";
$('#popout').css('display','');
}else{
var inner = document.getElementById("tiptext");
inner.innerHTML = "未知错误,请联系工作人员";
$('#popout').css('display','');
}
},
error:function (data){
alert("login failed, unknown failed")
}
})
实现后端Ajax接收数据
func (a *AddInsController) Put() {
ins := models.ChaincodeIns{}
body := a.Ctx.Input.RequestBody //通过内置函数接收Ajax数据
json.Unmarshal(body, &ins) //反序列化解析到结构体中
logs.Informational("Data from addIns html:" + ins.Name + " " + ins.CertNo + " " + ins.Address + " " + ins.LegalRepresentative)
}
Beego框架学习--(核心:数据交互)的更多相关文章
- Beego框架学习---layout的使用
Beego框架学习---layout的使用 在管理系统中,管理菜单的界面是固定的,会变化的只是中间的部分.我就在想,是不是跟angular的"组件模块的router-outlet一样&quo ...
- Beego 框架学习(一)
Beego官网本身已经整理的非常详细了,但是作为一个学习者,我还是决定自己好好整理一下,这样在后面使用的时候自己对每部分才能非常熟悉,及时忘记了,也可以迅速定位自己要用的知识在哪里.当然也是对官网的一 ...
- 在ssm框架中前后台数据交互均使用json格式
前后台数据交互均使用json. 框架ssm(spring+springmvc+mybatis) @RequestBody注解实现接收http请求的json数据,将json数据转换为java对象,注解加 ...
- uLua学习之数据交互(三)
前言 在上节中,大概谈了一下如何在lua脚本中调用unity3d中的方法来创建游戏物体,这只是很小的一个方面,uLua的优势在于对unity3d中C#语言的扩展和定制.那么如何扩展和定制呢?其中的数据 ...
- Beego 框架学习(一)
1.特性 beego是一个http框架 高性能,是目前最快的的go框架 开发快捷,组件多,高度解耦 RESTful方式,可以自定义action 文档完整 智能路由.智能监控 2.安装 go get g ...
- beego框架学习--beego orm映射
什么是ORM 即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作 ...
- beego框架学习(三) -orm的使用
2 3 4 5 6 7 8 9 10 11 目前beego-orm支持的数据有: - MySQL:https://github.com/go-sql-driver/mysql - PostgreSQL ...
- beego框架学习(二) -路由设置
路由设置 什么是路由设置呢?前面介绍的 MVC 结构执行时,介绍过 beego 存在三种方式的路由:固定路由.正则路由.自动路由,接下来详细的讲解如何使用这三种路由. 基础路由 从beego1.2版本 ...
- beego框架返回json数据
一.routers路由 package routers import ( "mybeego/controllers" "github.com/astaxie/beego& ...
随机推荐
- 【Luogu】P1072 Hankson 的趣味题 题解
原题链接 嗯...通过标签我们易得知,这是一道数学题(废话) 其中,题目给了这两个条件: \(gcd(x,a_0)=a_1,lcm(x,b_0)=b_1\) 所以,根据 \(gcd\) 与 \(lcm ...
- python开发基础(二)运算符以及数据类型之tuple(元组)
# encoding: utf-8 # module builtins # from (built-in) # by generator 1.147 """ Built- ...
- 3.6 栈 ADT - 3.7 队列 ADT
3.6 栈 ADT 栈是限制插入和删除只能在一个位置上进行的表,叫做栈的顶部.对栈的基本操作有进栈和出栈,进栈在顶部插入元素,出栈删除最后插入的元素. 栈是一个表,因此任何实现表的方法都能实现栈.显然 ...
- 嗯,挺全乎儿的,Spring Boot 多环境配置都在这里了,你喜欢哪种?
持续原创输出,点击上方蓝字关注我 目录 前言 Spring Boot 自带的多环境配置 创建不同环境的配置文件 指定运行的环境 Maven 的多环境配置 创建多环境配置文件 定义激活的变量 pom 文 ...
- SU模型叠加实景三维模型 用它就可以实现了
草图大师SketchUp是一套直接面向设计方案创作过程的设计软件,使用SketchUp规划设计师可以从潦草的平面草图开始,创建出想像的任何东西 .虽然市面软件众多,也不能取代SketchUp独有的位置 ...
- tp3.2 前端截取字符串
在Common目录中建立 function.php <?php function subtext($text, $length) { if(mb_strlen($text, 'utf8') &g ...
- 如何用css设置鼠标属性的小手
在元素中添加onmouseover="this.style.cursor='hand'"或者 cursor:pointer;
- pipe()管道通信
管道 管道的概念: 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递.调用pipe系统函数即可创建一个管道.有如下特质: 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两个 ...
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(五)
解码及显示 目录 解码及显示 解码 显示 资源清理 解码 循环读取视频帧 AVPacket packet = { 0 }; while (av_read_frame(m_pFmtCtx, &p ...
- 线程与更新UI,消除偏见,细谈原理
前言 相信不少读者都阅读过相类似的文章了,但是我还是想完整的把这之间的关系梳理清楚,细节聊好,希望你也能从中学到一些. 进入正题,大家应该都听过这样一句话--"UI更新要在主线程,子线程更新 ...