[ADD]
This commit is contained in:
commit
8ecdad20ed
|
@ -0,0 +1,18 @@
|
||||||
|
RUN_MODE = debug
|
||||||
|
|
||||||
|
[app]
|
||||||
|
PAGE_SIZE = 10
|
||||||
|
JWT_SECRET = 23347$040412
|
||||||
|
|
||||||
|
[server]
|
||||||
|
HTTP_PORT = 8000
|
||||||
|
READ_TIMEOUT = 60
|
||||||
|
WRITE_TIMEOUT = 60
|
||||||
|
|
||||||
|
[database]
|
||||||
|
TYPE = mysql
|
||||||
|
USER = root
|
||||||
|
PASSWORD = a19960425
|
||||||
|
HOST = localhost:3306
|
||||||
|
NAME = blog
|
||||||
|
TABLE_PREFIX = blog_
|
|
@ -0,0 +1,34 @@
|
||||||
|
module github.com/EDDYCJY/go-gin-example
|
||||||
|
|
||||||
|
go 1.15
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/astaxie/beego v1.12.2
|
||||||
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||||
|
github.com/gin-gonic/gin v1.6.3
|
||||||
|
github.com/go-ini/ini v1.61.0
|
||||||
|
github.com/go-playground/validator/v10 v10.3.0 // indirect
|
||||||
|
github.com/golang/protobuf v1.4.2 // indirect
|
||||||
|
github.com/jinzhu/gorm v1.9.16
|
||||||
|
github.com/json-iterator/go v1.1.10 // indirect
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
|
github.com/modern-go/reflect2 v1.0.1 // indirect
|
||||||
|
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
|
||||||
|
github.com/smartystreets/goconvey v1.6.4 // indirect
|
||||||
|
github.com/unknwon/com v1.0.1
|
||||||
|
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 // indirect
|
||||||
|
google.golang.org/protobuf v1.25.0 // indirect
|
||||||
|
gopkg.in/ini.v1 v1.61.0 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.3.0 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
replace (
|
||||||
|
github.com/EDDYCJY/go-gin-example/conf => ./go-gin-example/pkg/conf
|
||||||
|
github.com/EDDYCJY/go-gin-example/middleware => ./go-gin-example/middleware
|
||||||
|
github.com/EDDYCJY/go-gin-example/models => ./go-gin-example/models
|
||||||
|
github.com/EDDYCJY/go-gin-example/pkg/e => ./go-gin-example/pkg/e
|
||||||
|
github.com/EDDYCJY/go-gin-example/pkg/setting => ./go-gin-example/pkg/setting
|
||||||
|
github.com/EDDYCJY/go-gin-example/pkg/util => ./go-gin-example/pkg/util
|
||||||
|
github.com/EDDYCJY/go-gin-example/pkg/logging => ./go-gin-example/pkg/logging
|
||||||
|
github.com/EDDYCJY/go-gin-example/routers => ./go-gin-example/routers
|
||||||
|
)
|
|
@ -0,0 +1,291 @@
|
||||||
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||||
|
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
|
||||||
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
|
||||||
|
github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
|
||||||
|
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
|
||||||
|
github.com/astaxie/beego v1.12.2 h1:CajUexhSX5ONWDiSCpeQBNVfTzOtPb9e9d+3vuU5FuU=
|
||||||
|
github.com/astaxie/beego v1.12.2/go.mod h1:TMcqhsbhN3UFpN+RCfysaxPAbrhox6QSS3NIAEp/uzE=
|
||||||
|
github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
|
||||||
|
github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
|
||||||
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
|
github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
|
||||||
|
github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
|
||||||
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
|
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
|
||||||
|
github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
|
||||||
|
github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
|
||||||
|
github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
|
||||||
|
github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
||||||
|
github.com/dgrijalva/jwt-go v1.0.2 h1:KPldsxuKGsS2FPWsNeg9ZO18aCrGKujPoWXn2yo+KQM=
|
||||||
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||||
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
|
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||||
|
github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
|
||||||
|
github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
|
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
|
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.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
|
||||||
|
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||||
|
github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
|
||||||
|
github.com/go-ini/ini v1.61.0 h1:+IytwU4FcXqB+i5Vqiu/Ybf/Jdin9Pwzdxs5lmuT10o=
|
||||||
|
github.com/go-ini/ini v1.61.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
||||||
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
|
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
|
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
|
||||||
|
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.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
|
||||||
|
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
||||||
|
github.com/go-playground/validator/v10 v10.3.0 h1:nZU+7q+yJoFmwvNgv/LnPUkwPal62+b2xXj0AU1Es7o=
|
||||||
|
github.com/go-playground/validator/v10 v10.3.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
||||||
|
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||||
|
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||||
|
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
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.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
|
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||||
|
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
|
||||||
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
|
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
||||||
|
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||||
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
|
github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o=
|
||||||
|
github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs=
|
||||||
|
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||||
|
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||||
|
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||||
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
|
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.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
|
||||||
|
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
|
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
|
||||||
|
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/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
|
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
|
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-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
|
||||||
|
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
|
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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
|
||||||
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
|
github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
|
github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
|
||||||
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
|
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||||
|
github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
|
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||||
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
|
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||||
|
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo=
|
||||||
|
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
|
||||||
|
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
|
||||||
|
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
|
||||||
|
github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
|
||||||
|
github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
|
||||||
|
github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
|
||||||
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
|
||||||
|
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
|
||||||
|
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
|
github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.1.1/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 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
||||||
|
github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
||||||
|
github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
|
||||||
|
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/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
|
||||||
|
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||||
|
github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
|
||||||
|
github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
|
||||||
|
github.com/viletyy/potato v0.0.0-20200905024403-e2487411cd1b h1:uLMGV778J8r7fRoHp5An3H9Re9K0nEzrGomfBCkdteA=
|
||||||
|
github.com/viletyy/potato v0.0.0-20200905024403-e2487411cd1b/go.mod h1:6fX2LjSBhzAYK9OAsLkUgUp8VCbr/RiikUR4kHOUukw=
|
||||||
|
github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
|
||||||
|
github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
|
||||||
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
|
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
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-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/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-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 h1:W0lCpv29Hv0UaM1LXb9QlBHLNP8UFfcKjblhVCWftOM=
|
||||||
|
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20200117065230-39095c1d176c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||||
|
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||||
|
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
|
||||||
|
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
|
||||||
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
|
gopkg.in/ini.v1 v1.61.0 h1:LBCdW4FmFYL4s/vDZD1RQYX7oAR6IjujCYgMdbHBR10=
|
||||||
|
gopkg.in/ini.v1 v1.61.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
|
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||||
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.5/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.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
@ -0,0 +1,22 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/setting"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/routers"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
router := routers.InitRouter()
|
||||||
|
|
||||||
|
s := &http.Server{
|
||||||
|
Addr: fmt.Sprintf(":%d", setting.HTTPPort),
|
||||||
|
Handler: router,
|
||||||
|
ReadTimeout: setting.ReadTimeout,
|
||||||
|
WriteTimeout: setting.WriteTimeout,
|
||||||
|
MaxHeaderBytes: 1 << 20,
|
||||||
|
}
|
||||||
|
|
||||||
|
s.ListenAndServe()
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package jwt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/e"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/util"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func JWT() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
var code int
|
||||||
|
var data interface{}
|
||||||
|
code = e.SUCCESS
|
||||||
|
token := c.Query("token")
|
||||||
|
if token == "" {
|
||||||
|
code = e.INVALID_PARAMS
|
||||||
|
} else {
|
||||||
|
claims, err := util.ParseToken(token)
|
||||||
|
if err != nil {
|
||||||
|
code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
|
||||||
|
} else if time.Now().Unix() > claims.ExpiresAt {
|
||||||
|
code = e.ERROR_AUTH_CHECK_TOKEN_TIMEOUT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if code != e.SUCCESS {
|
||||||
|
c.JSON(http.StatusUnauthorized, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : data,
|
||||||
|
})
|
||||||
|
c.Abort()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Next()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jinzhu/gorm"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Article struct {
|
||||||
|
Model
|
||||||
|
TagID int `json:"tag_id" gorm:"index"`
|
||||||
|
Tag Tag `json:"tag"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Desc string `json:"desc"`
|
||||||
|
Content string `json:"content"`
|
||||||
|
CreatedBy string `json:"created_by"`
|
||||||
|
ModifiedBy string `json:"modified_by"`
|
||||||
|
State int `json:"state"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExistArticleByID(id int) bool {
|
||||||
|
var article Article
|
||||||
|
db.Select("id").Where("id = ?", id).First(&article)
|
||||||
|
if article.ID > 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetArticleTotal(maps interface{}) (count int) {
|
||||||
|
db.Model(&Article{}).Where(maps).Count(&count)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetArticles(pageNum int, pageSize int, maps interface{}) (articles []Article) {
|
||||||
|
db.Preload("Tag").Where(maps).Offset(pageNum).Limit(pageSize).Find(&articles)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetArticle(id int) (article Article) {
|
||||||
|
db.Where("id = ?", id).First(&article)
|
||||||
|
db.Model(&article).Related(&article.Tag)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func EditArticle(id int, data interface{}) bool {
|
||||||
|
db.Model(&Article{}).Where("id = ?", id).Updates(data)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddArticle(data map[string]interface{}) bool {
|
||||||
|
db.Create(&Article{
|
||||||
|
TagID: data["tag_id"].(int),
|
||||||
|
Title: data["title"].(string),
|
||||||
|
Desc: data["desc"].(string),
|
||||||
|
Content: data["content"].(string),
|
||||||
|
CreatedBy: data["created_by"].(string),
|
||||||
|
State: data["state"].(int),
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func DeleteArticle(id int) bool {
|
||||||
|
db.Where("id = ?", id).Delete(Article{})
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func (article *Article) BeforeCreate(scope *gorm.Scope) error {
|
||||||
|
scope.SetColumn("CreatedOn", time.Now().Unix())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (article *Article) BeforeUpdate(scope *gorm.Scope) error {
|
||||||
|
scope.SetColumn("ModifiedOn", time.Now().Unix())
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
type Auth struct {
|
||||||
|
ID int `gorm:"primary_key" json:"id"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckAuth(username, password string) bool {
|
||||||
|
var auth Auth
|
||||||
|
db.Select("id").Where(Auth{Username: username, Password: password}).First(&auth)
|
||||||
|
if auth.ID > 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/setting"
|
||||||
|
"github.com/jinzhu/gorm"
|
||||||
|
_ "github.com/jinzhu/gorm/dialects/mysql"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
var db *gorm.DB
|
||||||
|
|
||||||
|
type Model struct {
|
||||||
|
ID int `gorm:"primary_key" json:"id"`
|
||||||
|
CreatedOn int `json:"created_on"`
|
||||||
|
ModifiedOn int `json:"modified_on"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
var (
|
||||||
|
err error
|
||||||
|
dbType, dbName, user, password, host, tablePrefix string
|
||||||
|
)
|
||||||
|
|
||||||
|
sec, err := setting.Cfg.GetSection("database")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(2, "Fail to get section 'database': %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
dbType = sec.Key("TYPE").String()
|
||||||
|
dbName = sec.Key("NAME").String()
|
||||||
|
user = sec.Key("USER").String()
|
||||||
|
password = sec.Key("PASSWORD").String()
|
||||||
|
host = sec.Key("HOST").String()
|
||||||
|
tablePrefix = sec.Key("TABLE_PREFIX").String()
|
||||||
|
|
||||||
|
db, err = gorm.Open(dbType, fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
|
||||||
|
user,
|
||||||
|
password,
|
||||||
|
host,
|
||||||
|
dbName))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
|
||||||
|
return tablePrefix + defaultTableName
|
||||||
|
}
|
||||||
|
|
||||||
|
db.AutoMigrate(&Tag{}, &Article{}, &Auth{})
|
||||||
|
//db.SingularTable(true)
|
||||||
|
db.LogMode(true)
|
||||||
|
db.DB().SetMaxIdleConns(10)
|
||||||
|
db.DB().SetMaxOpenConns(100)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CloseDB() {
|
||||||
|
defer db.Close()
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jinzhu/gorm"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Tag struct {
|
||||||
|
Model
|
||||||
|
Name string `json:"name"`
|
||||||
|
CreatedBy string `json:"created_by"`
|
||||||
|
ModifiedBy string `json:"modified_by"`
|
||||||
|
State int `json:"state"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetTags(pageNum int, pageSize int, maps interface{}) (tags []Tag) {
|
||||||
|
db.Where(maps).Offset(pageNum).Limit(pageSize).Find(&tags)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetTagTotal(maps interface{}) (count int) {
|
||||||
|
db.Model(&Tag{}).Where(maps).Count(&count)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExistTagByName(name string) bool {
|
||||||
|
var tag Tag
|
||||||
|
db.Select("id").Where("name = ?", name).First(&tag)
|
||||||
|
if tag.ID > 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddTag(name string, state int, createdBy string) bool {
|
||||||
|
db.Create(&Tag{
|
||||||
|
Name: name,
|
||||||
|
State: state,
|
||||||
|
CreatedBy: createdBy,
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExistTagByID(id int) bool {
|
||||||
|
var tag Tag
|
||||||
|
db.Select("id").Where("id = ?", id).First(&tag)
|
||||||
|
if tag.ID > 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteTag(id int) bool {
|
||||||
|
db.Where("id = ?", id).Delete(&Tag{})
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func EditTag(id int, data interface {}) bool {
|
||||||
|
db.Model(&Tag{}).Where("id = ?", id).Updates(data)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tag *Tag) BeforeCreate(scope *gorm.Scope) error {
|
||||||
|
scope.SetColumn("CreatedOn", time.Now().Unix())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tag *Tag) BeforeUpdate(scope *gorm.Scope) error {
|
||||||
|
scope.SetColumn("ModifiedOn", time.Now().Unix())
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package e
|
||||||
|
|
||||||
|
const (
|
||||||
|
SUCCESS = 200
|
||||||
|
ERROR = 500
|
||||||
|
INVALID_PARAMS = 400
|
||||||
|
|
||||||
|
ERROR_EXIST_TAG = 10001
|
||||||
|
ERROR_NOT_EXIST_TAG = 10002
|
||||||
|
ERROR_NOT_EXIST_ARTICLE = 10003
|
||||||
|
|
||||||
|
ERROR_AUTH_CHECK_TOKEN_FAIL = 20001
|
||||||
|
ERROR_AUTH_CHECK_TOKEN_TIMEOUT = 20002
|
||||||
|
ERROR_AUTH_TOKEN = 20003
|
||||||
|
ERROR_AUTH = 20004
|
||||||
|
)
|
|
@ -0,0 +1,23 @@
|
||||||
|
package e
|
||||||
|
|
||||||
|
var MsgFlags = map[int]string{
|
||||||
|
SUCCESS: "ok",
|
||||||
|
ERROR: "fail",
|
||||||
|
INVALID_PARAMS: "请求参数错误",
|
||||||
|
ERROR_EXIST_TAG: "已存在该标签名称",
|
||||||
|
ERROR_NOT_EXIST_TAG: "该标签不存在",
|
||||||
|
ERROR_NOT_EXIST_ARTICLE: "该文章不存在",
|
||||||
|
ERROR_AUTH_CHECK_TOKEN_FAIL: "TOKEN鉴权失败",
|
||||||
|
ERROR_AUTH_CHECK_TOKEN_TIMEOUT: "TOKEN已超时",
|
||||||
|
ERROR_AUTH_TOKEN: "TOKEN生成失败",
|
||||||
|
ERROR_AUTH: "TOKEN错误",
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMsg(code int) string {
|
||||||
|
msg, ok := MsgFlags[code]
|
||||||
|
if ok {
|
||||||
|
return msg
|
||||||
|
}
|
||||||
|
|
||||||
|
return MsgFlags[ERROR]
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package logging
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
LogSavePath = "runtime/logs/"
|
||||||
|
LogSaveName = "log"
|
||||||
|
LogFileExt = "log"
|
||||||
|
TimeFormat = "20060102"
|
||||||
|
)
|
||||||
|
func getLogFilePath() string {
|
||||||
|
return fmt.Sprintf("%s", LogSavePath)
|
||||||
|
}
|
||||||
|
func getLogFileFullPath() string {
|
||||||
|
prefixPath := getLogFilePath()
|
||||||
|
suffixPath := fmt.Sprintf("%s%s.%s", LogSaveName, time.Now().Format(TimeFormat), LogFileExt)
|
||||||
|
return fmt.Sprintf("%s%s", prefixPath, suffixPath)
|
||||||
|
}
|
||||||
|
func openLogFile(filePath string) *os.File {
|
||||||
|
_, err := os.Stat(filePath)
|
||||||
|
switch {
|
||||||
|
case os.IsNotExist(err):
|
||||||
|
mkDir()
|
||||||
|
case os.IsPermission(err):
|
||||||
|
log.Fatalf("Permission :%v", err)
|
||||||
|
}
|
||||||
|
handle, err := os.OpenFile(filePath, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Fail to OpenFile :%v", err)
|
||||||
|
}
|
||||||
|
return handle
|
||||||
|
}
|
||||||
|
func mkDir() {
|
||||||
|
dir, _ := os.Getwd()
|
||||||
|
err := os.MkdirAll(dir + "/" + getLogFilePath(), os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
package logging
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Level int
|
||||||
|
|
||||||
|
var (
|
||||||
|
F *os.File
|
||||||
|
DefaultPrefix = ""
|
||||||
|
DefaultCallerDepth = 2
|
||||||
|
logger *log.Logger
|
||||||
|
logPrefix = ""
|
||||||
|
levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
DEBUG Level = iota
|
||||||
|
INFO
|
||||||
|
WARNING
|
||||||
|
ERROR
|
||||||
|
FATAL
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
filePath := getLogFileFullPath()
|
||||||
|
F = openLogFile(filePath)
|
||||||
|
logger = log.New(F, DefaultPrefix, log.LstdFlags)
|
||||||
|
}
|
||||||
|
func Debug(v ...interface{}) {
|
||||||
|
setPrefix(DEBUG)
|
||||||
|
logger.Println(v)
|
||||||
|
}
|
||||||
|
func Info(v ...interface{}) {
|
||||||
|
setPrefix(INFO)
|
||||||
|
logger.Println(v)
|
||||||
|
}
|
||||||
|
func Warn(v ...interface{}) {
|
||||||
|
setPrefix(WARNING)
|
||||||
|
logger.Println(v)
|
||||||
|
}
|
||||||
|
func Error(v ...interface{}) {
|
||||||
|
setPrefix(ERROR)
|
||||||
|
logger.Println(v)
|
||||||
|
}
|
||||||
|
func Fatal(v ...interface{}) {
|
||||||
|
setPrefix(FATAL)
|
||||||
|
logger.Fatalln(v)
|
||||||
|
}
|
||||||
|
func setPrefix(level Level) {
|
||||||
|
_, file, line, ok := runtime.Caller(DefaultCallerDepth)
|
||||||
|
if ok {
|
||||||
|
logPrefix = fmt.Sprintf("[%s][%s:%d]", levelFlags[level], filepath.Base(file), line)
|
||||||
|
} else {
|
||||||
|
logPrefix = fmt.Sprintf("[%s]", levelFlags[level])
|
||||||
|
}
|
||||||
|
logger.SetPrefix(logPrefix)
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/go-ini/ini"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
Cfg *ini.File
|
||||||
|
|
||||||
|
RunMode string
|
||||||
|
HTTPPort int
|
||||||
|
ReadTimeout time.Duration
|
||||||
|
WriteTimeout time.Duration
|
||||||
|
|
||||||
|
PageSize int
|
||||||
|
JwtSecret string
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
var err error
|
||||||
|
Cfg, err = ini.Load("conf/app.ini")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Fail to parse 'conf/app.ini': %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadBase()
|
||||||
|
LoadServer()
|
||||||
|
LoadApp()
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadBase() {
|
||||||
|
RunMode = Cfg.Section("").Key("RUN_MODE").MustString("debug")
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadServer() {
|
||||||
|
sec, err := Cfg.GetSection("server")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Fail to get section 'sever' : %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
HTTPPort = sec.Key("HTTP_PORT").MustInt(8000)
|
||||||
|
ReadTimeout = time.Duration(sec.Key("READ_TIMEOUT").MustUint(60)) * time.Second
|
||||||
|
WriteTimeout = time.Duration(sec.Key("WRITE_TIMEOUT").MustInt(60)) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadApp() {
|
||||||
|
sec, err := Cfg.GetSection("app")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Fail to get section 'app':%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
JwtSecret = sec.Key("JWT_SECRET").MustString("!@#!@#!@#!@@#!@#")
|
||||||
|
PageSize = sec.Key("PAGE_SIZE").MustInt(10)
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/setting"
|
||||||
|
"github.com/dgrijalva/jwt-go"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var jwtSecret = []byte(setting.JwtSecret)
|
||||||
|
|
||||||
|
type Claims struct {
|
||||||
|
Username string `json:"username"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
jwt.StandardClaims
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateToken(username, password string) (string, error) {
|
||||||
|
nowTime := time.Now()
|
||||||
|
expireTime := nowTime.Add(3 * time.Hour)
|
||||||
|
|
||||||
|
claims := Claims{
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
jwt.StandardClaims{
|
||||||
|
ExpiresAt: expireTime.Unix(),
|
||||||
|
Issuer: "gin-blog",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
tokenClaims := jwt.NewWithClaims(jwt.SigningMethodES256, claims)
|
||||||
|
token, err := tokenClaims.SignedString(jwtSecret)
|
||||||
|
|
||||||
|
return token, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseToken(token string) (*Claims, error) {
|
||||||
|
tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
|
||||||
|
return jwtSecret, nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if tokenClaims != nil {
|
||||||
|
if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid{
|
||||||
|
return claims, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, err
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/setting"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/unknwon/com"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetPage(c *gin.Context) int {
|
||||||
|
result := 0
|
||||||
|
page, _ := com.StrTo(c.Query("page")).Int()
|
||||||
|
if page > 0 {
|
||||||
|
result = (page - 1) * setting.PageSize
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/EDDYCJY/go-gin-example/models"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/e"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/logging"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/util"
|
||||||
|
"github.com/astaxie/beego/validation"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type auth struct {
|
||||||
|
Username string `valid:"Required; MaxSize(50)"`
|
||||||
|
Password string `valid:"Required; MaxSize(50)"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAuth(c *gin.Context) {
|
||||||
|
username := c.Query("username")
|
||||||
|
password := c.Query("password")
|
||||||
|
valid := validation.Validation{}
|
||||||
|
a := auth{Username: username, Password: password}
|
||||||
|
ok, _ := valid.Valid(&a)
|
||||||
|
data := make(map[string]interface{})
|
||||||
|
code := e.INVALID_PARAMS
|
||||||
|
if ok {
|
||||||
|
isExist := models.CheckAuth(username, password)
|
||||||
|
if isExist {
|
||||||
|
token, err := util.GenerateToken(username, password)
|
||||||
|
if err != nil {
|
||||||
|
code = e.ERROR_AUTH_TOKEN
|
||||||
|
} else {
|
||||||
|
data["token"] = token
|
||||||
|
code = e.SUCCESS
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
code = e.ERROR_AUTH
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for _, err := range valid.Errors {
|
||||||
|
logging.Info(err.Key, err.Message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code": code,
|
||||||
|
"msg": e.GetMsg(code),
|
||||||
|
"data": data,
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,196 @@
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/EDDYCJY/go-gin-example/models"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/e"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/logging"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/setting"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/util"
|
||||||
|
"github.com/astaxie/beego/validation"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/unknwon/com"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
//获取单个文章
|
||||||
|
func GetArticle(c *gin.Context) {
|
||||||
|
id := com.StrTo(c.Param("id")).MustInt()
|
||||||
|
valid := validation.Validation{}
|
||||||
|
valid.Min(id, 1, "id").Message("ID必须大于0")
|
||||||
|
code := e.INVALID_PARAMS
|
||||||
|
var data interface {}
|
||||||
|
if ! valid.HasErrors() {
|
||||||
|
if models.ExistArticleByID(id) {
|
||||||
|
data = models.GetArticle(id)
|
||||||
|
code = e.SUCCESS
|
||||||
|
} else {
|
||||||
|
code = e.ERROR_NOT_EXIST_ARTICLE
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for _, err := range valid.Errors {
|
||||||
|
log.Printf("err.key: %s, err.message: %s", err.Key, err.Message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//获取多个文章
|
||||||
|
func GetArticles(c *gin.Context) {
|
||||||
|
data := make(map[string]interface{})
|
||||||
|
maps := make(map[string]interface{})
|
||||||
|
valid := validation.Validation{}
|
||||||
|
var state int = -1
|
||||||
|
if arg := c.Query("state"); arg != "" {
|
||||||
|
state = com.StrTo(arg).MustInt()
|
||||||
|
maps["state"] = state
|
||||||
|
valid.Range(state, 0, 1, "state").Message("状态只允许0或1")
|
||||||
|
}
|
||||||
|
var tagId int = -1
|
||||||
|
if arg := c.Query("tag_id"); arg != "" {
|
||||||
|
tagId = com.StrTo(arg).MustInt()
|
||||||
|
maps["tag_id"] = tagId
|
||||||
|
valid.Min(tagId, 1, "tag_id").Message("标签ID必须大于0")
|
||||||
|
}
|
||||||
|
code := e.INVALID_PARAMS
|
||||||
|
if ! valid.HasErrors() {
|
||||||
|
code = e.SUCCESS
|
||||||
|
data["lists"] = models.GetArticles(util.GetPage(c), setting.PageSize, maps)
|
||||||
|
data["total"] = models.GetArticleTotal(maps)
|
||||||
|
} else {
|
||||||
|
for _, err := range valid.Errors {
|
||||||
|
logging.Info(err.Key, err.Message)
|
||||||
|
//log.Printf("err.key: %s, err.message: %s", err.Key, err.Message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//新增文章
|
||||||
|
func AddArticle(c *gin.Context) {
|
||||||
|
tagId := com.StrTo(c.Query("tag_id")).MustInt()
|
||||||
|
title := c.Query("title")
|
||||||
|
desc := c.Query("desc")
|
||||||
|
content := c.Query("content")
|
||||||
|
createdBy := c.Query("created_by")
|
||||||
|
state := com.StrTo(c.DefaultQuery("state", "0")).MustInt()
|
||||||
|
valid := validation.Validation{}
|
||||||
|
valid.Min(tagId, 1, "tag_id").Message("标签ID必须大于0")
|
||||||
|
valid.Required(title, "title").Message("标题不能为空")
|
||||||
|
valid.Required(desc, "desc").Message("简述不能为空")
|
||||||
|
valid.Required(content, "content").Message("内容不能为空")
|
||||||
|
valid.Required(createdBy, "created_by").Message("创建人不能为空")
|
||||||
|
valid.Range(state, 0, 1, "state").Message("状态只允许0或1")
|
||||||
|
code := e.INVALID_PARAMS
|
||||||
|
if ! valid.HasErrors() {
|
||||||
|
if models.ExistTagByID(tagId) {
|
||||||
|
data := make(map[string]interface {})
|
||||||
|
data["tag_id"] = tagId
|
||||||
|
data["title"] = title
|
||||||
|
data["desc"] = desc
|
||||||
|
data["content"] = content
|
||||||
|
data["created_by"] = createdBy
|
||||||
|
data["state"] = state
|
||||||
|
models.AddArticle(data)
|
||||||
|
code = e.SUCCESS
|
||||||
|
} else {
|
||||||
|
code = e.ERROR_NOT_EXIST_TAG
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for _, err := range valid.Errors {
|
||||||
|
log.Printf("err.key: %s, err.message: %s", err.Key, err.Message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : make(map[string]interface{}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//修改文章
|
||||||
|
func EditArticle(c *gin.Context) {
|
||||||
|
valid := validation.Validation{}
|
||||||
|
id := com.StrTo(c.Param("id")).MustInt()
|
||||||
|
tagId := com.StrTo(c.Query("tag_id")).MustInt()
|
||||||
|
title := c.Query("title")
|
||||||
|
desc := c.Query("desc")
|
||||||
|
content := c.Query("content")
|
||||||
|
modifiedBy := c.Query("modified_by")
|
||||||
|
var state int = -1
|
||||||
|
if arg := c.Query("state"); arg != "" {
|
||||||
|
state = com.StrTo(arg).MustInt()
|
||||||
|
valid.Range(state, 0, 1, "state").Message("状态只允许0或1")
|
||||||
|
}
|
||||||
|
valid.Min(id, 1, "id").Message("ID必须大于0")
|
||||||
|
valid.MaxSize(title, 100, "title").Message("标题最长为100字符")
|
||||||
|
valid.MaxSize(desc, 255, "desc").Message("简述最长为255字符")
|
||||||
|
valid.MaxSize(content, 65535, "content").Message("内容最长为65535字符")
|
||||||
|
valid.Required(modifiedBy, "modified_by").Message("修改人不能为空")
|
||||||
|
valid.MaxSize(modifiedBy, 100, "modified_by").Message("修改人最长为100字符")
|
||||||
|
code := e.INVALID_PARAMS
|
||||||
|
if ! valid.HasErrors() {
|
||||||
|
if models.ExistArticleByID(id) {
|
||||||
|
if models.ExistTagByID(tagId) {
|
||||||
|
data := make(map[string]interface {})
|
||||||
|
if tagId > 0 {
|
||||||
|
data["tag_id"] = tagId
|
||||||
|
}
|
||||||
|
if title != "" {
|
||||||
|
data["title"] = title
|
||||||
|
}
|
||||||
|
if desc != "" {
|
||||||
|
data["desc"] = desc
|
||||||
|
}
|
||||||
|
if content != "" {
|
||||||
|
data["content"] = content
|
||||||
|
}
|
||||||
|
data["modified_by"] = modifiedBy
|
||||||
|
models.EditArticle(id, data)
|
||||||
|
code = e.SUCCESS
|
||||||
|
} else {
|
||||||
|
code = e.ERROR_NOT_EXIST_TAG
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
code = e.ERROR_NOT_EXIST_ARTICLE
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for _, err := range valid.Errors {
|
||||||
|
log.Printf("err.key: %s, err.message: %s", err.Key, err.Message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : make(map[string]string),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//删除文章
|
||||||
|
func DeleteArticle(c *gin.Context) {
|
||||||
|
id := com.StrTo(c.Param("id")).MustInt()
|
||||||
|
valid := validation.Validation{}
|
||||||
|
valid.Min(id, 1, "id").Message("ID必须大于0")
|
||||||
|
code := e.INVALID_PARAMS
|
||||||
|
if ! valid.HasErrors() {
|
||||||
|
if models.ExistArticleByID(id) {
|
||||||
|
models.DeleteArticle(id)
|
||||||
|
code = e.SUCCESS
|
||||||
|
} else {
|
||||||
|
code = e.ERROR_NOT_EXIST_ARTICLE
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for _, err := range valid.Errors {
|
||||||
|
log.Printf("err.key: %s, err.message: %s", err.Key, err.Message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : make(map[string]string),
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/EDDYCJY/go-gin-example/models"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/e"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/setting"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/util"
|
||||||
|
"github.com/astaxie/beego/validation"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/unknwon/com"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
//获取多个文章标签
|
||||||
|
func GetTags(c *gin.Context) {
|
||||||
|
name := c.Query("name")
|
||||||
|
maps := make(map[string]interface{})
|
||||||
|
data := make(map[string]interface{})
|
||||||
|
if name != "" {
|
||||||
|
maps["name"] = name
|
||||||
|
}
|
||||||
|
var state int = -1
|
||||||
|
if arg := c.Query("state"); arg != "" {
|
||||||
|
state = com.StrTo(arg).MustInt()
|
||||||
|
maps["state"] = state
|
||||||
|
}
|
||||||
|
code := e.SUCCESS
|
||||||
|
data["lists"] = models.GetTags(util.GetPage(c), setting.PageSize, maps)
|
||||||
|
data["total"] = models.GetTagTotal(maps)
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : data,
|
||||||
|
})}
|
||||||
|
|
||||||
|
//新增文章标签
|
||||||
|
func AddTag(c *gin.Context) {
|
||||||
|
name := c.Query("name")
|
||||||
|
state := com.StrTo(c.DefaultQuery("state", "0")).MustInt()
|
||||||
|
createdBy := c.Query("created_by")
|
||||||
|
valid := validation.Validation{}
|
||||||
|
valid.Required(name, "name").Message("名称不能为空")
|
||||||
|
valid.MaxSize(name, 100, "name").Message("名称最长为100字符")
|
||||||
|
valid.Required(createdBy, "created_by").Message("创建人不能为空")
|
||||||
|
valid.MaxSize(createdBy, 100, "created_by").Message("创建人最长为100字符")
|
||||||
|
valid.Range(state, 0, 1, "state").Message("状态只允许0或1")
|
||||||
|
code := e.INVALID_PARAMS
|
||||||
|
if ! valid.HasErrors() {
|
||||||
|
if ! models.ExistTagByName(name) {
|
||||||
|
code = e.SUCCESS
|
||||||
|
models.AddTag(name, state, createdBy)
|
||||||
|
} else {
|
||||||
|
code = e.ERROR_EXIST_TAG
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : make(map[string]string),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//修改文章标签
|
||||||
|
func EditTag(c *gin.Context) {
|
||||||
|
id := com.StrTo(c.Param("id")).MustInt()
|
||||||
|
name := c.Query("name")
|
||||||
|
modifiedBy := c.Query("modified_by")
|
||||||
|
valid := validation.Validation{}
|
||||||
|
var state int = -1
|
||||||
|
if arg := c.Query("state"); arg != "" {
|
||||||
|
state = com.StrTo(arg).MustInt()
|
||||||
|
valid.Range(state, 0, 1, "state").Message("状态只允许0或1")
|
||||||
|
}
|
||||||
|
valid.Required(id, "id").Message("ID不能为空")
|
||||||
|
valid.Required(modifiedBy, "modified_by").Message("修改人不能为空")
|
||||||
|
valid.MaxSize(modifiedBy, 100, "modified_by").Message("修改人最长为100字符")
|
||||||
|
valid.MaxSize(name, 100, "name").Message("名称最长为100字符")
|
||||||
|
code := e.INVALID_PARAMS
|
||||||
|
if ! valid.HasErrors() {
|
||||||
|
code = e.SUCCESS
|
||||||
|
if models.ExistTagByID(id) {
|
||||||
|
data := make(map[string]interface{})
|
||||||
|
data["modified_by"] = modifiedBy
|
||||||
|
if name != "" {
|
||||||
|
data["name"] = name
|
||||||
|
}
|
||||||
|
if state != -1 {
|
||||||
|
data["state"] = state
|
||||||
|
}
|
||||||
|
models.EditTag(id, data)
|
||||||
|
} else {
|
||||||
|
code = e.ERROR_NOT_EXIST_TAG
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : make(map[string]string),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//删除文章标签
|
||||||
|
func DeleteTag(c *gin.Context) {
|
||||||
|
id := com.StrTo(c.Param("id")).MustInt()
|
||||||
|
valid := validation.Validation{}
|
||||||
|
valid.Min(id, 1, "id").Message("ID必须大于0")
|
||||||
|
code := e.INVALID_PARAMS
|
||||||
|
if ! valid.HasErrors() {
|
||||||
|
code = e.SUCCESS
|
||||||
|
if models.ExistTagByID(id) {
|
||||||
|
models.DeleteTag(id)
|
||||||
|
} else {
|
||||||
|
code = e.ERROR_NOT_EXIST_TAG
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code" : code,
|
||||||
|
"msg" : e.GetMsg(code),
|
||||||
|
"data" : make(map[string]string),
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package routers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/EDDYCJY/go-gin-example/middleware/jwt"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/pkg/setting"
|
||||||
|
"github.com/EDDYCJY/go-gin-example/routers/api"
|
||||||
|
v1 "github.com/EDDYCJY/go-gin-example/routers/api/v1"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func InitRouter() *gin.Engine {
|
||||||
|
r := gin.New()
|
||||||
|
|
||||||
|
r.Use(gin.Logger())
|
||||||
|
|
||||||
|
r.Use(gin.Recovery())
|
||||||
|
|
||||||
|
gin.SetMode(setting.RunMode)
|
||||||
|
|
||||||
|
r.GET("/ping", func(c *gin.Context) {
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"message": "pong",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
r.GET("/test", func(c *gin.Context) {
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"message": "test",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
r.GET("/auth", api.GetAuth)
|
||||||
|
|
||||||
|
apiv1 := r.Group("/api/v1")
|
||||||
|
apiv1.Use(jwt.JWT())
|
||||||
|
{
|
||||||
|
//获取标签列表
|
||||||
|
apiv1.GET("/tags", v1.GetTags)
|
||||||
|
//新建标签
|
||||||
|
apiv1.POST("/tags", v1.AddTag)
|
||||||
|
//更新指定标签
|
||||||
|
apiv1.PUT("/tags/:id", v1.EditTag)
|
||||||
|
//删除指定标签
|
||||||
|
apiv1.DELETE("/tags/:id", v1.DeleteTag)
|
||||||
|
//获取文章列表
|
||||||
|
apiv1.GET("/articles", v1.GetArticles)
|
||||||
|
//获取指定文章
|
||||||
|
apiv1.GET("/articles/:id", v1.GetArticle)
|
||||||
|
//新建文章
|
||||||
|
apiv1.POST("/articles", v1.AddArticle)
|
||||||
|
//更新指定文章
|
||||||
|
apiv1.PUT("/articles/:id", v1.EditArticle)
|
||||||
|
//删除指定文章
|
||||||
|
apiv1.DELETE("/articles/:id", v1.DeleteArticle)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r
|
||||||
|
}
|
Loading…
Reference in New Issue