Categorygithub.com/leaderwolfpipi/doris
modulepackage
1.2.0
Repository: https://github.com/leaderwolfpipi/doris.git
Documentation: pkg.go.dev

# README

doris高性能、易扩展、又好用的go web开发框架

部署步骤

设置环境变量$GOPATH
安装最新版本的go (>=1.11.0)
任意建一个新的工作目录doris,并新建main.go文件拷贝下面的实例代码
运行go mod init dorsi/main(模块名称任意取)
运行go build即可自动完成依赖的下载和代码编译

备注说明

运行go build或者go test等之后项目的依赖代码会自动下载到$GOPATH/pkg/mod/下面

代码案例


package main

import (
	"doris"
	"doris/middleware"
	"fmt"
	"time"
)

const (
	Nanosecond  time.Duration = 1
	Microsecond               = 1000 * Nanosecond
	Millisecond               = 1000 * Microsecond
	Second                    = 1000 * Millisecond
	Minute                    = 60 * Second
	Hour                      = 60 * Minute
)

type Person struct {
	Name string `json:"username"`
	Sex  string `json:"sex"`
	Age  int    `json:"age"`
	Url  string `json:"url"`
}

func main() {

	// 实例化框架对象
	d := doris.New()
	d.ShowBanner = true
	d.Debug = false

	// 中间件部分测试
	// 全局中间件测试
	d.Use(middleware.Test())
	d.Use(middleware.Logger())

	// 测试路由冲突
	d.GET("/", func(c *doris.Context) error {
		c.IndentedJson(200, doris.D{"code": 200, "message": "success!"})
		return nil
	})

	// /:a/:e/:id
	d.GET("/:a/:e/:id", func(c *doris.Context) error {
		fmt.Println("/:a/:e/:id!")
		//c.Response.Writer.Write([]byte("SUCCESS!HELLO WORLD!"))
		return nil
	})

	// /:a/:id
	d.GET("/:a/:id", func(c *doris.Context) error {
		var p Person
		p.Name = "张胜男"
		p.Sex = "女"
		p.Age = 12
		p.Url = "http://www.geeksniu.com/<html></html>"
		c.PureJson(200, p)
		return nil
	})

	d.POST("/hello", func(c *doris.Context) error {
		// 测试参数绑定结构体
		type Louhao struct {
			AA       string `param:"aa"`
			bB       string `param:"bb"`
			sb       string `param:"sb"`
			Age      int    `param:"age"`
			nickname string `param:"nickname"`
			Address  string `param:"street"`
		}
		h := Louhao{}
		_ = c.Form(&h)
		_ = c.FormParam("age00")
		time.Sleep(50 * Millisecond)
		c.String(200, "hello world!")
		return nil
	})

	// /:a/:b/:c/:id
	d.GET("/:a/:b/:c/:id", func(c *doris.Context) error {
		fmt.Println("/:a/:b/:c/:id!")
		return nil
	})

	d.GET("/xml", func(c *doris.Context) error {
		var p Person
		p.Name = "张胜男"
		p.Sex = "女"
		p.Age = 12
		p.Url = "http://www.geeksniu.com/<html></html>"
		c.Xml(200, p)
		return nil
	})

	d.GET("/pong", func(c *doris.Context) error {
		fmt.Println("/pong!")
		return nil
	})

	// 这种形式生成的树会漏掉当前的路由
	// 期望的情况是从l分割开来
	// 下面三个互换位置再测
	d.POST("/hello/", func(c *doris.Context) error {
		fmt.Println("POST /hello/!")
		c.Response.Writer.Write([]byte("SUCCESS!HELLO!"))
		return nil
	})

	d.POST("/hello", func(c *doris.Context) error {
		fmt.Println("POST /hello!")
		c.Response.Writer.Write([]byte("SUCCESS!HELLO!"))
		return nil
	})

	d.POST("/hell", func(c *doris.Context) error {
		fmt.Println("POST /hell!")
		//c.Response.Writer.Write([]byte("SUCCESS!HELLO WORLD!"))
		return nil
	})

	// 静态路由和参数路由冲突测试
	// 静态路由优先的原则
	d.POST("/hello/name", func(c *doris.Context) error {
		fmt.Println("POST /hello/name!")
		c.Response.Writer.Write([]byte("SUCCESS!HELLO!"))
		return nil
	})

	// bug curl -XPOST localhost:8002/hello/name9
	// 404错误
	// 期望是/hello/:name

	// 注意如果注册两个相同的路由会出现报错
	d.POST("/hello/name/", func(c *doris.Context) error {
		c.Response.Writer.Write([]byte("SUCCESS!HELLO!"))
		return nil
	})
	d.POST("/hello/name/", func(c *doris.Context) error {
		c.Response.Writer.Write([]byte("SUCCESS!HELLO!"))
		return nil
	})

	// 参数路由
	d.POST("/hello/:name", func(c *doris.Context) error {
		c.Response.Writer.Write([]byte("SUCCESS! /hello/:name!"))
		return nil
	})

	// 参数路由
	d.POST("/hello/:age", func(c *doris.Context) error {
		c.Response.Writer.Write([]byte("SUCCESS!/hello/:age!"))
		return nil
	})

	// 下面两个互换位置再测
	// 参数路由
	d.POST("/hello/:age/:sex", func(c *doris.Context) error {
		c.Response.Writer.Write([]byte("SUCCESS!/hello/:age/:sex!"))
		return nil
	})

	// 参数路由
	d.POST("/hello/:age/sex/:sex", func(c *doris.Context) error {
		c.Response.Writer.Write([]byte("SUCCESS!/hello/:age/sex/:sex!"))
		return nil
	})

	// 全量路由
	d.POST("/hello/*/", func(c *doris.Context) error {
		c.Response.Writer.Write([]byte("SUCCESS!/hello/*/!"))
		return nil
	})

	// 定义组路由
	v1 := d.Group("/v1/", func(c *doris.Context) error {
		c.Response.Writer.Write([]byte("SUCCESS!/hello/*/!"))
		return nil
	})

	// 组中间件测试
	v1.Use(middleware.Test())
	v1.Pre(middleware.Logger())

	// localhost:8002/v1/hello
	// 这个群组测试失败,需要继续验证
	v1.POST("/hello", func(c *doris.Context) error {
		fmt.Println("GROUP /v1/hello")
		c.Response.Writer.Write([]byte("SUCCESS!/v1/hello"))
		return nil
	})

	// 这个群组测试失败,需要继续验证
	// 已经修复
	v1.POST("/hello/LOUHAO", func(c *doris.Context) error {
		fmt.Println("GROUP /v1/LOUHAO")
		c.Response.Writer.Write([]byte("SUCCESS!/v1/LOUHAO"))
		return nil
	})

	v1.POST("/hell", func(c *doris.Context) error {
		fmt.Println("GROUP /v1/hell")
		c.Response.Writer.Write([]byte("SUCCESS!/v1/hell"))
		return nil
	})

	v1.POST("/hello/:id/", func(c *doris.Context) error {
		fmt.Println("GROUP /v1/hello/:id/")
		c.Response.Writer.Write([]byte("SUCCESS!/v1/hello/:id/"))
		return nil
	})

	// debug
	// d.ScanTrees()           // 打印路由树
	d.Run("localhost:9527") // listen and serve on 0.0.0.0:8080
}

# Packages

cors is a cross domain middleware.

# Functions

Dir returns a http.Filesystem that can be used by http.FileServer().
判断元素是否在切片中.
判断interface类型的动态值是否为nil.
连接路径公用方法.
实例化框架对象函数.
解析网络地址.
将keys切片和values切片转为Map.
实现字符串截取功能 Unicode编码的情况 普通的字符串可以直接使用切片截取 参考:https://cloud.tencent.com/developer/ask/50599.

# Constants

HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
Access control.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
Security.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
HTTP Headers Defined.
Version of Doris.

# Variables

用于存储JWT鉴权字段名称.
Errors.
define jwt err code 10xxx is system error of the doris.
Define jwt Errors.
define jwt err code 10xxx is system error of the doris.
Define jwt Errors.
define jwt err code 10xxx is system error of the doris.
Define jwt Errors.
define jwt err code 10xxx is system error of the doris.
Define jwt Errors.
define jwt err code 10xxx is system error of the doris.
Define jwt Errors.
define jwt err code 10xxx is system error of the doris.
Define jwt Errors.

# Structs

context是doris框架中最重要的结构之一,主要功能: 1.
No description provided by the author
No description provided by the author
单个url参数包含key/value.
No description provided by the author
No description provided by the author

# Interfaces

No description provided by the author
No description provided by the author
ResponseWriter接口定义.

# Type aliases

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
参数数组通常是route返回.
No description provided by the author