This commit is contained in:
xxjwxc
2021-05-02 19:37:03 +08:00
36 changed files with 1546 additions and 426 deletions

7
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,7 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": []
}

View File

@@ -5,5 +5,5 @@ golang 工具包。
包括:
`文件功能`,`leveldb`,`restful风格消息包头定义`,`cache缓存`,`绘图函数`,`elastic`,`echarts`,`http`,`日志`,`nsq抽取`,`线程安全队列`,`签名`,`gorm封装`,`时间函数`,`国际化i18n`,`gocui 界面类`,`驼峰命名转换工具`,`大驼峰到网络标准json串自动转换`,`剪切板`,`微信`,`ast`,`swagger 文档支持`,`mindoc/markdown 文档支持`,`分布式全局唯一id(myglobal)`,`ssh(支持tab自动补全)`,`zap logger`,`快递鸟`
`文件功能`,`leveldb`,`restful风格消息包头定义`,`cache缓存`,`绘图函数`,`elastic`,`echarts`,`http`,`日志`,`nsq抽取`,`线程安全队列`,`签名`,`gorm封装`,`时间函数`,`国际化i18n`,`gocui 界面类`,`驼峰命名转换工具`,`大驼峰到网络标准json串自动转换`,`剪切板`,`微信`,`ast`,`swagger 文档支持`,`mindoc/markdown 文档支持`,`分布式全局唯一id(myglobal)`,`ssh(支持tab自动补全)`,`zap logger`,`快递鸟`,`redis`
......

17
go.mod
View File

@@ -7,23 +7,18 @@ require (
github.com/atotto/clipboard v0.1.2
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394
github.com/bitly/go-simplejson v0.5.0
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect
github.com/btcsuite/winsvc v1.0.0
github.com/fortytw2/leaktest v1.3.0 // indirect
github.com/go-redis/redis/v8 v8.4.11
github.com/go-sql-driver/mysql v1.5.0
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
github.com/google/go-cmp v0.4.0 // indirect
github.com/gomodule/redigo v1.8.3
github.com/gookit/color v1.2.5
github.com/jander/golog v0.0.0-20150917071935-954a5be801fc
github.com/jinzhu/gorm v1.9.12
github.com/jroimartin/gocui v0.4.0
github.com/kardianos/service v1.0.0
github.com/kr/pretty v0.2.0 // indirect
github.com/mailru/easyjson v0.7.1 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/muesli/cache2go v0.0.0-20200423001931-a100c5aac93f
github.com/nicksnyder/go-i18n/v2 v2.0.3
github.com/nsf/termbox-go v0.0.0-20200418040025-38ba6e5628f1 // indirect
github.com/nsqio/go-nsq v1.0.8
github.com/olivere/elastic v6.2.31+incompatible
github.com/pkg/errors v0.9.1
@@ -31,10 +26,10 @@ require (
github.com/syndtr/goleveldb v1.0.0
github.com/xxjwxc/gowp v0.0.0-20200603130651-4d7368b0e285
go.uber.org/zap v1.10.0
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd
golang.org/x/image v0.0.0-20200430140353-33d19683fad8 // indirect
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f
golang.org/x/text v0.3.2
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb
golang.org/x/text v0.3.3
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
gopkg.in/eapache/queue.v1 v1.1.0
gopkg.in/go-with/wxpay.v1 v1.3.0
gopkg.in/natefinch/lumberjack.v2 v2.0.0

153
go.sum
View File

@@ -1,18 +1,12 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
github.com/BurntSushi/toml v0.3.0 h1:e1/Ivsx3Z0FVTV0NSOv/aVgbUWyQuzj7DDnFblkRvsY=
github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/ant0ine/go-json-rest v3.3.2+incompatible h1:nBixrkLFiDNAW0hauKDLc8yJI6XfrQumWvytE1Hk14E=
github.com/ant0ine/go-json-rest v3.3.2+incompatible/go.mod h1:q6aCt0GfU6LhpBsnZ/2U+mwe+0XB5WStbmwyoPfc+sk=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY=
github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
@@ -26,46 +20,44 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4Yn
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
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/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
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-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-kit/kit v0.8.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/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
github.com/go-redis/redis/v8 v8.4.11 h1:t2lToev01VTrqYQcv+QFbxtGgcf64K+VUMgf9Ap6A/E=
github.com/go-redis/redis/v8 v8.4.11/go.mod h1:d5yY/TlkQyYBSBHnXUmnf1OrHbyQere5JV4dLKwvXmo=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
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/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
@@ -74,52 +66,49 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
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.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/gomodule/redigo v1.8.3 h1:HR0kYDX2RJZvAup8CsiJwxB4dTCSC0AaUq6S4SiLwUc=
github.com/gomodule/redigo v1.8.3/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/gookit/color v1.1.7/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ=
github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/gookit/color v1.2.5 h1:s1gzb/fg3HhkSLKyWVUsZcVBUo+R1TwEYTmmxH8gGFg=
github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jander/golog v0.0.0-20150917071935-954a5be801fc h1:l+v2jwOsGum32nR8cN1MxAtvUWQCIcQGm4WHwizaAbA=
github.com/jander/golog v0.0.0-20150917071935-954a5be801fc/go.mod h1:uWhWXOR4dpfk9J8fegnMY7sP2GFXxe3PFI9Ps+TRXJs=
github.com/jinzhu/gorm v1.9.10/go.mod h1:Kh6hTsSGffh4ui079FHrR5Gg+5D0hgihqDcsDN2BBJY=
github.com/jinzhu/gorm v1.9.12 h1:Drgk1clyWT9t9ERbzHza6Mj/8FY/CqMyVzOiHviMo6Q=
github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs=
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 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M=
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E=
github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jroimartin/gocui v0.4.0 h1:52jnalstgmc25FmtGcWqa0tcbMEWS6RpFLsOIO+I+E8=
github.com/jroimartin/gocui v0.4.0/go.mod h1:7i7bbj99OgFHzo7kB2zPb8pXLqMBSQegY7azfqXMkyY=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kardianos/service v1.0.0 h1:HgQS3mFfOlyntWX8Oke98JcJLqt1DBcHR4kxShpYef0=
github.com/kardianos/service v1.0.0/go.mod h1:8CzDhVuCuugtsHyZoTvsOBuvonN/UDBvl0kH+BUxvbo=
@@ -133,7 +122,6 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4=
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
@@ -141,7 +129,6 @@ github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw=
github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -156,38 +143,37 @@ github.com/nsf/termbox-go v0.0.0-20200418040025-38ba6e5628f1 h1:lh3PyZvY+B9nFliS
github.com/nsf/termbox-go v0.0.0-20200418040025-38ba6e5628f1/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ=
github.com/nsqio/go-nsq v1.0.8 h1:3L2F8tNLlwXXlp2slDUrUWSBn2O3nMh8R1/KEDFTHPk=
github.com/nsqio/go-nsq v1.0.8/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/olivere/elastic v6.2.31+incompatible h1:zwJIIsgfiDBuDS3sb6MCbm/e03BPEJoGZvqevZXM254=
github.com/olivere/elastic v6.2.31+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M=
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.10.4 h1:NiTx7EEvBzu9sFOD1zORteLSt3o8gnlvZZwSE9TnY9U=
github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.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 v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
@@ -195,35 +181,31 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
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 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/xxjwxc/gormt v1.1.2 h1:vXIL7zK3jpGemOKv2nj6i9xQyLY6sQDlYlb0PQudw0o=
github.com/xxjwxc/gormt v1.1.2/go.mod h1:9IzphAz9GIitx1A5ci5ni+twbAVVcUiP2KQa/kHPHd8=
github.com/xxjwxc/gowp v0.0.0-20200603130651-4d7368b0e285 h1:gbdax2ZvHZwe8zxu7by/HMuDUS47iHR2zmEzlgAHBMw=
github.com/xxjwxc/gowp v0.0.0-20200603130651-4d7368b0e285/go.mod h1:yJ/fY5BorWARfDDsxBU/MyQTHc5MVyNcqBQQYD6MN0k=
github.com/xxjwxc/oauth2 v0.0.0-20200316140438-ddd4e3c5f272 h1:aKA2UeM+nzEanWpzZWqkD3e12FlX6bRdhcOsNhm21X0=
github.com/xxjwxc/public v0.0.0-20190915135914-aefa9155c004/go.mod h1:rgW5aGDrLzmJM8NtrtskcxerGFyvn1OK3+Ra52YeZS0=
github.com/xxjwxc/public v0.0.0-20200603115833-341beff27850/go.mod h1:fp3M+FEQrCgWD1fZ/PLwZkCTglf086OEhC9LcydAUnc=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
go.opentelemetry.io/otel v0.16.0 h1:uIWEbdeb4vpKPGITLsRVUS44L5oDbDUCZxn8lkxhmgw=
go.opentelemetry.io/otel v0.16.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA=
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
@@ -231,92 +213,82 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/
go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
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/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
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-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/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-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U=
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
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-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/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-20181107165924-66b7b1311ac8/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-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/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-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
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-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c h1:97SnQk1GYRXJgvwZ8fadnxDOWfKvkNQHH3CtZntPSrM=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
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/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
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-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
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-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/eapache/queue.v1 v1.1.0 h1:EldqoJEGtXYiVCMRo2C9mePO2UUGnYn2+qLmlQSqPdc=
gopkg.in/eapache/queue.v1 v1.1.0/go.mod h1:wNtmx1/O7kZSR9zNT1TTOJ7GLpm3Vn7srzlfylFbQwU=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
gopkg.in/go-with/wxpay.v1 v1.3.0 h1:RXVQck9qNIGkajbTMCvlRPHeewyAIItzOybTTykVdV0=
gopkg.in/go-with/wxpay.v1 v1.3.0/go.mod h1:12lWy92n19pAUSSE3BrOiEZbWRkl+9tneOd/aU/LU6g=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
@@ -325,15 +297,16 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
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.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/mysql v1.0.1 h1:omJoilUzyrAp0xNoio88lGJCroGdIOen9hq2A/+3ifw=
gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw=
gorm.io/gorm v1.9.19/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
gorm.io/gorm v1.20.2 h1:bZzSEnq7NDGsrd+n3evOOedDrY5oLM5QPlCjZJUK2ro=
gorm.io/gorm v1.20.2/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

View File

@@ -1,95 +0,0 @@
package goleveldb
import (
"os"
"../../data/config"
"../log"
"github.com/syndtr/goleveldb/leveldb"
)
var m_db *leveldb.DB = nil
func init() {
Clear();
creat()
}
func creat(){
if m_db == nil{
var err error
m_db, err = leveldb.OpenFile(config.GetLevelDbDir(), nil)
if err != nil {
log.Print(log.Log_Error, err.Error())
m_db.Close()
m_db = nil
}
}
}
/*
清空数据
*/
func Clear() bool {
Close();
os.RemoveAll(config.GetLevelDbDir());
return true;
}
/*
关闭
*/
func Close(){
if m_db != nil{
m_db.Close()
m_db = nil;
}
}
/*
*获取
*/
func Get(key []byte) (data []byte, err error) {
data = nil
data, err = m_db.Get(key, nil)
return
}
/*
设置
*/
func Set(key, value []byte) error {
err := m_db.Put(key, value, nil)
return err
}
/*
删除
*/
func Delete(key []byte) error {
return m_db.Delete(key, nil)
}
/*
*获取
*/
func Getkv(key string) (data []byte, err error) {
return Get([]byte(key))
}
/*
*获取
*/
func Setkv(key string, value []byte) error {
return Set([]byte(key), value)
}
/*
删除
*/
func Deletekv(key string) error {
return Delete([]byte(key))
}

View File

@@ -4,7 +4,7 @@ package message
type ErrCode int
const ( //消息id定义
NormalMessageID ErrCode = 0 // 默认返回值
NormalMessageID ErrCode = 0 // normal
ServerMaintenance ErrCode = 1 // 服务器维护中 请稍后再试
AccountDisabled ErrCode = 2 // 帐号被禁用
AppidOverdue ErrCode = 3 // appid过期
@@ -97,4 +97,5 @@ const ( //消息id定义
NotBindError ErrCode = 1085 // 未绑定
BindError ErrCode = 1086 // 绑定失败
CalError ErrCode = 1087 // 计算错误
TokenCheckError ErrCode = 1088 // token校验失败
)

View File

@@ -98,25 +98,26 @@ func _() {
_ = x[NotBindError-1085]
_ = x[BindError-1086]
_ = x[CalError-1087]
_ = x[TokenCheckError-1088]
}
const (
_ErrCode_name_0 = "默认返回值服务器维护中 请稍后再试帐号被禁用appid过期"
_ErrCode_name_0 = "normal服务器维护中 请稍后再试帐号被禁用appid过期"
_ErrCode_name_1 = "未知错误token失效"
_ErrCode_name_2 = "成功"
_ErrCode_name_3 = "禁止访问"
_ErrCode_name_4 = "参数无效appid参数无效密文校验失败,aa用户名不存在或密码错误键值对重复未找到无效操作授权码错误已被使用已被激活激活码被禁止使用用户已存在验证码请求过于平凡邮箱发送失败手机发送失败手机号格式有问题验证码错误用户不存在topic已经存在topic不存在bundle_id不存在topic开启处理失败topic处理类型不存在topic不能为空设备不存在"
_ErrCode_name_5 = "状态已存在上级菜单不存在菜单不存在用户权限不存在设备ID不存在商品处理类型不存在商品不存在商品正在打折商品可支付类型不存在商品已存在"
_ErrCode_name_6 = "订单不存在商品未打折会话不匹配商品已恢复原价邀请用户不存在邀请用户级数已满用户未授权申请人已存在申请人不存在订单无效微信零钱重复提现提现金额错误微信提现失败重复提交bundle已存在权限已存在权限不存在房型不存在房型已存在房间不存在房间已存在房价代码或房价名称已存在房价代码不存在文件不存在房间未启用班次已存在班次不存在系统时间与营业时间不匹配当前班次已交班支付金额错误存量不足数据存储错误数据添加错误数据更新错误数据删除错误时间错误预定信息错误不允许已过期超过最大值低于最小值已存在未绑定绑定失败计算错误"
_ErrCode_name_6 = "订单不存在商品未打折会话不匹配商品已恢复原价邀请用户不存在邀请用户级数已满用户未授权申请人已存在申请人不存在订单无效微信零钱重复提现提现金额错误微信提现失败重复提交bundle已存在权限已存在权限不存在房型不存在房型已存在房间不存在房间已存在房价代码或房价名称已存在房价代码不存在文件不存在房间未启用班次已存在班次不存在系统时间与营业时间不匹配当前班次已交班支付金额错误存量不足数据存储错误数据添加错误数据更新错误数据删除错误时间错误预定信息错误不允许已过期超过最大值低于最小值已存在未绑定绑定失败计算错误token校验失败"
_ErrCode_name_7 = "新消息心跳"
)
var (
_ErrCode_index_0 = [...]uint8{0, 15, 49, 64, 75}
_ErrCode_index_0 = [...]uint8{0, 6, 40, 55, 66}
_ErrCode_index_1 = [...]uint8{0, 12, 23}
_ErrCode_index_4 = [...]uint16{0, 12, 29, 50, 83, 98, 107, 119, 134, 146, 158, 182, 197, 224, 242, 260, 284, 299, 314, 331, 345, 363, 386, 412, 429, 444}
_ErrCode_index_5 = [...]uint8{0, 15, 36, 51, 72, 89, 116, 131, 149, 179, 194}
_ErrCode_index_6 = [...]uint16{0, 15, 30, 45, 66, 87, 111, 126, 144, 162, 174, 198, 216, 234, 246, 261, 276, 291, 306, 321, 336, 351, 387, 408, 423, 438, 453, 468, 504, 525, 543, 555, 573, 591, 609, 627, 639, 657, 666, 675, 690, 705, 714, 723, 735, 747}
_ErrCode_index_6 = [...]uint16{0, 15, 30, 45, 66, 87, 111, 126, 144, 162, 174, 198, 216, 234, 246, 261, 276, 291, 306, 321, 336, 351, 387, 408, 423, 438, 453, 468, 504, 525, 543, 555, 573, 591, 609, 627, 639, 657, 666, 675, 690, 705, 714, 723, 735, 747, 764}
_ErrCode_index_7 = [...]uint8{0, 9, 15}
)
@@ -137,7 +138,7 @@ func (i ErrCode) String() string {
case 1027 <= i && i <= 1036:
i -= 1027
return _ErrCode_name_5[_ErrCode_index_5[i]:_ErrCode_index_5[i+1]]
case 1043 <= i && i <= 1087:
case 1043 <= i && i <= 1088:
i -= 1043
return _ErrCode_name_6[_ErrCode_index_6[i]:_ErrCode_index_6[i+1]]
case 2001 <= i && i <= 2002:

View File

@@ -20,7 +20,7 @@ type MessageBody struct {
func init() {
_tryRegisteryCode(NormalMessageID)
_tryRegisteryCode(NormalMessageID)
_tryRegisteryCode(NotFindError)
}
//GetErrorMsg 获取错误消息 参数(int,string)
@@ -66,6 +66,12 @@ func GetSuccessMsg(codes ...ErrCode) (msg MessageBody) {
return
}
// GetError 获取错误信息
func GetError(code ErrCode) error {
go _tryRegisteryCode(code)
return fmt.Errorf(code.String())
}
//GetErrorStrMsg 获取错误消息 参数(int,string)
func GetErrorStrMsg(errorCode string) (msg MessageBody) {
// if k, ok := _MessageMap[errorCode]; ok {

View File

@@ -37,9 +37,7 @@ func Marshal(name string) string {
return s
}
/*
回退网络模式
*/
// UnMarshal 回退网络模式
func UnMarshal(name string) string {
const (
lower = false
@@ -89,3 +87,22 @@ func UnMarshal(name string) string {
s := strings.ToLower(buf.String())
return s
}
// UnSmallMarshal 小驼峰模式
func UnSmallMarshal(name string) string {
if name == "" {
return ""
}
var (
value = commonInitialismsReplacer.Replace(name)
)
strArry := []rune(value)
if bool(strArry[0] >= 'A' && strArry[0] <= 'Z') {
strArry[0] = strArry[0] + 32
}
return string(strArry)
}

View File

@@ -19,6 +19,7 @@ func Test_cache(t *testing.T) {
}
fmt.Println(CapLowercase("IDAPIID"))
fmt.Println(CapSmallcase("IDAPIID"))
}
func CapLowercase(name string) string {
@@ -29,3 +30,12 @@ func CapLowercase(name string) string {
return list[0] + name[len(list[0]):]
}
func CapSmallcase(name string) string {
list := strings.Split(UnSmallMarshal(name), "_")
if len(list) == 0 {
return ""
}
return list[0] + name[len(list[0]):]
}

View File

@@ -20,15 +20,18 @@ type Tweet struct {
func Test_cache(t *testing.T) {
//获取
cache := NewCache("_cache")
var tp interface{}
tp, b := cache.Value("key")
if b {
tmp := tp.(Tweet)
tp := Tweet{
User: "aaaa",
Retweets: 12,
}
cache.Add("key", tp, 24*time.Hour)
var tmp Tweet
err := cache.Value("key", &tmp)
if err != nil {
fmt.Println(tmp)
} else {
var tmp Tweet
//添加
cache.Add("key", tmp, 24*time.Hour)
fmt.Println(tmp)
}
return

View File

@@ -7,73 +7,86 @@ import (
"time"
"github.com/muesli/cache2go"
"github.com/xxjwxc/public/serializing"
)
// CacheIFS 缓存操作接口
type CacheIFS interface {
Destory() // 析构
Add(key interface{}, value interface{}, lifeSpan time.Duration) error // 添加一个元素
Value(key interface{}, value interface{}) error // 获取一个value
IsExist(key interface{}) bool // 判断是否存在
Delete(key interface{}) error // 删除一个
Clear() error // 清空
Close() (err error) // 关闭连接
}
// MyCache 内存缓存
type MyCache struct {
cache *cache2go.CacheTable
}
/*
初始化一个cache
cachename 缓存名字
*/
// NewCache 初始化一个cache,cachename 缓存名字
func NewCache(cachename string) (mc *MyCache) {
mc = &MyCache{}
mc.cache = cache2go.Cache(cachename)
return
}
/*
添加一个缓存
lifeSpan:缓存时间0表示永不超时
*/
func (mc *MyCache) Add(key interface{}, value interface{}, lifeSpan time.Duration) *cache2go.CacheItem {
return mc.cache.Add(key, lifeSpan, value)
// Destory 添加一个缓存,lifeSpan:缓存时间0表示永不超时
func (mc *MyCache) Destory() {
}
/*
查找一个cache
value 返回的值
*/
// Add 添加一个缓存,lifeSpan:缓存时间0表示永不超时
func (mc *MyCache) Add(key interface{}, value interface{}, lifeSpan time.Duration) error {
mc.cache.Add(key, lifeSpan, encodeValue(value))
return nil
}
func (mc *MyCache) Value(key interface{}) (value interface{}, b bool) {
b = false
// Value 查找一个cache
func (mc *MyCache) Value(key interface{}, value interface{}) error {
res, err := mc.cache.Value(key)
if err == nil {
value = res.Data()
b = true
return
bt := res.Data().([]byte)
return decodeValue(bt, value)
}
return
return err
}
/*
判断key是否存在
*/
// IsExist 判断key是否存在
func (mc *MyCache) IsExist(key interface{}) bool {
return mc.cache.Exists(key)
}
/*
删除一个cache
*/
// Delete 删除一个cache
func (mc *MyCache) Delete(key interface{}) error {
_, err := mc.cache.Delete(key)
return err
}
/*
获取原始cache2go操作类
*/
// GetCache2go 获取原始cache2go操作类
func (mc *MyCache) GetCache2go() *cache2go.CacheTable {
return mc.cache
}
/*
清空表內容
*/
func (mc *MyCache) Clear() bool {
// Clear 清空表內容
func (mc *MyCache) Clear() error {
mc.cache.Flush()
return true
return nil
}
// Close 清空表內容
func (mc *MyCache) Close() error {
return nil
}
func encodeValue(value interface{}) []byte {
data, _ := serializing.Encode(value)
return data
}
func decodeValue(in []byte, out interface{}) (err error) {
return serializing.Decode(in, out)
}

35
mycache1/my_test.go Normal file
View File

@@ -0,0 +1,35 @@
package mycache
import (
"fmt"
"testing"
"time"
)
// Tweet is a structure used for serializing/deserializing data in Elasticsearch.
type Tweet struct {
User string `json:"user"`
Message string `json:"message"`
Retweets int `json:"retweets"`
Image string `json:"image,omitempty"`
Created time.Time `json:"created,omitempty"`
Tags []string `json:"tags,omitempty"`
Location string `json:"location,omitempty"`
}
func Test_cache(t *testing.T) {
//获取
cache := NewCache("_cache")
var tp interface{}
tp, b := cache.Value("key")
if b {
tmp := tp.(Tweet)
fmt.Println(tmp)
} else {
var tmp Tweet
//添加
cache.Add("key", tmp, 24*time.Hour)
}
return
}

79
mycache1/mycache.go Normal file
View File

@@ -0,0 +1,79 @@
/*
key/value 内存缓存,支持基于超时的自动无效功能
*/
package mycache
import (
"time"
"github.com/muesli/cache2go"
)
// MyCache 内存缓存
type MyCache struct {
cache *cache2go.CacheTable
}
/*
初始化一个cache
cachename 缓存名字
*/
func NewCache(cachename string) (mc *MyCache) {
mc = &MyCache{}
mc.cache = cache2go.Cache(cachename)
return
}
/*
添加一个缓存
lifeSpan:缓存时间0表示永不超时
*/
func (mc *MyCache) Add(key interface{}, value interface{}, lifeSpan time.Duration) *cache2go.CacheItem {
return mc.cache.Add(key, lifeSpan, value)
}
/*
查找一个cache
value 返回的值
*/
func (mc *MyCache) Value(key interface{}) (value interface{}, b bool) {
b = false
res, err := mc.cache.Value(key)
if err == nil {
value = res.Data()
b = true
return
}
return
}
/*
判断key是否存在
*/
func (mc *MyCache) IsExist(key interface{}) bool {
return mc.cache.Exists(key)
}
/*
删除一个cache
*/
func (mc *MyCache) Delete(key interface{}) error {
_, err := mc.cache.Delete(key)
return err
}
/*
获取原始cache2go操作类
*/
func (mc *MyCache) GetCache2go() *cache2go.CacheTable {
return mc.cache
}
/*
清空表內容
*/
func (mc *MyCache) Clear() bool {
mc.cache.Flush()
return true
}

View File

@@ -2,14 +2,13 @@ package mydraw
import (
"fmt"
"public/mydraw"
"testing"
)
func TestMytest(t *testing.T) {
pen, b := mydraw.OnGetPen("./luximr.ttf", 0, 0, 0, 255)
pen, b := OnGetPen("./luximr.ttf", 0, 0, 0, 255)
if b {
var hdc mydraw.HDC
var hdc HDC
hdc.SetBg("./src.png")
pen.Dpi = 200
pen.FontSize = 16

View File

@@ -12,21 +12,20 @@ import (
)
//OnPostJSON 发送修改密码
func OnPostJSON(url, jsonstr string) []byte {
func OnPostJSON(url, jsonstr string) ([]byte, error) {
//解析这个 URL 并确保解析没有出错。
body := bytes.NewBuffer([]byte(jsonstr))
resp, err := http.Post(url, "application/json;charset=utf-8", body)
if err != nil {
return []byte("")
return nil, err
}
defer resp.Body.Close()
body1, err1 := ioutil.ReadAll(resp.Body)
if err1 != nil {
mylog.Error(err1)
return []byte("")
return nil, err
}
return body1
return body1, nil
}
//OnGetJSON 发送get 请求
@@ -117,7 +116,7 @@ func OnPostForm(url string, data url.Values) (body []byte) {
}
//SendPost 发送POST请求
func SendPost(requestBody interface{}, responseBody interface{}, url string) bool {
func SendPost(requestBody interface{}, responseBody interface{}, url string) error {
postData, err := json.Marshal(requestBody)
client := &http.Client{}
req, _ := http.NewRequest("POST", url, bytes.NewReader(postData))
@@ -126,25 +125,22 @@ func SendPost(requestBody interface{}, responseBody interface{}, url string) boo
// req.Header.Add("Authorization", authorization)
resp, e := client.Do(req)
if e != nil {
mylog.Error(e)
return false
return e
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
mylog.Error(e)
return false
return e
}
// mylog.Debug(string(body))
err = json.Unmarshal(body, &responseBody)
if err != nil {
mylog.Error(err)
return false
return e
}
return true
return nil
}
//WriteJSON 像指定client 发送json 包
@@ -155,5 +151,25 @@ func WriteJSON(w http.ResponseWriter, msg interface{}) {
if err != nil {
panic(err)
}
fmt.Fprintf(w, string(js))
fmt.Fprint(w, string(js))
}
// PostHeader post by head
func PostHeader(url, jsonstr string, header http.Header) ([]byte, error) {
postData := bytes.NewBuffer([]byte(jsonstr))
client := &http.Client{}
req, _ := http.NewRequest("POST", url, postData)
req.Header = header
resp, e := client.Do(req)
if e != nil {
return nil, e
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, e
}
return body, nil
}

View File

@@ -9,6 +9,6 @@ import (
func Test_kdn(t *testing.T) {
kdn := New("1111111", "11111111-1111-1111-1111-11111111111111")
result := kdn.GetLogisticsTrack("4304678557725", "YD")
result := kdn.GetLogisticsTrack("4304678557725", "YD", "")
fmt.Printf(tools.JSONDecode(result))
}

51
myredis/def.go Normal file
View File

@@ -0,0 +1,51 @@
package myredis
import (
"sync"
"time"
"github.com/gomodule/redigo/redis"
)
const keepTTL = -1
// MyRedis redis配置项
type MyRedis struct {
conf *redisOptions
// con redis.Conn
pool *redis.Pool
mtx sync.Mutex
once sync.Once
dial RedisDial
err error
}
var _default = &MyRedis{}
// redisOption redisOption
type redisOptions struct {
timeout time.Duration
groupName string
pwd string
clientName string
addrs []string
addrIdex int
db int
readTimeout time.Duration
writeTimeout time.Duration
// redis pool 相关
maxIdle int // 池中空闲连接的最大数目。
maxActive int // 池在给定时间分配的最大连接数。当为零时,池中的连接数没有限制。
}
// Option 功能选项
type Option interface {
apply(*redisOptions)
}
type optionFunc func(*redisOptions)
func (f optionFunc) apply(o *redisOptions) {
f(o)
}

14
myredis/log.go Normal file
View File

@@ -0,0 +1,14 @@
package myredis
import (
"context"
"github.com/xxjwxc/public/mylog"
)
type logger struct {
}
func (l *logger) Printf(ctx context.Context, format string, v ...interface{}) {
mylog.Infof(format, v...)
}

96
myredis/myredis.go Normal file
View File

@@ -0,0 +1,96 @@
package myredis
import (
"time"
"github.com/gomodule/redigo/redis"
)
// RedisDial 操作
type RedisDial interface {
Destory() // 析构
GetRedisClient() redis.Conn // 获取一个原始的redis连接
Ping() bool // 判断是否能ping通
Add(key interface{}, value interface{}, lifeSpan time.Duration) error // 添加一个元素
Value(key interface{}, value interface{}) error // 获取一个value
IsExist(key interface{}) bool // 判断是否存在
Delete(key interface{}) error // 删除一个
Clear() error // 清空
GetKeyS(key interface{}) ([]string, error) // 查询所有key
Close() (err error) // 关闭连接
}
// DefaultConf ...
func DefaultConf() *MyRedis {
if _default.conf == nil {
InitDefaultRedis()
}
return _default
}
// InitDefaultRedis 初始化(必须要优先调用一次)
func InitDefaultRedis(ops ...Option) *MyRedis {
var tmp = &redisOptions{}
for _, o := range ops {
o.apply(tmp)
}
if len(tmp.addrs) == 0 {
tmp.addrs = append(tmp.addrs, ":6379")
}
_default.mtx.Lock()
defer _default.mtx.Unlock()
_default.conf = tmp
return _default
}
// InitRedis 初始化(必须要优先调用一次)
func InitRedis(ops ...Option) *MyRedis {
var cnf = &MyRedis{}
var tmp = &redisOptions{}
for _, o := range ops {
o.apply(tmp)
}
if len(tmp.addrs) == 0 {
tmp.addrs = append(tmp.addrs, ":6379")
}
cnf.mtx.Lock()
defer cnf.mtx.Unlock()
cnf.conf = tmp
return cnf
}
// NewRedis 初始化一个(InitDefaultRedis(需要优先调用)) groupName:分组名
func NewRedis(con *MyRedis) (dial RedisDial, err error) {
if con == nil {
con = DefaultConf()
}
con.once.Do(func() { // 创建连接
ReDialRedis(con)
})
return con.dial, nil
}
// ReDialRedis 重新连接redis
func ReDialRedis(con *MyRedis) {
if con.dial != nil { // 清理,关闭连接
con.dial.Destory()
}
con.mtx.Lock()
defer con.mtx.Unlock()
if con.conf.maxIdle > 0 { // 创建连接池
con.dial = &redisConPool{
base: base{MyRedis: con},
}
return
}
// 创建单个连接
con.dial = &redisConOlny{
base: base{MyRedis: con},
}
}

45
myredis/myredis_test.go Normal file
View File

@@ -0,0 +1,45 @@
package myredis
import (
"fmt"
"testing"
"time"
)
func Test_cache(t *testing.T) {
conf := InitRedis(WithAddr("192.155.1.150:6379"), WithClientName(""),
WithPool(2, 2),
WithTimeout(10*time.Second), WithReadTimeout(10*time.Second), WithWriteTimeout(10*time.Second),
WithPwd("Niren1015"), WithGroupName("gggg"), WithDB(0))
//获取
res, err := NewRedis(conf)
fmt.Println(err)
aaa := "ccccc"
res.Add("aaaa", aaa, 20*time.Second)
res.Close()
res.Add("bbbb", aaa, 0)
res.Close()
fmt.Println(res.Ping())
fmt.Print(res.IsExist("aaaa"))
fmt.Print(res.GetKeyS("*"))
fmt.Println(res.Clear())
fmt.Println(res.Delete("aaaa"))
var tt string
res.Value("bbbb", &tt)
var ww []int32
res.Add("cccc", []int32{1, 2, 3, 4}, 0)
res.Value("cccc", &ww)
// time.Sleep(20 * time.Second)
// fmt.Print(res.IsExist("aaaa"))
// fmt.Println(res.Clear())
// fmt.Println(tt)
return
}

69
myredis/option.go Normal file
View File

@@ -0,0 +1,69 @@
package myredis
import (
"time"
)
// WithTimeout 设置过期时间
func WithTimeout(timeout time.Duration) Option {
return optionFunc(func(o *redisOptions) {
o.timeout = timeout
})
}
// WithGroupName 分组名
func WithGroupName(groupName string) Option {
return optionFunc(func(o *redisOptions) {
o.groupName = groupName
})
}
// WithPwd 密码
func WithPwd(pwd string) Option {
return optionFunc(func(o *redisOptions) {
o.pwd = pwd
})
}
// WithAddr 密码
func WithAddr(addr ...string) Option {
return optionFunc(func(o *redisOptions) {
o.addrs = append(o.addrs, addr...)
})
}
// WithDB 数据库地址(index)
func WithDB(db int) Option {
return optionFunc(func(o *redisOptions) {
o.db = db
})
}
// WithReadTimeout 设置读过期时间
func WithReadTimeout(timeout time.Duration) Option {
return optionFunc(func(o *redisOptions) {
o.readTimeout = timeout
})
}
// WithWriteTimeout 设置写过期时间
func WithWriteTimeout(timeout time.Duration) Option {
return optionFunc(func(o *redisOptions) {
o.writeTimeout = timeout
})
}
// WithPool 连接池配置
func WithPool(maxIdle, maxActive int) Option {
return optionFunc(func(o *redisOptions) {
o.maxIdle = maxIdle
o.maxActive = maxActive
})
}
// WithClientName 指定Redis服务器连接使用的客户端名称
func WithClientName(name string) Option {
return optionFunc(func(o *redisOptions) {
o.clientName = name
})
}

169
myredis/pool.go Normal file
View File

@@ -0,0 +1,169 @@
package myredis
import (
"fmt"
"time"
"github.com/gomodule/redigo/redis"
"github.com/xxjwxc/public/mylog"
)
type redisConPool struct {
base
}
func (mc *redisConPool) Destory() {
mc.mtx.Lock()
defer mc.mtx.Unlock()
if mc.pool != nil {
mc.pool.Close()
}
}
func (mc *redisConPool) GetRedisClient() redis.Conn {
mc.mtx.Lock()
if mc.pool == nil { // 创建连接
mc.pool = &redis.Pool{
MaxIdle: mc.conf.maxIdle,
MaxActive: mc.conf.maxActive,
Dial: func() (redis.Conn, error) {
return mc.Dial()
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
if err != nil {
mylog.Errorf("ping redis error: %s", err)
return err
}
return nil
},
}
}
mc.mtx.Unlock()
con := mc.pool.Get()
mylog.Info(mc.pool.ActiveCount())
return con
}
// Ping 判断是否能ping通
func (mc *redisConPool) Ping() bool {
return mc.ping(mc.GetRedisClient())
}
// Add 添加一个缓存 lifeSpan:缓存时间0表示永不超时
func (mc *redisConPool) Add(key interface{}, value interface{}, lifeSpan time.Duration) error {
var args []interface{}
args = append(args, mc.getKey(key), mc.encodeValue(value))
if lifeSpan > 0 {
if usePrecise(lifeSpan) {
args = append(args, "px", formatMs(lifeSpan))
} else {
args = append(args, "ex", formatSec(lifeSpan))
}
} else if lifeSpan == keepTTL {
args = append(args, "keepttl")
}
con := mc.GetRedisClient()
defer con.Close()
repy, err := mc.Do(con, "SET", args...)
mylog.Info(redis.String(repy, err))
if err != nil {
mylog.Error(err)
}
return err
}
// Value 查找一个cache
func (mc *redisConPool) Value(key interface{}, value interface{}) (err error) {
con := mc.GetRedisClient()
defer con.Close()
repy, err := mc.Do(con, "GET", mc.getKey(key))
if err != nil {
mylog.Error(err)
return err
}
return mc.decodeValue(repy, value)
}
// IsExist 判断key是否存在
func (mc *redisConPool) IsExist(key interface{}) bool {
con := mc.GetRedisClient()
defer con.Close()
repy, err := mc.Do(con, "EXISTS", mc.getKey(key))
if err != nil {
mylog.Error(err)
return false
}
exist, err := redis.Bool(repy, err) // 转化bool格式
if err != nil {
mylog.Error(err)
return false
}
return exist
}
// Delete 删除一个cache
func (mc *redisConPool) Delete(key interface{}) error {
con := mc.GetRedisClient()
defer con.Close()
_, err := mc.Do(con, "del", mc.getKey(key))
if err != nil {
mylog.Error(err)
return err
}
return err
}
// Clear 清空表內容
func (mc *redisConPool) Clear() error {
out, err := mc.GetKeyS("*")
if err != nil {
return err
}
for _, v := range out {
err = mc.Delete(v)
if err != nil {
return err
}
}
return err
}
// GetKeyS 查询所有key
func (mc *redisConPool) GetKeyS(key interface{}) ([]string, error) {
con := mc.GetRedisClient()
defer con.Close()
var keys []string
repy, err := mc.Do(con, "keys", mc.getKey(key))
if err != nil {
mylog.Error(err)
return keys, err
}
switch t := repy.(type) {
case []interface{}:
for _, v := range t {
out, err := redis.String(v, nil)
if err != nil {
mylog.Error(err)
}
keys = append(keys, mc.fixKeyGroupName(out))
}
default:
return keys, fmt.Errorf("decodeValue err in type not find:%v", t)
}
return keys, err
}
// Close 关闭一个连接
func (mc *redisConPool) Close() (err error) {
return nil
}

379
myredis/rediscon.go Normal file
View File

@@ -0,0 +1,379 @@
package myredis
import (
"context"
"fmt"
"strconv"
"strings"
"time"
"github.com/gomodule/redigo/redis"
"github.com/xxjwxc/public/dev"
"github.com/xxjwxc/public/mylog"
"github.com/xxjwxc/public/tools"
)
type base struct {
*MyRedis
}
func (mc *base) getCtx() context.Context {
return context.Background()
}
func (mc *base) getKey(key interface{}) string {
tmp := ""
if len(mc.conf.groupName) > 0 {
tmp = fmt.Sprintf("%v:", mc.conf.groupName)
}
switch t := key.(type) {
case []byte:
return fmt.Sprintf("%v%v", tmp, string(t))
case string:
return fmt.Sprintf("%v%v", tmp, t)
default:
return fmt.Sprintf("%v%v", tmp, tools.JSONDecode(key))
}
}
func (mc *base) encodeValue(value interface{}) interface{} {
switch t := value.(type) {
case int32, byte, string, bool, int, uint, int8, int16, int64, uint16, uint32, uint64, float32, float64: // 基础类型
return t
default:
return tools.JSONDecode(value)
// data, _ := serializing.Encode(value)
// return data
}
}
func (mc *base) decodeValue(in, out interface{}) (err error) {
if in == nil {
return fmt.Errorf("not fond")
}
var reply string
switch t := in.(type) {
case []byte:
reply = string(t)
default:
return fmt.Errorf("decodeValue err in type not find:%v", t)
}
switch o := out.(type) {
case *string: // string类型
*o = reply
return nil
case *int32:
i64, err := strconv.ParseInt(reply, 10, 0)
*o = int32(i64)
return err
case *bool:
b, err := strconv.ParseBool(string(reply))
*o = b
return err
case *int:
i64, err := strconv.ParseInt(reply, 10, 0)
*o = int(i64)
return err
case *int8:
i64, err := strconv.ParseInt(reply, 10, 0)
*o = int8(i64)
return err
case *int16:
i64, err := strconv.ParseInt(reply, 10, 0)
*o = int16(i64)
return err
case *int64:
i64, err := strconv.ParseInt(string(reply), 10, 64)
*o = int64(i64)
return err
case *uint:
i64, err := strconv.ParseUint(reply, 10, 0)
*o = uint(i64)
return err
case *uint8:
i64, err := strconv.ParseUint(reply, 10, 0)
*o = uint8(i64)
return err
case *uint16:
i64, err := strconv.ParseUint(reply, 10, 0)
*o = uint16(i64)
return err
case *uint32:
i64, err := strconv.ParseInt(string(reply), 10, 0)
*o = uint32(i64)
return err
case *uint64:
i64, err := strconv.ParseUint(reply, 10, 64)
*o = uint64(i64)
return err
case *float32:
f64, err := strconv.ParseFloat(string(reply), 32)
*o = float32(f64)
return err
case *float64: // 基础类型
f64, err := strconv.ParseFloat(string(reply), 64)
*o = float64(f64)
return err
default:
tools.JSONEncode(reply, out) // 复杂类型
return nil
//return serializing.Decode(t, out)
}
// return fmt.Errorf("decodeValue err not match:%v %v", in, out)
}
func (mc *base) ping(con redis.Conn) bool {
if con == nil {
return false
}
_, err := con.Do("PING")
if err != nil {
mylog.Errorf("ping redis error: %s", err)
return false
}
return true
}
// Dial 获取一个链接
func (mc *base) build() (con redis.Conn, err error) {
err = fmt.Errorf("not fond ")
index := mc.conf.addrIdex
len := len(mc.conf.addrs)
b := false
for i := 0; i < len; i++ {
index = (mc.conf.addrIdex + i) % len
con, err = redis.Dial("tcp", mc.conf.addrs[index], redis.DialClientName(mc.conf.clientName),
redis.DialConnectTimeout(mc.conf.timeout), redis.DialDatabase(mc.conf.db),
redis.DialPassword(mc.conf.pwd), redis.DialReadTimeout(mc.conf.readTimeout), redis.DialWriteTimeout(mc.conf.writeTimeout),
)
if err != nil {
mylog.Error(err)
}
if mc.ping(con) {
b = true
}
}
if b {
mc.conf.addrIdex = (index + 1) % len
}
return
}
// Dial 获取一个链接
func (mc *base) Dial() (redis.Conn, error) {
mc.mtx.Lock()
defer mc.mtx.Unlock()
return mc.build() // 创建连接
}
func (mc *base) Do(con redis.Conn, commandName string, args ...interface{}) (reply interface{}, err error) {
if dev.IsDev() {
cmd := commandName
for _, v := range args {
cmd += fmt.Sprintf(" %v", v)
if len(cmd) > 100 {
cmd = cmd[:100]
break
}
}
mylog.Infof("redis req :%v \n", cmd)
}
if con != nil {
reply, err = con.Do(commandName, args...)
// show log
if dev.IsDev() {
tmp := ""
switch reply := reply.(type) {
case []byte:
tmp = string(reply)
case string:
tmp = reply
case int64:
tmp = fmt.Sprintf("%v", reply)
}
if len(tmp) > 100 {
tmp = tmp[:100]
}
mylog.Infof("redis resp:%v,%v \n", tmp, err)
}
return
}
return nil, fmt.Errorf("con is nil")
}
func (mc *base) fixKeyGroupName(key string) string {
tmp := ""
if len(mc.conf.groupName) > 0 {
tmp = fmt.Sprintf("%v:", mc.conf.groupName)
}
return strings.TrimPrefix(key, tmp)
}
type redisConOlny struct {
base
con redis.Conn
}
// Destory 析构
func (mc *redisConOlny) Destory() {
mc.mtx.Lock()
defer mc.mtx.Unlock()
if mc.con != nil {
err := mc.con.Close()
if err != nil {
mylog.Error(err)
}
mc.con = nil
}
}
// GetRedisClient ...
func (mc *redisConOlny) GetRedisClient() redis.Conn {
if mc.con == nil {
con, _ := mc.Dial()
mc.con = con
}
return mc.con
}
// Ping 判断是否能ping通
func (mc *redisConOlny) Ping() bool {
return mc.ping(mc.GetRedisClient())
}
// 判断是否能ping通
// Add 添加一个缓存 lifeSpan:缓存时间0表示永不超时
func (mc *redisConOlny) Add(key interface{}, value interface{}, lifeSpan time.Duration) error {
var args []interface{}
args = append(args, mc.getKey(key), mc.encodeValue(value))
if lifeSpan > 0 {
if usePrecise(lifeSpan) {
args = append(args, "px", formatMs(lifeSpan))
} else {
args = append(args, "ex", formatSec(lifeSpan))
}
} else if lifeSpan == keepTTL {
args = append(args, "keepttl")
}
_, err := mc.Do(mc.GetRedisClient(), "SET", args...)
if err != nil {
mylog.Error(err)
}
return err
}
// Value 查找一个cache
func (mc *redisConOlny) Value(key interface{}, value interface{}) (err error) {
repy, err := mc.Do(mc.GetRedisClient(), "GET", mc.getKey(key))
if err != nil {
mylog.Error(err)
return err
}
return mc.decodeValue(repy, value)
}
// IsExist 判断key是否存在
func (mc *redisConOlny) IsExist(key interface{}) bool {
repy, err := mc.Do(mc.GetRedisClient(), "EXISTS", mc.getKey(key))
if err != nil {
mylog.Error(err)
return false
}
exist, err := redis.Bool(repy, err) // 转化bool格式
if err != nil {
mylog.Error(err)
return false
}
return exist
}
// Delete 删除一个cache
func (mc *redisConOlny) Delete(key interface{}) error {
_, err := mc.Do(mc.GetRedisClient(), "del", mc.getKey(key))
if err != nil {
mylog.Error(err)
return err
}
return err
}
// Clear 清空表內容
func (mc *redisConOlny) Clear() error {
out, err := mc.GetKeyS("*")
if err != nil {
return err
}
for _, v := range out {
err = mc.Delete(v)
if err != nil {
return err
}
}
return err
}
// GetKeyS 查询所有key
func (mc *redisConOlny) GetKeyS(key interface{}) ([]string, error) {
var keys []string
repy, err := mc.Do(mc.GetRedisClient(), "keys", mc.getKey(key))
if err != nil {
mylog.Error(err)
return keys, err
}
switch t := repy.(type) {
case []interface{}:
for _, v := range t {
out, err := redis.String(v, nil)
if err != nil {
mylog.Error(err)
}
keys = append(keys, mc.fixKeyGroupName(out))
}
default:
return keys, fmt.Errorf("decodeValue err in type not find:%v", t)
}
return keys, err
}
// Close 关闭一个连接
func (mc *redisConOlny) Close() (err error) {
mc.mtx.Lock()
defer mc.mtx.Unlock()
if mc.con != nil {
err = mc.con.Close()
mc.con = nil
}
return
}
func usePrecise(dur time.Duration) bool {
return dur < time.Second || dur%time.Second != 0
}
func formatMs(dur time.Duration) int64 {
if dur > 0 && dur < time.Millisecond {
return 1
}
return int64(dur / time.Millisecond)
}
func formatSec(dur time.Duration) int64 {
if dur > 0 && dur < time.Second {
return 1
}
return int64(dur / time.Second)
}

14
myredis1/log.go Normal file
View File

@@ -0,0 +1,14 @@
package myredis
import (
"context"
"github.com/xxjwxc/public/mylog"
)
type logger struct {
}
func (l *logger) Printf(ctx context.Context, format string, v ...interface{}) {
mylog.Infof(format, v...)
}

32
myredis1/my_test.go Normal file
View File

@@ -0,0 +1,32 @@
package myredis
import (
"fmt"
"testing"
"time"
)
func Test_cache(t *testing.T) {
//获取
res, _ := NewRedis([]string{"192.155.1.150:6379"}, "Niren1015", "gggg", 0)
fmt.Println(res.Clear())
aaa := "ccccc"
res.Add("aaaa", aaa, 20*time.Second)
res.Add("bbbb", aaa, 0)
fmt.Println(res.Delete("aaaa"))
fmt.Print(res.IsExist("aaaa"))
var tt string
res.Value("aaaa", &tt)
time.Sleep(20 * time.Second)
fmt.Print(res.IsExist("aaaa"))
fmt.Println(res.Clear())
fmt.Println(tt)
return
}

156
myredis1/myredis.go Normal file
View File

@@ -0,0 +1,156 @@
package myredis
import (
"context"
"fmt"
"time"
redis "github.com/go-redis/redis/v8"
"github.com/xxjwxc/public/mylog"
"github.com/xxjwxc/public/tools"
)
// MyRedis 分布式缓存
type MyRedis struct {
redis.Cmdable
timeout time.Duration
groupName string
}
// NewRedis 初始化一个cache cachename 缓存名字
func NewRedis(addrs []string, pwd, groupName string, timeout time.Duration) (mc *MyRedis, err error) {
redis.SetLogger(&logger{})
if len(addrs) <= 1 {
mc = &MyRedis{
Cmdable: redis.NewClient(&redis.Options{
Addr: addrs[0],
DialTimeout: timeout,
Password: pwd, // no password set
// DB: 0, // use default DB
}),
}
} else {
mc = &MyRedis{
Cmdable: redis.NewClusterClient(&redis.ClusterOptions{
Addrs: addrs,
Password: pwd, // no password set
DialTimeout: timeout,
}),
}
}
mc.timeout = timeout
mc.groupName = groupName
err = mc.Ping(mc.getCtx()).Err()
if err != nil {
mylog.Error(err)
}
return
}
func (mc *MyRedis) getCtx() context.Context {
return context.Background()
}
func (mc *MyRedis) getKey(key interface{}) string {
if len(mc.groupName) > 0 {
return fmt.Sprintf("%v:%v", mc.groupName, tools.JSONDecode(key))
}
return tools.JSONDecode(key)
}
// Add 添加一个缓存 lifeSpan:缓存时间0表示永不超时
func (mc *MyRedis) Add(key interface{}, value interface{}, lifeSpan time.Duration) (err error) {
set := mc.Set(mc.getCtx(), mc.getKey(key), tools.JSONDecode(value), lifeSpan)
mylog.Info(set.Val())
// redis.Expect(set.Err()).NotTo(HaveOccurred())
// redis.Expect(set.Val()).To(Equal("OK"))
err = set.Err()
if err != nil {
mylog.Error(err)
}
return
}
// Value 查找一个cache
func (mc *MyRedis) Value(key interface{}, value interface{}) (err error) {
set := mc.Get(mc.getCtx(), mc.getKey(key))
mylog.Info(set.Val())
// redis.Expect(set.Err()).NotTo(HaveOccurred())
// redis.Expect(set.Val()).To(Equal("OK"))
err = set.Err()
if err != nil {
mylog.Error(err)
return
}
tools.JSONEncode(set.Val(), value)
return
}
// IsExist 判断key是否存在
func (mc *MyRedis) IsExist(key interface{}) bool {
set := mc.Exists(mc.getCtx(), mc.getKey(key))
mylog.Info(set.Val())
// redis.Expect(set.Err()).NotTo(HaveOccurred())
// redis.Expect(set.Val()).To(Equal("OK"))
err := set.Err()
if err != nil {
mylog.Error(err)
}
return set.Val() == 1
}
// Delete 删除一个cache
func (mc *MyRedis) Delete(key interface{}) error {
set := mc.Del(mc.getCtx(), mc.getKey(key))
mylog.Info(set.Val())
// redis.Expect(set.Err()).NotTo(HaveOccurred())
// redis.Expect(set.Val()).To(Equal("OK"))
err := set.Err()
if err != nil {
mylog.Error(err)
}
return err
}
// GetRedisClient 获取原始cache2go操作类
func (mc *MyRedis) GetRedisClient() redis.Cmdable {
return mc
}
// Clear 清空表內容
func (mc *MyRedis) Clear() error {
key := "*"
if len(mc.groupName) > 0 {
key = fmt.Sprintf("%v:*", mc.groupName)
}
set := mc.Pipeline().Do(mc.getCtx(), "KEYS", key)
mylog.Info(set.Val())
// redis.Expect(set.Err()).NotTo(HaveOccurred())
// redis.Expect(set.Val()).To(Equal("OK"))
err := set.Err()
if err != nil {
mylog.Error(err)
}
return mc.delete(key)
}
// delete 删除一个cache
func (mc *MyRedis) delete(key string) error {
set := mc.Del(mc.getCtx(), key)
mylog.Info(set.Val())
// redis.Expect(set.Err()).NotTo(HaveOccurred())
// redis.Expect(set.Val()).To(Equal("OK"))
err := set.Err()
if err != nil {
mylog.Error(err)
}
return err
}

View File

@@ -21,5 +21,5 @@ func TestMain(t *testing.T) {
// time.Sleep(1 * time.Second)
c.Terminal() // 进入
c.EnterTerminal() // 进入
}

View File

@@ -6,12 +6,12 @@ package mywebsocket
import (
"encoding/json"
"net/http"
"public/mycache"
"public/mylog"
"sync"
"time"
"github.com/ant0ine/go-json-rest/rest"
"github.com/xxjwxc/public/mycache"
"github.com/xxjwxc/public/mylog"
"golang.org/x/net/websocket"
)

View File

@@ -13,4 +13,3 @@ type Sign_client_tbl struct {
Expire_time time.Time //超时时间
Strict_verify int //是否强制验证:0用户自定义1强制
}
z

View File

@@ -2,13 +2,6 @@ package sign
import (
"strings"
"time"
"github.com/xxjwxc/oauth2/oauth2Client/src/data/config"
"github.com/xxjwxc/public/mycache"
"github.com/xxjwxc/public/mylog"
"github.com/xxjwxc/public/mysqldb"
"github.com/xxjwxc/public/tools"
)
func init() {
@@ -16,44 +9,44 @@ func init() {
}
func OnInit() {
str_db := config.GetDbUrl()
if len(str_db) > 0 {
var db mysqldb.MySqlDB
defer db.OnDestoryDB()
orm := db.OnGetDBOrm(str_db)
if orm.HasTable(&Sign_client_tbl{}) { //有这个表
now := time.Now()
var list []Sign_client_tbl
err := orm.Where("expire_time > ?", now).Find(&list).Error
if err != nil {
mylog.Error(err)
return
}
cache := mycache.NewCache(_sign_data)
for _, v := range list { //保存数据到缓存
cache.Add(v.App_key, v, v.Expire_time.Sub(now))
}
}
}
// str_db := config.GetDbUrl()
// if len(str_db) > 0 {
// var db mysqldb.MySqlDB
// defer db.OnDestoryDB()
// orm := db.OnGetDBOrm(str_db)
// if orm.HasTable(&Sign_client_tbl{}) { //有这个表
// now := time.Now()
// var list []Sign_client_tbl
// err := orm.Where("expire_time > ?", now).Find(&list).Error
// if err != nil {
// mylog.Error(err)
// return
// }
// cache := mycache.NewCache(_sign_data)
// for _, v := range list { //保存数据到缓存
// cache.Add(v.App_key, v, v.Expire_time.Sub(now))
// }
// }
// }
}
func getOne(appKey string) (sign Sign_client_tbl) {
str_db := config.GetDbUrl()
if len(str_db) > 0 {
var db mysqldb.MySqlDB
defer db.OnDestoryDB()
orm := db.OnGetDBOrm(str_db)
if orm.HasTable(&Sign_client_tbl{}) { //有这个表
now := time.Now()
err := orm.Where("app_key = ? and expire_time > ?", appKey, now).Find(&sign).Error
if err != nil {
mylog.Error(err)
return
}
cache := mycache.NewCache(_sign_data)
cache.Add(sign.App_key, sign, sign.Expire_time.Sub(now))
}
}
// str_db := config.GetDbUrl()
// if len(str_db) > 0 {
// var db mysqldb.MySqlDB
// defer db.OnDestoryDB()
// orm := db.OnGetDBOrm(str_db)
// if orm.HasTable(&Sign_client_tbl{}) { //有这个表
// now := time.Now()
// err := orm.Where("app_key = ? and expire_time > ?", appKey, now).Find(&sign).Error
// if err != nil {
// mylog.Error(err)
// return
// }
// cache := mycache.NewCache(_sign_data)
// cache.Add(sign.App_key, sign, sign.Expire_time.Sub(now))
// }
// }
return
}
@@ -62,30 +55,31 @@ func getOne(appKey string) (sign Sign_client_tbl) {
生成验签
*/
func OnGetSign(appkey string, parm ...interface{}) string {
var sign Sign_client_tbl
if len(appkey) > 0 {
cache := mycache.NewCache(_sign_data)
tp, b := cache.Value(appkey)
if b {
sign = tp.(Sign_client_tbl)
} else {
sign = getOne(appkey)
}
}
// var sign Sign_client_tbl
// if len(appkey) > 0 {
// cache := mycache.NewCache(_sign_data)
// tp, b := cache.Value(appkey)
// if b {
// sign = tp.(Sign_client_tbl)
// } else {
// sign = getOne(appkey)
// }
// }
if sign.Id == 0 {
// if sign.Id == 0 {
// return ""
// }
// //开始验签
// var strKey string
// for _, v := range parm {
// strKey += tools.AsString(v)
// }
// return tools.Md5Encoder(strKey)
return ""
}
//开始验签
var strKey string
for _, v := range parm {
strKey += tools.AsString(v)
}
return tools.Md5Encoder(strKey)
}
/*
开始验签
*/

View File

@@ -2,15 +2,16 @@ package sign
import (
"fmt"
"public/message"
"public/tools"
"testing"
"time"
"github.com/xxjwxc/public/message"
"github.com/xxjwxc/public/tools"
)
func Test_sing(t *testing.T) {
now := time.Now()
str := "1" + tools.GetTimeString(now)
str := "1" + tools.GetTimeStr(now)
str += "1.0001"
fmt.Println(str)
ttt := tools.Md5Encoder(str)

View File

@@ -9,6 +9,7 @@ import (
"strconv"
"strings"
"time"
"unicode"
"github.com/xxjwxc/public/errors"
@@ -139,10 +140,45 @@ func UnicodeEmojiCode(s string) string {
if len(string(rs[i])) == 4 {
u := `[\u` + strconv.FormatInt(int64(rs[i]), 16) + `]`
ret += u
} else {
ret += string(rs[i])
}
}
return ret
}
// DbcToSbc 全角转半角
func DbcToSbc(str string) string {
numConv := unicode.SpecialCase{
unicode.CaseRange{
Lo: 0x3002, // Lo 全角句号
Hi: 0x3002, // Hi 全角句号
Delta: [unicode.MaxCase]rune{
0, // UpperCase
0x002e - 0x3002, // LowerCase 转成半角句号
0, // TitleCase
},
},
//
unicode.CaseRange{
Lo: 0xFF01, // 从全角!
Hi: 0xFF19, // 到全角 9
Delta: [unicode.MaxCase]rune{
0, // UpperCase
0x0021 - 0xFF01, // LowerCase 转成半角
0, // TitleCase
},
},
unicode.CaseRange{
Lo: 0xff21, // Lo: 全角
Hi: 0xFF5A, // Hi:到全角
Delta: [unicode.MaxCase]rune{
0, // UpperCase
0x0041 - 0xff21, // LowerCase 转成半角
0, // TitleCase
},
},
}
return strings.ToLowerSpecial(numConv, str)
}

View File

@@ -19,6 +19,9 @@ func GetLocalSystemLang(isSimple bool) (locale string) {
if isSimple {
locale, _ = splitLocale(locale)
}
if len(locale) == 0 {
locale = "zh"
}
return
}

View File

@@ -137,3 +137,8 @@ func Sha1Encrypt(str string) string {
func GetUtf8Str(str string) []rune {
return []rune(str)
}
// GetUtf8Len 获取中文字符的长度
func GetUtf8Len(str string) int {
return len([]rune(str))
}

View File

@@ -26,12 +26,11 @@ const (
func (_wx *wxTools) GetAccessToken() (accessToken string, err error) {
//先从缓存中获取 access_token
cache := mycache.NewCache(_cacheToken)
var tp interface{}
var b bool
tp, b = cache.Value(_cacheToken)
if b {
accessToken = *(tp.(*string))
} else {
err = cache.Value(_cacheToken, &accessToken)
if err == nil {
return
}
var url = _getToken + _wx.wxInfo.AppID + "&secret=" + _wx.wxInfo.AppSecret
resp, err := http.Get(url)
@@ -54,8 +53,6 @@ func (_wx *wxTools) GetAccessToken() (accessToken string, err error) {
//------------------end
}
//----------------------end
}
//---------------获取 access_token --------end
return
}
@@ -64,11 +61,11 @@ func (_wx *wxTools) GetAccessToken() (accessToken string, err error) {
func (_wx *wxTools) GetAPITicket() (ticket string, err error) {
//先从缓存中获取
cache := mycache.NewCache(_cacheTicket)
var tp interface{}
tp, b := cache.Value(_cacheTicket)
if b {
ticket = tp.(string)
} else {
err = cache.Value(_cacheTicket, &ticket)
if err == nil {
return
}
accessToken, e := _wx.GetAccessToken()
if e != nil {
mylog.Error(e)
@@ -95,7 +92,7 @@ func (_wx *wxTools) GetAPITicket() (ticket string, err error) {
ticket = result.Ticket
//保存缓存
cache.Add(_cacheTicket, ticket, 7000*time.Second)
}
return
}
@@ -103,11 +100,11 @@ func (_wx *wxTools) GetAPITicket() (ticket string, err error) {
func (_wx *wxTools) GetJsTicket() (ticket string, err error) {
//先从缓存中获取
cache := mycache.NewCache("weixin_js_ticket")
var tp interface{}
tp, b := cache.Value("base")
if b {
ticket = tp.(string)
} else {
err = cache.Value("base", &ticket)
if err == nil {
return
}
accessToken, e := _wx.GetAccessToken()
if e != nil {
mylog.Error(e)
@@ -134,7 +131,7 @@ func (_wx *wxTools) GetJsTicket() (ticket string, err error) {
ticket = result.Ticket
//保存缓存
cache.Add("base", ticket, 7000*time.Second)
}
return
}