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& ...
随机推荐
- P5958 【[POI2017]Sabotaż】
P5958 [[POI2017]Sabotaż] 题意描述 在一棵以1号节点为根节点的树上,有很多纯洁的白点, BUT,突然有一个黑点出现(可能在任意位置) 它要染黑尽可能多的节点,而在一棵子树中, ...
- 【Luogu】 P6274 [eJOI2017]六 题解
首先,题目说了最多\(6\)个质因数. 如此小的数据范围,不是状压还是啥? 然后,我们可以发现一个性质:只要两个因数有相同的质因数(不管次数是多少),两者就不互质. 这启示我们用一个二进制数来表示一类 ...
- 一篇搞懂Java的基本数据类型
byte 基本类型:byte 包装类:java.lang.Byte 大小:8bit 默认值:0 取值范围:-128~127 Byte.MIN_VALUE Byte.MAX_VALUE 二进制补码表示 ...
- 【17】进大厂必须掌握的面试题-50个Angular面试
我们整理了一份主要的Angular面试问题清单,分为三部分: 角度面试问题–初学者水平 角度面试问题–中级 角度面试问题–高级 初学者水平–面试问题 1.区分Angular和AngularJS. 特征 ...
- css 两边宽度固定中间自适应宽度
#content_left{ //左 width:73px; height:100px; vertical-align:middle; margin-right:-100px; float:lef ...
- dict和list
一.字典(Dictionary) 1.什么是 dict(字典) 上一章节,我们学习了列表(List) 和 元组(tuple) 来表示有序集合. 而我们在讲列表(list)的时候,我们用了列表(list ...
- Java实现酒店客房管理系统
这篇文章主要为大家详细介绍了Java实现酒店客房管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Java实现酒店客房管理系统的具体代码,供大家参考,具体内容如下 Log ...
- 【转载】Apriori
通过这个博客学习:数据挖掘十大算法(四):Apriori(关联分析算法) 代码也是摘自上面博客,对照代码理解理论部分可能更加有助于对该算法的理解 from numpy import * # 构造数据 ...
- 跟我一起学Redis之Redis事务简单了解一下
前言 关系数据库中的事务,小伙伴们应该是不陌生了,不管是在开发还是在面试过程中,总有两个问题逃不掉: 说说事务的特性: 事务隔离级别是怎么一回事? 事务处理不好,数据就可能不准确,最终就会导致业务出问 ...
- 谈谈AQS
AQS是什么? AQS全称叫AbstractQueuedSynchronizer,顾名思义,抽象的队列同步装置,在java中是一个抽象类.java JUC包下常用的同步类都是通过继承AQS实现的,那么 ...