Merge branch 'master' into master

This commit is contained in:
lcsin
2023-10-23 21:31:04 +08:00
committed by GitHub
11 changed files with 568 additions and 48 deletions

24
go.mod
View File

@@ -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
View File

@@ -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
View 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
View 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
}

View File

@@ -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()

View File

@@ -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),
)

View File

@@ -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
View 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"},
}

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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{}{