hebinlong 4 роки тому
коміт
964fc25d96
15 змінених файлів з 612 додано та 0 видалено
  1. 26 0
      .gitignore
  2. 41 0
      Makefile
  3. 33 0
      com/main.go
  4. 60 0
      config.go
  5. 19 0
      config.json
  6. 23 0
      go.mod
  7. 97 0
      go.sum
  8. 45 0
      router/RouterManchong/handler.go
  9. 40 0
      router/RouterManchong/req.go
  10. 76 0
      router/RouterManchong/resp.go
  11. 51 0
      router/RouterManchong/template.go
  12. 10 0
      router/init.go
  13. 10 0
      server.log
  14. 32 0
      utils/ginhandler.go
  15. 49 0
      utils/log.go

+ 26 - 0
.gitignore

@@ -0,0 +1,26 @@
+### Go template
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, built with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# Dependency directories (remove the comment below to include it)
+# vendor/
+
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+test

+ 41 - 0
Makefile

@@ -0,0 +1,41 @@
+
+edit ?= service
+GOHOSTOS = $(shell go env GOHOSTOS)
+GOHOSTARCH = $(shell go env GOHOSTARCH)
+GOOS ?= ${GOHOSTOS}
+GOARCH ?= ${GOHOSTARCH}
+END =
+ifeq (${GOOS}, windows)
+	END=.exe
+endif
+EDIT = ${edit}${END}
+
+
+commitId = $(shell git rev-parse HEAD)
+GO_TAGS = jsoniter
+GO_LDFLAGS = -w -s  -X main.buildOS="${GOHOSTOS}/${GOHOSTARCH}" -X main.commitId="${commitId}"
+GO_FLAGS = -ldflags="${GO_LDFLAGS}" -tags="${GO_TAGS}"
+
+$(shell go env -w CGO_ENABLED=0)
+
+catNoGoFile = $(filter-out %.go, $(wildcard ${1}/*))
+catGoFile = $(filter %.go %_test.go, $(wildcard ${1}/*))
+FindGoFile = $(foreach i,${1},$(if $(call catNoGoFile,${i}),$(call FindGoFile,$(call catNoGoFile,${i}))) $(call catGoFile,${i}))
+
+FILES = $(call FindGoFile,.)
+
+${EDIT}:${FILES} Makefile
+	@echo "Lock Files: ${FILES}"
+	CGO_ENABLED=0 GOOS=${GOOS} GOARCH=${GOARCH} go build -o $@ ${GO_FLAGS} ./com
+
+${FILES}:
+.PHONY: test clean run
+
+clean:
+	-rm ${EDIT}
+
+test:
+	@echo "Lock Files: ${FILES}"
+
+run:${EDIT}
+	nohup ${EDIT} > server.log  2>&1 &

+ 33 - 0
com/main.go

@@ -0,0 +1,33 @@
+package main
+
+import (
+	"github.com/gin-gonic/gin"
+	"manchong"
+	"manchong/router"
+	"manchong/utils"
+	"net/http"
+)
+
+var buildOS, commitId string
+
+func main() {
+	gin.SetMode(gin.ReleaseMode)
+	app := gin.New()
+	app.Use(utils.GinHandler)
+	app.NoRoute(utils.GinNoRoute)
+	router.Routers(app.Group("/"))
+	addr := manchong.CFG.Addr
+	server := http.Server{
+		Addr:    addr,
+		Handler: app,
+	}
+	utils.DefaultLogger().Infof("RunServer At Addr:\"%s\"", addr)
+	err := server.ListenAndServe()
+	if err != nil {
+		utils.DefaultLogger().Panic(err)
+	}
+}
+
+func init() {
+	utils.DefaultLogger().Infof("From \"%s\" to Build commitId is \"%s\"", buildOS, commitId)
+}

+ 60 - 0
config.go

@@ -0,0 +1,60 @@
+package manchong
+
+import (
+	"github.com/go-sql-driver/mysql"
+	"github.com/json-iterator/go"
+	"io"
+	"os"
+	"sync"
+	"time"
+)
+
+type Config struct {
+	Addr    string            `json:"addr"`
+	LogLeve string            `json:"log_leve"`
+	LogFile string            `json:"log_file"`
+	Users   map[string]string `json:"users"`
+	MySQL   *mysql.Config     `json:"mysql"`
+}
+
+var CFG = Config{
+	Addr:    ":8080",
+	LogLeve: "info",
+	LogFile: "",
+	Users:   nil,
+	MySQL:   mysql.NewConfig(),
+}
+var fnsL = &sync.Mutex{}
+var fns = make([]func(), 0, 10)
+
+func RegisterReloadConfigCall(fn func()) {
+	fnsL.Lock()
+	defer fnsL.Unlock()
+	fns = append(fns, fn)
+	fn()
+}
+
+func readCFG() {
+	file, err := os.Open("config.json")
+	if err != nil {
+		panic(err)
+	}
+	bs, err := io.ReadAll(file)
+	if err != nil {
+		panic(err)
+	}
+	err = jsoniter.Unmarshal(bs, &CFG)
+	CFG.MySQL.Loc = time.Local
+	if err != nil {
+		panic(err)
+	}
+	fnsL.Lock()
+	defer fnsL.Unlock()
+	for _, fn := range fns {
+		fn()
+	}
+}
+
+func init() {
+	readCFG()
+}

+ 19 - 0
config.json

@@ -0,0 +1,19 @@
+{
+  "addr": ":25535",
+  "log_leve": "info",
+  "log_file": "server.log",
+  "users": {"test": "test"},
+  "mysql": {
+    "User": "root",
+    "Passwd": "",
+    "Net": "tcp",
+    "Addr": "127.0.0.1:3306",
+    "DBName": "data",
+    "Params": {},
+    "Collation": "utf8mb4_general_ci",
+    "MaxAllowedPacket": 4194304,
+    "ServerPubKey": "",
+    "AllowNativePasswords": true,
+    "CheckConnLiveness":  true
+  }
+}

+ 23 - 0
go.mod

@@ -0,0 +1,23 @@
+module manchong
+
+go 1.16
+
+require (
+	github.com/antonfisher/nested-logrus-formatter v1.3.1 // indirect
+	github.com/gin-gonic/gin v1.7.2 // indirect
+	github.com/go-playground/validator/v10 v10.6.1 // indirect
+	github.com/go-sql-driver/mysql v1.6.0 // indirect
+	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/json-iterator/go v1.1.11 // indirect
+	github.com/leodido/go-urn v1.2.1 // indirect
+	github.com/mattn/go-isatty v0.0.13 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.1 // indirect
+	github.com/sirupsen/logrus v1.8.1 // indirect
+	github.com/ugorji/go v1.2.6 // indirect
+	golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect
+	golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect
+	golang.org/x/text v0.3.6 // indirect
+	google.golang.org/protobuf v1.27.1 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+)

+ 97 - 0
go.sum

@@ -0,0 +1,97 @@
+github.com/antonfisher/nested-logrus-formatter v1.3.1 h1:NFJIr+pzwv5QLHTPyKz9UMEoHck02Q9L0FP13b/xSbQ=
+github.com/antonfisher/nested-logrus-formatter v1.3.1/go.mod h1:6WTfyWFkBc9+zyBaKIqRrg/KwMqBbodBjgbHjDz7zjA=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA=
+github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+github.com/go-playground/validator/v10 v10.6.1 h1:W6TRDXt4WcWp4c4nf/G+6BkGdhiIo0k417gfr+V6u4I=
+github.com/go-playground/validator/v10 v10.6.1/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk=
+github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
+github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
+github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA=
+github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
+github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
+github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
+github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E=
+github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0=
+github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
+github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
+github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ=
+github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI=
+golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 45 - 0
router/RouterManchong/handler.go

@@ -0,0 +1,45 @@
+package RouterManchong
+
+import (
+	"github.com/gin-gonic/gin"
+)
+
+func Handler(ctx *gin.Context) {
+	req := &reqBody{}
+	resp := &respBody{
+		RESP: struct {
+			RCODE string `json:"RCODE "`
+			RMSG  string `json:"RMSG"`
+		}{},
+		CONTENT: nil,
+	}
+	header := &head{}
+	temp := template{
+		HEADER:  header,
+		MSGBODY: req,
+	}
+	err := ctx.BindJSON(&temp)
+	temp.MSGBODY = resp
+	if err != nil {
+		resp.RESP.RCODE = "306"
+		resp.RESP.RMSG = err.Error()
+		ctx.JSON(200, temp)
+		return
+	}
+	code, err := header.check()
+	if err != nil {
+		resp.RESP.RCODE = code
+		resp.RESP.RMSG = err.Error()
+		ctx.JSON(200, temp)
+		return
+	}
+	code, err = req.check(header.APPID)
+	if err != nil {
+		resp.RESP.RCODE = code
+		resp.RESP.RMSG = err.Error()
+		ctx.JSON(200, temp)
+		return
+	}
+	resp.getData()
+	ctx.JSON(200, temp)
+}

+ 40 - 0
router/RouterManchong/req.go

@@ -0,0 +1,40 @@
+package RouterManchong
+
+import (
+	"crypto/md5"
+	"encoding/hex"
+	"errors"
+	"fmt"
+	"manchong"
+	"strconv"
+	"time"
+)
+
+type reqBody struct {
+	CONTENT struct {
+		SIGN      string `json:"SIGN"`
+		TIMESTAMP string `json:"TIMESTAMP"`
+	} `json:"CONTENT"`
+}
+
+func (r *reqBody) check(appid string) (string, error) {
+	t, err := strconv.ParseInt(r.CONTENT.TIMESTAMP, 10, 0)
+	if err != nil {
+		return "11", err
+	}
+	now := time.Now().UnixNano() / 1e6
+	if t > now+5*60*1000 || t < now-5*60*1000 {
+		return "14", errors.New("TIMESTAMP超过时限")
+	}
+	appc, ok := manchong.CFG.Users[appid]
+	if !ok {
+		return "09", errors.New("APPID已经失效")
+	}
+	m5 := md5.New()
+	m5.Write([]byte(fmt.Sprintf("%s%s", appc, r.CONTENT.TIMESTAMP)))
+	str := hex.EncodeToString(m5.Sum(nil))
+	if str != r.CONTENT.SIGN {
+		return "08", errors.New("签名验证失败")
+	}
+	return "00", nil
+}

+ 76 - 0
router/RouterManchong/resp.go

@@ -0,0 +1,76 @@
+package RouterManchong
+
+import (
+	"database/sql"
+	"manchong"
+	"manchong/utils"
+	"sync"
+)
+
+type par struct {
+	PackageId interface{} `json:"packageId"`
+	STATUS    int         `json:"STATUS"`
+}
+
+type respBody struct {
+	RESP struct {
+		RCODE string `json:"RCODE "`
+		RMSG  string `json:"RMSG"`
+	} `json:"RESP"`
+	CONTENT []par `json:"CONTENT,omitempty"`
+}
+
+/*
+CREATE TABLE `flow_product_manchong_status` (
+	`flow_status_id` bigint(20) NOT NULL AUTO_INCREMENT,
+	`package_id` varchar(64) NOT NULL DEFAULT "" COMMENT '产品id',
+	`package_name` varchar(64) NOT NULL DEFAULT "" COMMENT '产品名称',
+	`status` varchar(32) NOT NULL DEFAULT "" COMMENT '状态:1-上架,2-下架',
+	`create_time` datetime NOT NULL DEFAULT NOW() COMMENT '创建时间',
+	`update_time` datetime NOT NULL DEFAULT NOW() ON UPDATE NOW() COMMENT '修改时间',
+	PRIMARY KEY (`flow_status_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
+*/
+func (r *respBody) getData() {
+	r.RESP.RCODE = "00"
+	r.RESP.RMSG = "OK"
+	result, err := DB.Query("select package_id,status from flow_product_status")
+	if err != nil {
+		r.RESP.RCODE = "99"
+		r.RESP.RMSG = err.Error()
+		return
+	}
+	for result.Next() {
+		par := par{}
+		err := result.Scan(&par.PackageId, &par.STATUS)
+		if err != nil {
+			r.RESP.RCODE = "99"
+			r.RESP.RMSG = err.Error()
+			return
+		}
+		r.CONTENT = append(r.CONTENT, par)
+	}
+}
+
+var oneDO = &sync.Once{}
+var DB *sql.DB
+
+func init() {
+	manchong.RegisterReloadConfigCall(func() {
+		oneDO.Do(func() {
+			t := manchong.CFG.MySQL
+			t.ParseTime = true
+			dns := t.FormatDSN()
+			utils.DefaultLogger().Infof("MySQL dns:%s", dns)
+			db, err := sql.Open("mysql", dns)
+			if err != nil {
+				utils.DefaultLogger().Panic(err)
+			}
+			err = db.Ping()
+			if err != nil {
+				utils.DefaultLogger().Panic(err)
+			}
+			DB = db
+		})
+	})
+}

+ 51 - 0
router/RouterManchong/template.go

@@ -0,0 +1,51 @@
+package RouterManchong
+
+import (
+	"crypto/md5"
+	"encoding/hex"
+	"errors"
+	"manchong"
+	"time"
+)
+
+type head struct {
+	VERSION   string `json:"VERSION"`
+	TIMESTAMP string `json:"TIMESTAMP"`
+	SEQNO     string `json:"SEQNO"`
+	APPID     string `json:"APPID"`
+	SECERTKEY string `json:"SECERTKEY"`
+}
+
+func (h *head) check() (string, error) {
+	n := len(h.TIMESTAMP)
+	if n < 15 {
+		return "14", errors.New("TIMESTAMP超过时限")
+	}
+	s := h.TIMESTAMP[:14] + "." + h.TIMESTAMP[14:]
+	t, err := time.ParseInLocation("20060102150405.999999999", s, time.Local)
+
+	if err != nil {
+		return "99", err
+	}
+	bigt := time.Now().Add(5 * time.Minute)
+	lowt := time.Now().Add(-5 * time.Minute)
+	if t.Before(lowt) || t.After(bigt) {
+		return "14", errors.New("TIMESTAMP超过时限")
+	}
+	appc, ok := manchong.CFG.Users[h.APPID]
+	if !ok {
+		return "09", errors.New("APPID已经失效")
+	}
+	m5 := md5.New()
+	m5.Write([]byte(h.TIMESTAMP + h.SEQNO + h.APPID + appc))
+	s = hex.EncodeToString(m5.Sum(nil))
+	if s != h.SECERTKEY {
+		return "08", errors.New("签名验证失败")
+	}
+	return "00", nil
+}
+
+type template struct {
+	HEADER  *head       `json:"HEADER"`
+	MSGBODY interface{} `json:"MSGBODY"`
+}

+ 10 - 0
router/init.go

@@ -0,0 +1,10 @@
+package router
+
+import (
+	"github.com/gin-gonic/gin"
+	"manchong/router/RouterManchong"
+)
+
+func Routers(group *gin.RouterGroup) {
+	group.POST("/gateway/flowservice/manchong/queryProdStat.ws", RouterManchong.Handler)
+}

+ 10 - 0
server.log

@@ -0,0 +1,10 @@
+2021-06-29 15:33:56 [INFO] MySQL dns:root@tcp(127.0.0.1:3306)/fmp?parseTime=true
+2021-06-29 15:33:56 [PANI] Error 1049: Unknown database 'fmp'
+2021-06-29 15:35:05 [INFO] MySQL dns:root@tcp(127.0.0.1:3306)/data?parseTime=true
+2021-06-29 15:35:05 [INFO] From "windows/amd64" to Build commitId is ""
+2021-06-29 15:35:05 [INFO] RunServer At Addr:":25535"
+2021-06-29 15:35:08 [INFO] FromIP:127.0.0.1 Request: Method:POST Url:/gateway/flowservice/manchong/queryProdStat.ws Time:188.4µs Status:200
+2021-06-29 16:07:20 [INFO] MySQL dns:root@tcp(127.0.0.1:3306)/data?loc=Local&parseTime=true
+2021-06-29 16:07:20 [INFO] From "windows/amd64" to Build commitId is ""
+2021-06-29 16:07:20 [INFO] RunServer At Addr:":25535"
+2021-06-29 16:07:24 [INFO] FromIP:127.0.0.1 Request: Method:POST Url:/gateway/flowservice/manchong/queryProdStat.ws Time:2.6269ms Status:200

+ 32 - 0
utils/ginhandler.go

@@ -0,0 +1,32 @@
+package utils
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"time"
+)
+
+func GinHandler(c *gin.Context) {
+	defer func() {
+		if err := recover(); err != nil {
+			logger.Errorf("GinLogHandler Error %v", err)
+			c.JSON(500, gin.H{"code": 500, "msg": fmt.Sprintf("GinLogHandler Error %v", err)})
+			//c.Data(500, "application/json; charset=utf-8", []byte{})
+		}
+	}()
+	startTime := time.Now()
+	c.Next()
+	endTime := time.Now()
+	latencyTime := endTime.Sub(startTime)
+	reqMethod := c.Request.Method
+	reqUri := c.Request.RequestURI
+	statusCode := c.Writer.Status()
+	clientIP := c.ClientIP()
+	//a := logger.WithFields(map[string]interface{}{"test":"test"})
+	logger.Infof("FromIP:%s Request: Method:%s Url:%s Time:%v Status:%d",
+		clientIP, reqMethod, reqUri, latencyTime, statusCode)
+}
+
+func GinNoRoute(c *gin.Context) {
+	c.Data(404, "application/json; charset=utf-8", []byte(`{"code":404,"msg":"404 page not found"}`))
+}

+ 49 - 0
utils/log.go

@@ -0,0 +1,49 @@
+package utils
+
+import (
+	"github.com/antonfisher/nested-logrus-formatter"
+	"github.com/sirupsen/logrus"
+	"manchong"
+	"os"
+	"strings"
+)
+
+func NewLogger(leve logrus.Level) *logrus.Logger {
+	logger := logrus.New()
+	logger.SetLevel(leve)
+	//logger.ReportCaller=true
+	logger.SetFormatter(&formatter.Formatter{
+		TimestampFormat: "2006-01-02 15:04:05",
+		HideKeys:        false,
+		NoColors:        true,
+		CallerFirst:     true,
+	})
+	logger.SetOutput(os.Stdout)
+	return logger
+}
+
+var logger = NewLogger(logrus.DebugLevel)
+
+func DefaultLogger() *logrus.Logger {
+	return logger
+}
+
+func init() {
+	manchong.RegisterReloadConfigCall(func() {
+		leve, err := logrus.ParseLevel(strings.ToLower(manchong.CFG.LogLeve))
+		if err != nil {
+			leve = logrus.InfoLevel
+		}
+		logger.SetLevel(leve)
+		file, err := os.OpenFile(manchong.CFG.LogFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
+		if err != nil {
+			logger.Errorf("OpenFile Error:%s", err.Error())
+		}
+		temp := logger.Out
+		f, ok := temp.(*os.File)
+		logger.SetOutput(file)
+		if ok {
+			_ = f.Close()
+		}
+	})
+}