Beego框架以及8大模块简介

Beego的安装

  • 安装 Go 1.1+ 以确保所有功能的正常使用。
  • 下载Beego 和 Bee 的开发工具
$ go get -u github.com/astaxie/beego
$ go get -u github.com/beego/bee
  • 为了更加方便的操作,请将 $GOPATH/bin 加入到你的 $PATH 变量中。请确保在此之前您已经添加了 $GOPATH 变量。
例如:E:\Workplace_Go\bin

Beego 架构图

997599-20180321233004672-238888081

997599-20180321233021296-480972597

创建 Beego HelloWord

>cd %GOPATH%/src
>bee new hello
>cd hello
>bee run

MVC结构如下:

├── conf
│   └── app.conf
├── controllers
│   └── default.go
├── main.go
├── models
├── routers
│   └── router.go
├── static
│   ├── css
│   ├── img
│   └── js
│       └── reload.min.js
├── tests
│   └── default_test.go
└── views
    └── index.tpl

一旦程序开始运行,您就可以在浏览器中打开 http://localhost:8080/ 进行访问。

beego路由请求

可用的 HTTP Method:

  • *: 包含以下所有的函数
  • get: GET 请求
  • post: POST 请求
  • put: PUT 请求
  • delete: DELETE 请求
  • patch: PATCH 请求
  • options: OPTIONS 请求
  • head: HEAD 请求

​ 如果同时存在 * 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法。

bee常用的命令

  • bee new <项目名> :创建一个项目,这样的项目一般是web项目
  • bee api myapi : 创建一个api项目
  • bee run 命令是监控 beego 的项目,通过 fsnotify监控文件系统。

beego框架之日志模块

beego框架之日志模块默认支持4种记录方式:
  1. 终端输出(console) :这种方式一般用在开发环境下面,方便调试。
  2. 本地文件(file) :这种方式一般用来保存常规日志,为生产环境中常用的方式。
  3. 网络方式(network):这种方式可以用来将日志发送到指定服务器,一般可以用来根据日志触发事件等。
  4. 发送邮件(email) :这种方式一般是将生产环境下比较重要的日志发送给相应的管理人员,以便及时发现和解决问题。

beego框架之日志模块等级定义在github.com/astaxie/beego/logs/log.go:(级别以此递减)
  const (
    LevelEmergency = iota // 紧急级别
    LevelAlert // 报警级别
    LevelCritical // 严重错误级别
    LevelError // 错误级别
    LevelWarning // 警告级别
    LevelNotice // 注意级别
    LevelInformational // 报告级别
    LevelDebug // 除错级别
  )

1.终端输出(console)记录方式示例:

package main

import (
    "github.com/astaxie/beego/logs"
)

func main() {
    log := logs.NewLogger(10000)  // 创建一个日志记录器,参数为缓冲区的大小
    log.SetLogger("console", "")  // 设置日志记录方式:控制台记录
    log.SetLevel(logs.LevelDebug) // 设置日志写入缓冲区的等级:Debug级别(最低级别,所以所有log都会输入到缓冲区)
    log.EnableFuncCallDepth(true) // 输出log时能显示输出文件名和行号(非必须)

    log.Emergency("Emergency")
    log.Alert("Alert")
    log.Critical("Critical")
    log.Error("Error")
    log.Warning("Warning")
    log.Notice("Notice")
    log.Informational("Informational")
    log.Debug("Debug")

    log.Close()
}

程序输出:
    2015/06/29 12:01:07 [main.go:13] [M] Emergency
    2015/06/29 12:01:07 [main.go:14] [A] Alert
    2015/06/29 12:01:07 [main.go:15] [C] Critical
    2015/06/29 12:01:07 [main.go:16] [E] Error
    2015/06/29 12:01:07 [main.go:17] [W] Warning
    2015/06/29 12:01:07 [main.go:18] [N] Notice
    2015/06/29 12:01:07 [main.go:19] [I] Informational
    2015/06/29 12:01:07 [main.go:20] [D] Debug

备注:如果log.SetLevel(logs.LevelDebug)修改为log.SetLevel(logs.LevelEmergency),则只输出Emergency级别的log,其他级别的log不会输出。
  1. 本地文件(file)记录方式示例
package main

import (
    "github.com/astaxie/beego/logs"
)

func main() {
    log := logs.NewLogger(10000) // 创建一个日志记录器,参数为缓冲区的大小
    // 设置配置文件
    jsonConfig := `{
        "filename" : "test.log", // 文件名
        "maxlines" : 1000,       // 最大行
        "maxsize"  : 10240       // 最大Size
    }`
    log.SetLogger("file", jsonConfig) // 设置日志记录方式:本地文件记录
    log.SetLevel(logs.LevelDebug)     // 设置日志写入缓冲区的等级
    log.EnableFuncCallDepth(true)     // 输出log时能显示输出文件名和行号(非必须)

    log.Emergency("Emergency")
    log.Alert("Alert")
    log.Critical("Critical")
    log.Error("Error")
    log.Warning("Warning")
    log.Notice("Notice")
    log.Informational("Informational")
    log.Debug("Debug")

    log.Flush() // 将日志从缓冲区读出,写入到文件
    log.Close()
}

输出结果:test.log
2015/06/29 12:55:29 [main.go:19] [M] Emergency
2015/06/29 12:55:29 [main.go:20] [A] Alert
2015/06/29 12:55:29 [main.go:21] [C] Critical
2015/06/29 12:55:29 [main.go:22] [E] Error
2015/06/29 12:55:29 [main.go:23] [W] Warning
2015/06/29 12:55:29 [main.go:24] [N] Notice
2015/06/29 12:55:29 [main.go:25] [I] Informational
2015/06/29 12:55:29 [main.go:26] [D] Debug

beego框架之orm模块

beego ORM 是一个强大的 Go 语言 ORM 框架,orm模块主要是处理MVC中的M(models)。

beego框架之Context模块

上下文模块主要是针对 HTTP 请求中,request 和 response 的进一步封装,他包括用户的输入和输出,用户的输入即为 request,context 模块中提供了 Input 对象进行解析,用户的输出即为 response,context 模块中提供了 Output 对象进行输出。
context 对象是对 Input 和 Output 的封装,里面封装了几个方法

beego框架之Cache模块

参考地址:https://www.jianshu.com/p/0db57ea057ce

cache模块是beego中的一个独立模块,这个模块的设计方式是经典的工厂模式。
cache.go:抽象接口部分、注册部分、模块以外的初始化。
memory:memorycache
file:filecache
cache/memcache:封装的是memcache
cache/redis:封装的是redis
cache/ssdb:封装的是ssdb

beego框架之config模块

首先要搞清楚一点Config在整个beego框架承担的任务:提供Ini、yaml、xml、json、env等方式参数配置,并提供了不同config方式的接口。

config构成
config对应beego项目的config包构成涉及了env(env配置)、xml(xml配置)、yaml(yaml配置)、ini(ini配置,也是默认方式)、json(json配置方式)、fake(伪造配置类)、config(配置功能接口)
2.剖析

2.1 Configer接口
该接口定义如何从配置原始数据获取或设置内容相关规范行为,而完成最终的操作是由具体实现Configer接口的具体Configer类来完成的。
IniConfigContainer:ini配置类
JSONConfigContainer:json配置类
ConfigContainer:yaml配置类
ConfigContainer:xml配置类
关于env是没有配置类, 实际上env只需要get、set操作即可: env-key:env-value形式
前面四种配置类采用的类似database/sql模式,定义两部分接口配置文件的Parse(见Config接口部分)和Operation,其具体实现配置类则根据自己的实际情况实现对应的接口(后面会有专门的源码来进行说明)
2.2 Config接口
该接口定义对应的配置文件的Parse操作,主要通过解析配置文件获取其原始数据内容绑定到Configer,可进行Configer里面的get、set等操作
2.3 Register方法
该方法主要完成将不同配置类型及其具体配置实现类进行注册,能够在本地进行缓存,便于使用。通过map[string]Config来存放。
2.4 NewConfig方法和NewConfigData方法
新建Config:第一个根据filepath来新建,第二种直接根据文件内容来新建;其中第一个参数adapterName包括:ini/json/xml/yaml

beego框架之httplib模块

httplib简单使用
req := httplib.Get("http://beego.me/")
str, err := req.String()
if err != nil {
    t.Fatal(err)
}
fmt.Println(str)
支持的请求方法
Get(url string)
Post(url string)
Put(url string)
Delete(url string)
Head(url string)
支持超时
req.SetTimeout(connectTimeout, readWriteTimeout)
httplib.Get("http://beego.me/").SetTimeout(100 * time.Second, 30 * time.Second)
设置请求参数
1. 方法一
req := httplib.Post("http://beego.me/")
req.Param("username","astaxie")
req.Param("password","123456")
2. 方法二
req := httplib.Post("http://127.0.0.1:9999")
req.JSONBody(map[string]interface{}{"jsonrpc":"2.0","method":"eth_blockNumber","id":83})
var js interface{}
req.ToJSON(&js)
fmt.Println(js)
3. 方法三 发送大片的数据
req := httplib.Post("http://beego.me/")
bt,err:=ioutil.ReadFile("hello.txt")
if err!=nil{
    log.Fatal("read file err:",err)
}
req.Body(bt)

beego框架之session模块

参考https://www.cnblogs.com/liaojiafa/p/8137317.html

what is session
session 是存储在服务端,也是用于客户身份标识,用于跟踪用户会话。

BeeGo session保存方式
Beego内置了session模块,目前session模块支持的后端引擎包括memory,cookie,file,mysql,redis,couchbase,memcache、postgres,用户也可以根据相应的interface实现自己的引擎。

beego 启用session
beego中使用session相当方便,只需要在main入口函数中设置如下:

beego.BConfig.WebConfig.Session.SessionOn = true

或者通过配置文件配置如下:

sessionon = true

session 有几个方便的方法

1. SetSession(name string,value interface{})
2. GetSession(name string,) interface{}
3. DelSession(name string)
4. SessionRegenerateID()
5. DestorySession()
测试代码:
package routers

import (
    "WEB/controllers"

    "github.com/astaxie/beego"
)

func init() {
    beego.Router("/test_login", &controllers.TestLoginController{}, "post:PostData;get:Login")   // 唯一添加了这条
}


// testlogin
package controllers

import (
    "github.com/astaxie/beego"
)

type TestLoginController struct {
    beego.Controller
}

func (c *TestLoginController) SelfTest() {
    c.Ctx.WriteString("this is myself  controller!")
}

func (c *TestLoginController) Login() {
    name := c.Ctx.GetCookie("name")
    password := c.Ctx.GetCookie("password")

    if name != "" {
        c.Ctx.WriteString("Username:" + name + "password:" + password)
    } else {
        formData := `<html><form action="/test_login" method="post">
         <input type="text" name="Username">
         <input type="password" name="Password">
        <input type="submit" value="post">
            </html>
        `
        c.Ctx.WriteString(formData)
    }
}

func (c *TestLoginController) PostData() {
    u := User{}
    if err := c.ParseForm(&u); err != nil {

    }
    c.Ctx.SetCookie("name", u.Username, 100, "/")  // 设置cookie
    c.Ctx.SetCookie("password", u.Password, 100, "/")  // 设置cookie
    c.Ctx.WriteString("username:" + u.Username + "   password:" + u.Password)
}

beego框架之toolbox模块

beego的toolbox模块,包括了以下几个功能:健康检查、性能调试、访问统计、计划任务。今天要了解的就是这个计划任务功能,首先你需要安装这个包,github.com/astaxie/beego/toolbox。下面我们具体看如何使用,以一个例子演示。

package main

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/toolbox"
    "fmt"
    "time"
)

func main() {
    tk := toolbox.NewTask("myTask", "0 07 13 * * *", func() error { fmt.Println("hello world"); return nil })
    err := tk.Run()
    if err != nil {
        fmt.Println(err)
    }
    toolbox.AddTask("myTask", tk)
    toolbox.StartTask()
    time.Sleep(6 * time.Second)
    toolbox.StopTask()
    beego.Run()
}

猜你喜欢

转载自blog.csdn.net/qqqqll3/article/details/88194706