add 路由配置

This commit is contained in:
新亮
2019-07-17 22:16:58 +08:00
parent ff6c31dd1e
commit 48de19bfee
11 changed files with 389 additions and 0 deletions

View File

@@ -255,3 +255,9 @@ const (
```
引入 config 包,直接 `config.xx` 即可。
## 源码
**下载源码后,请先执行 `dep ensure` 下载依赖包!**
[查看源码](https://github.com/xinliangnote/Go/blob/master/01-Gin框架/codes/02-路由配置)

View File

@@ -0,0 +1,128 @@
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
[[projects]]
digest = "1:3ee1d175a75b911a659fbd860060874c4f503e793c5870d13e5a0ede529a63cf"
name = "github.com/gin-contrib/sse"
packages = ["."]
pruneopts = "UT"
revision = "54d8467d122d380a14768b6b4e5cd7ca4755938f"
version = "v0.1.0"
[[projects]]
digest = "1:d8bd2a337f6ff2188e08f72c614f2f3f0fd48e6a7b37a071b197e427d77d3a47"
name = "github.com/gin-gonic/gin"
packages = [
".",
"binding",
"internal/json",
"render",
]
pruneopts = "UT"
revision = "b75d67cd51eb53c3c3a2fc406524c940021ffbda"
version = "v1.4.0"
[[projects]]
digest = "1:573ca21d3669500ff845bdebee890eb7fc7f0f50c59f2132f2a0c6b03d85086a"
name = "github.com/golang/protobuf"
packages = ["proto"]
pruneopts = "UT"
revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7"
version = "v1.3.2"
[[projects]]
digest = "1:f5a2051c55d05548d2d4fd23d244027b59fbd943217df8aa3b5e170ac2fd6e1b"
name = "github.com/json-iterator/go"
packages = ["."]
pruneopts = "UT"
revision = "0ff49de124c6f76f8494e194af75bde0f1a49a29"
version = "v1.1.6"
[[projects]]
digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de"
name = "github.com/konsorten/go-windows-terminal-sequences"
packages = ["."]
pruneopts = "UT"
revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e"
version = "v1.0.2"
[[projects]]
branch = "master"
digest = "1:8654122ef85f2bc03859b0a7ea2d36c9965888689cdac7640cceaa6edb11cff6"
name = "github.com/lestrrat-go/strftime"
packages = ["."]
pruneopts = "UT"
revision = "8b31f9c59b0feb56c456ce49a7b3d2b2e93a6f18"
[[projects]]
digest = "1:9b90c7639a41697f3d4ad12d7d67dfacc9a7a4a6e0bbfae4fc72d0da57c28871"
name = "github.com/mattn/go-isatty"
packages = ["."]
pruneopts = "UT"
revision = "1311e847b0cb909da63b5fecfb5370aa66236465"
version = "v0.0.8"
[[projects]]
digest = "1:33422d238f147d247752996a26574ac48dcf472976eda7f5134015f06bf16563"
name = "github.com/modern-go/concurrent"
packages = ["."]
pruneopts = "UT"
revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94"
version = "1.0.3"
[[projects]]
digest = "1:e32bdbdb7c377a07a9a46378290059822efdce5c8d96fe71940d87cb4f918855"
name = "github.com/modern-go/reflect2"
packages = ["."]
pruneopts = "UT"
revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd"
version = "1.0.1"
[[projects]]
digest = "1:cf31692c14422fa27c83a05292eb5cbe0fb2775972e8f1f8446a71549bd8980b"
name = "github.com/pkg/errors"
packages = ["."]
pruneopts = "UT"
revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4"
version = "v0.8.1"
[[projects]]
digest = "1:5a1cf4e370bc86137b58da2ae065e76526d32b11f62a7665f36dbd5f41fa95ff"
name = "github.com/ugorji/go"
packages = ["codec"]
pruneopts = "UT"
revision = "23ab95ef5dc3b70286760af84ce2327a2b64ed62"
version = "v1.1.7"
[[projects]]
branch = "master"
digest = "1:5b3f90037a9027c43bdcae488c39d41aadecb9d85e645bb62b773a0a6f6e86b8"
name = "golang.org/x/sys"
packages = ["unix"]
pruneopts = "UT"
revision = "6ec70d6a5542cba804c6d16ebe8392601a0b7b60"
[[projects]]
digest = "1:cbc72c4c4886a918d6ab4b95e347ffe259846260f99ebdd8a198c2331cf2b2e9"
name = "gopkg.in/go-playground/validator.v8"
packages = ["."]
pruneopts = "UT"
revision = "5f1438d3fca68893a817e4a66806cea46a9e4ebf"
version = "v8.18.2"
[[projects]]
digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96"
name = "gopkg.in/yaml.v2"
packages = ["."]
pruneopts = "UT"
revision = "51d6538a90f86fe93ac480b35f37b2be17fef232"
version = "v2.2.2"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
input-imports = [
"github.com/gin-gonic/gin",
]
solver-name = "gps-cdcl"
solver-version = 1

View File

@@ -0,0 +1,33 @@
# Gopkg.toml example
#
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
# name = "github.com/user/project"
# version = "1.0.0"
#
# [[constraint]]
# name = "github.com/user/project2"
# branch = "dev"
# source = "github.com/myfork/project2"
#
# [[override]]
# name = "github.com/x/y"
# version = "2.4.0"
#
# [prune]
# non-go = false
# go-tests = true
# unused-packages = true
[[constraint]]
name = "github.com/gin-gonic/gin"
version = "1.4.0"
[prune]
go-tests = true
unused-packages = true

View File

@@ -0,0 +1,101 @@
package common
import (
"crypto/md5"
"encoding/hex"
"fmt"
"ginDemo/config"
"github.com/gin-gonic/gin"
"net/http"
"net/url"
"sort"
"strconv"
"time"
)
// 打印
func Print(i interface{}) {
fmt.Println("---")
fmt.Println(i)
fmt.Println("---")
}
// 返回JSON
func RetJson(code, msg string, data interface{}, c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"code" : code,
"msg" : msg,
"data" : data,
})
c.Abort()
}
// 获取当前时间戳
func GetTimeUnix() int64 {
return time.Now().Unix()
}
// MD5 方法
func MD5(str string) string {
s := md5.New()
s.Write([]byte(str))
return hex.EncodeToString(s.Sum(nil))
}
// 生成签名
func CreateSign(params url.Values) string {
var key []string
var str = ""
for k := range params {
if k != "sn" {
key = append(key, k)
}
}
sort.Strings(key)
for i := 0; i < len(key); i++ {
if i == 0 {
str = fmt.Sprintf("%v=%v", key[i], params.Get(key[i]))
} else {
str = str + fmt.Sprintf("&%v=%v", key[i], params.Get(key[i]))
}
}
// 自定义签名算法
sign := MD5(MD5(str) + MD5(config.APP_NAME + config.APP_SECRET))
return sign
}
// 验证签名
func VerifySign(c *gin.Context) {
var method = c.Request.Method
var ts int64
var sn string
var req url.Values
if method == "GET" {
req = c.Request.URL.Query()
sn = c.Query("sn")
ts, _ = strconv.ParseInt(c.Query("ts"), 10, 64)
} else if method == "POST" {
req = c.Request.PostForm
sn = c.PostForm("sn")
ts, _ = strconv.ParseInt(c.PostForm("ts"), 10, 64)
} else {
RetJson("500", "Illegal requests", "", c)
return
}
exp, _ := strconv.ParseInt(config.API_EXPIRY, 10, 64)
// 验证过期时间
if ts > GetTimeUnix() || GetTimeUnix() - ts >= exp {
RetJson("500", "Ts Error", "", c)
return
}
// 验证签名
if sn == "" || sn != CreateSign(req) {
RetJson("500", "Sn Error", "", c)
return
}
}

View File

@@ -0,0 +1,9 @@
package config
const (
PORT = ":8080"
APP_NAME = "ginDemo"
APP_SECRET = "6YJSuc50uJ18zj45"
API_EXPIRY = "120"
)

View File

@@ -0,0 +1,15 @@
package v1
import "github.com/gin-gonic/gin"
func AddMember(c *gin.Context) {
// 获取 Get 参数
name := c.Query("name")
price := c.DefaultQuery("price", "100")
c.JSON(200, gin.H{
"v1" : "AddMember",
"name" : name,
"price" : price,
})
}

View File

@@ -0,0 +1,15 @@
package v1
import "github.com/gin-gonic/gin"
func AddProduct(c *gin.Context) {
// 获取 Get 参数
name := c.Query("name")
price := c.DefaultQuery("price", "100")
c.JSON(200, gin.H{
"v1" : "AddProduct",
"name" : name,
"price" : price,
})
}

View File

@@ -0,0 +1,9 @@
package v2
import "github.com/gin-gonic/gin"
func AddMember(c *gin.Context) {
c.JSON(200, gin.H{
"v2" : "AddMember",
})
}

View File

@@ -0,0 +1,17 @@
package v2
import (
"github.com/gin-gonic/gin"
)
func AddProduct(c *gin.Context) {
// 获取 Get 参数
name := c.Query("name")
price := c.DefaultQuery("price", "100")
c.JSON(200, gin.H{
"v2" : "AddProduct",
"name" : name,
"price" : price,
})
}

View File

@@ -0,0 +1,14 @@
package main
import (
"ginDemo/config"
"ginDemo/router"
"github.com/gin-gonic/gin"
)
func main() {
gin.SetMode(gin.ReleaseMode) // 默认为 debug 模式,设置为发布模式
engine := gin.Default()
router.InitRouter(engine) // 设置路由
engine.Run(config.PORT)
}

View File

@@ -0,0 +1,42 @@
package router
import (
"ginDemo/common"
"ginDemo/controller/v1"
"ginDemo/controller/v2"
"github.com/gin-gonic/gin"
"net/url"
"strconv"
)
func InitRouter(r *gin.Engine) {
r.GET("/sn", SignDemo)
// v1 版本
GroupV1 := r.Group("/v1")
{
GroupV1.Any("/product/add", v1.AddProduct)
GroupV1.Any("/member/add", v1.AddMember)
}
// v2 版本
GroupV2 := r.Group("/v2", common.VerifySign)
{
GroupV2.Any("/product/add", v2.AddProduct)
GroupV2.Any("/member/add", v2.AddMember)
}
}
func SignDemo(c *gin.Context) {
ts := strconv.FormatInt(common.GetTimeUnix(), 10)
res := map[string]interface{}{}
params := url.Values{
"name" : []string{"a"},
"price" : []string{"10"},
"ts" : []string{ts},
}
res["sn"] = common.CreateSign(params)
res["ts"] = ts
common.RetJson("200", "", res, c)
}