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.Runbeego.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框架学习--(核心:数据交互)的更多相关文章

  1. Beego框架学习---layout的使用

    Beego框架学习---layout的使用 在管理系统中,管理菜单的界面是固定的,会变化的只是中间的部分.我就在想,是不是跟angular的"组件模块的router-outlet一样&quo ...

  2. Beego 框架学习(一)

    Beego官网本身已经整理的非常详细了,但是作为一个学习者,我还是决定自己好好整理一下,这样在后面使用的时候自己对每部分才能非常熟悉,及时忘记了,也可以迅速定位自己要用的知识在哪里.当然也是对官网的一 ...

  3. 在ssm框架中前后台数据交互均使用json格式

    前后台数据交互均使用json. 框架ssm(spring+springmvc+mybatis) @RequestBody注解实现接收http请求的json数据,将json数据转换为java对象,注解加 ...

  4. uLua学习之数据交互(三)

    前言 在上节中,大概谈了一下如何在lua脚本中调用unity3d中的方法来创建游戏物体,这只是很小的一个方面,uLua的优势在于对unity3d中C#语言的扩展和定制.那么如何扩展和定制呢?其中的数据 ...

  5. Beego 框架学习(一)

    1.特性 beego是一个http框架 高性能,是目前最快的的go框架 开发快捷,组件多,高度解耦 RESTful方式,可以自定义action 文档完整 智能路由.智能监控 2.安装 go get g ...

  6. beego框架学习--beego orm映射

    什么是ORM 即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作 ...

  7. beego框架学习(三) -orm的使用

    2 3 4 5 6 7 8 9 10 11 目前beego-orm支持的数据有: - MySQL:https://github.com/go-sql-driver/mysql - PostgreSQL ...

  8. beego框架学习(二) -路由设置

    路由设置 什么是路由设置呢?前面介绍的 MVC 结构执行时,介绍过 beego 存在三种方式的路由:固定路由.正则路由.自动路由,接下来详细的讲解如何使用这三种路由. 基础路由 从beego1.2版本 ...

  9. beego框架返回json数据

    一.routers路由 package routers import ( "mybeego/controllers" "github.com/astaxie/beego& ...

随机推荐

  1. vue API 知识点(2)---选项总结

    一.选项 / 数据 1.data 当一个组件被定义,data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例,如果 data 仍然是一个纯碎的对象,则所有的实例将被共享引用同一个 ...

  2. c#导入文件以后查看制定值

    //Console.ReadKey(); ceshi("3.ini", "用户名"); ceshi("3.ini", "IP地址& ...

  3. 新疆地形数据下载:30米、12.5米、5米DEM地形数据

    新疆是我国陆地面积最大的省级行政区,总面积达166万平方公里.新疆的地形也十分的复杂,新疆的地形呈山脉与盆地相间排列,盆地被高山环抱,,俗称"三山夹两盆".三山指阿尔泰山.昆仑山. ...

  4. ExecutorService的invokeAny方法注意

    package com.msxf.datasource.thirdpart.service.extface; import java.util.HashSet; import java.util.Li ...

  5. c语言 字符指针数组的用法

    #include <stdio.h> #include <stdlib.h> int main(){ //字符数组的使用 char str[] = {'z','b','c',' ...

  6. 安全也挺让人心烦的 ---login shell

    今天查问题时, ssh 登录后台发现 需要输入密码,输入密码后弹出一个二维码, 然后扫码获取秘钥.输入秘钥登陆!!! 真是恶心了一把,找手机都花了不少时间!!!! 那么怎样干掉输入密码这些操作呢??? ...

  7. TCP粘包问题的解决方案02——利用readline函数解决粘包问题

      主要内容: 1.read,write 与 recv,send函数. recv函数只能用于套接口IO ssize_t recv(int sockfd,void * buff,size_t len,i ...

  8. 分布式监控系统之Zabbix基础

    1.为什么要使用监控系统? 我们知道一个系统不管怎么讲它都会出故障,我们为了保证线上业务的最大化的可用性,通常我们要给关键业务做高可用:做高可用的目的是为了让故障发生时,能够有一个备用的解决方案,将故 ...

  9. 对accuracy、precision、recall、F1-score、ROC-AUC、PRC-AUC的一些理解

    最近做了一些分类模型,所以打算对分类模型常用的评价指标做一些记录,说一下自己的理解.使用何种评价指标,完全取决于应用场景及数据分析人员关注点,不同评价指标之间并没有优劣之分,只是各指标侧重反映的信息不 ...

  10. 开发工具之Git(一)

    目录 一.什么是Git 二.Git基本原理 三.Git用户交互 一.什么是Git 答:Git是一个分布式版本控制软件.另外提一句,它的开发者就是大名鼎鼎的Linux之父Linus. 版本控制,顾名思义 ...