From f49bb56b1240d2dd9ef3607a0d6f16792100d8d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=B8=85?= <133814250@qq.com> Date: Sun, 8 Oct 2023 16:04:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83v2.9.3=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0=E5=86=85=E5=AE=B9=E8=AF=B7=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=EF=BC=9Ahttps://github.com/bufanyun/hotgo/blob/v2.0/d?= =?UTF-8?q?ocs/guide-zh-CN/start-update-log.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/guide-zh-CN/start-update-log.md | 7 + server/api/admin/curddemo/curddemo.go | 2 +- server/go.mod | 44 +- server/go.sum | 134 +++- server/internal/consts/version.go | 2 +- .../controller/admin/sys/curd_demo.go | 2 +- .../library/hggen/internal/cmd/cmd_build.go | 9 +- .../hggen/internal/cmd/cmd_fix_test.go | 12 +- .../hggen/internal/cmd/cmd_gen_dao_test.go | 229 ++++++ .../hggen/internal/cmd/genctrl/genctrl.go | 2 +- .../internal/cmd/genctrl/genctrl_calculate.go | 10 +- .../cmd/genctrl/genctrl_generate_ctrl.go | 9 +- .../cmd/genctrl/genctrl_generate_interface.go | 6 + .../cmd/genctrl/genctrl_generate_sdk.go | 6 +- .../hggen/internal/cmd/gendao/gendao.go | 56 +- .../internal/cmd/gendao/gendao_structure.go | 52 +- .../internal/cmd/genpbentity/genpbentity.go | 25 +- .../internal/cmd/genservice/genservice.go | 2 +- .../cmd/genservice/genservice_generate.go | 2 +- .../fix25_content.go} | 2 +- .../generated_user/dao/internal/table_user.go | 85 +++ .../gendao/generated_user/dao/table_user.go | 27 + .../generated_user/model/do/table_user.go | 22 + .../generated_user/model/entity/table_user.go | 20 + .../dao/internal/table_user.go | 85 +++ .../dao/table_user.go | 27 + .../model/do/table_user.go | 22 + .../model/entity/table_user.go | 21 + .../internal/cmd/testdata/gendao/go.mod.txt | 32 + .../internal/cmd/testdata/gendao/user.tpl.sql | 10 + .../consts/consts_gen_ctrl_template.go | 4 + .../consts/consts_gen_ctrl_template_sdk.go | 5 +- .../hggen/internal/packed/template-mono.go | 2 +- .../hggen/internal/packed/template-single.go | 2 +- server/internal/library/hggen/views/column.go | 55 +- .../hggen/views/curd_generate_web_model.go | 2 +- server/internal/library/storager/upload.go | 3 +- server/internal/logic/admin/site.go | 22 + server/internal/logic/sys/curd_demo.go | 2 +- server/internal/logic/sys/log.go | 2 +- .../internal/model/input/sysin/curd_demo.go | 2 +- server/internal/router/genrouter/curd_demo.go | 2 +- server/internal/service/sys.go | 712 +++++++++--------- server/manifest/config/config.example.yaml | 6 +- web/package.json | 2 +- web/src/views/curdDemo/edit.vue | 2 +- web/src/views/curdDemo/index.vue | 10 +- web/src/views/curdDemo/model.ts | 6 +- web/src/views/org/user/addBalance.vue | 4 +- web/src/views/org/user/addIntegral.vue | 4 +- 50 files changed, 1280 insertions(+), 533 deletions(-) create mode 100644 server/internal/library/hggen/internal/cmd/cmd_gen_dao_test.go rename server/internal/library/hggen/internal/cmd/testdata/{fix25_content.go.txt => fix/fix25_content.go} (99%) create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/dao/internal/table_user.go create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/dao/table_user.go create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/model/do/table_user.go create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/model/entity/table_user.go create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/dao/internal/table_user.go create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/dao/table_user.go create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/model/do/table_user.go create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/model/entity/table_user.go create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/go.mod.txt create mode 100644 server/internal/library/hggen/internal/cmd/testdata/gendao/user.tpl.sql diff --git a/docs/guide-zh-CN/start-update-log.md b/docs/guide-zh-CN/start-update-log.md index 13c5398..0ac2f98 100644 --- a/docs/guide-zh-CN/start-update-log.md +++ b/docs/guide-zh-CN/start-update-log.md @@ -11,6 +11,13 @@ > 如果升级(覆盖)代码后打开会出现 sql 报错, 请检查更新的数据库格式或自行调整 +### v2.9.3 +updated 2023.10.08 + +- 优化:gf版本升级到v2.5.4 +- 优化:优化上传文件资源复用策略 +- 修复:修复登录角色的部门状态检查 +- 修复:修复配置参数`exceptLogin`命名 ### v2.8.9 updated 2023.09.06 diff --git a/server/api/admin/curddemo/curddemo.go b/server/api/admin/curddemo/curddemo.go index 40e1e21..deb0101 100644 --- a/server/api/admin/curddemo/curddemo.go +++ b/server/api/admin/curddemo/curddemo.go @@ -3,7 +3,7 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.7.6 +// @AutoGenerate Version 2.8.9 package curddemo import ( diff --git a/server/go.mod b/server/go.mod index b1fc188..be28bb5 100644 --- a/server/go.mod +++ b/server/go.mod @@ -13,10 +13,15 @@ require ( github.com/casbin/casbin/v2 v2.55.0 github.com/forgoer/openssl v1.4.0 github.com/go-pay/gopay v1.5.91 - github.com/gogf/gf/contrib/drivers/mysql/v2 v2.5.2 - github.com/gogf/gf/contrib/nosql/redis/v2 v2.5.2 - github.com/gogf/gf/contrib/trace/jaeger/v2 v2.5.2 - github.com/gogf/gf/v2 v2.5.2 + github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.5.4 + github.com/gogf/gf/contrib/drivers/mssql/v2 v2.5.4 + github.com/gogf/gf/contrib/drivers/mysql/v2 v2.5.4 + github.com/gogf/gf/contrib/drivers/oracle/v2 v2.5.4 + github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.5.4 + github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.5.4 + github.com/gogf/gf/contrib/nosql/redis/v2 v2.5.4 + github.com/gogf/gf/contrib/trace/jaeger/v2 v2.5.4 + github.com/gogf/gf/v2 v2.5.4 github.com/golang-jwt/jwt/v5 v5.0.0 github.com/gorilla/websocket v1.5.0 github.com/kayon/iploc v0.0.0-20200312105652-bda3e968a794 @@ -31,7 +36,7 @@ require ( github.com/tencentyun/cos-go-sdk-v5 v0.7.41 github.com/ufilesdk-dev/ufile-gosdk v1.0.3 github.com/xuri/excelize/v2 v2.6.0 - go.opentelemetry.io/otel v1.17.0 + go.opentelemetry.io/otel v1.19.0 golang.org/x/mod v0.9.0 golang.org/x/tools v0.7.0 gopkg.in/yaml.v3 v3.0.1 @@ -40,6 +45,7 @@ require ( require ( aead.dev/minisign v0.2.0 // indirect github.com/BurntSushi/toml v1.3.2 // indirect + github.com/ClickHouse/clickhouse-go/v2 v2.0.15 // indirect github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 // indirect @@ -53,7 +59,9 @@ require ( github.com/clbanning/mxj v1.8.4 // indirect github.com/clbanning/mxj/v2 v2.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/denisenkom/go-mssqldb v0.12.3 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/eapache/go-resiliency v1.2.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect github.com/eapache/queue v1.1.0 // indirect @@ -61,11 +69,14 @@ require ( github.com/fatih/color v1.15.0 // indirect github.com/fatih/structs v1.1.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect + github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/snappy v0.0.4 // indirect @@ -83,6 +94,7 @@ require ( github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.15.6 // indirect + github.com/lib/pq v1.10.9 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -93,15 +105,19 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/mozillazg/go-httpheader v0.2.1 // indirect + github.com/paulmach/orb v0.7.1 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/redis/go-redis/v9 v9.1.0 // indirect + github.com/redis/go-redis/v9 v9.2.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/richardlehane/mscfb v1.0.4 // indirect github.com/richardlehane/msoleps v1.0.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/shoenig/go-m1cpu v0.1.4 // indirect + github.com/shopspring/decimal v1.3.1 // indirect + github.com/sijms/go-ora/v2 v2.7.10 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/cast v1.4.1 // indirect github.com/tidwall/gjson v1.14.1 // indirect @@ -114,17 +130,21 @@ require ( github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect - go.opentelemetry.io/otel/metric v1.17.0 // indirect - go.opentelemetry.io/otel/sdk v1.17.0 // indirect - go.opentelemetry.io/otel/trace v1.17.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/sdk v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect go.uber.org/atomic v1.7.0 // indirect - golang.org/x/crypto v0.13.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/image v0.1.0 // indirect - golang.org/x/net v0.15.0 // indirect + golang.org/x/net v0.16.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect gopkg.in/ini.v1 v1.56.0 // indirect + modernc.org/libc v1.22.5 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.5.0 // indirect + modernc.org/sqlite v1.23.1 // indirect stathat.com/c/consistent v1.0.0 // indirect ) diff --git a/server/go.sum b/server/go.sum index ea0b53d..d34b0e6 100644 --- a/server/go.sum +++ b/server/go.sum @@ -33,10 +33,16 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= +github.com/ClickHouse/clickhouse-go/v2 v2.0.15 h1:lLAZliqrZEygkxosLaW1qHyeTb4Ho7fVCZ0WKCpLocU= +github.com/ClickHouse/clickhouse-go/v2 v2.0.15/go.mod h1:Z21o82zD8FFqefOQDg93c0XITlxGbTsWQuRm588Azkk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= @@ -44,6 +50,7 @@ github.com/Shopify/sarama v1.34.1 h1:pVCQO7BMAK3s1jWhgi5v1W6lwZ6Veiekfc2vsgRS06Y github.com/Shopify/sarama v1.34.1/go.mod h1:NZSNswsnStpq8TUdFaqnpXm2Do6KRzTIjdBdVlL1YRM= github.com/Shopify/toxiproxy/v2 v2.4.0 h1:O1e4Jfvr/hefNTNu+8VtdEG5lSeamJRo4aKhMOKNM64= github.com/Shopify/toxiproxy/v2 v2.4.0/go.mod h1:3ilnjng821bkozDRxNoo64oI/DKqM+rOyJzb564+bvg= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -85,10 +92,11 @@ github.com/apache/rocketmq-client-go/v2 v2.1.0/go.mod h1:oEZKFDvS7sz/RWU0839+dQB github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d h1:pVrfxiGfwelyab6n21ZBkbkmbevaf+WvMIiR7sr97hw= github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= -github.com/bsm/ginkgo/v2 v2.9.5 h1:rtVBYPs3+TC5iLUVOis1B9tjLTup7Cj5IfzosKtvTJ0= -github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/casbin/casbin/v2 v2.55.0 h1:RyU+OacnVzjxof1U3bmxHM7oCRdx9+gNnkclrvof/zI= github.com/casbin/casbin/v2 v2.55.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -105,14 +113,20 @@ github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw= +github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo= 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/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= @@ -137,6 +151,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= +github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -147,10 +163,12 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-pay/gopay v1.5.91 h1:CYQ+eugaoCyQFOtMhXlcOBeTk+CpNfGFxh1UaBuj4YI= @@ -163,21 +181,37 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl github.com/go-playground/validator/v10 v10.8.0/go.mod h1:9JhgTzTaE31GZDpH/HSvHiRJrJ3iKAgqqH0Bl/Ocjdk= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/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/gogf/gf/contrib/drivers/mysql/v2 v2.5.2 h1:tFQP3/4Ivsx9ZkXXbHPIGn+TCiEW+0pQ2elwsafACNM= -github.com/gogf/gf/contrib/drivers/mysql/v2 v2.5.2/go.mod h1:k9TrNZlYVBPNPYeqJ2uac0aqcJh75CHk7mWNYpRmrk4= -github.com/gogf/gf/contrib/nosql/redis/v2 v2.5.2 h1:JzRIXB5J6vvnJGJmh7RfT8ntjXsn2jYXJf1+Q6oFe+A= -github.com/gogf/gf/contrib/nosql/redis/v2 v2.5.2/go.mod h1:vLNtPgfInF5cXlcjLhVZxijIXD30+IiVjN6hP9sjjhY= -github.com/gogf/gf/contrib/trace/jaeger/v2 v2.5.2 h1:Aqgr/wlZT1iO1+eCoUQiNEqJM2VllHLXGPH3x0fuqlE= -github.com/gogf/gf/contrib/trace/jaeger/v2 v2.5.2/go.mod h1:+WE25pafL/4PNz5T3iwkMqvyk8l2nDWfRYVfq3aXnIk= -github.com/gogf/gf/v2 v2.5.2 h1:fACJE7DJH6iTGHGhgiNY1uuZIZtr2IqQkJ52E+wBnt8= -github.com/gogf/gf/v2 v2.5.2/go.mod h1:7yf5qp0BznfsYx7Sw49m3mQvBsHpwAjJk3Q9ZnKoUEc= +github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.5.4 h1:qfsZ9BGEQ0zcjZoXrDS6hXqIYmfsl75xXODKUfSi3Tc= +github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.5.4/go.mod h1:qpUmfJiCyK+IWi82P9ZtvBArS9zgP7e2koCbeYDZDd4= +github.com/gogf/gf/contrib/drivers/mssql/v2 v2.5.4 h1:hAwujIn56v3GQ09Z8F+SVP1eNuoG6P9Nd8Ty5sbTaU0= +github.com/gogf/gf/contrib/drivers/mssql/v2 v2.5.4/go.mod h1:gW7V/BynC1+46bMOEv/7EJv7NRnkIZDw0vvLD0MHz3o= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.5.4 h1:xAmYQZEDBDoce/q5s7UTibYHHW0DSTApfmXVC/i0/zI= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.5.4/go.mod h1:lEgzJw5PLBOEJ4gZHgs1GwsbjyBLBttN2sN63rYRNhk= +github.com/gogf/gf/contrib/drivers/oracle/v2 v2.5.4 h1:ZtMuMNETqGcFapCK34olW03xWyYicfZPwNIlXoqbRUg= +github.com/gogf/gf/contrib/drivers/oracle/v2 v2.5.4/go.mod h1:HIOlTEJBrvi7vxHrvkEWuRAMMn1uUl55YPirVRSG5AY= +github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.5.4 h1:9NSznPu4xmkgoWmT6XUJjzu5RxQC6+2D4j7pXMzrbkw= +github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.5.4/go.mod h1:wE/R5d40VQGebYlbgueVC1NicGZ0FyBP35BmflP1HMo= +github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.5.4 h1:1qWazCCe2UU5zYVncv/u18gFUn2jtyqVZhW0tDON2oc= +github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.5.4/go.mod h1:N+RC0Km7nkLk3bjxtgSsbazBZxhUgbQVvZwRiV+d05c= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.5.4 h1:t4Ls/E022VMk5hc3a4IgWO3xGNEQRXicCTOrFymZdDg= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.5.4/go.mod h1:1P7id3OWFb3lkp1zBKdGqRoVXgYAjATzky++tGh2vxc= +github.com/gogf/gf/contrib/trace/jaeger/v2 v2.5.4 h1:eGZdC5MZGaIk/jhwepjJRipc+ttXtT1XduA1ZddnntI= +github.com/gogf/gf/contrib/trace/jaeger/v2 v2.5.4/go.mod h1:0W6ogffjjvGIv0NPvslA56A0jY0sH9dPIYDDQ9TWlBU= +github.com/gogf/gf/v2 v2.5.4 h1:UBCSw8mInkHmEqL0E1LYc6QhSpaNFY/wHcFrTI/rzTk= +github.com/gogf/gf/v2 v2.5.4/go.mod h1:7yf5qp0BznfsYx7Sw49m3mQvBsHpwAjJk3Q9ZnKoUEc= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +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= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -225,6 +259,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -240,6 +275,7 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -249,9 +285,11 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0= @@ -281,6 +319,7 @@ github.com/jcmturner/gokrb5/v8 v8.4.2 h1:6ZIM6b/JJN0X8UM43ZOM6Z4SJzla+a/u7scXFJz github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -296,6 +335,7 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kayon/iploc v0.0.0-20200312105652-bda3e968a794 h1:dWJxw+KQOMeVcoyxqG9I5fppPld1hh1FG8ngv0fKNsQ= github.com/kayon/iploc v0.0.0-20200312105652-bda3e968a794/go.mod h1:IwrOeG3O3K9vVXmcVvc9T0XLabw67QePi5pKQt5U+Kw= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.15.6 h1:6D9PcO8QWu0JyaQ2zUMmu16T1T+zjjEpP91guRsvDfY= github.com/klauspost/compress v1.15.6/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= @@ -311,6 +351,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/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -323,11 +366,13 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/minio/selfupdate v0.6.0 h1:i76PgT0K5xO9+hjzKcacQtO7+MjJ4JKA8Ak8XQ9DDwU= github.com/minio/selfupdate v0.6.0/go.mod h1:bO02GTIPCMQFTEvE5h4DjYB58bCoZ35XLeBf0buTDdM= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615/go.mod h1:Ad7oeElCZqA1Ufj0U9/liOF4BtVepxRcTvr2ey7zTvM= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -335,6 +380,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/mojocn/base64Captcha v1.3.5 h1:Qeilr7Ta6eDtG4S+tQuZ5+hO+QHbiGAJdi4PfoagaA0= @@ -361,8 +407,13 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/paulmach/orb v0.7.1 h1:Zha++Z5OX/l168sqHK3k4z18LDvr+YAO/VjK0ReQ9rU= +github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= +github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.14 h1:+fL8AQEZtz/ijeNnpduH0bROTu0O3NZAlPjQxGn8LwE= github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -396,8 +447,11 @@ github.com/qiniu/go-sdk/v7 v7.14.0/go.mod h1:btsaOc8CA3hdVloULfFdDgDc+g4f3TDZEFs github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY= -github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= +github.com/redis/go-redis/v9 v9.2.1 h1:WlYJg71ODF0dVspZZCpYmoF1+U1Jjk9Rwd7pq6QmlCg= +github.com/redis/go-redis/v9 v9.2.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= github.com/richardlehane/msoleps v1.0.1 h1:RfrALnSNXzmXLbGct/P2b4xkFz4e8Gmj/0Vj9M9xC1o= @@ -410,13 +464,20 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE= github.com/shirou/gopsutil/v3 v3.23.3/go.mod h1:lSBNN6t3+D6W5e5nXTxc8KIMMVxAcS+6IJlffjRRlMU= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shoenig/go-m1cpu v0.1.4 h1:SZPIgRM2sEF9NJy50mRHu9PKGwxyyTTJIWvCtgVbozs= github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ= github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c= github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sijms/go-ora/v2 v2.7.10 h1:GSLdj0PYYgSndhsnm7b6p32OqgnwnUZSkFb3j+htfhI= +github.com/sijms/go-ora/v2 v2.7.10/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= github.com/silenceper/wechat/v2 v2.1.4 h1:X+G9C/EiBET5AK0zhrflX3ESCP/yxhJUvoRoSXHm0js= github.com/silenceper/wechat/v2 v2.1.4/go.mod h1:F0PKqImb15THnwoqRNrZO1z3vpwyWuiHr5zzfnjdECY= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -447,6 +508,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= @@ -469,8 +531,10 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/ufilesdk-dev/ufile-gosdk v1.0.3 h1:M85lCFBmCHcFfXldFOb+Lkdw10fLZXvqVUnyZ852Nhk= @@ -499,16 +563,18 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= -go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= +go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= -go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= -go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= -go.opentelemetry.io/otel/sdk v1.17.0 h1:FLN2X66Ke/k5Sg3V623Q7h7nt3cHXaW1FOvKKrW0IpE= -go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= -go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= -go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -520,6 +586,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -528,8 +595,8 @@ golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= 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= @@ -603,12 +670,13 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 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= @@ -649,6 +717,7 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220220014-0732a990476f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -682,6 +751,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220429233432-b5fbb4746d32/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -689,8 +760,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -748,10 +819,12 @@ golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= @@ -835,6 +908,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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= 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= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -870,6 +944,14 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= +modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/server/internal/consts/version.go b/server/internal/consts/version.go index f1d0140..fe45bad 100644 --- a/server/internal/consts/version.go +++ b/server/internal/consts/version.go @@ -7,5 +7,5 @@ package consts // VersionApp HotGo版本 const ( - VersionApp = "2.8.9" + VersionApp = "2.9.3" ) diff --git a/server/internal/controller/admin/sys/curd_demo.go b/server/internal/controller/admin/sys/curd_demo.go index 15330ee..bace630 100644 --- a/server/internal/controller/admin/sys/curd_demo.go +++ b/server/internal/controller/admin/sys/curd_demo.go @@ -3,7 +3,7 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.7.6 +// @AutoGenerate Version 2.8.9 package sys import ( diff --git a/server/internal/library/hggen/internal/cmd/cmd_build.go b/server/internal/library/hggen/internal/cmd/cmd_build.go index fb869d5..804f2d4 100644 --- a/server/internal/library/hggen/internal/cmd/cmd_build.go +++ b/server/internal/library/hggen/internal/cmd/cmd_build.go @@ -17,6 +17,7 @@ import ( "github.com/gogf/gf/v2/encoding/gbase64" "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gbuild" "github.com/gogf/gf/v2/os/gcmd" "github.com/gogf/gf/v2/os/genv" "github.com/gogf/gf/v2/os/gfile" @@ -46,7 +47,7 @@ const ( cBuildBrief = `cross-building go project for lots of platforms` cBuildEg = ` gf build main.go -gf build main.go --pack public,template +gf build main.go --ps public,template gf build main.go --cgo gf build main.go -m none gf build main.go -n my-app -a all -s all @@ -311,9 +312,9 @@ func (c cBuild) getBuildInVarStr(ctx context.Context, in cBuildInput) string { if buildInVarMap == nil { buildInVarMap = make(g.Map) } - buildInVarMap[`builtGit`] = c.getGitCommit(ctx) - buildInVarMap[`builtTime`] = gtime.Now().String() - buildInVarMap[`builtVersion`] = in.Version + buildInVarMap[gbuild.BuiltGit] = c.getGitCommit(ctx) + buildInVarMap[gbuild.BuiltTime] = gtime.Now().String() + buildInVarMap[gbuild.BuiltVersion] = in.Version b, err := json.Marshal(buildInVarMap) if err != nil { mlog.Fatal(err) diff --git a/server/internal/library/hggen/internal/cmd/cmd_fix_test.go b/server/internal/library/hggen/internal/cmd/cmd_fix_test.go index 70d8700..ad53e41 100644 --- a/server/internal/library/hggen/internal/cmd/cmd_fix_test.go +++ b/server/internal/library/hggen/internal/cmd/cmd_fix_test.go @@ -1,7 +1,12 @@ +// Copyright GoFrame gf Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + package cmd import ( - "fmt" "testing" "github.com/gogf/gf/v2/test/gtest" @@ -10,11 +15,10 @@ import ( func Test_Fix_doFixV25Content(t *testing.T) { gtest.C(t, func(t *gtest.T) { var ( - content = gtest.DataContent(`fix25_content.go.txt`) + content = gtest.DataContent(`fix`, `fix25_content.go`) f = cFix{} ) - newContent, err := f.doFixV25Content(content) + _, err := f.doFixV25Content(content) t.AssertNil(err) - fmt.Println(newContent) }) } diff --git a/server/internal/library/hggen/internal/cmd/cmd_gen_dao_test.go b/server/internal/library/hggen/internal/cmd/cmd_gen_dao_test.go new file mode 100644 index 0000000..0a1bda7 --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/cmd_gen_dao_test.go @@ -0,0 +1,229 @@ +// Copyright GoFrame gf Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package cmd + +import ( + "context" + "fmt" + "testing" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/guid" + "github.com/gogf/gf/v2/util/gutil" + "hotgo/internal/library/hggen/internal/cmd/gendao" +) + +var ctx = context.Background() + +func dropTableWithDb(db gdb.DB, table string) { + dropTableStmt := fmt.Sprintf("DROP TABLE IF EXISTS `%s`", table) + if _, err := db.Exec(ctx, dropTableStmt); err != nil { + gtest.Error(err) + } +} + +func Test_Gen_Dao_Default(t *testing.T) { + link := "mysql:root:12345678@tcp(127.0.0.1:3306)/test?loc=Local&parseTime=true" + db, err := gdb.New(gdb.ConfigNode{ + Link: link, + }) + gtest.AssertNil(err) + + gtest.C(t, func(t *gtest.T) { + var ( + table = "table_user" + sqlContent = fmt.Sprintf( + gtest.DataContent(`gendao`, `user.tpl.sql`), + table, + ) + ) + dropTableWithDb(db, table) + array := gstr.SplitAndTrim(sqlContent, ";") + for _, v := range array { + if _, err = db.Exec(ctx, v); err != nil { + t.AssertNil(err) + } + } + defer dropTableWithDb(db, table) + + var ( + path = gfile.Temp(guid.S()) + group = "test" + in = gendao.CGenDaoInput{ + Path: path, + Link: link, + Tables: "", + TablesEx: "", + Group: group, + Prefix: "", + RemovePrefix: "", + JsonCase: "SnakeScreaming", + ImportPrefix: "", + DaoPath: "", + DoPath: "", + EntityPath: "", + TplDaoIndexPath: "", + TplDaoInternalPath: "", + TplDaoDoPath: "", + TplDaoEntityPath: "", + StdTime: false, + WithTime: false, + GJsonSupport: false, + OverwriteDao: false, + DescriptionTag: false, + NoJsonTag: false, + NoModelComment: false, + Clear: false, + TypeMapping: nil, + } + ) + err = gutil.FillStructWithDefault(&in) + t.AssertNil(err) + + err = gfile.Mkdir(path) + t.AssertNil(err) + + // for go mod import path auto retrieve. + err = gfile.Copy( + gtest.DataPath("gendao", "go.mod.txt"), + gfile.Join(path, "go.mod"), + ) + t.AssertNil(err) + + _, err = gendao.CGenDao{}.Dao(ctx, in) + t.AssertNil(err) + defer gfile.Remove(path) + + // files + files, err := gfile.ScanDir(path, "*.go", true) + t.AssertNil(err) + t.Assert(files, []string{ + path + "/dao/internal/table_user.go", + path + "/dao/table_user.go", + path + "/model/do/table_user.go", + path + "/model/entity/table_user.go", + }) + // content + testPath := gtest.DataPath("gendao", "generated_user") + expectFiles := []string{ + testPath + "/dao/internal/table_user.go", + testPath + "/dao/table_user.go", + testPath + "/model/do/table_user.go", + testPath + "/model/entity/table_user.go", + } + for i, _ := range files { + t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i])) + } + }) +} + +func Test_Gen_Dao_TypeMapping(t *testing.T) { + link := "mysql:root:12345678@tcp(127.0.0.1:3306)/test?loc=Local&parseTime=true" + db, err := gdb.New(gdb.ConfigNode{ + Link: link, + }) + gtest.AssertNil(err) + + gtest.C(t, func(t *gtest.T) { + var ( + table = "table_user" + sqlContent = fmt.Sprintf( + gtest.DataContent(`gendao`, `user.tpl.sql`), + table, + ) + ) + defer dropTableWithDb(db, table) + array := gstr.SplitAndTrim(sqlContent, ";") + for _, v := range array { + if _, err = db.Exec(ctx, v); err != nil { + t.AssertNil(err) + } + } + defer dropTableWithDb(db, table) + + var ( + path = gfile.Temp(guid.S()) + group = "test" + in = gendao.CGenDaoInput{ + Path: path, + Link: link, + Tables: "", + TablesEx: "", + Group: group, + Prefix: "", + RemovePrefix: "", + JsonCase: "", + ImportPrefix: "", + DaoPath: "", + DoPath: "", + EntityPath: "", + TplDaoIndexPath: "", + TplDaoInternalPath: "", + TplDaoDoPath: "", + TplDaoEntityPath: "", + StdTime: false, + WithTime: false, + GJsonSupport: false, + OverwriteDao: false, + DescriptionTag: false, + NoJsonTag: false, + NoModelComment: false, + Clear: false, + TypeMapping: map[gendao.DBFieldTypeName]gendao.CustomAttributeType{ + "int": { + Type: "int64", + Import: "", + }, + "decimal": { + Type: "decimal.Decimal", + Import: "github.com/shopspring/decimal", + }, + }, + } + ) + err = gutil.FillStructWithDefault(&in) + t.AssertNil(err) + + err = gfile.Mkdir(path) + t.AssertNil(err) + + // for go mod import path auto retrieve. + err = gfile.Copy( + gtest.DataPath("gendao", "go.mod.txt"), + gfile.Join(path, "go.mod"), + ) + t.AssertNil(err) + + _, err = gendao.CGenDao{}.Dao(ctx, in) + t.AssertNil(err) + defer gfile.Remove(path) + + // files + files, err := gfile.ScanDir(path, "*.go", true) + t.AssertNil(err) + t.Assert(files, []string{ + path + "/dao/internal/table_user.go", + path + "/dao/table_user.go", + path + "/model/do/table_user.go", + path + "/model/entity/table_user.go", + }) + // content + testPath := gtest.DataPath("gendao", "generated_user_type_mapping") + expectFiles := []string{ + testPath + "/dao/internal/table_user.go", + testPath + "/dao/table_user.go", + testPath + "/model/do/table_user.go", + testPath + "/model/entity/table_user.go", + } + for i, _ := range files { + t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i])) + } + }) +} diff --git a/server/internal/library/hggen/internal/cmd/genctrl/genctrl.go b/server/internal/library/hggen/internal/cmd/genctrl/genctrl.go index 4336909..f29b1bd 100644 --- a/server/internal/library/hggen/internal/cmd/genctrl/genctrl.go +++ b/server/internal/library/hggen/internal/cmd/genctrl/genctrl.go @@ -37,7 +37,7 @@ gf gen ctrl ) const ( - PatternApiDefinition = `type\s+(\w+)Req\s+struct\s+{` + PatternApiDefinition = `type\s+(\w+)Req\s+struct\s+{([\s\S]+?)}` PatternCtrlDefinition = `func\s+\(.+?\)\s+\w+\(.+?\*(\w+)\.(\w+)Req\)\s+\(.+?\*(\w+)\.(\w+)Res,\s+\w+\s+error\)\s+{` ) diff --git a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_calculate.go b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_calculate.go index 3c73153..66a3468 100644 --- a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_calculate.go +++ b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_calculate.go @@ -43,11 +43,19 @@ func (c CGenCtrl) getApiItemsInSrc(apiModuleFolderPath string) (items []apiItem, return nil, err } for _, match := range matches { + var ( + methodName = match[1] + structBody = match[2] + ) + // ignore struct name that match a request, but has no g.Meta in its body. + if !gstr.Contains(structBody, `g.Meta`) { + continue + } item := apiItem{ Import: gstr.Trim(importPath, `"`), Module: gfile.Basename(apiModuleFolderPath), Version: gfile.Basename(apiVersionFolderPath), - MethodName: match[1], + MethodName: methodName, } items = append(items, item) } diff --git a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_ctrl.go b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_ctrl.go index 9ac546c..cc44326 100644 --- a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_ctrl.go +++ b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_ctrl.go @@ -32,9 +32,12 @@ func (c *controllerGenerator) Generate(dstModuleFolderPath string, apiModuleApiI continue } // retrieve all api items of the same module. - subItems := c.getSubItemsByModuleAndVersion(apiModuleApiItems, item.Module, item.Version) + var ( + subItems = c.getSubItemsByModuleAndVersion(apiModuleApiItems, item.Module, item.Version) + importPath = gstr.Replace(gfile.Dir(item.Import), "\\", "/", -1) + ) if err = c.doGenerateCtrlNewByModuleAndVersion( - dstModuleFolderPath, item.Module, item.Version, gfile.Dir(item.Import), + dstModuleFolderPath, item.Module, item.Version, importPath, ); err != nil { return } @@ -69,8 +72,6 @@ func (c *controllerGenerator) doGenerateCtrlNewByModuleAndVersion( newFuncNameDefinition = fmt.Sprintf(`func %s()`, newFuncName) alreadyCreated bool ) - // replace "\" to "/", fix import error - importPath = gstr.Replace(importPath, "\\", "/", -1) if !gfile.Exists(moduleFilePath) { content := gstr.ReplaceByMap(consts.TemplateGenCtrlControllerEmpty, g.MapStrStr{ "{Module}": module, diff --git a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_interface.go b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_interface.go index e714036..4f95015 100644 --- a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_interface.go +++ b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_interface.go @@ -17,6 +17,7 @@ import ( "github.com/gogf/gf/v2/util/gconv" "hotgo/internal/library/hggen/internal/consts" "hotgo/internal/library/hggen/internal/utility/mlog" + "hotgo/internal/library/hggen/internal/utility/utils" ) type apiInterfaceGenerator struct{} @@ -42,6 +43,11 @@ func (c *apiInterfaceGenerator) doGenerate(apiModuleFolderPath string, module st importPathMap = gmap.NewListMap() importPaths []string ) + // if there's already exist file that with the same but not auto generated go file, + // it uses another file name. + if !utils.IsFileDoNotEdit(moduleFilePath) { + moduleFilePath = gfile.Join(apiModuleFolderPath, fmt.Sprintf(`%s.if.go`, module)) + } // all import paths. importPathMap.Set("\t"+`"context"`, 1) importPathMap.Set("\t"+``, 1) diff --git a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_sdk.go b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_sdk.go index 2d9f45e..384c6c1 100644 --- a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_sdk.go +++ b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_sdk.go @@ -78,7 +78,7 @@ func (c *apiSdkGenerator) doGenerateSdkIClient( pkgName = gfile.Basename(sdkFolderPath) funcName = gstr.CaseCamel(module) + gstr.UcFirst(version) interfaceName = fmt.Sprintf(`I%s`, funcName) - moduleImportPath = fmt.Sprintf(`"%s"`, gfile.Dir(versionImportPath)) + moduleImportPath = gstr.Replace(fmt.Sprintf(`"%s"`, gfile.Dir(versionImportPath)), "\\", "/", -1) iClientFilePath = gfile.Join(sdkFolderPath, fmt.Sprintf(`%s.iclient.go`, pkgName)) interfaceFuncDefinition = fmt.Sprintf( `%s() %s.%s`, @@ -116,7 +116,7 @@ func (c *apiSdkGenerator) doGenerateSdkIClient( if !gstr.Contains(fileContent, interfaceFuncDefinition) { isDirty = true fileContent, err = gregex.ReplaceString( - `(type iClient interface {[\s\S]*?)}`, + `(type IClient interface {[\s\S]*?)}`, fmt.Sprintf("$1\t%s\n}", interfaceFuncDefinition), fileContent, ) @@ -142,7 +142,7 @@ func (c *apiSdkGenerator) doGenerateSdkImplementer( pkgName = gfile.Basename(sdkFolderPath) moduleNameCamel = gstr.CaseCamel(module) moduleNameSnake = gstr.CaseSnake(module) - moduleImportPath = gfile.Dir(versionImportPath) + moduleImportPath = gstr.Replace(gfile.Dir(versionImportPath), "\\", "/", -1) versionPrefix = "" implementerName = moduleNameCamel + gstr.UcFirst(version) implementerFilePath = gfile.Join(sdkFolderPath, fmt.Sprintf( diff --git a/server/internal/library/hggen/internal/cmd/gendao/gendao.go b/server/internal/library/hggen/internal/cmd/gendao/gendao.go index fd6147f..008dc66 100644 --- a/server/internal/library/hggen/internal/cmd/gendao/gendao.go +++ b/server/internal/library/hggen/internal/cmd/gendao/gendao.go @@ -115,7 +115,7 @@ generated json tag case for model struct, cases are as follows: var ( createdAt = gtime.Now() - defaultTypeMapping = map[string]TypeMapping{ + defaultTypeMapping = map[DBFieldTypeName]CustomAttributeType{ "decimal": { Type: "float64", }, @@ -172,31 +172,32 @@ type ( CGenDao struct{} CGenDaoInput struct { g.Meta `name:"dao" config:"{CGenDaoConfig}" usage:"{CGenDaoUsage}" brief:"{CGenDaoBrief}" eg:"{CGenDaoEg}" ad:"{CGenDaoAd}"` - Path string `name:"path" short:"p" brief:"{CGenDaoBriefPath}" d:"internal"` - Link string `name:"link" short:"l" brief:"{CGenDaoBriefLink}"` - Tables string `name:"tables" short:"t" brief:"{CGenDaoBriefTables}"` - TablesEx string `name:"tablesEx" short:"x" brief:"{CGenDaoBriefTablesEx}"` - Group string `name:"group" short:"g" brief:"{CGenDaoBriefGroup}" d:"default"` - Prefix string `name:"prefix" short:"f" brief:"{CGenDaoBriefPrefix}"` - RemovePrefix string `name:"removePrefix" short:"r" brief:"{CGenDaoBriefRemovePrefix}"` - JsonCase string `name:"jsonCase" short:"j" brief:"{CGenDaoBriefJsonCase}" d:"CamelLower"` - ImportPrefix string `name:"importPrefix" short:"i" brief:"{CGenDaoBriefImportPrefix}"` - DaoPath string `name:"daoPath" short:"d" brief:"{CGenDaoBriefDaoPath}" d:"dao"` - DoPath string `name:"doPath" short:"o" brief:"{CGenDaoBriefDoPath}" d:"model/do"` - EntityPath string `name:"entityPath" short:"e" brief:"{CGenDaoBriefEntityPath}" d:"model/entity"` - TplDaoIndexPath string `name:"tplDaoIndexPath" short:"t1" brief:"{CGenDaoBriefTplDaoIndexPath}"` - TplDaoInternalPath string `name:"tplDaoInternalPath" short:"t2" brief:"{CGenDaoBriefTplDaoInternalPath}"` - TplDaoDoPath string `name:"tplDaoDoPath" short:"t3" brief:"{CGenDaoBriefTplDaoDoPathPath}"` - TplDaoEntityPath string `name:"tplDaoEntityPath" short:"t4" brief:"{CGenDaoBriefTplDaoEntityPath}"` - StdTime bool `name:"stdTime" short:"s" brief:"{CGenDaoBriefStdTime}" orphan:"true"` - WithTime bool `name:"withTime" short:"w" brief:"{CGenDaoBriefWithTime}" orphan:"true"` - GJsonSupport bool `name:"gJsonSupport" short:"n" brief:"{CGenDaoBriefGJsonSupport}" orphan:"true"` - OverwriteDao bool `name:"overwriteDao" short:"v" brief:"{CGenDaoBriefOverwriteDao}" orphan:"true"` - DescriptionTag bool `name:"descriptionTag" short:"c" brief:"{CGenDaoBriefDescriptionTag}" orphan:"true"` - NoJsonTag bool `name:"noJsonTag" short:"k" brief:"{CGenDaoBriefNoJsonTag}" orphan:"true"` - NoModelComment bool `name:"noModelComment" short:"m" brief:"{CGenDaoBriefNoModelComment}" orphan:"true"` - Clear bool `name:"clear" short:"a" brief:"{CGenDaoBriefClear}" orphan:"true"` - TypeMapping map[string]TypeMapping `name:"typeMapping" short:"y" brief:"{CGenDaoBriefTypeMapping}" orphan:"true"` + Path string `name:"path" short:"p" brief:"{CGenDaoBriefPath}" d:"internal"` + Link string `name:"link" short:"l" brief:"{CGenDaoBriefLink}"` + Tables string `name:"tables" short:"t" brief:"{CGenDaoBriefTables}"` + TablesEx string `name:"tablesEx" short:"x" brief:"{CGenDaoBriefTablesEx}"` + Group string `name:"group" short:"g" brief:"{CGenDaoBriefGroup}" d:"default"` + Prefix string `name:"prefix" short:"f" brief:"{CGenDaoBriefPrefix}"` + RemovePrefix string `name:"removePrefix" short:"r" brief:"{CGenDaoBriefRemovePrefix}"` + JsonCase string `name:"jsonCase" short:"j" brief:"{CGenDaoBriefJsonCase}" d:"CamelLower"` + ImportPrefix string `name:"importPrefix" short:"i" brief:"{CGenDaoBriefImportPrefix}"` + DaoPath string `name:"daoPath" short:"d" brief:"{CGenDaoBriefDaoPath}" d:"dao"` + DoPath string `name:"doPath" short:"o" brief:"{CGenDaoBriefDoPath}" d:"model/do"` + EntityPath string `name:"entityPath" short:"e" brief:"{CGenDaoBriefEntityPath}" d:"model/entity"` + TplDaoIndexPath string `name:"tplDaoIndexPath" short:"t1" brief:"{CGenDaoBriefTplDaoIndexPath}"` + TplDaoInternalPath string `name:"tplDaoInternalPath" short:"t2" brief:"{CGenDaoBriefTplDaoInternalPath}"` + TplDaoDoPath string `name:"tplDaoDoPath" short:"t3" brief:"{CGenDaoBriefTplDaoDoPathPath}"` + TplDaoEntityPath string `name:"tplDaoEntityPath" short:"t4" brief:"{CGenDaoBriefTplDaoEntityPath}"` + StdTime bool `name:"stdTime" short:"s" brief:"{CGenDaoBriefStdTime}" orphan:"true"` + WithTime bool `name:"withTime" short:"w" brief:"{CGenDaoBriefWithTime}" orphan:"true"` + GJsonSupport bool `name:"gJsonSupport" short:"n" brief:"{CGenDaoBriefGJsonSupport}" orphan:"true"` + OverwriteDao bool `name:"overwriteDao" short:"v" brief:"{CGenDaoBriefOverwriteDao}" orphan:"true"` + DescriptionTag bool `name:"descriptionTag" short:"c" brief:"{CGenDaoBriefDescriptionTag}" orphan:"true"` + NoJsonTag bool `name:"noJsonTag" short:"k" brief:"{CGenDaoBriefNoJsonTag}" orphan:"true"` + NoModelComment bool `name:"noModelComment" short:"m" brief:"{CGenDaoBriefNoModelComment}" orphan:"true"` + Clear bool `name:"clear" short:"a" brief:"{CGenDaoBriefClear}" orphan:"true"` + + TypeMapping map[DBFieldTypeName]CustomAttributeType `name:"typeMapping" short:"y" brief:"{CGenDaoBriefTypeMapping}" orphan:"true"` } CGenDaoOutput struct{} @@ -207,7 +208,8 @@ type ( NewTableNames []string } - TypeMapping struct { + DBFieldTypeName = string + CustomAttributeType struct { Type string `brief:"custom attribute type name"` Import string `brief:"custom import for this type"` } diff --git a/server/internal/library/hggen/internal/cmd/gendao/gendao_structure.go b/server/internal/library/hggen/internal/cmd/gendao/gendao_structure.go index a88fa5c..132f1a1 100644 --- a/server/internal/library/hggen/internal/cmd/gendao/gendao_structure.go +++ b/server/internal/library/hggen/internal/cmd/gendao/gendao_structure.go @@ -67,9 +67,10 @@ func generateStructFieldDefinition( ctx context.Context, field *gdb.TableField, in generateStructDefinitionInput, ) (attrLines []string, appendImport string) { var ( - err error - typeName string - jsonTag = getJsonTagFromCase(field.Name, in.JsonCase) + err error + localTypeName gdb.LocalType + localTypeNameStr string + jsonTag = getJsonTagFromCase(field.Name, in.JsonCase) ) if in.TypeMapping != nil && len(in.TypeMapping) > 0 { @@ -84,38 +85,39 @@ func generateStructFieldDefinition( } if tryTypeName != "" { if typeMapping, ok := in.TypeMapping[strings.ToLower(tryTypeName)]; ok { - typeName = typeMapping.Type + localTypeNameStr = typeMapping.Type appendImport = typeMapping.Import } } } - if typeName == "" { - typeName, err = in.DB.CheckLocalTypeForField(ctx, field.Type, nil) + if localTypeNameStr == "" { + localTypeName, err = in.DB.CheckLocalTypeForField(ctx, field.Type, nil) if err != nil { panic(err) } - } - switch typeName { - case gdb.LocalTypeDate, gdb.LocalTypeDatetime: - if in.StdTime { - typeName = "time.Time" - } else { - typeName = "*gtime.Time" - } + localTypeNameStr = string(localTypeName) + switch localTypeName { + case gdb.LocalTypeDate, gdb.LocalTypeDatetime: + if in.StdTime { + localTypeNameStr = "time.Time" + } else { + localTypeNameStr = "*gtime.Time" + } - case gdb.LocalTypeInt64Bytes: - typeName = "int64" + case gdb.LocalTypeInt64Bytes: + localTypeNameStr = "int64" - case gdb.LocalTypeUint64Bytes: - typeName = "uint64" + case gdb.LocalTypeUint64Bytes: + localTypeNameStr = "uint64" - // Special type handle. - case gdb.LocalTypeJson, gdb.LocalTypeJsonb: - if in.GJsonSupport { - typeName = "*gjson.Json" - } else { - typeName = "string" + // Special type handle. + case gdb.LocalTypeJson, gdb.LocalTypeJsonb: + if in.GJsonSupport { + localTypeNameStr = "*gjson.Json" + } else { + localTypeNameStr = "string" + } } } @@ -125,7 +127,7 @@ func generateStructFieldDefinition( ) attrLines = []string{ " #" + gstr.CaseCamel(field.Name), - " #" + typeName, + " #" + localTypeNameStr, } attrLines = append(attrLines, " #"+fmt.Sprintf(tagKey+`json:"%s"`, jsonTag)) attrLines = append(attrLines, " #"+fmt.Sprintf(`description:"%s"`+tagKey, descriptionTag)) diff --git a/server/internal/library/hggen/internal/cmd/genpbentity/genpbentity.go b/server/internal/library/hggen/internal/cmd/genpbentity/genpbentity.go index daf0400..fff71e8 100644 --- a/server/internal/library/hggen/internal/cmd/genpbentity/genpbentity.go +++ b/server/internal/library/hggen/internal/cmd/genpbentity/genpbentity.go @@ -12,6 +12,8 @@ import ( "fmt" "strings" + "github.com/olekukonko/tablewriter" + "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" @@ -21,7 +23,6 @@ import ( "github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/gtag" - "github.com/olekukonko/tablewriter" "hotgo/internal/library/hggen/internal/consts" "hotgo/internal/library/hggen/internal/utility/mlog" ) @@ -294,17 +295,17 @@ func generateEntityMessageDefinition(entityName string, fieldMap map[string]*gdb // generateMessageFieldForPbEntity generates and returns the message definition for specified field. func generateMessageFieldForPbEntity(index int, field *gdb.TableField, in CGenPbEntityInternalInput) []string { var ( - typeName string - comment string - jsonTagStr string - err error - ctx = gctx.GetInitCtx() + localTypeName gdb.LocalType + comment string + jsonTagStr string + err error + ctx = gctx.GetInitCtx() ) - typeName, err = in.DB.CheckLocalTypeForField(ctx, field.Type, nil) + localTypeName, err = in.DB.CheckLocalTypeForField(ctx, field.Type, nil) if err != nil { panic(err) } - var typeMapping = map[string]string{ + var typeMapping = map[gdb.LocalType]string{ gdb.LocalTypeString: "string", gdb.LocalTypeDate: "google.protobuf.Timestamp", gdb.LocalTypeDatetime: "google.protobuf.Timestamp", @@ -324,9 +325,9 @@ func generateMessageFieldForPbEntity(index int, field *gdb.TableField, in CGenPb gdb.LocalTypeJson: "string", gdb.LocalTypeJsonb: "string", } - typeName = typeMapping[typeName] - if typeName == "" { - typeName = "string" + localTypeNameStr := typeMapping[localTypeName] + if localTypeNameStr == "" { + localTypeNameStr = "string" } comment = gstr.ReplaceByArray(field.Comment, g.SliceStr{ @@ -350,7 +351,7 @@ func generateMessageFieldForPbEntity(index int, field *gdb.TableField, in CGenPb } } return []string{ - " #" + typeName, + " #" + localTypeNameStr, " #" + formatCase(field.Name, in.NameCase), " #= " + gconv.String(index) + jsonTagStr + ";", " #" + fmt.Sprintf(`// %s`, comment), diff --git a/server/internal/library/hggen/internal/cmd/genservice/genservice.go b/server/internal/library/hggen/internal/cmd/genservice/genservice.go index b1986b0..2f3a2e2 100644 --- a/server/internal/library/hggen/internal/cmd/genservice/genservice.go +++ b/server/internal/library/hggen/internal/cmd/genservice/genservice.go @@ -194,7 +194,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe return nil, err } // remove all comments. - fileContent, err = gregex.ReplaceString(`/[/|\*](.*)`, "", fileContent) + fileContent, err = gregex.ReplaceString(`(//.*)|((?s)/\*.*?\*/)`, "", fileContent) if err != nil { return nil, err } diff --git a/server/internal/library/hggen/internal/cmd/genservice/genservice_generate.go b/server/internal/library/hggen/internal/cmd/genservice/genservice_generate.go index 7b9c834..fd1cf57 100644 --- a/server/internal/library/hggen/internal/cmd/genservice/genservice_generate.go +++ b/server/internal/library/hggen/internal/cmd/genservice/genservice_generate.go @@ -137,7 +137,7 @@ func (c CGenService) isToGenerateServiceGoFile(dstPackageName, filePath string, return true } // remove all comments. - fileContent, err = gregex.ReplaceString(`/[/|\*](.*)`, "", fileContent) + fileContent, err = gregex.ReplaceString(`(//.*)|((?s)/\*.*?\*/)`, "", fileContent) if err != nil { panic(err) return false diff --git a/server/internal/library/hggen/internal/cmd/testdata/fix25_content.go.txt b/server/internal/library/hggen/internal/cmd/testdata/fix/fix25_content.go similarity index 99% rename from server/internal/library/hggen/internal/cmd/testdata/fix25_content.go.txt rename to server/internal/library/hggen/internal/cmd/testdata/fix/fix25_content.go index 0c2db7d..934ebd2 100644 --- a/server/internal/library/hggen/internal/cmd/testdata/fix25_content.go.txt +++ b/server/internal/library/hggen/internal/cmd/testdata/fix/fix25_content.go @@ -27,4 +27,4 @@ func Test_Router_Hook_Multi(t *testing.T) { r.Response.Write("2") }, }) -} \ No newline at end of file +} diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/dao/internal/table_user.go b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/dao/internal/table_user.go new file mode 100644 index 0000000..f883408 --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/dao/internal/table_user.go @@ -0,0 +1,85 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TableUserDao is the data access object for table table_user. +type TableUserDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns TableUserColumns // columns contains all the column names of Table for convenient usage. +} + +// TableUserColumns defines and stores column names for table table_user. +type TableUserColumns struct { + Id string // User ID + Passport string // User Passport + Password string // User Password + Nickname string // User Nickname + Score string // Total score amount. + CreateAt string // Created Time + UpdateAt string // Updated Time +} + +// tableUserColumns holds the columns for table table_user. +var tableUserColumns = TableUserColumns{ + Id: "id", + Passport: "passport", + Password: "password", + Nickname: "nickname", + Score: "score", + CreateAt: "create_at", + UpdateAt: "update_at", +} + +// NewTableUserDao creates and returns a new DAO object for table data access. +func NewTableUserDao() *TableUserDao { + return &TableUserDao{ + group: "test", + table: "table_user", + columns: tableUserColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TableUserDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TableUserDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TableUserDao) Columns() TableUserColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TableUserDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TableUserDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TableUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/dao/table_user.go b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/dao/table_user.go new file mode 100644 index 0000000..9bc9cff --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/dao/table_user.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "for-gendao-test/pkg/dao/internal" +) + +// internalTableUserDao is internal type for wrapping internal DAO implements. +type internalTableUserDao = *internal.TableUserDao + +// tableUserDao is the data access object for table table_user. +// You can define custom methods on it to extend its functionality as you wish. +type tableUserDao struct { + internalTableUserDao +} + +var ( + // TableUser is globally public accessible object for table table_user operations. + TableUser = tableUserDao{ + internal.NewTableUserDao(), + } +) + +// Fill with you ideas below. diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/model/do/table_user.go b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/model/do/table_user.go new file mode 100644 index 0000000..656fb9c --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/model/do/table_user.go @@ -0,0 +1,22 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// TableUser is the golang structure of table table_user for DAO operations like Where/Data. +type TableUser struct { + g.Meta `orm:"table:table_user, do:true"` + Id interface{} // User ID + Passport interface{} // User Passport + Password interface{} // User Password + Nickname interface{} // User Nickname + Score interface{} // Total score amount. + CreateAt *gtime.Time // Created Time + UpdateAt *gtime.Time // Updated Time +} diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/model/entity/table_user.go b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/model/entity/table_user.go new file mode 100644 index 0000000..22a8f0e --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user/model/entity/table_user.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// TableUser is the golang structure for table table_user. +type TableUser struct { + Id uint `json:"ID" ` // User ID + Passport string `json:"PASSPORT" ` // User Passport + Password string `json:"PASSWORD" ` // User Password + Nickname string `json:"NICKNAME" ` // User Nickname + Score float64 `json:"SCORE" ` // Total score amount. + CreateAt *gtime.Time `json:"CREATE_AT" ` // Created Time + UpdateAt *gtime.Time `json:"UPDATE_AT" ` // Updated Time +} diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/dao/internal/table_user.go b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/dao/internal/table_user.go new file mode 100644 index 0000000..f883408 --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/dao/internal/table_user.go @@ -0,0 +1,85 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TableUserDao is the data access object for table table_user. +type TableUserDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns TableUserColumns // columns contains all the column names of Table for convenient usage. +} + +// TableUserColumns defines and stores column names for table table_user. +type TableUserColumns struct { + Id string // User ID + Passport string // User Passport + Password string // User Password + Nickname string // User Nickname + Score string // Total score amount. + CreateAt string // Created Time + UpdateAt string // Updated Time +} + +// tableUserColumns holds the columns for table table_user. +var tableUserColumns = TableUserColumns{ + Id: "id", + Passport: "passport", + Password: "password", + Nickname: "nickname", + Score: "score", + CreateAt: "create_at", + UpdateAt: "update_at", +} + +// NewTableUserDao creates and returns a new DAO object for table data access. +func NewTableUserDao() *TableUserDao { + return &TableUserDao{ + group: "test", + table: "table_user", + columns: tableUserColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TableUserDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TableUserDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TableUserDao) Columns() TableUserColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TableUserDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TableUserDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TableUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/dao/table_user.go b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/dao/table_user.go new file mode 100644 index 0000000..9bc9cff --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/dao/table_user.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "for-gendao-test/pkg/dao/internal" +) + +// internalTableUserDao is internal type for wrapping internal DAO implements. +type internalTableUserDao = *internal.TableUserDao + +// tableUserDao is the data access object for table table_user. +// You can define custom methods on it to extend its functionality as you wish. +type tableUserDao struct { + internalTableUserDao +} + +var ( + // TableUser is globally public accessible object for table table_user operations. + TableUser = tableUserDao{ + internal.NewTableUserDao(), + } +) + +// Fill with you ideas below. diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/model/do/table_user.go b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/model/do/table_user.go new file mode 100644 index 0000000..656fb9c --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/model/do/table_user.go @@ -0,0 +1,22 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// TableUser is the golang structure of table table_user for DAO operations like Where/Data. +type TableUser struct { + g.Meta `orm:"table:table_user, do:true"` + Id interface{} // User ID + Passport interface{} // User Passport + Password interface{} // User Password + Nickname interface{} // User Nickname + Score interface{} // Total score amount. + CreateAt *gtime.Time // Created Time + UpdateAt *gtime.Time // Updated Time +} diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/model/entity/table_user.go b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/model/entity/table_user.go new file mode 100644 index 0000000..f0caddd --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/generated_user_type_mapping/model/entity/table_user.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/shopspring/decimal" +) + +// TableUser is the golang structure for table table_user. +type TableUser struct { + Id int64 `json:"id" ` // User ID + Passport string `json:"passport" ` // User Passport + Password string `json:"password" ` // User Password + Nickname string `json:"nickname" ` // User Nickname + Score decimal.Decimal `json:"score" ` // Total score amount. + CreateAt *gtime.Time `json:"createAt" ` // Created Time + UpdateAt *gtime.Time `json:"updateAt" ` // Updated Time +} diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/go.mod.txt b/server/internal/library/hggen/internal/cmd/testdata/gendao/go.mod.txt new file mode 100644 index 0000000..63c8430 --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/go.mod.txt @@ -0,0 +1,32 @@ +module for-gendao-test/pkg + +go 1.18 + +require ( + github.com/gogf/gf/v2 v2.5.3 + github.com/shopspring/decimal v1.3.1 +) + +require ( + github.com/BurntSushi/toml v1.2.0 // indirect + github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/fatih/color v1.15.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/grokify/html-strip-tags-go v0.0.1 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + go.opentelemetry.io/otel v1.14.0 // indirect + go.opentelemetry.io/otel/sdk v1.14.0 // indirect + go.opentelemetry.io/otel/trace v1.14.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/server/internal/library/hggen/internal/cmd/testdata/gendao/user.tpl.sql b/server/internal/library/hggen/internal/cmd/testdata/gendao/user.tpl.sql new file mode 100644 index 0000000..f27fc11 --- /dev/null +++ b/server/internal/library/hggen/internal/cmd/testdata/gendao/user.tpl.sql @@ -0,0 +1,10 @@ +CREATE TABLE `%s` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', + `passport` varchar(45) NOT NULL COMMENT 'User Passport', + `password` varchar(45) NOT NULL COMMENT 'User Password', + `nickname` varchar(45) NOT NULL COMMENT 'User Nickname', + `score` decimal(10,2) unsigned DEFAULT NULL COMMENT 'Total score amount.', + `create_at` datetime DEFAULT NULL COMMENT 'Created Time', + `update_at` datetime DEFAULT NULL COMMENT 'Updated Time', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/server/internal/library/hggen/internal/consts/consts_gen_ctrl_template.go b/server/internal/library/hggen/internal/consts/consts_gen_ctrl_template.go index de01e04..b2cfdc4 100644 --- a/server/internal/library/hggen/internal/consts/consts_gen_ctrl_template.go +++ b/server/internal/library/hggen/internal/consts/consts_gen_ctrl_template.go @@ -7,6 +7,10 @@ package consts const TemplateGenCtrlControllerEmpty = ` +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + package {Module} ` diff --git a/server/internal/library/hggen/internal/consts/consts_gen_ctrl_template_sdk.go b/server/internal/library/hggen/internal/consts/consts_gen_ctrl_template_sdk.go index 7ab1d80..92177fb 100644 --- a/server/internal/library/hggen/internal/consts/consts_gen_ctrl_template_sdk.go +++ b/server/internal/library/hggen/internal/consts/consts_gen_ctrl_template_sdk.go @@ -25,7 +25,7 @@ type implementer struct { config httpclient.Config } -func New(config httpclient.Config) iClient { +func New(config httpclient.Config) IClient { if !gstr.HasPrefix(config.URL, "http") { config.URL = fmt.Sprintf("http://%s", config.URL) } @@ -49,7 +49,7 @@ package {PkgName} import ( ) -type iClient interface { +type IClient interface { } ` @@ -84,6 +84,7 @@ func (i *implementer) {ImplementerName}() {Module}.I{ImplementerName} { client.Client = client.Prefix(prefix) return &implementer{ImplementerName}{client} } + ` const TemplateGenCtrlSdkImplementerFunc = ` diff --git a/server/internal/library/hggen/internal/packed/template-mono.go b/server/internal/library/hggen/internal/packed/template-mono.go index d08011d..67c325d 100644 --- a/server/internal/library/hggen/internal/packed/template-mono.go +++ b/server/internal/library/hggen/internal/packed/template-mono.go @@ -3,7 +3,7 @@ package packed import "github.com/gogf/gf/v2/os/gres" func init() { - if err := gres.Add("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"); err != nil { + if err := gres.Add("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"); err != nil { panic("add binary content to resource manager failed: " + err.Error()) } } diff --git a/server/internal/library/hggen/internal/packed/template-single.go b/server/internal/library/hggen/internal/packed/template-single.go index ee20193..37510b8 100644 --- a/server/internal/library/hggen/internal/packed/template-single.go +++ b/server/internal/library/hggen/internal/packed/template-single.go @@ -3,7 +3,7 @@ package packed import "github.com/gogf/gf/v2/os/gres" func init() { - if err := gres.Add("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"); err != nil { + if err := gres.Add("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"); err != nil { panic("add binary content to resource manager failed: " + err.Error()) } } diff --git a/server/internal/library/hggen/views/column.go b/server/internal/library/hggen/views/column.go index 2ee8e98..e8f8a09 100644 --- a/server/internal/library/hggen/views/column.go +++ b/server/internal/library/hggen/views/column.go @@ -62,7 +62,7 @@ func CustomAttributes(ctx context.Context, field *sysin.GenCodesColumnListModel, } // GenGotype 生成字段的go类型 -func GenGotype(ctx context.Context, field *sysin.GenCodesColumnListModel, in gendao.CGenDaoInput) (goName, typeName, tsName, tsType string) { +func GenGotype(ctx context.Context, field *sysin.GenCodesColumnListModel, in gendao.CGenDaoInput) (goName, typeName, tsName string, tsType string) { var err error tsName = getJsonTagFromCase(field.Name, in.JsonCase) goName = gstr.CaseCamel(field.Name) @@ -71,7 +71,8 @@ func GenGotype(ctx context.Context, field *sysin.GenCodesColumnListModel, in gen if err != nil { panic(err) } - switch typeName { + + switch gdb.LocalType(typeName) { case gdb.LocalTypeDate, gdb.LocalTypeDatetime: if in.StdTime { typeName = "time.Time" @@ -120,7 +121,7 @@ func CheckLocalTypeForField(ctx context.Context, fieldType string, fieldValue in "tinyblob", "mediumblob", "longblob": - return gdb.LocalTypeBytes, nil + return string(gdb.LocalTypeBytes), nil case "int", @@ -131,22 +132,22 @@ func CheckLocalTypeForField(ctx context.Context, fieldType string, fieldValue in "mediumint", "serial": if gstr.ContainsI(fieldType, "unsigned") { - return gdb.LocalTypeUint, nil + return string(gdb.LocalTypeUint), nil } - return gdb.LocalTypeInt, nil + return string(gdb.LocalTypeInt), nil case "big_int", "bigint", "bigserial": if gstr.ContainsI(fieldType, "unsigned") { - return gdb.LocalTypeUint64, nil + return string(gdb.LocalTypeUint64), nil } - return gdb.LocalTypeInt64, nil + return string(gdb.LocalTypeInt64), nil case "real": - return gdb.LocalTypeFloat32, nil + return string(gdb.LocalTypeFloat32), nil case "float", @@ -155,75 +156,75 @@ func CheckLocalTypeForField(ctx context.Context, fieldType string, fieldValue in "money", "numeric", "smallmoney": - return gdb.LocalTypeFloat64, nil + return string(gdb.LocalTypeFloat64), nil case "bit": // It is suggested using bit(1) as boolean. if typePattern == "1" { - return gdb.LocalTypeBool, nil + return string(gdb.LocalTypeBool), nil } s := gconv.String(fieldValue) // mssql is true|false string. if strings.EqualFold(s, "true") || strings.EqualFold(s, "false") { - return gdb.LocalTypeBool, nil + return string(gdb.LocalTypeBool), nil } if gstr.ContainsI(fieldType, "unsigned") { - return gdb.LocalTypeUint64Bytes, nil + return string(gdb.LocalTypeUint64Bytes), nil } - return gdb.LocalTypeInt64Bytes, nil + return string(gdb.LocalTypeInt64Bytes), nil case "bool": - return gdb.LocalTypeBool, nil + return string(gdb.LocalTypeBool), nil case "date": - return gdb.LocalTypeDate, nil + return string(gdb.LocalTypeDate), nil case "datetime", "timestamp", "timestamptz": - return gdb.LocalTypeDatetime, nil + return string(gdb.LocalTypeDatetime), nil case "json": - return gdb.LocalTypeJson, nil + return string(gdb.LocalTypeJson), nil case "jsonb": - return gdb.LocalTypeJsonb, nil + return string(gdb.LocalTypeJsonb), nil default: // Auto-detect field type, using key match. switch { case strings.Contains(typeName, "text") || strings.Contains(typeName, "char") || strings.Contains(typeName, "character"): - return gdb.LocalTypeString, nil + return string(gdb.LocalTypeString), nil case strings.Contains(typeName, "float") || strings.Contains(typeName, "double") || strings.Contains(typeName, "numeric"): - return gdb.LocalTypeFloat64, nil + return string(gdb.LocalTypeFloat64), nil case strings.Contains(typeName, "bool"): - return gdb.LocalTypeBool, nil + return string(gdb.LocalTypeBool), nil case strings.Contains(typeName, "binary") || strings.Contains(typeName, "blob"): - return gdb.LocalTypeBytes, nil + return string(gdb.LocalTypeBytes), nil case strings.Contains(typeName, "int"): if gstr.ContainsI(fieldType, "unsigned") { - return gdb.LocalTypeUint, nil + return string(gdb.LocalTypeUint), nil } - return gdb.LocalTypeInt, nil + return string(gdb.LocalTypeInt), nil case strings.Contains(typeName, "time"): - return gdb.LocalTypeDatetime, nil + return string(gdb.LocalTypeDatetime), nil case strings.Contains(typeName, "date"): - return gdb.LocalTypeDatetime, nil + return string(gdb.LocalTypeDatetime), nil default: - return gdb.LocalTypeString, nil + return string(gdb.LocalTypeString), nil } } } diff --git a/server/internal/library/hggen/views/curd_generate_web_model.go b/server/internal/library/hggen/views/curd_generate_web_model.go index 5434812..cfb8055 100644 --- a/server/internal/library/hggen/views/curd_generate_web_model.go +++ b/server/internal/library/hggen/views/curd_generate_web_model.go @@ -44,7 +44,7 @@ func (l *gCurd) generateWebModelState(ctx context.Context, in *CurdPreviewInput) func (l *gCurd) generateWebModelDefaultState(ctx context.Context, in *CurdPreviewInput) string { buffer := bytes.NewBuffer(nil) - buffer.WriteString("export const defaultState = {\n") + buffer.WriteString("export const defaultState: State = {\n") for _, field := range in.masterFields { var value = field.DefaultValue if value == nil { diff --git a/server/internal/library/storager/upload.go b/server/internal/library/storager/upload.go index d3cfae1..d4c9dad 100644 --- a/server/internal/library/storager/upload.go +++ b/server/internal/library/storager/upload.go @@ -117,7 +117,8 @@ func DoUpload(ctx context.Context, typ string, file *ghttp.UploadFile) (result * return } - if result != nil { + // 相同存储相同身份才复用 + if result != nil && result.Drive == config.Drive && result.MemberId == contexts.GetUserId(ctx) && result.AppId == contexts.GetModule(ctx) { return } diff --git a/server/internal/logic/admin/site.go b/server/internal/logic/admin/site.go index d8c7657..0d0ce64 100644 --- a/server/internal/logic/admin/site.go +++ b/server/internal/logic/admin/site.go @@ -236,6 +236,17 @@ func (s *sAdminSite) handleLogin(ctx context.Context, mb *entity.AdminMember) (r return } + var dept *entity.AdminDept + if err = g.Model("admin_dept").Ctx(ctx).Fields("id,status").Where("id", mb.DeptId).Scan(&dept); err != nil || dept == nil { + err = gerror.Wrap(err, "获取部门信息失败,请稍后重试!") + return + } + + if dept.Status != consts.StatusEnabled { + err = gerror.New("部门已被禁用,如有疑问请联系管理员") + return + } + user := &model.Identity{ Id: mb.Id, Pid: mb.Pid, @@ -294,6 +305,17 @@ func (s *sAdminSite) BindUserContext(ctx context.Context, claims *model.Identity return } + var dept *entity.AdminDept + if err = g.Model("admin_dept").Ctx(ctx).Fields("id,status").Where("id", mb.DeptId).Scan(&dept); err != nil || dept == nil { + err = gerror.Wrap(err, "获取部门信息失败,请稍后重试!") + return + } + + if dept.Status != consts.StatusEnabled { + err = gerror.New("部门已被禁用,如有疑问请联系管理员") + return + } + user := &model.Identity{ Id: mb.Id, Pid: mb.Pid, diff --git a/server/internal/logic/sys/curd_demo.go b/server/internal/logic/sys/curd_demo.go index 9bb3caf..f58e48c 100644 --- a/server/internal/logic/sys/curd_demo.go +++ b/server/internal/logic/sys/curd_demo.go @@ -3,7 +3,7 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.7.6 +// @AutoGenerate Version 2.8.9 package sys import ( diff --git a/server/internal/logic/sys/log.go b/server/internal/logic/sys/log.go index a30b53d..68432c9 100644 --- a/server/internal/logic/sys/log.go +++ b/server/internal/logic/sys/log.go @@ -181,7 +181,7 @@ func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog { postForm := gjson.New(gconv.String(request.PostForm)).Map() if len(postForm) > 0 { for k, v := range postForm { - postData.MustAppend(k, v) + postData.MustSet(k, v) } } diff --git a/server/internal/model/input/sysin/curd_demo.go b/server/internal/model/input/sysin/curd_demo.go index 3810004..85c3071 100644 --- a/server/internal/model/input/sysin/curd_demo.go +++ b/server/internal/model/input/sysin/curd_demo.go @@ -3,7 +3,7 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.7.6 +// @AutoGenerate Version 2.8.9 package sysin import ( diff --git a/server/internal/router/genrouter/curd_demo.go b/server/internal/router/genrouter/curd_demo.go index 32f52ea..fe55522 100644 --- a/server/internal/router/genrouter/curd_demo.go +++ b/server/internal/router/genrouter/curd_demo.go @@ -3,7 +3,7 @@ // @Copyright Copyright (c) 2023 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE -// @AutoGenerate Version 2.7.6 +// @AutoGenerate Version 2.8.9 package genrouter import "hotgo/internal/controller/admin/sys" diff --git a/server/internal/service/sys.go b/server/internal/service/sys.go index f5bf630..0be50a1 100644 --- a/server/internal/service/sys.go +++ b/server/internal/service/sys.go @@ -18,21 +18,103 @@ import ( ) type ( - ISysCronGroup interface { + ISysEmsLog interface { // Delete 删除 - Delete(ctx context.Context, in *sysin.CronGroupDeleteInp) (err error) + Delete(ctx context.Context, in *sysin.EmsLogDeleteInp) (err error) // Edit 修改/新增 - Edit(ctx context.Context, in *sysin.CronGroupEditInp) (err error) - // Status 更新状态 - Status(ctx context.Context, in *sysin.CronGroupStatusInp) (err error) - // MaxSort 最大排序 - MaxSort(ctx context.Context, in *sysin.CronGroupMaxSortInp) (res *sysin.CronGroupMaxSortModel, err error) - // View 获取指定信息 - View(ctx context.Context, in *sysin.CronGroupViewInp) (res *sysin.CronGroupViewModel, err error) + Edit(ctx context.Context, in *sysin.EmsLogEditInp) (err error) + // Status 更新部门状态 + Status(ctx context.Context, in *sysin.EmsLogStatusInp) (err error) + // View 获取指定字典类型信息 + View(ctx context.Context, in *sysin.EmsLogViewInp) (res *sysin.EmsLogViewModel, err error) // List 获取列表 - List(ctx context.Context, in *sysin.CronGroupListInp) (list []*sysin.CronGroupListModel, totalCount int, err error) - // Select 选项 - Select(ctx context.Context, in *sysin.CronGroupSelectInp) (res *sysin.CronGroupSelectModel, err error) + List(ctx context.Context, in *sysin.EmsLogListInp) (list []*sysin.EmsLogListModel, totalCount int, err error) + // Send 发送邮件 + Send(ctx context.Context, in *sysin.SendEmsInp) (err error) + // GetTemplate 获取指定邮件模板 + GetTemplate(ctx context.Context, template string, config *model.EmailConfig) (val string, err error) + // AllowSend 是否允许发送 + AllowSend(ctx context.Context, models *entity.SysEmsLog, config *model.EmailConfig) (err error) + // NowDayCount 当天发送次数 + NowDayCount(ctx context.Context, event, email string) (count int, err error) + // VerifyCode 效验验证码 + VerifyCode(ctx context.Context, in *sysin.VerifyEmsCodeInp) (err error) + } + ISysAddons interface { + // List 获取列表 + List(ctx context.Context, in *sysin.AddonsListInp) (list []*sysin.AddonsListModel, totalCount int, err error) + // Selects 选项 + Selects(ctx context.Context, in *sysin.AddonsSelectsInp) (res *sysin.AddonsSelectsModel, err error) + // Build 提交生成 + Build(ctx context.Context, in *sysin.AddonsBuildInp) (err error) + // Install 安装模块 + Install(ctx context.Context, in *sysin.AddonsInstallInp) (err error) + // Upgrade 更新模块 + Upgrade(ctx context.Context, in *sysin.AddonsUpgradeInp) (err error) + // UnInstall 卸载模块 + UnInstall(ctx context.Context, in *sysin.AddonsUnInstallInp) (err error) + } + ISysAttachment interface { + // Model ORM模型 + Model(ctx context.Context, option ...*handler.Option) *gdb.Model + // Delete 删除附件 + Delete(ctx context.Context, in *sysin.AttachmentDeleteInp) (err error) + // View 获取附件信息 + View(ctx context.Context, in *sysin.AttachmentViewInp) (res *sysin.AttachmentViewModel, err error) + // List 获取附件列表 + List(ctx context.Context, in *sysin.AttachmentListInp) (list []*sysin.AttachmentListModel, totalCount int, err error) + // ClearKind 清空上传类型 + ClearKind(ctx context.Context, in *sysin.AttachmentClearKindInp) (err error) + } + ISysDictData interface { + // Delete 删除 + Delete(ctx context.Context, in *sysin.DictDataDeleteInp) error + // Edit 修改/新增 + Edit(ctx context.Context, in *sysin.DictDataEditInp) (err error) + // List 获取列表 + List(ctx context.Context, in *sysin.DictDataListInp) (list []*sysin.DictDataListModel, totalCount int, err error) + // GetId 获取指定类型的ID + GetId(ctx context.Context, t string) (id int64, err error) + // GetType 获取指定ID的类型标识 + GetType(ctx context.Context, id int64) (types string, err error) + // GetTypes 获取指定ID的所有类型标识,包含下级 + GetTypes(ctx context.Context, id int64) (types []string, err error) + // Select 获取列表 + Select(ctx context.Context, in *sysin.DataSelectInp) (list sysin.DataSelectModel, err error) + } + ISysServeLog interface { + // Model 服务日志Orm模型 + Model(ctx context.Context) *gdb.Model + // List 获取服务日志列表 + List(ctx context.Context, in *sysin.ServeLogListInp) (list []*sysin.ServeLogListModel, totalCount int, err error) + // Export 导出服务日志 + Export(ctx context.Context, in *sysin.ServeLogListInp) (err error) + // Delete 删除服务日志 + Delete(ctx context.Context, in *sysin.ServeLogDeleteInp) (err error) + // View 获取服务日志指定信息 + View(ctx context.Context, in *sysin.ServeLogViewInp) (res *sysin.ServeLogViewModel, err error) + // RealWrite 真实写入 + RealWrite(ctx context.Context, models entity.SysServeLog) (err error) + } + ISysCurdDemo interface { + // Model 生成演示ORM模型 + Model(ctx context.Context, option ...*handler.Option) *gdb.Model + // List 获取生成演示列表 + List(ctx context.Context, in *sysin.CurdDemoListInp) (list []*sysin.CurdDemoListModel, totalCount int, err error) + // Export 导出生成演示 + Export(ctx context.Context, in *sysin.CurdDemoListInp) (err error) + // Edit 修改/新增生成演示 + Edit(ctx context.Context, in *sysin.CurdDemoEditInp) (err error) + // Delete 删除生成演示 + Delete(ctx context.Context, in *sysin.CurdDemoDeleteInp) (err error) + // MaxSort 获取生成演示最大排序 + MaxSort(ctx context.Context, in *sysin.CurdDemoMaxSortInp) (res *sysin.CurdDemoMaxSortModel, err error) + // View 获取生成演示指定信息 + View(ctx context.Context, in *sysin.CurdDemoViewInp) (res *sysin.CurdDemoViewModel, err error) + // Status 更新生成演示状态 + Status(ctx context.Context, in *sysin.CurdDemoStatusInp) (err error) + // Switch 更新生成演示开关 + Switch(ctx context.Context, in *sysin.CurdDemoSwitchInp) (err error) } ISysDictType interface { // Tree 树 @@ -44,6 +126,32 @@ type ( // TreeSelect 获取类型关系树选项 TreeSelect(ctx context.Context, in *sysin.DictTreeSelectInp) (list []*sysin.DictTypeTree, err error) } + ISysGenCodes interface { + // Delete 删除 + Delete(ctx context.Context, in *sysin.GenCodesDeleteInp) (err error) + // Edit 修改/新增 + Edit(ctx context.Context, in *sysin.GenCodesEditInp) (res *sysin.GenCodesEditModel, err error) + // Status 更新部门状态 + Status(ctx context.Context, in *sysin.GenCodesStatusInp) (err error) + // MaxSort 最大排序 + MaxSort(ctx context.Context, in *sysin.GenCodesMaxSortInp) (res *sysin.GenCodesMaxSortModel, err error) + // View 获取指定字典类型信息 + View(ctx context.Context, in *sysin.GenCodesViewInp) (res *sysin.GenCodesViewModel, err error) + // List 获取列表 + List(ctx context.Context, in *sysin.GenCodesListInp) (list []*sysin.GenCodesListModel, totalCount int, err error) + // Selects 选项 + Selects(ctx context.Context, in *sysin.GenCodesSelectsInp) (res *sysin.GenCodesSelectsModel, err error) + // TableSelect 表选项 + TableSelect(ctx context.Context, in *sysin.GenCodesTableSelectInp) (res []*sysin.GenCodesTableSelectModel, err error) + // ColumnSelect 表字段选项 + ColumnSelect(ctx context.Context, in *sysin.GenCodesColumnSelectInp) (res []*sysin.GenCodesColumnSelectModel, err error) + // ColumnList 表字段列表 + ColumnList(ctx context.Context, in *sysin.GenCodesColumnListInp) (res []*sysin.GenCodesColumnListModel, err error) + // Preview 生成预览 + Preview(ctx context.Context, in *sysin.GenCodesPreviewInp) (res *sysin.GenCodesPreviewModel, err error) + // Build 提交生成 + Build(ctx context.Context, in *sysin.GenCodesBuildInp) (err error) + } ISysLog interface { // Export 导出 Export(ctx context.Context, in *sysin.LogListInp) (err error) @@ -60,55 +168,33 @@ type ( // List 列表 List(ctx context.Context, in *sysin.LogListInp) (list []*sysin.LogListModel, totalCount int, err error) } - ISysLoginLog interface { - // Model 登录日志Orm模型 - Model(ctx context.Context) *gdb.Model - // List 获取登录日志列表 - List(ctx context.Context, in *sysin.LoginLogListInp) (list []*sysin.LoginLogListModel, totalCount int, err error) - // Export 导出登录日志 - Export(ctx context.Context, in *sysin.LoginLogListInp) (err error) - // Delete 删除登录日志 - Delete(ctx context.Context, in *sysin.LoginLogDeleteInp) (err error) - // View 获取登录日志指定信息 - View(ctx context.Context, in *sysin.LoginLogViewInp) (res *sysin.LoginLogViewModel, err error) - // Push 推送登录日志 - Push(ctx context.Context, in *sysin.LoginLogPushInp) - // RealWrite 真实写入 - RealWrite(ctx context.Context, models entity.SysLoginLog) (err error) + ISysAddonsConfig interface { + // GetConfigByGroup 获取指定分组的配置 + GetConfigByGroup(ctx context.Context, in *sysin.GetAddonsConfigInp) (res *sysin.GetAddonsConfigModel, err error) + // ConversionType 转换类型 + ConversionType(ctx context.Context, models *entity.SysAddonsConfig) (value interface{}, err error) + // UpdateConfigByGroup 更新指定分组的配置 + UpdateConfigByGroup(ctx context.Context, in *sysin.UpdateAddonsConfigInp) (err error) } - ISysProvinces interface { - // Tree 关系树选项列表 - Tree(ctx context.Context) (list []*sysin.ProvincesTree, err error) - // Delete 删除省市区数据 - Delete(ctx context.Context, in *sysin.ProvincesDeleteInp) (err error) - // Edit 修改/新增省市区数据 - Edit(ctx context.Context, in *sysin.ProvincesEditInp) (err error) - // Status 更新省市区状态 - Status(ctx context.Context, in *sysin.ProvincesStatusInp) (err error) - // MaxSort 最大排序 - MaxSort(ctx context.Context, in *sysin.ProvincesMaxSortInp) (res *sysin.ProvincesMaxSortModel, err error) - // View 获取省市区信息 - View(ctx context.Context, in *sysin.ProvincesViewInp) (res *sysin.ProvincesViewModel, err error) + ISysBlacklist interface { + // Delete 删除 + Delete(ctx context.Context, in *sysin.BlacklistDeleteInp) (err error) + // Edit 修改/新增 + Edit(ctx context.Context, in *sysin.BlacklistEditInp) (err error) + // Status 更新部门状态 + Status(ctx context.Context, in *sysin.BlacklistStatusInp) (err error) + // View 获取指定字典类型信息 + View(ctx context.Context, in *sysin.BlacklistViewInp) (res *sysin.BlacklistViewModel, err error) // List 获取列表 - List(ctx context.Context, in *sysin.ProvincesListInp) (list []*sysin.ProvincesListModel, totalCount int, err error) - // ChildrenList 获取省市区下级列表 - ChildrenList(ctx context.Context, in *sysin.ProvincesChildrenListInp) (list []*sysin.ProvincesChildrenListModel, totalCount int, err error) - // UniqueId 获取省市区下级列表 - UniqueId(ctx context.Context, in *sysin.ProvincesUniqueIdInp) (res *sysin.ProvincesUniqueIdModel, err error) - // Select 省市区选项 - Select(ctx context.Context, in *sysin.ProvincesSelectInp) (res *sysin.ProvincesSelectModel, err error) - } - ISysAttachment interface { - // Model ORM模型 - Model(ctx context.Context, option ...*handler.Option) *gdb.Model - // Delete 删除附件 - Delete(ctx context.Context, in *sysin.AttachmentDeleteInp) (err error) - // View 获取附件信息 - View(ctx context.Context, in *sysin.AttachmentViewInp) (res *sysin.AttachmentViewModel, err error) - // List 获取附件列表 - List(ctx context.Context, in *sysin.AttachmentListInp) (list []*sysin.AttachmentListModel, totalCount int, err error) - // ClearKind 清空上传类型 - ClearKind(ctx context.Context, in *sysin.AttachmentClearKindInp) (err error) + List(ctx context.Context, in *sysin.BlacklistListInp) (list []*sysin.BlacklistListModel, totalCount int, err error) + // VariableLoad 变化加载 + VariableLoad(ctx context.Context, err error) + // Load 加载黑名单 + Load(ctx context.Context) + // VerifyRequest 验证请求的访问IP是否在黑名单,如果存在则返回错误 + VerifyRequest(r *ghttp.Request) (err error) + // ClusterSync 集群同步 + ClusterSync(ctx context.Context, message *gredis.Message) } ISysConfig interface { // InitConfig 初始化系统配置 @@ -171,66 +257,6 @@ type ( // OnlineExec 在线执行 OnlineExec(ctx context.Context, in *sysin.OnlineExecInp) (err error) } - ISysServeLicense interface { - // Model 服务许可证ORM模型 - Model(ctx context.Context, option ...*handler.Option) *gdb.Model - // List 获取服务许可证列表 - List(ctx context.Context, in *sysin.ServeLicenseListInp) (list []*sysin.ServeLicenseListModel, totalCount int, err error) - // Export 导出服务许可证 - Export(ctx context.Context, in *sysin.ServeLicenseListInp) (err error) - // Edit 修改/新增服务许可证 - Edit(ctx context.Context, in *sysin.ServeLicenseEditInp) (err error) - // Delete 删除服务许可证 - Delete(ctx context.Context, in *sysin.ServeLicenseDeleteInp) (err error) - // View 获取服务许可证指定信息 - View(ctx context.Context, in *sysin.ServeLicenseViewInp) (res *sysin.ServeLicenseViewModel, err error) - // Status 更新服务许可证状态 - Status(ctx context.Context, in *sysin.ServeLicenseStatusInp) (err error) - // AssignRouter 分配服务许可证路由 - AssignRouter(ctx context.Context, in *sysin.ServeLicenseAssignRouterInp) (err error) - } - ISysDictData interface { - // Delete 删除 - Delete(ctx context.Context, in *sysin.DictDataDeleteInp) error - // Edit 修改/新增 - Edit(ctx context.Context, in *sysin.DictDataEditInp) (err error) - // List 获取列表 - List(ctx context.Context, in *sysin.DictDataListInp) (list []*sysin.DictDataListModel, totalCount int, err error) - // GetId 获取指定类型的ID - GetId(ctx context.Context, t string) (id int64, err error) - // GetType 获取指定ID的类型标识 - GetType(ctx context.Context, id int64) (types string, err error) - // GetTypes 获取指定ID的所有类型标识,包含下级 - GetTypes(ctx context.Context, id int64) (types []string, err error) - // Select 获取列表 - Select(ctx context.Context, in *sysin.DataSelectInp) (list sysin.DataSelectModel, err error) - } - ISysGenCodes interface { - // Delete 删除 - Delete(ctx context.Context, in *sysin.GenCodesDeleteInp) (err error) - // Edit 修改/新增 - Edit(ctx context.Context, in *sysin.GenCodesEditInp) (res *sysin.GenCodesEditModel, err error) - // Status 更新部门状态 - Status(ctx context.Context, in *sysin.GenCodesStatusInp) (err error) - // MaxSort 最大排序 - MaxSort(ctx context.Context, in *sysin.GenCodesMaxSortInp) (res *sysin.GenCodesMaxSortModel, err error) - // View 获取指定字典类型信息 - View(ctx context.Context, in *sysin.GenCodesViewInp) (res *sysin.GenCodesViewModel, err error) - // List 获取列表 - List(ctx context.Context, in *sysin.GenCodesListInp) (list []*sysin.GenCodesListModel, totalCount int, err error) - // Selects 选项 - Selects(ctx context.Context, in *sysin.GenCodesSelectsInp) (res *sysin.GenCodesSelectsModel, err error) - // TableSelect 表选项 - TableSelect(ctx context.Context, in *sysin.GenCodesTableSelectInp) (res []*sysin.GenCodesTableSelectModel, err error) - // ColumnSelect 表字段选项 - ColumnSelect(ctx context.Context, in *sysin.GenCodesColumnSelectInp) (res []*sysin.GenCodesColumnSelectModel, err error) - // ColumnList 表字段列表 - ColumnList(ctx context.Context, in *sysin.GenCodesColumnListInp) (res []*sysin.GenCodesColumnListModel, err error) - // Preview 生成预览 - Preview(ctx context.Context, in *sysin.GenCodesPreviewInp) (res *sysin.GenCodesPreviewModel, err error) - // Build 提交生成 - Build(ctx context.Context, in *sysin.GenCodesBuildInp) (err error) - } ISysSmsLog interface { // Delete 删除 Delete(ctx context.Context, in *sysin.SmsLogDeleteInp) (err error) @@ -253,259 +279,101 @@ type ( // VerifyCode 效验验证码 VerifyCode(ctx context.Context, in *sysin.VerifyCodeInp) (err error) } - ISysAddons interface { + ISysCronGroup interface { + // Delete 删除 + Delete(ctx context.Context, in *sysin.CronGroupDeleteInp) (err error) + // Edit 修改/新增 + Edit(ctx context.Context, in *sysin.CronGroupEditInp) (err error) + // Status 更新状态 + Status(ctx context.Context, in *sysin.CronGroupStatusInp) (err error) + // MaxSort 最大排序 + MaxSort(ctx context.Context, in *sysin.CronGroupMaxSortInp) (res *sysin.CronGroupMaxSortModel, err error) + // View 获取指定信息 + View(ctx context.Context, in *sysin.CronGroupViewInp) (res *sysin.CronGroupViewModel, err error) // List 获取列表 - List(ctx context.Context, in *sysin.AddonsListInp) (list []*sysin.AddonsListModel, totalCount int, err error) - // Selects 选项 - Selects(ctx context.Context, in *sysin.AddonsSelectsInp) (res *sysin.AddonsSelectsModel, err error) - // Build 提交生成 - Build(ctx context.Context, in *sysin.AddonsBuildInp) (err error) - // Install 安装模块 - Install(ctx context.Context, in *sysin.AddonsInstallInp) (err error) - // Upgrade 更新模块 - Upgrade(ctx context.Context, in *sysin.AddonsUpgradeInp) (err error) - // UnInstall 卸载模块 - UnInstall(ctx context.Context, in *sysin.AddonsUnInstallInp) (err error) + List(ctx context.Context, in *sysin.CronGroupListInp) (list []*sysin.CronGroupListModel, totalCount int, err error) + // Select 选项 + Select(ctx context.Context, in *sysin.CronGroupSelectInp) (res *sysin.CronGroupSelectModel, err error) } - ISysAddonsConfig interface { - // GetConfigByGroup 获取指定分组的配置 - GetConfigByGroup(ctx context.Context, in *sysin.GetAddonsConfigInp) (res *sysin.GetAddonsConfigModel, err error) - // ConversionType 转换类型 - ConversionType(ctx context.Context, models *entity.SysAddonsConfig) (value interface{}, err error) - // UpdateConfigByGroup 更新指定分组的配置 - UpdateConfigByGroup(ctx context.Context, in *sysin.UpdateAddonsConfigInp) (err error) - } - ISysServeLog interface { - // Model 服务日志Orm模型 + ISysLoginLog interface { + // Model 登录日志Orm模型 Model(ctx context.Context) *gdb.Model - // List 获取服务日志列表 - List(ctx context.Context, in *sysin.ServeLogListInp) (list []*sysin.ServeLogListModel, totalCount int, err error) - // Export 导出服务日志 - Export(ctx context.Context, in *sysin.ServeLogListInp) (err error) - // Delete 删除服务日志 - Delete(ctx context.Context, in *sysin.ServeLogDeleteInp) (err error) - // View 获取服务日志指定信息 - View(ctx context.Context, in *sysin.ServeLogViewInp) (res *sysin.ServeLogViewModel, err error) + // List 获取登录日志列表 + List(ctx context.Context, in *sysin.LoginLogListInp) (list []*sysin.LoginLogListModel, totalCount int, err error) + // Export 导出登录日志 + Export(ctx context.Context, in *sysin.LoginLogListInp) (err error) + // Delete 删除登录日志 + Delete(ctx context.Context, in *sysin.LoginLogDeleteInp) (err error) + // View 获取登录日志指定信息 + View(ctx context.Context, in *sysin.LoginLogViewInp) (res *sysin.LoginLogViewModel, err error) + // Push 推送登录日志 + Push(ctx context.Context, in *sysin.LoginLogPushInp) // RealWrite 真实写入 - RealWrite(ctx context.Context, models entity.SysServeLog) (err error) + RealWrite(ctx context.Context, models entity.SysLoginLog) (err error) } - ISysBlacklist interface { - // Delete 删除 - Delete(ctx context.Context, in *sysin.BlacklistDeleteInp) (err error) - // Edit 修改/新增 - Edit(ctx context.Context, in *sysin.BlacklistEditInp) (err error) - // Status 更新部门状态 - Status(ctx context.Context, in *sysin.BlacklistStatusInp) (err error) - // View 获取指定字典类型信息 - View(ctx context.Context, in *sysin.BlacklistViewInp) (res *sysin.BlacklistViewModel, err error) + ISysProvinces interface { + // Tree 关系树选项列表 + Tree(ctx context.Context) (list []*sysin.ProvincesTree, err error) + // Delete 删除省市区数据 + Delete(ctx context.Context, in *sysin.ProvincesDeleteInp) (err error) + // Edit 修改/新增省市区数据 + Edit(ctx context.Context, in *sysin.ProvincesEditInp) (err error) + // Status 更新省市区状态 + Status(ctx context.Context, in *sysin.ProvincesStatusInp) (err error) + // MaxSort 最大排序 + MaxSort(ctx context.Context, in *sysin.ProvincesMaxSortInp) (res *sysin.ProvincesMaxSortModel, err error) + // View 获取省市区信息 + View(ctx context.Context, in *sysin.ProvincesViewInp) (res *sysin.ProvincesViewModel, err error) // List 获取列表 - List(ctx context.Context, in *sysin.BlacklistListInp) (list []*sysin.BlacklistListModel, totalCount int, err error) - // VariableLoad 变化加载 - VariableLoad(ctx context.Context, err error) - // Load 加载黑名单 - Load(ctx context.Context) - // VerifyRequest 验证请求的访问IP是否在黑名单,如果存在则返回错误 - VerifyRequest(r *ghttp.Request) (err error) - // ClusterSync 集群同步 - ClusterSync(ctx context.Context, message *gredis.Message) + List(ctx context.Context, in *sysin.ProvincesListInp) (list []*sysin.ProvincesListModel, totalCount int, err error) + // ChildrenList 获取省市区下级列表 + ChildrenList(ctx context.Context, in *sysin.ProvincesChildrenListInp) (list []*sysin.ProvincesChildrenListModel, totalCount int, err error) + // UniqueId 获取省市区下级列表 + UniqueId(ctx context.Context, in *sysin.ProvincesUniqueIdInp) (res *sysin.ProvincesUniqueIdModel, err error) + // Select 省市区选项 + Select(ctx context.Context, in *sysin.ProvincesSelectInp) (res *sysin.ProvincesSelectModel, err error) } - ISysCurdDemo interface { - // Model 生成演示ORM模型 + ISysServeLicense interface { + // Model 服务许可证ORM模型 Model(ctx context.Context, option ...*handler.Option) *gdb.Model - // List 获取生成演示列表 - List(ctx context.Context, in *sysin.CurdDemoListInp) (list []*sysin.CurdDemoListModel, totalCount int, err error) - // Export 导出生成演示 - Export(ctx context.Context, in *sysin.CurdDemoListInp) (err error) - // Edit 修改/新增生成演示 - Edit(ctx context.Context, in *sysin.CurdDemoEditInp) (err error) - // Delete 删除生成演示 - Delete(ctx context.Context, in *sysin.CurdDemoDeleteInp) (err error) - // MaxSort 获取生成演示最大排序 - MaxSort(ctx context.Context, in *sysin.CurdDemoMaxSortInp) (res *sysin.CurdDemoMaxSortModel, err error) - // View 获取生成演示指定信息 - View(ctx context.Context, in *sysin.CurdDemoViewInp) (res *sysin.CurdDemoViewModel, err error) - // Status 更新生成演示状态 - Status(ctx context.Context, in *sysin.CurdDemoStatusInp) (err error) - // Switch 更新生成演示开关 - Switch(ctx context.Context, in *sysin.CurdDemoSwitchInp) (err error) - } - ISysEmsLog interface { - // Delete 删除 - Delete(ctx context.Context, in *sysin.EmsLogDeleteInp) (err error) - // Edit 修改/新增 - Edit(ctx context.Context, in *sysin.EmsLogEditInp) (err error) - // Status 更新部门状态 - Status(ctx context.Context, in *sysin.EmsLogStatusInp) (err error) - // View 获取指定字典类型信息 - View(ctx context.Context, in *sysin.EmsLogViewInp) (res *sysin.EmsLogViewModel, err error) - // List 获取列表 - List(ctx context.Context, in *sysin.EmsLogListInp) (list []*sysin.EmsLogListModel, totalCount int, err error) - // Send 发送邮件 - Send(ctx context.Context, in *sysin.SendEmsInp) (err error) - // GetTemplate 获取指定邮件模板 - GetTemplate(ctx context.Context, template string, config *model.EmailConfig) (val string, err error) - // AllowSend 是否允许发送 - AllowSend(ctx context.Context, models *entity.SysEmsLog, config *model.EmailConfig) (err error) - // NowDayCount 当天发送次数 - NowDayCount(ctx context.Context, event, email string) (count int, err error) - // VerifyCode 效验验证码 - VerifyCode(ctx context.Context, in *sysin.VerifyEmsCodeInp) (err error) + // List 获取服务许可证列表 + List(ctx context.Context, in *sysin.ServeLicenseListInp) (list []*sysin.ServeLicenseListModel, totalCount int, err error) + // Export 导出服务许可证 + Export(ctx context.Context, in *sysin.ServeLicenseListInp) (err error) + // Edit 修改/新增服务许可证 + Edit(ctx context.Context, in *sysin.ServeLicenseEditInp) (err error) + // Delete 删除服务许可证 + Delete(ctx context.Context, in *sysin.ServeLicenseDeleteInp) (err error) + // View 获取服务许可证指定信息 + View(ctx context.Context, in *sysin.ServeLicenseViewInp) (res *sysin.ServeLicenseViewModel, err error) + // Status 更新服务许可证状态 + Status(ctx context.Context, in *sysin.ServeLicenseStatusInp) (err error) + // AssignRouter 分配服务许可证路由 + AssignRouter(ctx context.Context, in *sysin.ServeLicenseAssignRouterInp) (err error) } ) var ( - localSysCron ISysCron localSysCronGroup ISysCronGroup - localSysDictType ISysDictType - localSysLog ISysLog localSysLoginLog ISysLoginLog localSysProvinces ISysProvinces - localSysAttachment ISysAttachment - localSysConfig ISysConfig localSysServeLicense ISysServeLicense - localSysSmsLog ISysSmsLog - localSysDictData ISysDictData - localSysGenCodes ISysGenCodes - localSysAddons ISysAddons - localSysAddonsConfig ISysAddonsConfig localSysEmsLog ISysEmsLog + localSysAddons ISysAddons + localSysAttachment ISysAttachment + localSysDictData ISysDictData localSysServeLog ISysServeLog + localSysAddonsConfig ISysAddonsConfig localSysBlacklist ISysBlacklist + localSysConfig ISysConfig + localSysCron ISysCron localSysCurdDemo ISysCurdDemo + localSysDictType ISysDictType + localSysGenCodes ISysGenCodes + localSysLog ISysLog + localSysSmsLog ISysSmsLog ) -func SysDictData() ISysDictData { - if localSysDictData == nil { - panic("implement not found for interface ISysDictData, forgot register?") - } - return localSysDictData -} - -func RegisterSysDictData(i ISysDictData) { - localSysDictData = i -} - -func SysGenCodes() ISysGenCodes { - if localSysGenCodes == nil { - panic("implement not found for interface ISysGenCodes, forgot register?") - } - return localSysGenCodes -} - -func RegisterSysGenCodes(i ISysGenCodes) { - localSysGenCodes = i -} - -func SysSmsLog() ISysSmsLog { - if localSysSmsLog == nil { - panic("implement not found for interface ISysSmsLog, forgot register?") - } - return localSysSmsLog -} - -func RegisterSysSmsLog(i ISysSmsLog) { - localSysSmsLog = i -} - -func SysAddons() ISysAddons { - if localSysAddons == nil { - panic("implement not found for interface ISysAddons, forgot register?") - } - return localSysAddons -} - -func RegisterSysAddons(i ISysAddons) { - localSysAddons = i -} - -func SysAddonsConfig() ISysAddonsConfig { - if localSysAddonsConfig == nil { - panic("implement not found for interface ISysAddonsConfig, forgot register?") - } - return localSysAddonsConfig -} - -func RegisterSysAddonsConfig(i ISysAddonsConfig) { - localSysAddonsConfig = i -} - -func SysServeLog() ISysServeLog { - if localSysServeLog == nil { - panic("implement not found for interface ISysServeLog, forgot register?") - } - return localSysServeLog -} - -func RegisterSysServeLog(i ISysServeLog) { - localSysServeLog = i -} - -func SysBlacklist() ISysBlacklist { - if localSysBlacklist == nil { - panic("implement not found for interface ISysBlacklist, forgot register?") - } - return localSysBlacklist -} - -func RegisterSysBlacklist(i ISysBlacklist) { - localSysBlacklist = i -} - -func SysCurdDemo() ISysCurdDemo { - if localSysCurdDemo == nil { - panic("implement not found for interface ISysCurdDemo, forgot register?") - } - return localSysCurdDemo -} - -func RegisterSysCurdDemo(i ISysCurdDemo) { - localSysCurdDemo = i -} - -func SysEmsLog() ISysEmsLog { - if localSysEmsLog == nil { - panic("implement not found for interface ISysEmsLog, forgot register?") - } - return localSysEmsLog -} - -func RegisterSysEmsLog(i ISysEmsLog) { - localSysEmsLog = i -} - -func SysCronGroup() ISysCronGroup { - if localSysCronGroup == nil { - panic("implement not found for interface ISysCronGroup, forgot register?") - } - return localSysCronGroup -} - -func RegisterSysCronGroup(i ISysCronGroup) { - localSysCronGroup = i -} - -func SysDictType() ISysDictType { - if localSysDictType == nil { - panic("implement not found for interface ISysDictType, forgot register?") - } - return localSysDictType -} - -func RegisterSysDictType(i ISysDictType) { - localSysDictType = i -} - -func SysLog() ISysLog { - if localSysLog == nil { - panic("implement not found for interface ISysLog, forgot register?") - } - return localSysLog -} - -func RegisterSysLog(i ISysLog) { - localSysLog = i -} - func SysLoginLog() ISysLoginLog { if localSysLoginLog == nil { panic("implement not found for interface ISysLoginLog, forgot register?") @@ -528,6 +396,39 @@ func RegisterSysProvinces(i ISysProvinces) { localSysProvinces = i } +func SysServeLicense() ISysServeLicense { + if localSysServeLicense == nil { + panic("implement not found for interface ISysServeLicense, forgot register?") + } + return localSysServeLicense +} + +func RegisterSysServeLicense(i ISysServeLicense) { + localSysServeLicense = i +} + +func SysCronGroup() ISysCronGroup { + if localSysCronGroup == nil { + panic("implement not found for interface ISysCronGroup, forgot register?") + } + return localSysCronGroup +} + +func RegisterSysCronGroup(i ISysCronGroup) { + localSysCronGroup = i +} + +func SysEmsLog() ISysEmsLog { + if localSysEmsLog == nil { + panic("implement not found for interface ISysEmsLog, forgot register?") + } + return localSysEmsLog +} + +func RegisterSysEmsLog(i ISysEmsLog) { + localSysEmsLog = i +} + func SysAttachment() ISysAttachment { if localSysAttachment == nil { panic("implement not found for interface ISysAttachment, forgot register?") @@ -539,6 +440,50 @@ func RegisterSysAttachment(i ISysAttachment) { localSysAttachment = i } +func SysDictData() ISysDictData { + if localSysDictData == nil { + panic("implement not found for interface ISysDictData, forgot register?") + } + return localSysDictData +} + +func RegisterSysDictData(i ISysDictData) { + localSysDictData = i +} + +func SysServeLog() ISysServeLog { + if localSysServeLog == nil { + panic("implement not found for interface ISysServeLog, forgot register?") + } + return localSysServeLog +} + +func RegisterSysServeLog(i ISysServeLog) { + localSysServeLog = i +} + +func SysAddons() ISysAddons { + if localSysAddons == nil { + panic("implement not found for interface ISysAddons, forgot register?") + } + return localSysAddons +} + +func RegisterSysAddons(i ISysAddons) { + localSysAddons = i +} + +func SysBlacklist() ISysBlacklist { + if localSysBlacklist == nil { + panic("implement not found for interface ISysBlacklist, forgot register?") + } + return localSysBlacklist +} + +func RegisterSysBlacklist(i ISysBlacklist) { + localSysBlacklist = i +} + func SysConfig() ISysConfig { if localSysConfig == nil { panic("implement not found for interface ISysConfig, forgot register?") @@ -561,13 +506,68 @@ func RegisterSysCron(i ISysCron) { localSysCron = i } -func SysServeLicense() ISysServeLicense { - if localSysServeLicense == nil { - panic("implement not found for interface ISysServeLicense, forgot register?") +func SysCurdDemo() ISysCurdDemo { + if localSysCurdDemo == nil { + panic("implement not found for interface ISysCurdDemo, forgot register?") } - return localSysServeLicense + return localSysCurdDemo } -func RegisterSysServeLicense(i ISysServeLicense) { - localSysServeLicense = i +func RegisterSysCurdDemo(i ISysCurdDemo) { + localSysCurdDemo = i +} + +func SysDictType() ISysDictType { + if localSysDictType == nil { + panic("implement not found for interface ISysDictType, forgot register?") + } + return localSysDictType +} + +func RegisterSysDictType(i ISysDictType) { + localSysDictType = i +} + +func SysGenCodes() ISysGenCodes { + if localSysGenCodes == nil { + panic("implement not found for interface ISysGenCodes, forgot register?") + } + return localSysGenCodes +} + +func RegisterSysGenCodes(i ISysGenCodes) { + localSysGenCodes = i +} + +func SysLog() ISysLog { + if localSysLog == nil { + panic("implement not found for interface ISysLog, forgot register?") + } + return localSysLog +} + +func RegisterSysLog(i ISysLog) { + localSysLog = i +} + +func SysAddonsConfig() ISysAddonsConfig { + if localSysAddonsConfig == nil { + panic("implement not found for interface ISysAddonsConfig, forgot register?") + } + return localSysAddonsConfig +} + +func RegisterSysAddonsConfig(i ISysAddonsConfig) { + localSysAddonsConfig = i +} + +func SysSmsLog() ISysSmsLog { + if localSysSmsLog == nil { + panic("implement not found for interface ISysSmsLog, forgot register?") + } + return localSysSmsLog +} + +func RegisterSysSmsLog(i ISysSmsLog) { + localSysSmsLog = i } diff --git a/server/manifest/config/config.example.yaml b/server/manifest/config/config.example.yaml index 33fd84f..48f1048 100644 --- a/server/manifest/config/config.example.yaml +++ b/server/manifest/config/config.example.yaml @@ -155,7 +155,7 @@ router: # 前缀 prefix: "/api" # 不需要验证登录的路由地址 - exceptPath: [] + exceptLogin: [] # websocket websocket: # 前缀 @@ -167,7 +167,7 @@ router: # 前缀 prefix: "/home" # 不需要验证登录的路由地址 - exceptPath: [] + exceptLogin: [] #缓存 @@ -263,7 +263,7 @@ hggen: webApiPath: "../web/src/api" # webApi生成路径 webViewsPath : "../web/src/views" # web页面生成路径 - # 默认的插件包模板 + # 默认的插件包模板,{$name}会自动替换成实际的插件名称 - group: "addon" # 分组名称 isAddon: true # 是否为插件模板 false|true masterPackage: "sys" # 主包名称,需和controllerPath、logicPath、inputPath保持关联 diff --git a/web/package.json b/web/package.json index 67d0c81..f9514e5 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "hotgo", - "version": "2.8.9", + "version": "2.9.3", "author": { "name": "MengShuai", "email": "133814250@qq.com", diff --git a/web/src/views/curdDemo/edit.vue b/web/src/views/curdDemo/edit.vue index 0b1a9fd..f2f8bd6 100644 --- a/web/src/views/curdDemo/edit.vue +++ b/web/src/views/curdDemo/edit.vue @@ -15,7 +15,7 @@ :rules="rules" ref="formRef" label-placement="left" - :label-width="80" + :label-width="100" class="py-4" > diff --git a/web/src/views/curdDemo/index.vue b/web/src/views/curdDemo/index.vue index c48891b..59d8355 100644 --- a/web/src/views/curdDemo/index.vue +++ b/web/src/views/curdDemo/index.vue @@ -1,11 +1,11 @@