diff --git a/01-Gin框架/02-路由配置.md b/01-Gin框架/02-路由配置.md index f21de47..8770af0 100644 --- a/01-Gin框架/02-路由配置.md +++ b/01-Gin框架/02-路由配置.md @@ -255,3 +255,9 @@ const ( ``` 引入 config 包,直接 `config.xx` 即可。 + +## 源码 + +**下载源码后,请先执行 `dep ensure` 下载依赖包!** + +[查看源码](https://github.com/xinliangnote/Go/blob/master/01-Gin框架/codes/02-路由配置) diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.lock b/01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.lock new file mode 100644 index 0000000..d9a85d3 --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.lock @@ -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 diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.toml b/01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.toml new file mode 100644 index 0000000..29f2740 --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/Gopkg.toml @@ -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 diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/common/common.go b/01-Gin框架/codes/02-路由配置/ginDemo/common/common.go new file mode 100644 index 0000000..9ec2b9e --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/common/common.go @@ -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 + } +} diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/config/config.go b/01-Gin框架/codes/02-路由配置/ginDemo/config/config.go new file mode 100644 index 0000000..c9ec740 --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/config/config.go @@ -0,0 +1,9 @@ +package config + +const ( + PORT = ":8080" + APP_NAME = "ginDemo" + APP_SECRET = "6YJSuc50uJ18zj45" + API_EXPIRY = "120" + +) diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/member.go b/01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/member.go new file mode 100644 index 0000000..5e8be1c --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/member.go @@ -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, + }) +} diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/product.go b/01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/product.go new file mode 100644 index 0000000..2cb9692 --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/controller/v1/product.go @@ -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, + }) +} diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/member.go b/01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/member.go new file mode 100644 index 0000000..21bfffe --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/member.go @@ -0,0 +1,9 @@ +package v2 + +import "github.com/gin-gonic/gin" + +func AddMember(c *gin.Context) { + c.JSON(200, gin.H{ + "v2" : "AddMember", + }) +} diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/product.go b/01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/product.go new file mode 100644 index 0000000..ef92f26 --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/controller/v2/product.go @@ -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, + }) +} diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/main.go b/01-Gin框架/codes/02-路由配置/ginDemo/main.go new file mode 100644 index 0000000..eb37f6a --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/main.go @@ -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) +} \ No newline at end of file diff --git a/01-Gin框架/codes/02-路由配置/ginDemo/router/router.go b/01-Gin框架/codes/02-路由配置/ginDemo/router/router.go new file mode 100644 index 0000000..76cc493 --- /dev/null +++ b/01-Gin框架/codes/02-路由配置/ginDemo/router/router.go @@ -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) +} \ No newline at end of file