Categorygithub.com/go-touch/ratgo
modulepackage
1.0.1
Repository: https://github.com/go-touch/ratgo.git
Documentation: pkg.go.dev

# README

ratgo框架 - 快速构建web项目

  • 使用gin作为底层框架,在此基础上做进一步封装,同时保留gin原生方法
  • 增加简易路由,用以约束开发规范
  • 内置扩展包为低耦合设计,均可单独使用
  • 使用容器,以长驻内存的方式运行时注入元素,实现复用节省开销
  • 内置丰富的工具类,可实现大部分网络功能

目录

安装与配置

1. 安装Go (version 1.10+),配置使用gitlab私有仓库作为项目的依赖包

1. 获取gitlab的access token
进入Gitlab->Settings->Access Tokens,然后创建一个personal access token,这里权限最好选择只读(read_repository)。有了access token后,我们还需要在git中进行配置,这样才能go get下了私有仓库的包,需要把刚刚的token添加进git的请求头中,操作如下:
	$ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN"

2. 配置git将请求从ssh转换为https:
	$ git config --global url."ssh://[email protected]:2022".insteadOf "https://gitlabj01.vdongchina.com"

3. 设置 GOPRIVATE 环境变量:
	$ set GOPRIVATE=gitlabj01.vdongchina.com

2. 使用下面命令进行安装 ratgo

$ go get gitlabj01.vdongchina.com/TemplateFramework/ratgo

3. 依赖包安装(已安装可忽略)

$ go get github.com/gin-gonic/gin
$ go get github.com/unrolled/secure
$ go get github.com/go-sql-driver/mysql
$ go get github.com/jinzhu/gorm
$ go get github.com/garyburd/redigo/redis
$ go get gopkg.in/ini.v1
$ go get github.com/go-touch/mtype

4. 设置系统环境变量

RATGO_RUNMODE = dev | test | prod

5. 如使用 go mod(自行查找使用方法) 包依赖管理工具,请参考下面命令

Windows 下开启 GO111MODULE 并设置 GOPROXY 的命令为:
$ set GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
MacOS 或者 Linux 下开启 GO111MODULE 并设置 GOPROXY 的命令为:
$ export GO111MODULE=on
$ export GOPROXY=https://goproxy.cn

项目结构

  • application
    • modules // Controller存放目录,
      • demo // 模块名
    • model
      • bussiness // 业务类
      • common // 公共处理函数
      • dao // 抽象数据模型
      • form // 校验数据模型
      • mysql // mysql表字段映射模型
      • redis // redis数据模型
    • router // 注册路由目录
  • config
    • dev // 必要配置项(通过系统环境变量选择配置路径)
      • ratgo.ini // web服务配置
      • database.ini // 数据库配置
      • redis.ini // redis配置
    • test
    • prod
  • runtime
    • log // 存储系统错误日志
  • main.go // 入口文件

服务配置

配置项 src/myratgo/config/ratgo.ini

[main]
AppName = ratgo // 服务名称
HTTPAddr = 127.0.0.1:8089 // http地址端口
HTTPSAddr = 127.0.0.1:10443 // https地址端口

项目中使用配置

读取方式: (不会直接获取对应值, 而是返回一个*mtype.anyvalue结构体指针, 可实现对应类型转换)
config := ratgo.Config.Get("xx.xx")

调用示例:
config := ratgo.Config.Get("ratgo.main.AppName").ToString() // 输出 ratgo

备注: ratgo.ini、database.ini、redis.ini等必要配置项,文件和字段名均为ratgo使用,不可修改.

快速开始

示例说明:

项目名称:myratgo
src: GOPATH 下的 src 目录

入口文件: src/myratgo/main.go

package main

import (
	"gitlabj01.vdongchina.com/TemplateFramework/ratgo"
	_ "myratgo/application/router"
)

func main() {
	ratgo.RunWebServer()
}
编译运行
$ go run main.go // 编译并运行
或者:
$ go build main.go // 编译
$ ./main.x // 执行编译后的文件

路由配置

举例: src/myratgo/application/router/demo.go

package router

import (
	"gitlabj01.vdongchina.com/TemplateFramework/ratgo"
	"myratgo/application/modules/demo"
	"myratgo/application/modules/demo/sub"
)

func init() {
	// Demo模块
	ratgo.Router.General("demo", ratgo.GeneralMap{
		"index": &demo.Index{}, // 对应控制器: application/modules/demo下的Index结构体
		"list":  &demo.List{}, // 对应控制器: application/modules/demo下的List结构体
		"sub/index": &sub.Index{}, // 对应控制器: application/modules/demo/sub下的Index结构体
	})

	// 静态文件
	ratgo.Router.SetStatic("/apidoc", "./apidoc") // 访问: http://127.0.0.1:port/apidoc
	ratgo.Router.SetStatic("/assets", "./assets") // 访问: http://127.0.0.1:port/assets
}
访问:
http://127.0.0.1:port/xx/xx
http://127.0.0.1:port/xx/xx/xx

示例:
http://127.0.0.1:port/demo/index
http://127.0.0.1:port/demo/list
http://127.0.0.1:port/demo/sub/index
Note: 该路由模式为简易模式, 对应gin: any("/xx/:param1",func())、any("/xx/:param1/:param2",func())两种模式
,即两段和三段路由无拦截访问。

Web应用

基类Controller的代码示例: ratgo/Controller.go

package ratgo

import "github.com/gin-gonic/gin"

// 控制器
type Controller struct {
	context *gin.Context
	result  *Result
}

// 控制器初始化方法 -- 此方法为系统调用
func (c *Controller) Init(context *gin.Context, result *Result) {
	c.context = context
	c.result = result
}

// 获取 gin 的上下文Context -- 对应一个用户请求,用法可参考gin框架
func (c *Controller) Context() *gin.Context {
	return c.context
}

// 简易模式 - 前置方法 -- 在简易路由模式下,系统会首先执行该方法
func (c *Controller) BeforeExec() {

}

// 简易模式 - 执行方法 -- 在简易路由模式下,系统执行完 BeforeExec() 后会执行该方法
func (c *Controller) Exec() {

}

// 结果方法 -- 控制响应(辅助用法,阻断执行直接响应异常)
func (c *Controller) Result() *Result {
	return c.result
}
Note:
BeforeExec()方法可用于鉴权、登录验证等公共功能;
Result()方法获取到一个*ratgo.result可修改状态码、响应类型等, 系统调用执行方法时会根据状态码进行逻辑处理.

Controller.result的示例代码: ratgo/Result.go

package ratgo

/**************************************** 数据类型 - 结构体Result ****************************************/
// 定义常量
const (
	RespString = "String"
	RespJson   = "Json"
	RespHtml   = "Html"
)

// 响应结果
type Result struct {
	Status int         // 状态码: [200:OK] [400:Bad Request] [500:Internal Server Error] [900:逻辑异常(状态码200)]
	Type   string      // 响应类型: String、Json、Html 默认Json
	Msg    string      // 消息提示
	Data   interface{} // 响应数据
}

// 实例化 Result
func NewResult() *Result {
	return &Result{
		Status: 200,
		Type:   RespJson,
		Msg:    "",
		Data:   "",
	}
}

// 设置Code
func (r *Result) SetStatus(status int) {
	r.Status = status
}

// 设置Code
func (r *Result) SetType(t string) {
	r.Type = t
}

// 设置Msg
func (r *Result) SetMsg(msg string) {
	r.Msg = msg
}

// 设置Data
func (r *Result) SetData(data interface{}) {
	r.Data = data
}

项目Controller的代码示例: myratgo/application/modules/demo/index.go

package demo

import (
	"gitlabj01.vdongchina.com/TemplateFramework/ratgo"
)

type Index struct {
	ratgo.Controller
}

/**
 * @api {post} /demo/index  xxx接口
 * @apiDescription 1.0
 * @apiGroup api
 * @apiVersion 1.0.0
 * @apiParam {string} xxx 参数
 * @apiSuccessExample {json} 正确返回值:
 * {"code":200,"msg":"ok","time":1560245913,"data":""}
 */
func (this *Index) Exec() {
	this.Context().String(200, "执行Controller: demo.Index")
}
Note:访问 http://127.0.0.1:port/demo/index // 浏览器输出: 执行Controller: demo.Index

数据库

配置项 myratgo/config/dev/database.ini

[plus_center] // 配置分组,必填
; 主库
master.driverName = mysql // 驱动名称
master.dataSourceName = root:root@tcp(127.0.0.1:3306)/dbName?charset=utf8 // 连接参数
master.maxIdleConn = 100 // 空闲连接数
master.maxOpenConn = 100 // 最大连接数
master.maxLifetime = 1800 // 连接超时

; 从库
slave.driverName = mysql
slave.dataSourceName = root:root@tcp(127.0.0.1:3306)/dbName?charset=utf8
slave.maxIdleConn = 100
slave.maxOpenConn = 100
slave.maxLifetime = 1800

默认使用Gorm(用法请参考 http://gorm.book.jasperxu.com)

func (ds *DbStorage) Db(key string) *gorm.DB // 返回 *gorm.DB

示例:
db := extend.Gorm.Db("plus_center.master") // 对应配置项设置
db.xxx() // gorm的用法

Redis

配置项 xxx/config/dev/redis.ini

[plus_center] // // 配置分组,必填
master.host = 127.0.0.1:6379 // 主机端口
master.password = "" // 密码
master.db = 10 // 库标
master.MaxIdle = 16 // 空闲连接数
master.MaxActive = 32 // 最大连接数 
master.IdleTimeout = 120 // 超时时间

RedisModel的示例

package redis

type TestModel struct {}

// Redis库标识
func (b *Base) Identify() string {
	return "plus_center.master"
}
(this *Users) Identify() string // 设置redis连接参数,对应Redis配置的key链关系

Redis的使用示例:

传入一个model获取 Redis Dao 实例
RedisModel(model interface{}) *RedisDao

示例:
redisDao := RedisModel(&TestModel{})
获取连接池对象,开发者可通过此返回值
(rd *RedisDao) Pool() *redis.Pool

示例:
pool := RedisModel(&TestModel{}).Pool()
执行redis命令,返回*base.AnyValue,可进行类型转换. 参数name:命令名称 args:该命令对应的参数
(rd *RedisDao) Command(name string, args ...interface{}) *base.AnyValue

示例:
RedisModel(&TestModel{}).Command("SET","username","admin")
RedisModel(&TestModel{}).Command("HSET","user","username","admin")
ret := RedisModel(&TestModel{}).Command("GET","username")
ret.ToError() // 可获取错误信息,如果返回nil,则说明无错误发生
ret.ToAffectedRows() // 返回受影响行数

Utils工具

Curl使用

GET请求
获取一个 *curl.GetCaller
func Get() *GetCaller
设置header信息
func (gc *GetCaller) Header(header map[string]string)
发送一个GET请求
func (gc *GetCaller) Call(url string, args ...map[string]interface{}) *multitype.AnyValue
GET请求示例:
get := curl.Get()

// 如需设置header, 则使用此方法
get.Header(map[string]string{"Authorization":"Basic MTAwMToxMjM0NTY="})

// 发送请求
get.Call("http://www.baidu.com",map[string]interface{}{
	"user_id":  1,
	"username": "admin",
	"password": "123456",
})
POST请求
获取一个 *curl.PostCaller
func Post() *PostCaller
设置header信息
func (pc *PostCaller) Header(header map[string]string)
发送一个POST请求
func (pc *PostCaller) Call(url string, args ...interface{}) *multitype.AnyValue
POST请求示例:
post := curl.Post()

// 如需设置header, 则使用此方法
post.Header(map[string]string{"Authorization":"Basic MTAwMToxMjM0NTY="})

// 设置 json 请求 header, 默认 header {"Content-Type": "application/x-www-form-urlencoded"}
post.Header(map[string]string{"Content-Type": "application/json"})

// 发送请求(key-value形式)
post.Call("http://www.baidu.com",map[string]interface{}{
	"user_id":  1,
	"username": "admin",
	"password": "123456",
})

// 发送请求(json串形式)
post.Call("http://www.baidu.com",`{"user_id":1,"username":"admin","password":"123456"}`)

# Packages

No description provided by the author
Copyright 2020 ratgo Author.
No description provided by the author
No description provided by the author
No description provided by the author

# Functions

创建文件.
Error info.
写入错误.
获取 *WebServer.
日志句柄初始化.
日志初始化.
日志写入 ES.
[info]日志写入到文件.
日志写入 syslog.
执行的sql或者返回结果存储,日志动态输出.
字符串加密.
实例化 Result.
获取web实例.
运行cmd服务.
运行web服务.
运行websocket服务.
Handle Stack message.
日志列表-记录格式.

# Constants

*************************************** 数据类型 - 结构体Result ****************************************/ 定义常量.
*************************************** 数据类型 - 结构体Result ****************************************/ 定义常量.
*************************************** 数据类型 - 结构体Result ****************************************/ 定义常量.

# Variables

应用容器.
BConfig is the default config for Application.
初始化.
router对象.

# Structs

No description provided by the author
控制器.
中间件容器.
响应结果.
路由存储器.
Web server.

# Interfaces

控制器接口.

# Type aliases

Error handle.
简易模式路由容器.