mirror of
https://github.com/xxjwxc/public.git
synced 2025-09-26 20:01:19 +08:00
Merge branch 'master' into master
This commit is contained in:
24
go.mod
24
go.mod
@@ -1,17 +1,18 @@
|
||||
module github.com/xxjwxc/public
|
||||
|
||||
go 1.18
|
||||
go 1.21.0
|
||||
|
||||
require (
|
||||
github.com/aliyun/aliyun-oss-go-sdk v2.2.9+incompatible
|
||||
github.com/apache/rocketmq-client-go/v2 v2.1.2-0.20230412142645-25003f6f083d
|
||||
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/btcsuite/winsvc v1.0.0
|
||||
github.com/go-redis/redis/v8 v8.11.5
|
||||
github.com/go-sql-driver/mysql v1.6.0
|
||||
github.com/go-sql-driver/mysql v1.7.0
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
||||
github.com/gomodule/redigo v1.8.3
|
||||
github.com/gomodule/redigo v2.0.0+incompatible
|
||||
github.com/gookit/color v1.2.5
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
github.com/jander/golog v0.0.0-20150917071935-954a5be801fc
|
||||
@@ -29,8 +30,8 @@ require (
|
||||
github.com/wenzhenxi/gorsa v0.0.0-20210524035706-528c7050d703
|
||||
github.com/xxjwxc/gowp v0.0.0-20200603130651-4d7368b0e285
|
||||
go.uber.org/zap v1.24.0
|
||||
golang.org/x/crypto v0.1.0
|
||||
golang.org/x/text v0.8.0
|
||||
golang.org/x/crypto v0.10.0
|
||||
golang.org/x/text v0.10.0
|
||||
google.golang.org/grpc v1.47.0
|
||||
gopkg.in/eapache/queue.v1 v1.1.0
|
||||
gopkg.in/go-with/wxpay.v1 v1.3.0
|
||||
@@ -44,13 +45,13 @@ require (
|
||||
github.com/ClickHouse/ch-go v0.53.0 // indirect
|
||||
github.com/ClickHouse/clickhouse-go/v2 v2.8.3 // indirect
|
||||
github.com/andybalholm/brotli v1.0.5 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/emirpasic/gods v1.12.0 // indirect
|
||||
github.com/go-faster/city v1.0.1 // indirect
|
||||
github.com/go-faster/errors v0.6.1 // indirect
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/golang/protobuf v1.5.2 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/golang/snappy v0.0.1 // indirect
|
||||
github.com/google/uuid v1.3.0 // indirect
|
||||
github.com/hashicorp/go-version v1.6.0 // indirect
|
||||
@@ -60,6 +61,7 @@ require (
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/klauspost/compress v1.16.0 // indirect
|
||||
github.com/lib/pq v1.10.5 // indirect
|
||||
github.com/mailru/easyjson v0.7.6 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
@@ -80,11 +82,11 @@ require (
|
||||
go.uber.org/atomic v1.10.0 // indirect
|
||||
go.uber.org/multierr v1.9.0 // indirect
|
||||
golang.org/x/image v0.5.0 // indirect
|
||||
golang.org/x/net v0.8.0 // indirect
|
||||
golang.org/x/sys v0.6.0 // indirect
|
||||
golang.org/x/term v0.6.0 // indirect
|
||||
golang.org/x/sys v0.9.0 // indirect
|
||||
golang.org/x/term v0.9.0 // indirect
|
||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
|
||||
google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad // indirect
|
||||
google.golang.org/protobuf v1.28.0 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
stathat.com/c/consistent v1.0.0 // indirect
|
||||
)
|
||||
|
41
go.sum
41
go.sum
@@ -108,6 +108,8 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||
github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
|
||||
github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk=
|
||||
github.com/aliyun/aliyun-oss-go-sdk v2.2.9+incompatible h1:Sg/2xHwDrioHpxTN6WMiwbXTpUEinBpHsN7mG21Rc2k=
|
||||
github.com/aliyun/aliyun-oss-go-sdk v2.2.9+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
||||
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
|
||||
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||
github.com/ant0ine/go-json-rest v3.3.2+incompatible/go.mod h1:q6aCt0GfU6LhpBsnZ/2U+mwe+0XB5WStbmwyoPfc+sk=
|
||||
@@ -158,8 +160,9 @@ github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6
|
||||
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
|
||||
github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=
|
||||
github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
|
||||
@@ -435,8 +438,9 @@ github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq
|
||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
|
||||
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
|
||||
@@ -490,13 +494,14 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
|
||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
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/gomodule/redigo v1.8.3 h1:HR0kYDX2RJZvAup8CsiJwxB4dTCSC0AaUq6S4SiLwUc=
|
||||
github.com/gomodule/redigo v1.8.3/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
|
||||
github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
|
||||
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
|
||||
@@ -668,8 +673,9 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
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/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ=
|
||||
github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
@@ -1112,8 +1118,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm
|
||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
|
||||
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
|
||||
golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
|
||||
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@@ -1214,8 +1220,8 @@ golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qx
|
||||
golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
|
||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
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/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
@@ -1354,8 +1360,9 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
@@ -1363,8 +1370,8 @@ golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuX
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=
|
||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||
golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28=
|
||||
golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
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=
|
||||
@@ -1375,8 +1382,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
|
||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
@@ -1384,6 +1391,7 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
|
||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
@@ -1581,8 +1589,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
|
||||
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
120
myalioss/bucket.go
Normal file
120
myalioss/bucket.go
Normal file
@@ -0,0 +1,120 @@
|
||||
package myalioss
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
||||
)
|
||||
|
||||
// Bucket 存储桶
|
||||
type Bucket struct {
|
||||
Bucket *oss.Bucket
|
||||
Info *BucketInfo
|
||||
}
|
||||
|
||||
// BucketInfo 存储桶的信息
|
||||
type BucketInfo struct {
|
||||
Name string `xml:"Name"` // 桶名
|
||||
Location string `xml:"Location"` // Bucket所在的地域
|
||||
CreationDate time.Time `xml:"CreationDate"` // Bucket的创建时间,格式为UTC时间
|
||||
ExtranetEndpoint string `xml:"ExtranetEndpoint"` // Bucket的外网域名
|
||||
IntranetEndpoint string `xml:"IntranetEndpoint"` // 同地域ECS访问Bucket的内网域名
|
||||
ACL string `xml:"AccessControlList>Grant"` // Bucket读写权限(ACL)信息的容器
|
||||
RedundancyType string `xml:"DataRedundancyType"` // Bucket的数据容灾类型
|
||||
StorageClass string `xml:"StorageClass"` // Bucket的存储类型
|
||||
Versioning string `xml:"Versioning"` // Bucket的版本控制状态。有效值:Enabled、Suspended
|
||||
TransferAcceleration string `xml:"TransferAcceleration"` // 显示Bucket的传输加速状态。有效值:Enabled、Disabled
|
||||
CrossRegionReplication string `xml:"CrossRegionReplication"` // 显示Bucket的跨区域复制状态。有效值:Enabled、Disabled
|
||||
}
|
||||
|
||||
// CreateOSSBucket 获取OSS对象存储桶
|
||||
func CreateOSSBucket(endPoint, accessKeyID, accessKeySecret, bucketName string) (*Bucket, error) {
|
||||
// 客户端连接
|
||||
client, err := oss.New(endPoint, accessKeyID, accessKeySecret)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 判断存储空间是否
|
||||
isExist, err := client.IsBucketExist(bucketName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 创建一个存储桶
|
||||
if !isExist {
|
||||
// 创建存储空间,并设置存储类型为标准访问oss.StorageStandard、读写权限ACL为公共读oss.ACLPublicRead、数据容灾类型为本地冗余存储oss.RedundancyLRS
|
||||
err = client.CreateBucket(bucketName, oss.StorageClass(oss.StorageStandard), oss.ACL(oss.ACLPublicRead), oss.RedundancyType(oss.RedundancyLRS)) // 名字只能包含小写字母、数字、`-`,桶名称易重复
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// 获取存储空间的信息
|
||||
res, err := client.GetBucketInfo(bucketName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// fmt.Println("BucketInfo.Location: ", res.BucketInfo.Location)
|
||||
// fmt.Println("BucketInfo.CreationDate: ", res.BucketInfo.CreationDate)
|
||||
// fmt.Println("BucketInfo.ACL: ", res.BucketInfo.ACL)
|
||||
// fmt.Println("BucketInfo.Owner: ", res.BucketInfo.Owner)
|
||||
// fmt.Println("BucketInfo.StorageClass: ", res.BucketInfo.StorageClass)
|
||||
// fmt.Println("BucketInfo.RedundancyType: ", res.BucketInfo.RedundancyType)
|
||||
// fmt.Println("BucketInfo.ExtranetEndpoint: ", res.BucketInfo.ExtranetEndpoint)
|
||||
// fmt.Println("BucketInfo.IntranetEndpoint: ", res.BucketInfo.IntranetEndpoint)
|
||||
|
||||
_bucket := &Bucket{
|
||||
Info: &BucketInfo{
|
||||
Name: res.BucketInfo.Name,
|
||||
Location: res.BucketInfo.Location,
|
||||
CreationDate: res.BucketInfo.CreationDate,
|
||||
ExtranetEndpoint: res.BucketInfo.ExtranetEndpoint,
|
||||
IntranetEndpoint: res.BucketInfo.IntranetEndpoint,
|
||||
ACL: res.BucketInfo.ACL,
|
||||
RedundancyType: res.BucketInfo.RedundancyType,
|
||||
StorageClass: res.BucketInfo.StorageClass,
|
||||
Versioning: res.BucketInfo.Versioning,
|
||||
TransferAcceleration: res.BucketInfo.TransferAcceleration,
|
||||
CrossRegionReplication: res.BucketInfo.CrossRegionReplication,
|
||||
},
|
||||
}
|
||||
|
||||
// 获取存储空间。
|
||||
_bucket.Bucket, err = client.Bucket(bucketName)
|
||||
if err != nil {
|
||||
return _bucket, err
|
||||
}
|
||||
|
||||
return _bucket, err
|
||||
}
|
||||
|
||||
// GetObjectToFile 下载到本地文件
|
||||
func (b *Bucket) GetObjectToFile(objectKey string, filePath string) error {
|
||||
return b.Bucket.GetObjectToFile(objectKey, filePath)
|
||||
}
|
||||
|
||||
// PutObjectFromFileName 上传本地文件
|
||||
func (b *Bucket) PutObjectFromFileName(from string, to string) error {
|
||||
return b.Bucket.PutObjectFromFile(to, from)
|
||||
}
|
||||
|
||||
// PutObjectFromFile 上传文件流
|
||||
func (b *Bucket) PutObjectFromFile(from string, to string) error {
|
||||
file, err := os.Open(from)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
return b.Bucket.PutObject(to, file)
|
||||
}
|
||||
|
||||
// PutObjectFromReader 上传文件流
|
||||
func (b *Bucket) PutObjectFromBytes(from []byte, to string) error {
|
||||
reader := bytes.NewReader(from)
|
||||
return b.Bucket.PutObject(to, reader)
|
||||
}
|
43
myalioss/common.go
Normal file
43
myalioss/common.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package myalioss
|
||||
|
||||
import (
|
||||
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
||||
)
|
||||
|
||||
// IsObjectExist 判断文件是否存在
|
||||
func (b *Bucket) IsObjectExist(filename string) (bool, error) {
|
||||
return b.Bucket.IsObjectExist(filename)
|
||||
}
|
||||
|
||||
// DeleteObject 删除文件
|
||||
func (b *Bucket) DeleteObject(filenames []string) ([]string, error) {
|
||||
res, err := b.Bucket.DeleteObjects(filenames)
|
||||
return res.DeletedObjects, err
|
||||
}
|
||||
|
||||
// // ListObjects 列举文件
|
||||
// func (b *Bucket) ListObjects(filenames []string) ([]string, error) {
|
||||
// lsRes, err := b.Bucket.ListObjects(oss.Marker(marker))
|
||||
// return res.DeletedObjects, err
|
||||
// }
|
||||
|
||||
// SetObjectACL 设置文件的访问权限
|
||||
func (b *Bucket) SetObjectACL(_type oss.ACLType) error {
|
||||
return b.Bucket.SetObjectACL(b.Info.Name, _type)
|
||||
}
|
||||
|
||||
// GetObjectACL 获取文件的访问权限
|
||||
func (b *Bucket) GetObjectACL() (string, error) {
|
||||
aclRes, err := b.Bucket.GetObjectACL(b.Info.Name)
|
||||
return aclRes.ACL, err
|
||||
}
|
||||
|
||||
// GetObjectMeta 获取文件元信息
|
||||
func (b *Bucket) GetObjectMeta(objectName string) (map[string][]string, error) {
|
||||
props, err := b.Bucket.GetObjectMeta(objectName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return props, nil
|
||||
}
|
@@ -23,6 +23,7 @@ type CacheIFS interface {
|
||||
Close() (err error) // 关闭连接
|
||||
TryLock(key interface{}, value interface{}, lifeSpan time.Duration) (err error) // 试着加锁
|
||||
Unlock(key interface{}) (err error) // 解锁
|
||||
GetKeyS(key interface{}) ([]string, error) // 查询所有key
|
||||
}
|
||||
|
||||
// MyCache 内存缓存
|
||||
@@ -75,6 +76,11 @@ func (mc *MyCache) GetCache2go() *cache2go.CacheTable {
|
||||
return mc.cache
|
||||
}
|
||||
|
||||
// GetKeyS 查询所有key
|
||||
func (mc *MyCache) GetKeyS(key interface{}) ([]string, error) {
|
||||
return []string{}, nil
|
||||
}
|
||||
|
||||
// Clear 清空表內容
|
||||
func (mc *MyCache) Clear() error {
|
||||
mc.cache.Flush()
|
||||
|
@@ -98,7 +98,7 @@ func NewRedis(con *MyRedis) (dial RedisDial, err error) {
|
||||
len := len(con.conf.addrs)
|
||||
con.conf.addrIdex = (index + 1) % len
|
||||
|
||||
return redis.Dial("tcp", con.conf.addrs[index], redis.DialClientName(con.conf.clientName),
|
||||
return redis.Dial("tcp", con.conf.addrs[index], // redis.DialClientName(con.conf.clientName),
|
||||
redis.DialConnectTimeout(con.conf.timeout), redis.DialDatabase(con.conf.db),
|
||||
redis.DialPassword(con.conf.pwd), redis.DialReadTimeout(con.conf.readTimeout), redis.DialWriteTimeout(con.conf.writeTimeout),
|
||||
)
|
||||
|
@@ -147,7 +147,7 @@ func (mc *base) build() (con redis.Conn, err error) {
|
||||
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),
|
||||
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),
|
||||
)
|
||||
|
346
mysqldb/tabtools.go
Normal file
346
mysqldb/tabtools.go
Normal file
@@ -0,0 +1,346 @@
|
||||
package mysqldb
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"time"
|
||||
|
||||
"github.com/xxjwxc/public/mylog"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// TabColumnInfo 表信息
|
||||
type TabColumnInfo struct {
|
||||
ColumnName string
|
||||
ColumnType string // 跟数据库一致
|
||||
Len string
|
||||
NotNull bool
|
||||
Comment string // 注释
|
||||
}
|
||||
|
||||
type TablesModel struct {
|
||||
ID int `gorm:"primaryKey;column:id" json:"-"` // 主键id
|
||||
}
|
||||
|
||||
type TablesTools struct {
|
||||
tabName string
|
||||
orm *MySqlDB
|
||||
}
|
||||
|
||||
// Tables
|
||||
func NewTabTools(orm *MySqlDB, tabName string) (*TablesTools, error) {
|
||||
return &TablesTools{
|
||||
orm: orm,
|
||||
tabName: tabName,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// GetDB 获取db
|
||||
func (t *TablesTools) GetDB() *gorm.DB {
|
||||
return t.orm.Table(t.tabName)
|
||||
}
|
||||
|
||||
// CreateTable 创建表
|
||||
func (t *TablesTools) CreateTable(columns []*TabColumnInfo) error {
|
||||
err := t.orm.Table(t.tabName).Set("gorm:table_options", "ENGINE=InnoDB").Migrator().CreateTable(&TablesModel{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, v := range columns {
|
||||
err := t.AddColumn(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// notnul := ""
|
||||
// if v.NotNull {
|
||||
// notnul = "NOT NULL"
|
||||
// }
|
||||
// _len := v.Len
|
||||
// if len(v.Len) > 0 {
|
||||
// _len = fmt.Sprintf("(%v)", v.Len)
|
||||
// }
|
||||
|
||||
// sql := fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v%v %v COMMENT '%v';", t.tabName, v.ColumnName, v.ColumnType, _len, notnul, v.Comment)
|
||||
// err = t.orm.Exec(sql).Error
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// HasTable 表是否存在
|
||||
func (t *TablesTools) HasTable() bool {
|
||||
return t.orm.Migrator().HasTable(t.tabName)
|
||||
}
|
||||
|
||||
// DropTable 如果存在表则删除(删除时会忽略、删除外键约束)
|
||||
func (t *TablesTools) DropTable() error {
|
||||
return t.orm.Migrator().DropTable(t.tabName)
|
||||
}
|
||||
|
||||
// TruncateTable 截断表
|
||||
func (t *TablesTools) TruncateTable() error {
|
||||
return t.orm.Exec(fmt.Sprintf("TRUNCATE TABLE %v;", t.tabName)).Error
|
||||
}
|
||||
|
||||
// GetTables 获取所有表名
|
||||
func (t *TablesTools) GetTables() (tableList []string, err error) {
|
||||
return t.orm.Migrator().GetTables()
|
||||
}
|
||||
|
||||
// RenameTable 重命名表
|
||||
func (t *TablesTools) RenameTable(newTabName string) error {
|
||||
return t.orm.Migrator().RenameTable(t.tabName, newTabName)
|
||||
}
|
||||
|
||||
// AddColumn 添加列元素
|
||||
func (t *TablesTools) AddColumn(column *TabColumnInfo) error {
|
||||
notnul := ""
|
||||
if column.NotNull {
|
||||
notnul = "NOT NULL"
|
||||
}
|
||||
_len := column.Len
|
||||
if len(column.Len) > 0 {
|
||||
_len = fmt.Sprintf("(%v)", column.Len)
|
||||
}
|
||||
|
||||
sql := fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v%v %v COMMENT '%v';", t.tabName, column.ColumnName, column.ColumnType, _len, notnul, column.Comment)
|
||||
err := t.orm.Exec(sql).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// HasColumn 是否有列
|
||||
func (t *TablesTools) HasColumn(column string) bool {
|
||||
return t.orm.Table(t.tabName).Migrator().HasColumn(&TablesModel{}, column)
|
||||
}
|
||||
|
||||
// DropColumn 删除列
|
||||
func (t *TablesTools) DropColumn(column string) error {
|
||||
return t.orm.Table(t.tabName).Migrator().DropColumn(&TablesModel{}, column)
|
||||
}
|
||||
|
||||
// RenameColumn 字段重命名
|
||||
func (t *TablesTools) RenameColumn(oldColumn, newColumn string) error {
|
||||
return t.orm.Table(t.tabName).Migrator().RenameColumn(&TablesModel{}, oldColumn, newColumn)
|
||||
}
|
||||
|
||||
// ColumnTypes 获取列属性
|
||||
func (t *TablesTools) ColumnTypes() ([]gorm.ColumnType, error) {
|
||||
return t.orm.Table(t.tabName).Migrator().ColumnTypes(&TablesModel{})
|
||||
}
|
||||
|
||||
// CreateIndex Indexes
|
||||
func (t *TablesTools) CreateIndex(column string) error {
|
||||
return t.orm.Table(t.tabName).Migrator().CreateIndex(&TablesModel{}, column)
|
||||
}
|
||||
|
||||
// DropIndex Indexes
|
||||
func (t *TablesTools) DropIndex(column string) error {
|
||||
return t.orm.Table(t.tabName).Migrator().DropIndex(&TablesModel{}, column)
|
||||
}
|
||||
|
||||
// HasIndex Indexes
|
||||
func (t *TablesTools) HasIndex(column string) bool {
|
||||
return t.orm.Table(t.tabName).Migrator().HasIndex(&TablesModel{}, column)
|
||||
}
|
||||
|
||||
// RenameIndex Indexes
|
||||
func (t *TablesTools) RenameIndex(oldColumn, newColumn string) error {
|
||||
return t.orm.Table(t.tabName).Migrator().RenameIndex(&TablesModel{}, oldColumn, newColumn)
|
||||
}
|
||||
|
||||
type ColumnTypeInfo struct {
|
||||
Name string
|
||||
Type string
|
||||
Commont string
|
||||
}
|
||||
|
||||
// RawInfo 列信息
|
||||
type RawInfo struct {
|
||||
ColumnTypes []ColumnTypeInfo
|
||||
Values [][]interface{}
|
||||
}
|
||||
|
||||
// Select 查询
|
||||
func (t *TablesTools) Select(DB *gorm.DB) (*RawInfo, error) {
|
||||
colTypes, err := t.ColumnTypes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
out := &RawInfo{}
|
||||
for i, v := range colTypes {
|
||||
commont, _ := v.Comment()
|
||||
out.ColumnTypes = append(out.ColumnTypes, ColumnTypeInfo{
|
||||
Name: v.Name(),
|
||||
Type: ColumnType(colTypes[i]),
|
||||
Commont: commont,
|
||||
})
|
||||
}
|
||||
|
||||
rows, err := DB.Table(t.tabName).Rows()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
for rows.Next() {
|
||||
var values []interface{} //创建一个与列的数量相当的空接口
|
||||
for _, v := range out.ColumnTypes {
|
||||
deserialize(v.Type, &values)
|
||||
}
|
||||
|
||||
err := rows.Scan(values...) //开始读行,Scan函数只接受指针变量
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out.Values = append(out.Values, values) //将单行所有列的键值对附加在总的返回值上(以行为单位)
|
||||
}
|
||||
|
||||
return out, err
|
||||
}
|
||||
|
||||
func deserialize(tp string, data *[]interface{}) interface{} {
|
||||
switch tp {
|
||||
case "int":
|
||||
var tmp int
|
||||
*data = append(*data, &tmp)
|
||||
case "int64":
|
||||
var tmp int64
|
||||
*data = append(*data, &tmp)
|
||||
case "string":
|
||||
var tmp string
|
||||
*data = append(*data, &tmp)
|
||||
case "[]byte":
|
||||
var tmp []byte
|
||||
*data = append(*data, &tmp)
|
||||
case "time":
|
||||
var tmp time.Time
|
||||
*data = append(*data, &tmp)
|
||||
case "bool":
|
||||
var tmp bool
|
||||
*data = append(*data, &tmp)
|
||||
case "float64":
|
||||
var tmp float64
|
||||
*data = append(*data, &tmp)
|
||||
default:
|
||||
mylog.Errorf("type (%v) not match in any way.maybe need to add on", tp)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// "VARCHAR", "TEXT", "NVARCHAR", "DECIMAL", "BOOL",
|
||||
// "INT", and "BIGINT".
|
||||
func ColumnType(t gorm.ColumnType) string {
|
||||
tp, _ := t.ColumnType()
|
||||
// Precise matching first.先精确匹配
|
||||
if v, ok := TypeMysqlDicMp[tp]; ok {
|
||||
return v
|
||||
}
|
||||
|
||||
// Fuzzy Regular Matching.模糊正则匹配
|
||||
for _, l := range TypeMysqlMatchList {
|
||||
if ok, _ := regexp.MatchString(l.Key, tp); ok {
|
||||
return l.Value
|
||||
}
|
||||
}
|
||||
|
||||
return tp
|
||||
}
|
||||
|
||||
// TypeMysqlDicMp Accurate matching type.精确匹配类型
|
||||
var TypeMysqlDicMp = map[string]string{
|
||||
"int": "int",
|
||||
"int unsigned": "int",
|
||||
"tinyint": "int",
|
||||
"tinyint unsigned": "int",
|
||||
"mediumint": "int",
|
||||
"mediumint unsigned": "int",
|
||||
|
||||
"smallint": "int64",
|
||||
"smallint unsigned": "int64",
|
||||
"bigint": "int64",
|
||||
"bigint unsigned": "int64",
|
||||
"timestamp": "int64",
|
||||
"integer": "int64",
|
||||
|
||||
"varchar": "string",
|
||||
"char": "string",
|
||||
"json": "string",
|
||||
"text": "string",
|
||||
"mediumtext": "string",
|
||||
"longtext": "string",
|
||||
"tinytext": "string",
|
||||
"enum": "string",
|
||||
"nvarchar": "string",
|
||||
|
||||
"bit(1)": "[]byte",
|
||||
"tinyblob": "[]byte",
|
||||
"blob": "[]byte",
|
||||
"mediumblob": "[]byte",
|
||||
"longblob": "[]byte",
|
||||
"binary": "[]byte",
|
||||
|
||||
"date": "time",
|
||||
"datetime": "time",
|
||||
"time": "time",
|
||||
"smalldatetime": "time", //sqlserver
|
||||
|
||||
"tinyint(1)": "bool", // tinyint(1) 默认设置成bool
|
||||
"tinyint(1) unsigned": "bool", // tinyint(1) 默认设置成bool
|
||||
|
||||
"double": "float64",
|
||||
"double unsigned": "float64",
|
||||
"float": "float64",
|
||||
"float unsigned": "float64",
|
||||
"real": "float64",
|
||||
"numeric": "float64",
|
||||
}
|
||||
|
||||
// TypeMysqlMatchList Fuzzy Matching Types.模糊匹配类型
|
||||
var TypeMysqlMatchList = []struct {
|
||||
Key string
|
||||
Value string
|
||||
}{
|
||||
{`^(tinyint)[(]\d+[)] unsigned`, "int"},
|
||||
{`^(smallint)[(]\d+[)] unsigned`, "int"},
|
||||
{`^(int)[(]\d+[)] unsigned`, "int"},
|
||||
{`^(tinyint)[(]\d+[)]`, "int"},
|
||||
{`^(smallint)[(]\d+[)]`, "int"},
|
||||
{`^(int)[(]\d+[)]`, "int"},
|
||||
{`^(mediumint)[(]\d+[)]`, "int"},
|
||||
{`^(mediumint)[(]\d+[)] unsigned`, "int"},
|
||||
{`^(integer)[(]\d+[)]`, "int"},
|
||||
|
||||
{`^(bigint)[(]\d+[)] unsigned`, "int64"},
|
||||
{`^(bigint)[(]\d+[)]`, "int64"},
|
||||
{`^(timestamp)[(]\d+[)]`, "int64"},
|
||||
|
||||
{`^(float)[(]\d+,\d+[)] unsigned`, "float64"},
|
||||
{`^(double)[(]\d+,\d+[)] unsigned`, "float64"},
|
||||
{`^(decimal)[(]\d+,\d+[)]`, "float64"},
|
||||
{`^(double)[(]\d+,\d+[)]`, "float64"},
|
||||
{`^(float)[(]\d+,\d+[)]`, "float64"},
|
||||
|
||||
{`^(char)[(]\d+[)]`, "string"},
|
||||
{`^(enum)[(](.)+[)]`, "string"},
|
||||
{`^(varchar)[(]\d+[)]`, "string"},
|
||||
{`^(text)[(]\d+[)]`, "string"},
|
||||
{`^(set)[(][\s\S]+[)]`, "string"},
|
||||
|
||||
{`^(varbinary)[(]\d+[)]`, "[]byte"},
|
||||
{`^(blob)[(]\d+[)]`, "[]byte"},
|
||||
{`^(binary)[(]\d+[)]`, "[]byte"},
|
||||
{`^(bit)[(]\d+[)]`, "[]byte"},
|
||||
{`^(geometry)[(]\d+[)]`, "[]byte"},
|
||||
|
||||
{`^(datetime)[(]\d+[)]`, "time"},
|
||||
}
|
@@ -44,7 +44,7 @@ const (
|
||||
func (_wx *wxTools) GetAccessToken() (accessToken string, err error) {
|
||||
//先从缓存中获取 access_token
|
||||
cache := mycache.NewCache(_cacheToken)
|
||||
err = cache.Value(_cacheToken, &accessToken)
|
||||
err = cache.Value(_wx.client.AppId, &accessToken)
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
@@ -71,7 +71,7 @@ func (_wx *wxTools) GetAccessToken() (accessToken string, err error) {
|
||||
return
|
||||
}
|
||||
//保存缓存
|
||||
cache.Add(_cacheToken, &accessToken, time.Duration(7000)*time.Second)
|
||||
cache.Add(_wx.client.AppId, &accessToken, time.Duration(7000)*time.Second)
|
||||
//------------------end
|
||||
}
|
||||
//----------------------end
|
||||
@@ -83,14 +83,14 @@ func (_wx *wxTools) GetAccessToken() (accessToken string, err error) {
|
||||
func (_wx *wxTools) clearAccessTokenCache() error {
|
||||
//先从缓存中获取 access_token
|
||||
cache := mycache.NewCache(_cacheToken)
|
||||
return cache.Delete(_cacheToken)
|
||||
return cache.Delete(_wx.client.AppId)
|
||||
}
|
||||
|
||||
// GetAPITicket 获取微信卡券ticket
|
||||
func (_wx *wxTools) GetAPITicket() (ticket string, err error) {
|
||||
//先从缓存中获取
|
||||
cache := mycache.NewCache(_cacheTicket)
|
||||
err = cache.Value(_cacheTicket, &ticket)
|
||||
err = cache.Value(_wx.client.AppId, &ticket)
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
@@ -120,7 +120,7 @@ func (_wx *wxTools) GetAPITicket() (ticket string, err error) {
|
||||
json.Unmarshal(body, &result)
|
||||
ticket = result.Ticket
|
||||
//保存缓存
|
||||
cache.Add(_cacheTicket, ticket, 7000*time.Second)
|
||||
cache.Add(_wx.client.AppId, ticket, 7000*time.Second)
|
||||
|
||||
return
|
||||
}
|
||||
|
@@ -39,12 +39,12 @@ type WxTools interface {
|
||||
GetBlacklist(openid string) ([]string, string, error) // 获取黑名单列表
|
||||
Getuserphonenumber(code string) (string, error) // 手机号获取凭证
|
||||
// --------------------h5------------------------------
|
||||
GetWebOauth(code string) (*AccessToken, error) // 授权
|
||||
GetWebUserinfo(openid string) (*WxUserinfo, error) // 获取用户信息
|
||||
SendWebTemplateMsg(msg TempWebMsg) error // 发送公众号模板消息
|
||||
CreateMenu(menu WxMenu) error // 创建自定义菜单
|
||||
DeleteMenu() error // 删除自定义菜单
|
||||
SetGuideConfig(guideConfig GuideConfig) error // 快捷回复与关注自动回复
|
||||
GetWebOauth(code string) (*AccessToken, error) // 授权
|
||||
GetWebUserinfo(openid, snaccessToken string) (*WxUserinfo, error) // 获取用户信息
|
||||
SendWebTemplateMsg(msg TempWebMsg) error // 发送公众号模板消息
|
||||
CreateMenu(menu WxMenu) error // 创建自定义菜单
|
||||
DeleteMenu() error // 删除自定义菜单
|
||||
SetGuideConfig(guideConfig GuideConfig) error // 快捷回复与关注自动回复
|
||||
|
||||
SendCustomMsg(msg CustomMsg) error // 发送客服消息
|
||||
UploadTmpFile(path, tp string) (string, error) //上传临时文件(tp:媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb))
|
||||
|
@@ -52,13 +52,8 @@ func (_wx *wxTools) GetWebOauth(code string) (*AccessToken, error) {
|
||||
}
|
||||
|
||||
// GetWebUserinfo 获取用户信息
|
||||
func (_wx *wxTools) GetWebUserinfo(openid string) (*WxUserinfo, error) {
|
||||
accessToken, e := _wx.GetAccessToken()
|
||||
if e != nil {
|
||||
return nil, e
|
||||
}
|
||||
|
||||
var url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN"
|
||||
func (_wx *wxTools) GetWebUserinfo(openid, snaccessToken string) (*WxUserinfo, error) {
|
||||
var url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + snaccessToken + "&openid=" + openid + "&lang=zh_CN"
|
||||
|
||||
resp, e := http.Get(url)
|
||||
if e != nil {
|
||||
@@ -83,7 +78,6 @@ func (_wx *wxTools) Getuserphonenumber(code string) (string, error) { // 手机
|
||||
return "", e
|
||||
}
|
||||
|
||||
// ...
|
||||
var url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken
|
||||
|
||||
params := map[string]interface{}{
|
||||
|
Reference in New Issue
Block a user