From 2fd3854aeb728ada899a04b6d43e84ee072b41fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E5=B8=85?= <133814250@qq.com>
Date: Wed, 27 Nov 2024 18:44:19 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83v2.15.11=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
---
README.md | 6 +-
docs/guide-zh-CN/start-update-log.md | 9 ++
server/api/admin/testcategory/testcategory.go | 4 +-
server/go.mod | 32 ++--
server/go.sum | 64 ++++----
server/internal/consts/version.go | 2 +-
.../controller/admin/sys/test_category.go | 4 +-
.../internal/library/addons/build_layout.go | 2 +-
server/internal/library/cron/cron_gen.go | 2 +
server/internal/library/dict/dict_option.go | 23 +++
.../library/hggen/internal/cmd/cmd.go | 2 +-
.../library/hggen/internal/cmd/cmd_build.go | 11 +-
.../library/hggen/internal/cmd/cmd_doc.go | 30 ++--
.../library/hggen/internal/cmd/cmd_run.go | 8 +-
.../library/hggen/internal/cmd/cmd_up.go | 2 +-
.../internal/cmd/cmd_z_unit_gen_dao_test.go | 148 ++++++++++++++++++
.../internal/cmd/cmd_z_unit_gen_pb_test.go | 50 ++++++
.../cmd/cmd_z_unit_gen_service_test.go | 92 ++++++++++-
.../hggen/internal/cmd/genctrl/genctrl.go | 2 +-
.../cmd/genctrl/genctrl_generate_ctrl.go | 8 +-
.../genctrl/genctrl_generate_ctrl_clear.go | 2 +-
.../cmd/genctrl/genctrl_generate_interface.go | 2 +-
.../cmd/genctrl/genctrl_generate_sdk.go | 8 +-
.../hggen/internal/cmd/gendao/gendao.go | 8 +-
.../hggen/internal/cmd/gendao/gendao_clear.go | 2 +-
.../hggen/internal/cmd/gendao/gendao_dao.go | 12 +-
.../hggen/internal/cmd/gendao/gendao_do.go | 6 +-
.../internal/cmd/gendao/gendao_entity.go | 6 +-
.../internal/cmd/gendao/gendao_structure.go | 41 ++++-
.../library/hggen/internal/cmd/genpb/genpb.go | 3 +
.../hggen/internal/cmd/genpb/genpb_tag.go | 9 +-
.../internal/cmd/genpbentity/genpbentity.go | 2 +-
.../internal/cmd/genservice/genservice.go | 6 +-
.../cmd/genservice/genservice_ast_parse.go | 37 ++++-
.../internal/packed/template-mono-app.go | 2 +-
.../hggen/internal/packed/template-mono.go | 2 +-
.../hggen/internal/packed/template-single.go | 2 +-
.../hggen/internal/utility/utils/utils.go | 16 +-
server/internal/logic/admin/member.go | 2 +-
server/internal/logic/sys/option_tree_demo.go | 3 +-
server/internal/logic/sys/test_category.go | 6 +-
.../model/input/sysin/test_category.go | 4 +-
.../router/genrouter/test_category.go | 4 +-
.../default/curd/web.index.vue.template | 4 +-
web/package.json | 2 +-
web/src/styles/common.less | 9 +-
web/src/utils/urlUtils.ts | 16 ++
.../views/addons/hgexample/config/system.vue | 2 +-
.../views/addons/hgexample/portal/index.vue | 2 +-
.../addons/hgexample/treeTable/index.vue | 6 +-
web/src/views/apply/provinces/index.vue | 6 +-
web/src/views/asset/cash/index.vue | 6 +-
web/src/views/asset/recharge/recharge.vue | 2 +-
web/src/views/asset/rechargeLog/index.vue | 5 +-
web/src/views/dashboard/console/console.vue | 2 +-
.../views/dashboard/workplace/workplace.vue | 2 +-
web/src/views/develop/code/deploy.vue | 2 +-
web/src/views/home/account/account.vue | 4 +-
web/src/views/monitor/online/index.vue | 5 +-
web/src/views/optionTreeDemo/index.vue | 4 +-
web/src/views/org/dept/dept.vue | 7 +-
web/src/views/org/user/user.vue | 5 +-
web/src/views/permission/menu/menu.vue | 5 +-
web/src/views/permission/role/role.vue | 2 +-
web/src/views/system/config/system.vue | 25 ++-
web/src/views/system/dict/index.vue | 6 +-
web/src/views/testCategory/edit.vue | 55 +++----
web/src/views/testCategory/index.vue | 4 +-
web/src/views/testCategory/model.ts | 27 +---
69 files changed, 656 insertions(+), 245 deletions(-)
create mode 100644 server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_pb_test.go
diff --git a/README.md b/README.md
index add98f3..fd16d72 100644
--- a/README.md
+++ b/README.md
@@ -6,19 +6,19 @@
-
+
-
+
-
+
diff --git a/docs/guide-zh-CN/start-update-log.md b/docs/guide-zh-CN/start-update-log.md
index 6235ca9..edda09c 100644
--- a/docs/guide-zh-CN/start-update-log.md
+++ b/docs/guide-zh-CN/start-update-log.md
@@ -11,6 +11,15 @@
> 如果升级(覆盖)代码后打开会出现 sql 报错, 请检查更新的数据库格式或自行调整
+### v2.15.11
+updated 2024.11.27
+
+- 增加:增加配置管理子页面选项参数记忆
+- 修复:修复定时任务中日志配置的读取并发读问题
+- 优化:gf版本升级到v2.8.2
+- 优化:优化数据卡片展示
+
+
### v2.15.7
updated 2024.7.21
diff --git a/server/api/admin/testcategory/testcategory.go b/server/api/admin/testcategory/testcategory.go
index 75bf06b..7a8eca3 100644
--- a/server/api/admin/testcategory/testcategory.go
+++ b/server/api/admin/testcategory/testcategory.go
@@ -3,7 +3,7 @@
// @Copyright Copyright (c) 2024 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
-// @AutoGenerate Version 2.15.1
+// @AutoGenerate Version 2.15.7
package testcategory
import (
@@ -66,4 +66,4 @@ type StatusReq struct {
sysin.TestCategoryStatusInp
}
-type StatusRes struct{}
\ No newline at end of file
+type StatusRes struct{}
diff --git a/server/go.mod b/server/go.mod
index f0cf508..43f37c1 100644
--- a/server/go.mod
+++ b/server/go.mod
@@ -14,10 +14,10 @@ require (
github.com/forgoer/openssl v1.6.0
github.com/go-pay/crypto v0.0.1
github.com/go-pay/gopay v1.5.104
- github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.2
- github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.2
- github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.2
- github.com/gogf/gf/v2 v2.7.2
+ github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.1
+ github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.1
+ github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.4
+ github.com/gogf/gf/v2 v2.8.1
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f
github.com/golang-jwt/jwt/v5 v5.2.1
github.com/gorilla/websocket v1.5.3
@@ -33,9 +33,9 @@ require (
github.com/tencentyun/cos-go-sdk-v5 v0.7.54
github.com/ufilesdk-dev/ufile-gosdk v1.0.4
github.com/xuri/excelize/v2 v2.6.0
- go.opentelemetry.io/otel v1.29.0
+ go.opentelemetry.io/otel v1.32.0
golang.org/x/mod v0.20.0
- golang.org/x/net v0.28.0
+ golang.org/x/net v0.31.0
golang.org/x/tools v0.24.0
gopkg.in/yaml.v3 v3.0.1
)
@@ -64,9 +64,9 @@ require (
github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect
github.com/eapache/queue v1.1.0 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
- github.com/fatih/color v1.17.0 // indirect
+ github.com/fatih/color v1.18.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
- github.com/fsnotify/fsnotify v1.7.0 // indirect
+ github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
@@ -114,7 +114,7 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
- github.com/redis/go-redis/v9 v9.6.1 // indirect
+ github.com/redis/go-redis/v9 v9.7.0 // indirect
github.com/richardlehane/mscfb v1.0.4 // indirect
github.com/richardlehane/msoleps v1.0.3 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
@@ -132,15 +132,15 @@ require (
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
- go.opentelemetry.io/otel/metric v1.29.0 // indirect
- go.opentelemetry.io/otel/sdk v1.29.0 // indirect
- go.opentelemetry.io/otel/trace v1.29.0 // indirect
+ go.opentelemetry.io/otel/metric v1.32.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.32.0 // indirect
+ go.opentelemetry.io/otel/trace v1.32.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
- golang.org/x/crypto v0.26.0 // indirect
+ golang.org/x/crypto v0.29.0 // indirect
golang.org/x/image v0.19.0 // indirect
- golang.org/x/sync v0.8.0 // indirect
- golang.org/x/sys v0.24.0 // indirect
- golang.org/x/text v0.17.0 // indirect
+ golang.org/x/sync v0.9.0 // indirect
+ golang.org/x/sys v0.27.0 // indirect
+ golang.org/x/text v0.20.0 // indirect
golang.org/x/time v0.6.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
diff --git a/server/go.sum b/server/go.sum
index 52cbd2c..1f69c6f 100644
--- a/server/go.sum
+++ b/server/go.sum
@@ -110,8 +110,8 @@ github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FM
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
-github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/forgoer/openssl v1.6.0 h1:IueL+UfH0hKo99xFPojHLlO3QzRBQqFY+Cht0WwtOC0=
@@ -122,8 +122,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
-github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
+github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
@@ -162,14 +162,14 @@ github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PU
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
-github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.2 h1:GpE2JuHVoNJD4lNP1omC1+TKXNCSvXr5oil1bNULYd0=
-github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.2/go.mod h1:0h3UmNAmA8hnjvTyozZelSWWxiAjGDQttzZqMhkCkJo=
-github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.2 h1:V1hdGnyjU9kT0I3DDDFDl6Ll8yC6aAIFJa/lMQwB8V4=
-github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.2/go.mod h1:XzkPv3G8TdKczqoB/ydR3bxvBRdQLQNCOCEgxso/c3o=
-github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.2 h1:YKMJMhJJjbaPhgjpH9veZpn80mwkPgPAIatSvUFTt38=
-github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.2/go.mod h1:kzxWAaY5Livk2SNPNrs9PJJvxK8A7uVwd8UGwjdMEfU=
-github.com/gogf/gf/v2 v2.7.2 h1:uZDfyblasI12lZUtFd1mfxsIr8b14cd/F88DJUTCSDM=
-github.com/gogf/gf/v2 v2.7.2/go.mod h1:EBXneAg/wes86rfeh68XC0a2JBNQylmT7Sp6/8Axk88=
+github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.1 h1:jbaPawkb8qmaYzrmBDbTa8Zkhzacq1RBOZw+qRJExI4=
+github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.1/go.mod h1:s2aI1fV9AvKi4NtMpv3pV0EHtazkvfUNVQmzapr7UJQ=
+github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.1 h1:1vPFyN0GLv24JD3WGhvKzXvKG+fmuixDTawbtfzCzRQ=
+github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.1/go.mod h1:IWyGxzplp06tRc6Ah/eCLuBntnKSw9sn1maH0vzPPtw=
+github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.4 h1:JnUjXb7C9vmwcZFwXqnxi9H4/I0rir9LmRryIX7xNds=
+github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.4/go.mod h1:A3NhV8u45twLq5VdqObhYNhT4szLFLCROw4LzHM+lYg=
+github.com/gogf/gf/v2 v2.8.1 h1:1oVQg3G5OgCats4qWFTH3pHLe92nfUQeUDta05tUs1g=
+github.com/gogf/gf/v2 v2.8.1/go.mod h1:6iYuZZ+A0ZcH8+4MDS/P0SvTPCvKzRvyAsY1kbkJYJc=
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f h1:7xfXR/BhG3JDqO1s45n65Oyx9t4E/UqDOXep6jXdLCM=
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f/go.mod h1:HnYoio6S7VaFJdryKcD/r9HgX+4QzYfr00XiXUo/xz0=
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
@@ -344,8 +344,8 @@ github.com/qiniu/go-sdk/v7 v7.21.1/go.mod h1:8EM2awITynlem2VML2dXGHkMYP2UyECsGLO
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.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4=
-github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
+github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
+github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
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/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
@@ -440,16 +440,16 @@ github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRF
github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
-go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw=
-go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8=
+go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
+go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
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.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc=
-go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8=
-go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo=
-go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok=
-go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4=
-go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ=
+go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M=
+go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
+go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4=
+go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU=
+go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
+go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
@@ -468,8 +468,8 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
-golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
+golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
+golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk=
@@ -511,8 +511,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
-golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
+golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
+golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -523,8 +523,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
+golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -559,8 +559,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
-golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
+golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
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=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -579,8 +579,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
-golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
+golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/server/internal/consts/version.go b/server/internal/consts/version.go
index d0ed678..b7ef1d8 100644
--- a/server/internal/consts/version.go
+++ b/server/internal/consts/version.go
@@ -7,5 +7,5 @@ package consts
// VersionApp HotGo版本
const (
- VersionApp = "2.15.7"
+ VersionApp = "2.15.11"
)
diff --git a/server/internal/controller/admin/sys/test_category.go b/server/internal/controller/admin/sys/test_category.go
index d761e0f..72213f3 100644
--- a/server/internal/controller/admin/sys/test_category.go
+++ b/server/internal/controller/admin/sys/test_category.go
@@ -3,7 +3,7 @@
// @Copyright Copyright (c) 2024 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
-// @AutoGenerate Version 2.15.1
+// @AutoGenerate Version 2.15.7
package sys
import (
@@ -76,4 +76,4 @@ func (c *cTestCategory) Delete(ctx context.Context, req *testcategory.DeleteReq)
func (c *cTestCategory) Status(ctx context.Context, req *testcategory.StatusReq) (res *testcategory.StatusRes, err error) {
err = service.SysTestCategory().Status(ctx, &req.TestCategoryStatusInp)
return
-}
\ No newline at end of file
+}
diff --git a/server/internal/library/addons/build_layout.go b/server/internal/library/addons/build_layout.go
index c10e82a..dd85e96 100644
--- a/server/internal/library/addons/build_layout.go
+++ b/server/internal/library/addons/build_layout.go
@@ -113,7 +113,7 @@ export function updateConfig(params) {
webConfigSystem = `
-
+
0 && customSystems[0] != "all" && !gstr.InArray(customSystems, system) {
continue
diff --git a/server/internal/library/hggen/internal/cmd/cmd_doc.go b/server/internal/library/hggen/internal/cmd/cmd_doc.go
index 9b0ba9d..08f8257 100644
--- a/server/internal/library/hggen/internal/cmd/cmd_doc.go
+++ b/server/internal/library/hggen/internal/cmd/cmd_doc.go
@@ -8,6 +8,7 @@ package cmd
import (
"context"
+ "fmt"
"io"
"net/http"
"os"
@@ -22,8 +23,12 @@ import (
)
const (
+ GitName = "gf-site"
+ BranchName = "gh-pages"
+
+ SiteFileName = GitName + "-" + BranchName
// DocURL is the download address of the document
- DocURL = "https://github.com/gogf/gf/archive/refs/heads/gh-pages.zip"
+ DocURL = "https://github.com/gogf/" + GitName + "/archive/refs/heads/" + BranchName + ".zip"
)
var (
@@ -70,12 +75,13 @@ func (c cDoc) Index(ctx context.Context, in cDocInput) (out *cDocOutput, err err
mlog.Print("Failed to download document:", err)
return
}
- s := g.Server()
- s.SetServerRoot(docs.DocDir)
- s.SetPort(in.Port)
- s.SetDumpRouterMap(false)
- mlog.Printf("Access address http://127.0.0.1:%d", in.Port)
- s.Run()
+
+ http.Handle("/", http.FileServer(http.Dir(docs.DocDir)))
+ mlog.Printf("Access address http://127.0.0.1:%d in %s", in.Port, docs.DocDir)
+ err = http.ListenAndServe(fmt.Sprintf(":%d", in.Port), nil)
+ if err != nil {
+ return nil, err
+ }
return
}
@@ -89,7 +95,7 @@ type DocSetting struct {
// NewDocSetting new DocSetting
func NewDocSetting(ctx context.Context, in cDocInput) *DocSetting {
- fileName := "gf-doc-md.zip"
+ fileName := SiteFileName + ".zip"
tempDir := in.Path
if tempDir == "" {
tempDir = gfile.Temp("goframe/docs")
@@ -99,17 +105,17 @@ func NewDocSetting(ctx context.Context, in cDocInput) *DocSetting {
return &DocSetting{
TempDir: filepath.FromSlash(tempDir),
- DocDir: filepath.FromSlash(path.Join(tempDir, "gf-gh-pages")),
+ DocDir: filepath.FromSlash(path.Join(tempDir, SiteFileName)),
DocURL: in.Proxy + DocURL,
DocZipFile: filepath.FromSlash(path.Join(tempDir, fileName)),
}
}
-// Clean clean the temporary directory
+// Clean cleans the temporary directory
func (d *DocSetting) Clean() error {
if _, err := os.Stat(d.TempDir); err == nil {
- err = gfile.Remove(d.TempDir)
+ err = gfile.RemoveAll(d.TempDir)
if err != nil {
mlog.Print("Failed to delete temporary directory:", err)
return err
@@ -168,7 +174,7 @@ func (d *DocSetting) DownloadDoc() error {
err := gcompress.UnZipFile(d.DocZipFile, d.TempDir)
if err != nil {
mlog.Print("Failed to unzip the file, please run again:", err)
- gfile.Remove(d.DocZipFile)
+ _ = gfile.RemoveFile(d.DocZipFile)
return err
}
diff --git a/server/internal/library/hggen/internal/cmd/cmd_run.go b/server/internal/library/hggen/internal/cmd/cmd_run.go
index 4d274ca..d11c03e 100644
--- a/server/internal/library/hggen/internal/cmd/cmd_run.go
+++ b/server/internal/library/hggen/internal/cmd/cmd_run.go
@@ -93,6 +93,12 @@ type (
)
func (c cRun) Index(ctx context.Context, in cRunInput) (out *cRunOutput, err error) {
+ if !gfile.Exists(in.File) {
+ mlog.Fatalf(`given file "%s" not found`, in.File)
+ }
+ if !gfile.IsFile(in.File) {
+ mlog.Fatalf(`given "%s" is not a file`, in.File)
+ }
// Necessary check.
if gproc.SearchBinary("go") == "" {
mlog.Fatalf(`command "go" not found in your environment, please install golang first to proceed this command`)
@@ -205,7 +211,7 @@ func (app *cRunApp) End(ctx context.Context, sig os.Signal, outputPath string) {
mlog.Debugf("kill process error: %s", err.Error())
}
}
- if err := gfile.Remove(outputPath); err != nil {
+ if err := gfile.RemoveFile(outputPath); err != nil {
mlog.Printf("delete binary file error: %s", err.Error())
} else {
mlog.Printf("deleted binary file: %s", outputPath)
diff --git a/server/internal/library/hggen/internal/cmd/cmd_up.go b/server/internal/library/hggen/internal/cmd/cmd_up.go
index aa49d1d..8c8efeb 100644
--- a/server/internal/library/hggen/internal/cmd/cmd_up.go
+++ b/server/internal/library/hggen/internal/cmd/cmd_up.go
@@ -192,7 +192,7 @@ func (c cUp) doUpgradeCLI(ctx context.Context) (err error) {
defer func() {
mlog.Printf(`new version cli binary is successfully installed to "%s"`, gfile.SelfPath())
mlog.Printf(`remove temporary buffer file "%s"`, localSaveFilePath)
- _ = gfile.Remove(localSaveFilePath)
+ _ = gfile.RemoveFile(localSaveFilePath)
}()
// It fails if file not exist or its size is less than 1MB.
diff --git a/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_dao_test.go b/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_dao_test.go
index 6525dc2..4947c79 100644
--- a/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_dao_test.go
+++ b/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_dao_test.go
@@ -691,3 +691,151 @@ func Test_Gen_Dao_Issue3459(t *testing.T) {
}
})
}
+
+// https://github.com/gogf/gf/issues/3749
+func Test_Gen_Dao_Issue3749(t *testing.T) {
+ gtest.C(t, func(t *gtest.T) {
+ var (
+ err error
+ db = testDB
+ table = "table_user"
+ sqlContent = fmt.Sprintf(
+ gtest.DataContent(`issue`, `3749`, `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,
+ Group: group,
+ }
+ )
+
+ 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{
+ filepath.FromSlash(path + "/dao/internal/table_user.go"),
+ filepath.FromSlash(path + "/dao/table_user.go"),
+ filepath.FromSlash(path + "/model/do/table_user.go"),
+ filepath.FromSlash(path + "/model/entity/table_user.go"),
+ })
+ // content
+ testPath := gtest.DataPath(`issue`, `3749`)
+ expectFiles := []string{
+ filepath.FromSlash(testPath + "/dao/internal/table_user.go"),
+ filepath.FromSlash(testPath + "/dao/table_user.go"),
+ filepath.FromSlash(testPath + "/model/do/table_user.go"),
+ filepath.FromSlash(testPath + "/model/entity/table_user.go"),
+ }
+ for i, _ := range files {
+ t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i]))
+ }
+ })
+}
+
+func Test_Gen_Dao_Sqlite3(t *testing.T) {
+ gtest.C(t, func(t *gtest.T) {
+ var (
+ err error
+ table = "table_user"
+ path = gfile.Temp(guid.S())
+ linkSqlite3 = fmt.Sprintf("sqlite::@file(%s/db.sqlite3)", path)
+ sqlContent = fmt.Sprintf(
+ gtest.DataContent(`gendao`, `sqlite3`, `user.sqlite3.sql`),
+ table,
+ )
+ )
+ err = gfile.Mkdir(path)
+ t.AssertNil(err)
+ defer gfile.Remove(path)
+
+ dbSqlite3, err := gdb.New(gdb.ConfigNode{
+ Link: linkSqlite3,
+ })
+ t.AssertNil(err)
+
+ array := gstr.SplitAndTrim(sqlContent, ";")
+ for _, v := range array {
+ if v == "" {
+ continue
+ }
+ if _, err = dbSqlite3.Exec(ctx, v); err != nil {
+ t.AssertNil(err)
+ }
+ }
+
+ var (
+ group = "test"
+ in = gendao.CGenDaoInput{
+ Path: path,
+ Link: linkSqlite3,
+ Group: group,
+ Tables: table,
+ }
+ )
+ err = gutil.FillStructWithDefault(&in)
+ 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{
+ filepath.FromSlash(path + "/dao/internal/table_user.go"),
+ filepath.FromSlash(path + "/dao/table_user.go"),
+ filepath.FromSlash(path + "/model/do/table_user.go"),
+ filepath.FromSlash(path + "/model/entity/table_user.go"),
+ })
+ // content
+ testPath := gtest.DataPath("gendao", "generated_user_sqlite3")
+ expectFiles := []string{
+ filepath.FromSlash(testPath + "/dao/internal/table_user.go"),
+ filepath.FromSlash(testPath + "/dao/table_user.go"),
+ filepath.FromSlash(testPath + "/model/do/table_user.go"),
+ filepath.FromSlash(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/cmd_z_unit_gen_pb_test.go b/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_pb_test.go
new file mode 100644
index 0000000..882efe3
--- /dev/null
+++ b/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_pb_test.go
@@ -0,0 +1,50 @@
+// 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 (
+ "path/filepath"
+ "testing"
+
+ "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"
+ "hotgo/internal/library/hggen/internal/cmd/genpb"
+)
+
+func TestGenPbIssue3882(t *testing.T) {
+ gtest.C(t, func(t *gtest.T) {
+ var (
+ outputPath = gfile.Temp(guid.S())
+ outputApiPath = filepath.Join(outputPath, "api")
+ outputCtrlPath = filepath.Join(outputPath, "controller")
+
+ protobufFolder = gtest.DataPath("issue", "3882")
+ in = genpb.CGenPbInput{
+ Path: protobufFolder,
+ OutputApi: outputApiPath,
+ OutputCtrl: outputCtrlPath,
+ }
+ err error
+ )
+ err = gfile.Mkdir(outputApiPath)
+ t.AssertNil(err)
+ err = gfile.Mkdir(outputCtrlPath)
+ t.AssertNil(err)
+ defer gfile.Remove(outputPath)
+
+ _, err = genpb.CGenPb{}.Pb(ctx, in)
+ t.AssertNil(err)
+
+ var (
+ genContent = gfile.GetContents(filepath.Join(outputApiPath, "issue3882.pb.go"))
+ exceptText = `dc:"Some comment on field with 'one' 'two' 'three' in the comment."`
+ )
+ t.Assert(gstr.Contains(genContent, exceptText), true)
+ })
+}
diff --git a/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_service_test.go b/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_service_test.go
index 47f9fcf..c503706 100644
--- a/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_service_test.go
+++ b/server/internal/library/hggen/internal/cmd/cmd_z_unit_gen_service_test.go
@@ -22,9 +22,9 @@ func Test_Gen_Service_Default(t *testing.T) {
var (
path = gfile.Temp(guid.S())
dstFolder = path + filepath.FromSlash("/service")
- apiFolder = gtest.DataPath("genservice", "logic")
+ srvFolder = gtest.DataPath("genservice", "logic")
in = genservice.CGenServiceInput{
- SrcFolder: apiFolder,
+ SrcFolder: srvFolder,
DstFolder: dstFolder,
DstFileNameCase: "Snake",
WatchFile: "",
@@ -46,11 +46,11 @@ func Test_Gen_Service_Default(t *testing.T) {
// logic file
var (
- genApi = apiFolder + filepath.FromSlash("/logic.go")
- genApiExpect = apiFolder + filepath.FromSlash("/logic_expect.go")
+ genSrv = srvFolder + filepath.FromSlash("/logic.go")
+ genSrvExpect = srvFolder + filepath.FromSlash("/logic_expect.go")
)
- defer gfile.Remove(genApi)
- t.Assert(gfile.GetContents(genApi), gfile.GetContents(genApiExpect))
+ defer gfile.Remove(genSrv)
+ t.Assert(gfile.GetContents(genSrv), gfile.GetContents(genSrvExpect))
// files
files, err := gfile.ScanDir(dstFolder, "*.go", true)
@@ -73,3 +73,83 @@ func Test_Gen_Service_Default(t *testing.T) {
}
})
}
+
+// https://github.com/gogf/gf/issues/3328
+func Test_Issue3328(t *testing.T) {
+ gtest.C(t, func(t *gtest.T) {
+ var (
+ path = gfile.Temp(guid.S())
+ dstFolder = path + filepath.FromSlash("/service")
+ srvFolder = gtest.DataPath("issue", "3328", "logic")
+ logicGoPath = srvFolder + filepath.FromSlash("/logic.go")
+ in = genservice.CGenServiceInput{
+ SrcFolder: srvFolder,
+ DstFolder: dstFolder,
+ DstFileNameCase: "Snake",
+ WatchFile: "",
+ StPattern: "",
+ Packages: nil,
+ ImportPrefix: "",
+ Clear: false,
+ }
+ )
+ gfile.Remove(logicGoPath)
+ defer gfile.Remove(logicGoPath)
+
+ err := gutil.FillStructWithDefault(&in)
+ t.AssertNil(err)
+
+ err = gfile.Mkdir(path)
+ t.AssertNil(err)
+ defer gfile.Remove(path)
+
+ _, err = genservice.CGenService{}.Service(ctx, in)
+ t.AssertNil(err)
+
+ files, err := gfile.ScanDir(srvFolder, "*", true)
+ for _, file := range files {
+ if file == logicGoPath {
+ if gfile.IsDir(logicGoPath) {
+ t.Fatalf("%s should not is folder", logicGoPath)
+ }
+ }
+ }
+ })
+}
+
+// https://github.com/gogf/gf/issues/3835
+func Test_Issue3835(t *testing.T) {
+ gtest.C(t, func(t *gtest.T) {
+ var (
+ path = gfile.Temp(guid.S())
+ dstFolder = path + filepath.FromSlash("/service")
+ srvFolder = gtest.DataPath("issue", "3835", "logic")
+ in = genservice.CGenServiceInput{
+ SrcFolder: srvFolder,
+ DstFolder: dstFolder,
+ DstFileNameCase: "Snake",
+ WatchFile: "",
+ StPattern: "",
+ Packages: nil,
+ ImportPrefix: "",
+ Clear: false,
+ }
+ )
+ err := gutil.FillStructWithDefault(&in)
+ t.AssertNil(err)
+
+ err = gfile.Mkdir(path)
+ t.AssertNil(err)
+ defer gfile.Remove(path)
+
+ _, err = genservice.CGenService{}.Service(ctx, in)
+ t.AssertNil(err)
+
+ // contents
+ var (
+ genFile = dstFolder + filepath.FromSlash("/issue_3835.go")
+ expectFile = gtest.DataPath("issue", "3835", "service", "issue_3835.go")
+ )
+ t.Assert(gfile.GetContents(genFile), gfile.GetContents(expectFile))
+ })
+}
diff --git a/server/internal/library/hggen/internal/cmd/genctrl/genctrl.go b/server/internal/library/hggen/internal/cmd/genctrl/genctrl.go
index e477c3f..5e6ae61 100644
--- a/server/internal/library/hggen/internal/cmd/genctrl/genctrl.go
+++ b/server/internal/library/hggen/internal/cmd/genctrl/genctrl.go
@@ -128,7 +128,7 @@ func (c CGenCtrl) generateByWatchFile(watchFile, sdkPath string, sdkStdVersion,
return
}
}
- defer gfile.Remove(flockFilePath)
+ defer gfile.RemoveFile(flockFilePath)
_ = gfile.PutContents(flockFilePath, gtime.TimestampStr())
// check this updated file is an api file.
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 29e548e..2c54af4 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
@@ -89,7 +89,7 @@ func (c *controllerGenerator) doGenerateCtrlNewByModuleAndVersion(
if err = gfile.PutContents(moduleFilePath, gstr.TrimLeft(content)); err != nil {
return err
}
- mlog.Printf(`generated: %s`, moduleFilePath)
+ mlog.Printf(`generated: %s`, gfile.RealPath(moduleFilePath))
}
if !gfile.Exists(moduleFilePathNew) {
content := gstr.ReplaceByMap(consts.TemplateGenCtrlControllerNewEmpty, g.MapStrStr{
@@ -99,7 +99,7 @@ func (c *controllerGenerator) doGenerateCtrlNewByModuleAndVersion(
if err = gfile.PutContents(moduleFilePathNew, gstr.TrimLeft(content)); err != nil {
return err
}
- mlog.Printf(`generated: %s`, moduleFilePathNew)
+ mlog.Printf(`generated: %s`, gfile.RealPath(moduleFilePathNew))
}
filePaths, err := gfile.ScanDir(dstModuleFolderPath, "*.go", false)
if err != nil {
@@ -161,7 +161,7 @@ func (c *controllerGenerator) doGenerateCtrlItem(dstModuleFolderPath string, ite
return err
}
}
- mlog.Printf(`generated: %s`, methodFilePath)
+ mlog.Printf(`generated: %s`, gfile.RealPath(methodFilePath))
return
}
@@ -221,7 +221,7 @@ func (c *controllerGenerator) doGenerateCtrlMergeItem(dstModuleFolderPath string
if err = gfile.PutContentsAppend(ctrlFilePath, ctrlFileItem.controllers.String()); err != nil {
return err
}
- mlog.Printf(`generated: %s`, ctrlFilePath)
+ mlog.Printf(`generated: %s`, gfile.RealPath(ctrlFilePath))
}
return
}
diff --git a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_ctrl_clear.go b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_ctrl_clear.go
index ee63270..aab8a78 100644
--- a/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_ctrl_clear.go
+++ b/server/internal/library/hggen/internal/cmd/genctrl/genctrl_generate_ctrl_clear.go
@@ -49,7 +49,7 @@ func (c *controllerClearer) doClear(dstModuleFolderPath string, item apiItem) (e
`remove unimplemented and of no api definitions controller file: %s`,
methodFilePath,
)
- err = gfile.Remove(methodFilePath)
+ err = gfile.RemoveFile(methodFilePath)
}
}
return
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 5c0eb6a..29df0e3 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
@@ -94,7 +94,7 @@ func (c *apiInterfaceGenerator) doGenerate(apiModuleFolderPath string, module st
"{Interfaces}": gstr.TrimRightStr(interfaceDefinition, "\n", 2),
}))
err = gfile.PutContents(moduleFilePath, interfaceContent)
- mlog.Printf(`generated: %s`, moduleFilePath)
+ mlog.Printf(`generated: %s`, gfile.RealPath(moduleFilePath))
return
}
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 b5d4e49..8881bac 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
@@ -65,7 +65,7 @@ func (c *apiSdkGenerator) doGenerateSdkPkgFile(sdkFolderPath string) (err error)
"{PkgName}": pkgName,
}))
err = gfile.PutContents(pkgFilePath, fileContent)
- mlog.Printf(`generated: %s`, pkgFilePath)
+ mlog.Printf(`generated: %s`, gfile.RealPath(pkgFilePath))
return
}
@@ -130,9 +130,9 @@ func (c *apiSdkGenerator) doGenerateSdkIClient(
if isDirty {
err = gfile.PutContents(iClientFilePath, fileContent)
if isExist {
- mlog.Printf(`updated: %s`, iClientFilePath)
+ mlog.Printf(`updated: %s`, gfile.RealPath(iClientFilePath))
} else {
- mlog.Printf(`generated: %s`, iClientFilePath)
+ mlog.Printf(`generated: %s`, gfile.RealPath(iClientFilePath))
}
}
return
@@ -183,7 +183,7 @@ func (c *apiSdkGenerator) doGenerateSdkImplementer(
implementerFileContent += "\n"
}
err = gfile.PutContents(implementerFilePath, implementerFileContent)
- mlog.Printf(`generated: %s`, implementerFilePath)
+ mlog.Printf(`generated: %s`, gfile.RealPath(implementerFilePath))
return
}
diff --git a/server/internal/library/hggen/internal/cmd/gendao/gendao.go b/server/internal/library/hggen/internal/cmd/gendao/gendao.go
index cefe31e..8157777 100644
--- a/server/internal/library/hggen/internal/cmd/gendao/gendao.go
+++ b/server/internal/library/hggen/internal/cmd/gendao/gendao.go
@@ -208,9 +208,11 @@ type (
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"`
- FieldMapping map[DBTableFieldName]CustomAttributeType `name:"fieldMapping" short:"fm" brief:"{CGenDaoBriefFieldMapping}" orphan:"true"`
- genItems *CGenDaoInternalGenItems
+ TypeMapping map[DBFieldTypeName]CustomAttributeType `name:"typeMapping" short:"y" brief:"{CGenDaoBriefTypeMapping}" orphan:"true"`
+ FieldMapping map[DBTableFieldName]CustomAttributeType `name:"fieldMapping" short:"fm" brief:"{CGenDaoBriefFieldMapping}" orphan:"true"`
+
+ // internal usage purpose.
+ genItems *CGenDaoInternalGenItems
}
CGenDaoOutput struct{}
diff --git a/server/internal/library/hggen/internal/cmd/gendao/gendao_clear.go b/server/internal/library/hggen/internal/cmd/gendao/gendao_clear.go
index e12327c..ae297e0 100644
--- a/server/internal/library/hggen/internal/cmd/gendao/gendao_clear.go
+++ b/server/internal/library/hggen/internal/cmd/gendao/gendao_clear.go
@@ -40,7 +40,7 @@ func doClearItem(item CGenDaoInternalGenItem, allGeneratedFilePaths []string) {
}
for _, filePath := range generatedFilePaths {
if !gstr.InArray(allGeneratedFilePaths, filePath) {
- if err := gfile.Remove(filePath); err != nil {
+ if err := gfile.RemoveFile(filePath); err != nil {
mlog.Print(err)
}
}
diff --git a/server/internal/library/hggen/internal/cmd/gendao/gendao_dao.go b/server/internal/library/hggen/internal/cmd/gendao/gendao_dao.go
index bc9d388..2b152fa 100644
--- a/server/internal/library/hggen/internal/cmd/gendao/gendao_dao.go
+++ b/server/internal/library/hggen/internal/cmd/gendao/gendao_dao.go
@@ -58,8 +58,8 @@ func generateDaoSingle(ctx context.Context, in generateDaoSingleInput) {
mlog.Fatalf(`fetching tables fields failed for table "%s": %+v`, in.TableName, err)
}
var (
- tableNameCamelCase = gstr.CaseCamel(strings.ToLower(in.NewTableName))
- tableNameCamelLowerCase = gstr.CaseCamelLower(strings.ToLower(in.NewTableName))
+ tableNameCamelCase = formatFieldName(in.NewTableName, FieldNameCaseCamel)
+ tableNameCamelLowerCase = formatFieldName(in.NewTableName, FieldNameCaseCamelLower)
tableNameSnakeCase = gstr.CaseSnake(in.NewTableName)
importPrefix = in.ImportPrefix
)
@@ -123,7 +123,7 @@ func generateDaoIndex(in generateDaoIndexInput) {
mlog.Fatalf("writing content to '%s' failed: %v", path, err)
} else {
utils.GoFmt(path)
- mlog.Print("generated:", path)
+ mlog.Print("generated:", gfile.RealPath(path))
}
}
}
@@ -157,7 +157,7 @@ func generateDaoInternal(in generateDaoInternalInput) {
mlog.Fatalf("writing content to '%s' failed: %v", path, err)
} else {
utils.GoFmt(path)
- mlog.Print("generated:", path)
+ mlog.Print("generated:", gfile.RealPath(path))
}
}
@@ -179,7 +179,7 @@ func generateColumnNamesForDao(fieldMap map[string]*gdb.TableField, removeFieldP
}
array[index] = []string{
- " #" + gstr.CaseCamel(strings.ToLower(newFiledName)) + ":",
+ " #" + formatFieldName(newFiledName, FieldNameCaseCamel) + ":",
fmt.Sprintf(` #"%s",`, field.Name),
}
}
@@ -219,7 +219,7 @@ func generateColumnDefinitionForDao(fieldMap map[string]*gdb.TableField, removeF
newFiledName = gstr.TrimLeftStr(newFiledName, v, 1)
}
array[index] = []string{
- " #" + gstr.CaseCamel(strings.ToLower(newFiledName)),
+ " #" + formatFieldName(newFiledName, FieldNameCaseCamel),
" # " + "string",
" #" + fmt.Sprintf(`// %s`, comment),
}
diff --git a/server/internal/library/hggen/internal/cmd/gendao/gendao_do.go b/server/internal/library/hggen/internal/cmd/gendao/gendao_do.go
index cb1be25..fabb4e6 100644
--- a/server/internal/library/hggen/internal/cmd/gendao/gendao_do.go
+++ b/server/internal/library/hggen/internal/cmd/gendao/gendao_do.go
@@ -40,7 +40,7 @@ func generateDo(ctx context.Context, in CGenDaoInternalInput) {
structDefinition, _ = generateStructDefinition(ctx, generateStructDefinitionInput{
CGenDaoInternalInput: in,
TableName: tableName,
- StructName: gstr.CaseCamel(strings.ToLower(newTableName)),
+ StructName: formatFieldName(newTableName, FieldNameCaseCamel),
FieldMap: fieldMap,
IsDo: true,
})
@@ -61,7 +61,7 @@ func generateDo(ctx context.Context, in CGenDaoInternalInput) {
ctx,
in,
tableName,
- gstr.CaseCamel(strings.ToLower(newTableName)),
+ formatFieldName(newTableName, FieldNameCaseCamel),
structDefinition,
)
in.genItems.AppendGeneratedFilePath(doFilePath)
@@ -70,7 +70,7 @@ func generateDo(ctx context.Context, in CGenDaoInternalInput) {
mlog.Fatalf(`writing content to "%s" failed: %v`, doFilePath, err)
} else {
utils.GoFmt(doFilePath)
- mlog.Print("generated:", doFilePath)
+ mlog.Print("generated:", gfile.RealPath(doFilePath))
}
}
}
diff --git a/server/internal/library/hggen/internal/cmd/gendao/gendao_entity.go b/server/internal/library/hggen/internal/cmd/gendao/gendao_entity.go
index 9062979..d9f8675 100644
--- a/server/internal/library/hggen/internal/cmd/gendao/gendao_entity.go
+++ b/server/internal/library/hggen/internal/cmd/gendao/gendao_entity.go
@@ -36,7 +36,7 @@ func generateEntity(ctx context.Context, in CGenDaoInternalInput) {
structDefinition, appendImports = generateStructDefinition(ctx, generateStructDefinitionInput{
CGenDaoInternalInput: in,
TableName: tableName,
- StructName: gstr.CaseCamel(strings.ToLower(newTableName)),
+ StructName: formatFieldName(newTableName, FieldNameCaseCamel),
FieldMap: fieldMap,
IsDo: false,
})
@@ -44,7 +44,7 @@ func generateEntity(ctx context.Context, in CGenDaoInternalInput) {
ctx,
in,
newTableName,
- gstr.CaseCamel(strings.ToLower(newTableName)),
+ formatFieldName(newTableName, FieldNameCaseCamel),
structDefinition,
appendImports,
)
@@ -55,7 +55,7 @@ func generateEntity(ctx context.Context, in CGenDaoInternalInput) {
mlog.Fatalf("writing content to '%s' failed: %v", entityFilePath, err)
} else {
utils.GoFmt(entityFilePath)
- mlog.Print("generated:", entityFilePath)
+ mlog.Print("generated:", gfile.RealPath(entityFilePath))
}
}
}
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 e9acc8b..01f334c 100644
--- a/server/internal/library/hggen/internal/cmd/gendao/gendao_structure.go
+++ b/server/internal/library/hggen/internal/cmd/gendao/gendao_structure.go
@@ -99,7 +99,7 @@ func generateStructFieldDefinition(
}
localTypeNameStr = string(localTypeName)
switch localTypeName {
- case gdb.LocalTypeDate, gdb.LocalTypeDatetime:
+ case gdb.LocalTypeDate, gdb.LocalTypeTime, gdb.LocalTypeDatetime:
if in.StdTime {
localTypeNameStr = "time.Time"
} else {
@@ -140,7 +140,7 @@ func generateStructFieldDefinition(
}
attrLines = []string{
- " #" + gstr.CaseCamel(strings.ToLower(newFiledName)),
+ " #" + formatFieldName(newFiledName, FieldNameCaseCamel),
" #" + localTypeNameStr,
}
attrLines = append(attrLines, fmt.Sprintf(` #%sjson:"%s"`, tagKey, jsonTag))
@@ -167,6 +167,43 @@ func generateStructFieldDefinition(
return attrLines, appendImport
}
+type FieldNameCase string
+
+const (
+ FieldNameCaseCamel FieldNameCase = "CaseCamel"
+ FieldNameCaseCamelLower FieldNameCase = "CaseCamelLower"
+)
+
+// formatFieldName formats and returns a new field name that is used for golang codes generating.
+func formatFieldName(fieldName string, nameCase FieldNameCase) string {
+ // For normal databases like mysql, pgsql, sqlite,
+ // field/table names of that are in normal case.
+ var newFieldName = fieldName
+ if isAllUpper(fieldName) {
+ // For special databases like dm, oracle,
+ // field/table names of that are in upper case.
+ newFieldName = strings.ToLower(fieldName)
+ }
+ switch nameCase {
+ case FieldNameCaseCamel:
+ return gstr.CaseCamel(newFieldName)
+ case FieldNameCaseCamelLower:
+ return gstr.CaseCamelLower(newFieldName)
+ default:
+ return ""
+ }
+}
+
+// isAllUpper checks and returns whether given `fieldName` all letters are upper case.
+func isAllUpper(fieldName string) bool {
+ for _, b := range fieldName {
+ if b >= 'a' && b <= 'z' {
+ return false
+ }
+ }
+ return true
+}
+
// formatComment formats the comment string to fit the golang code without any lines.
func formatComment(comment string) string {
comment = gstr.ReplaceByArray(comment, g.SliceStr{
diff --git a/server/internal/library/hggen/internal/cmd/genpb/genpb.go b/server/internal/library/hggen/internal/cmd/genpb/genpb.go
index 768926c..5139dc2 100644
--- a/server/internal/library/hggen/internal/cmd/genpb/genpb.go
+++ b/server/internal/library/hggen/internal/cmd/genpb/genpb.go
@@ -94,6 +94,9 @@ func (c CGenPb) Pb(ctx context.Context, in CGenPbInput) (out *CGenPbOutput, err
mlog.Fatalf(`no proto files found in folder "%s"`, in.Path)
}
+ var originPwd = gfile.Pwd()
+ defer gfile.Chdir(originPwd)
+
if err = gfile.Chdir(protoPath); err != nil {
mlog.Fatal(err)
}
diff --git a/server/internal/library/hggen/internal/cmd/genpb/genpb_tag.go b/server/internal/library/hggen/internal/cmd/genpb/genpb_tag.go
index cd6281b..6283f6a 100644
--- a/server/internal/library/hggen/internal/cmd/genpb/genpb_tag.go
+++ b/server/internal/library/hggen/internal/cmd/genpb/genpb_tag.go
@@ -11,6 +11,7 @@ import (
"fmt"
"github.com/gogf/gf/v2/container/gmap"
+ "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
@@ -90,8 +91,12 @@ func (c CGenPb) tagCommentIntoListMap(comment string, lineTagMap *gmap.ListMap)
lineTagMap.Set(tagName, lineTagMap.GetVar(tagName).String()+tagContent)
} else {
var (
- tagName = "dc"
- tagContent = comment
+ tagName = "dc"
+ // Convert backticks and double quotes to single quotes.
+ tagContent = gstr.ReplaceByMap(comment, g.MapStrStr{
+ "`": `'`,
+ `"`: `'`,
+ })
)
lineTagMap.Set(tagName, lineTagMap.GetVar(tagName).String()+tagContent)
}
diff --git a/server/internal/library/hggen/internal/cmd/genpbentity/genpbentity.go b/server/internal/library/hggen/internal/cmd/genpbentity/genpbentity.go
index b7088cb..d4b8022 100644
--- a/server/internal/library/hggen/internal/cmd/genpbentity/genpbentity.go
+++ b/server/internal/library/hggen/internal/cmd/genpbentity/genpbentity.go
@@ -254,7 +254,7 @@ func generatePbEntityContentFile(ctx context.Context, in CGenPbEntityInternalInp
if err := gfile.PutContents(path, strings.TrimSpace(entityContent)); err != nil {
mlog.Fatalf("writing content to '%s' failed: %v", path, err)
} else {
- mlog.Print("generated:", path)
+ mlog.Print("generated:", gfile.RealPath(path))
}
}
diff --git a/server/internal/library/hggen/internal/cmd/genservice/genservice.go b/server/internal/library/hggen/internal/cmd/genservice/genservice.go
index 16d0c38..fad6326 100644
--- a/server/internal/library/hggen/internal/cmd/genservice/genservice.go
+++ b/server/internal/library/hggen/internal/cmd/genservice/genservice.go
@@ -114,7 +114,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe
return
}
}
- defer gfile.Remove(flockFilePath)
+ defer gfile.RemoveFile(flockFilePath)
_ = gfile.PutContents(flockFilePath, gtime.TimestampStr())
// It works only if given WatchFile is in SrcFolder.
@@ -253,7 +253,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe
utils.IsFileDoNotEdit(relativeFilePath) {
mlog.Printf(`remove no longer used service file: %s`, relativeFilePath)
- if err = gfile.Remove(file); err != nil {
+ if err = gfile.RemoveFile(file); err != nil {
return nil, err
}
}
@@ -289,7 +289,7 @@ func (c CGenService) checkAndUpdateMain(srcFolder string) (err error) {
var (
logicPackageName = gstr.ToLower(gfile.Basename(srcFolder))
logicFilePath = gfile.Join(srcFolder, logicPackageName+".go")
- importPath = utils.GetImportPath(logicFilePath)
+ importPath = utils.GetImportPath(srcFolder)
importStr = fmt.Sprintf(`_ "%s"`, importPath)
mainFilePath = gfile.Join(gfile.Dir(gfile.Dir(gfile.Dir(logicFilePath))), "main.go")
mainFileContent = gfile.GetContents(mainFilePath)
diff --git a/server/internal/library/hggen/internal/cmd/genservice/genservice_ast_parse.go b/server/internal/library/hggen/internal/cmd/genservice/genservice_ast_parse.go
index 6a7785f..c4205cc 100644
--- a/server/internal/library/hggen/internal/cmd/genservice/genservice_ast_parse.go
+++ b/server/internal/library/hggen/internal/cmd/genservice/genservice_ast_parse.go
@@ -12,6 +12,7 @@ import (
"go/token"
"github.com/gogf/gf/v2/os/gfile"
+ "github.com/gogf/gf/v2/text/gstr"
)
type pkgItem struct {
@@ -78,12 +79,19 @@ func (c CGenService) parseImportPackages(node *ast.ImportSpec) (packages pkgItem
path = node.Path.Value
rawImport string
)
+
if node.Name != nil {
alias = node.Name.Name
- rawImport = alias + " " + path
+ rawImport = node.Name.Name + " " + path
} else {
rawImport = path
}
+
+ // if the alias is empty, it will further retrieve the real alias.
+ if alias == "" {
+ alias = c.getRealAlias(path)
+ }
+
return pkgItem{
Alias: alias,
Path: path,
@@ -91,6 +99,33 @@ func (c CGenService) parseImportPackages(node *ast.ImportSpec) (packages pkgItem
}
}
+// getRealAlias retrieves the real alias of the package.
+// If package is "github.com/gogf/gf", the alias is "gf".
+// If package is "github.com/gogf/gf/v2", the alias is "gf" instead of "v2".
+func (c CGenService) getRealAlias(importPath string) (pkgName string) {
+ importPath = gstr.Trim(importPath, `"`)
+ parts := gstr.Split(importPath, "/")
+ if len(parts) == 0 {
+ return
+ }
+
+ pkgName = parts[len(parts)-1]
+
+ if !gstr.HasPrefix(pkgName, "v") {
+ return pkgName
+ }
+
+ if len(parts) < 2 {
+ return pkgName
+ }
+
+ if gstr.IsNumeric(gstr.SubStr(pkgName, 1)) {
+ pkgName = parts[len(parts)-2]
+ }
+
+ return pkgName
+}
+
// parseFuncReceiverTypeName retrieves the receiver type of the function.
// For example:
//
diff --git a/server/internal/library/hggen/internal/packed/template-mono-app.go b/server/internal/library/hggen/internal/packed/template-mono-app.go
index 3df4114..46fb81c 100644
--- a/server/internal/library/hggen/internal/packed/template-mono-app.go
+++ b/server/internal/library/hggen/internal/packed/template-mono-app.go
@@ -3,7 +3,7 @@ package packed
import "github.com/gogf/gf/v2/os/gres"
func init() {
- if err := gres.Add("H4sIAAAAAAAC/7RaCTjU2xs+tuxLsiQi+24oWcq1VmTsImRJjDEZM5hB6lKKtMh+leWmREjI0iZZs4a4KloIlWQpRZH1/3Tv5T8/y5gZXc/TzKOe3vf9vu+c8/vO73vN4DS0XIABMIBB5jwbQPCzCTACPMLTC+2MR8h7YjFYeWcvL5ixswfCDYVGWO2jA1SHOXa5MX0dZz/r/4XFwszM7JaVWatUs0FTvbmUlGnru6+4MV9WNi+8Hx1cOj3tunh8X5yU9/176yYm9GtOpen0imfdp1M/K55VXJ0Q8FE9y9BeYba5K1fn3vv7W0djcIaWFtxjY9s4YwsrQhwxKlsAmJszg9MzHM2SveYJADgHAFhZPf+y6i126+wy3q1gvGtBPtfjfKZKbRbQMlMq0o2O1LvI8yinN/Mbve4FpQ4V4QuTU+/v3C3ZbF/kn8woqPwqRKclu2oLsylesi0O48SnpUh7FB/1fSTi1u3HCd+sXK41v4hCNWldPW51yuWMwoeBwdF9huqCL/2Y57WbDIgZHQYAeBBoB0u0cy+r3dkLtaD6Jxbh/1gZi38lLJg7Ao3Groq4NLNixBH/+VRA/h+6KML48KA2R0j7gCWX3V52LdYd2tY+QbTCpw8WYOHDXzhQdoK+4cZ1naf+kPM5kXZVekLqRoP66+nv0Tj3It4jZ2M60uhrBUXD3AVSxzocvPL8z+rrjHZU7gtjGmS9rHLgde4rT7rJWGdl7/EGR68oZ7NURZNEFjpEQEbrO7Q6Iu69ZkeP537fHTvygj4b1aAOxs7hzgRx1Fp6wUN2PlP/Y5dfAu1wFffDpwytYsP3N5RY3ilPLdxWKnujD77fwOdRmaWDfDxSPV4qplGrteRkGj7QWDyQoxUJ5iuKbf7U/gIAkE9FrAqCq+TMT4mCQkiuCrq0FuimfJNTSiy03feDmB5vkLtwsHED3tnZJfuHd/KZSyGPsuyEuzabS6RFSHZ2tgccQ3Jr/Aa4Bj3Vuioiio445k3l2LZcl3ZnyqiNWpdEK36PfgTOq2GQM2yr6T1pk/SWdwg/J9Z8ZGhI3aKujFUX+Wc02/GKR7hj59N6Q3AJX+7tOopituRr+1Ks8yk0YmSGPVF1i6xEtH2zYMEB8bhtB/I4UZNSQkd/+8E4n1xOOwH0DQDAB6JLnGfZPLg7u3hQkFSRFcFgLliMGwqpEODsiV4AFmvKP1ylyBXa02nqbfC8IfWe2EGpzTvodoxxcw3aPdz318O6ApeyQPPCwCr16U6+FCfVfdET1PVfAPLIS6lzEg3ccaoKMUlTn8JT7Hz5cli38l7MvMh5s1j7fOclQeOHSTLwWffSH+M9Ppsd8/R4+6S/dlA5XneSMS4PfN+vnxx+Cj77dV3hFh9H/42709MUx9RmTLOZ34S6daECgqhO4ceS7SzbHxiHed84TjWf0Y2DE2E3AQCtlCbh54e8Cxql4Pn/7KKjnLI3KHFUp6im9N4at5ArPjvZoWvFdIfOe/cXnZci3tvqT7vFFiTcYZoZKZgRTR339OmLGt0pKnjrXIIvw8Bgl7uEF/XdkCsJW11mnelMpA2EteQHI99IuJ/kNR7ZYF7S9CjT/dwFKRPMJQ+18/EBKZKG6k+Ge8LQFhn2Ptbq2UeZ0rYhfGccEvDnhFHXkmdmJ+TuclHbU1eL8vjOIKbLJj6N/q5e467squJ5keXynIBu3rl9zZVOU1cmfS2n2Kp0Gb6cCIA3se1I1Lojyd/wynp6+1xbh+0+/cYrLJutNEJOtBe2yiY/GeEZ3N5Qqyp+w0DKKb4Dk1FlJapCLcV0+GWIT3TXYIQC0BSVKN0WHRDcWIwcmnrKwSe0eSy4rfPKiwypdDmY2O4Mf2UzJ8fnpsfp50shGaxbtpUKgGdUxEohSLwUhGUIsTLHiqhyBNWUHWowD/V8chNvym1ucjXYJ8ORxtDnD5P0c27+yIpqjwd3Lm5Inx5vcGSIChFk78r/kIStcZnSy7R/TqcDczhYGk7zJL3fCl7TVY60vCK5cdBJzpo2k4mjq6IpI7J7u8HYOw21yAQxm2hf3WzBQWMtI0zZ2FWVmyqBDGhd9UiLguffSkJegtryWZy8K1WCmXu72c6rfVEeVucCPFuZc64UFZ+02V/YdcBFnJ2xgONJ74Rh4j225NLT+yyLIsCFM8cuxYrwq8R7vM+Jj0EPnHsfrD5uXaBYUrlT8tnEC/6Nn8/WbDIUrtfJkmehj8Wr7dVvYC7TjOLJtA2eZEGMaHIntj+P+Xrw5ux5H/bR32b2fksbaBgODNPwTqj+YpS7zvvO7LEC2WghpWK34OFSpM14ZlUrzw6nGDrznukz8ia2AilKvsVFuoyR7KeUyrnxxRgdi0r7I1J1761daZN5Kye3e0V8lc3d7PXJW1DzEiLeer8W1Qfuyd+peLOFFLqdvPaVh8IDXsLfPLwkybghPbXs6tR3sZTR/sHyw0VNe1PNRj4F2rXIWN2O2/vVML/C8Gh+cUi0zK4fTAZxLS80WGpe3R1xHdKN3JuR8llLYMSZx+uY6Ba9dv+ZYbRIEPNr2X58WGySk75/5N1Tb/bsLStkfP3q8bYMThjXc8f9/bsjLHIrnmLWO46zudX3I5HtzBx+ilM3fR16YvzirsbLYhLj9LZa5EXGhEoK9I/v/90WGXeMMc268rBV9Fd9U4k9hX1tWp4f7mN4ikSyjGMUnxf7vQtuE2+0ybbjqaRWbfnYZSzBHlkV6b93IGvrxwI/x/29QsXJ+daOyUBmX6rYh7brp2lUnskWcLYrDKMF9e+WYfVGYv0zND/PSdpyFUpkfgRgk2h7+WPsntCZM5yzDBm/JQYl/o4y4S99cNKPf7aEtmwLt7b+O4lSRkGMAXhjSq96zbW9p+XbGB+vaktX48tmM02PcdVCPykxg6Bt2XUuwYJJCY/C0zyGUisaX06Nc83pBU13iRd+V5l+mT9roawqJuUYFeRyu93WoXRfcXenbHcP5lJ4wlA4V8LQrs7L5vQXmNOR/Qy9Ke2M8rs73Y69RZ+rmXFaeKR/yDyA3EUDgA49safO8u0xCoNH+GCc0RR0aoJEAWEunq4UPM7EVwX9+YewQ8BH6Xi8VuQIffJX3kZ8zCnZVkHW+2It32PM7hT5Wwl67E6P5qtP0n4x5ygHUw7rE+trakuKvLtj7hUdbQpS2sWRWbXFQsops8fD0oKJ+9BObFk47MVpTh5+nmM/XHn9+DzNPm9iSGL98Pz5uHz6y+7R6TeyrKOJ9lXs2y0M3EW3u/rUf3K3t9C9gzTKklI3CPAuwWndN/BiP5YZIKe+M3HOQPiyQw2jNoJ37wWLM0LP6JK7GNgFvBO0n/XdqzBh5f5x8vXdFNWvG+T4A4Zfyb5uUIqs3Vk5cE+kyqFsKoedxt11nauCRjmbsIzROEfj+OXsMIUEmP0dK9nsGlGtoW2vv/U2ZqFZ7x/A8KV+brJM/hACizAXaj5euV8fp6vp7MBsJdA1ffSM8qDm+a7kgJqLKULfFP1yduap3mzbQy/s8urSiUMxuvb60rk+Ucdp5hdT0xl/NTgVACrUxGovvEqZsBgcHkdB+WVJwf33i3ARyBgYNZsYmVoZND+RVZDuo6adD6ecl6WRGwDATnQpi69Ki/fBotEIHwq2iSyp2BRfcJTJY1jmwtNcwUitxBHac+zGEdZ7WeWxt0SOFAV7b1Y95XIZLWFQzHusZW626uK272UK78Ph+es8ogRf59j5xrbw59LoNydpcIeNMurssAk84dvKWHhftHSw016Y9dRmrAfC8Hj09Yty7LbcuzsTNBeauiwzg9NoAAAb0U5CjZKwnDAIf2hoDw9XaXPQdr+c4jp1/iBv61V6A/EP+hxDNZlO8MHR6LZhb8f14S0PwsSMBbdcdrsRyfdhZOyN8IeW/i0jMWm36oEJzR62ejUxPq/iHisnpsiTfQ9Ds2qYHtB8DxO97D+cT935fiPik1YHswLnNc5QJQ8ltPvt7xUKbVkDvnjHmRcJ4eoF9W+3iwlVe7N90s9BwV3vyrkr27ZuTMdvz7W+3tUX2q+RLnjsx9BA03f/zMNvSrOzldpunDEW7+nJu8xrd6aUej5nlZoFnNUAgHCiOfuNopz5KTktvXhdqDAJVeTY3d64P9yh9SKSf5qO821iKPaCb79oPJsRve6haX+aYq+eQ1vrm+6PNwZO9Iv2/Glx6IR3oi2XR6ZR982i7OCGR+afB5OYNX7UeY94j7yKFUpLqdOnmeMwbEs+ml67te9S3fhov2nom000PAdtcOU7utPf36yUji5R4XFiu85W/Dav67bW3DldZsc7NX8a6J+vtsucvtDAvfedGs/5FLPd7a0FFq3InqxnMxvv5F7bilN4h9kqk26fVBipGj82e1Bun26x4WnYBNt8Bu+P0Hs0/3xuUa3hqebqjP1lN19CUJgCEoX3QCC8FtAXdstPALpVj5ktxCnQWCTKhQLl0iTA/tfaPbGuCPSv1/437Jq1i5JC4krJopEjDXnNEUiSwoPA4FH4AAqiUCQdfc2RrNKVeDm7eCBcf31X8g/uv1/LdSWgNUva/sRCvz667vCzDav2JCLESXEIHz+UC+LXR/MvMJnFWErDtyyNpzMKQ5ii35t1blQqctR88f3AdTXbtZWlRLYk9J7XWzpXo7aNQ0a6fxrolDx4mtM7OxU0LRsqm+5+qQC45iLMXa7uTNBEPCwqZA9V+kP56p7cbSiBewZ8mdaNqd7rE70tezto8EJ5yj0z7I9ZLVu+DfaG8R8ZqqAyMq7c2bpj9ITCSD97XLVQUkfTtweZx+on87J92S6PMM1HKMpx+WMMAKAdkH+j8nTGoNwQODwFraIwUcB/3+dRUHF5UnCXfV2oHG7ORK3EsmsOd06YviXI0KSHm5p10LAjPu1AHozbv9TtSCP8PEqY1j3HOeEkd7y+dCijeyfb8JRlLbzcf3hq+M9hGymtYk8e3klTia93GmKKjXEMNp3HL5q/UqcVNREVmVw3n3KnLLYINwDA8bVkyBXhhcYG/LImfREuzMMXh8d6oo4iKGBQJI8BdsgZR8nm1qaA5t+/9URg8NDq46MemtAqsYRMaVSXlDM6JLGdjemVORpbyMZce/YQzcu7+j3I27Id0pLbUiSuK5hq2CcizD4HjQeZ5B1qD6f/9DK+gSfLp+WPkz7U4TJI2vZcrt998pN8qOMu2wZKKOocF+263/ihwiE9Cpm8ofumfeqFz4fSpWCR/H9RMWePtr1iSf5rcy8H9XREokzTyUdH0Ocy8uZErsV0DFBbfPz+mc8v+HHSQHpWnPhbRy33L3GaCxfYexck1PIBAN5EG2U9SvI0/6szHoXFQFMl15DPWqnIQdcye32EWskwrIT6t4femv2Pvzi8w4mEfpQ2+JF2UVWz9c/r0k87w7YHrT//MSnF5rMg6q5LkPM7WxnfvT3eORruMpsxx2AjYpY2t3L8VPrPIDHZRhWt7DzT0iJlC0+Paob6mp8bBQvIvwisEt+/Rz80MtcmJaYqRZbQHoeMFjrqj9ZF36mD4z9VBtBa1nIW1P2A697FaP1Fb/qwdP01O15NzFhWIHeQSISd9k6L/cbchz4V66nlH2t7pHz4zSZ3tYYfvucFkEb7md4gD7l9v1V0yHjim00u/DC67n1YXyyrclxRFHPm1Bxb4EI1i4Jb8o4CADKJbi5lMqPF+iF80M4BOAr2sQaFVDBXhB8CjfWiYE/D10j578nu6ewFrazGhb+397opjeqMMX+5zT7wC7t2Y9dvoG6O5PwsIiYouF6lPUDDJeHA0WhNC/mQt12B1zkZIm+XpE88akIosaGN2KSSQw/GJBXUI9I4rRTyCptevx6YVW3HNhtOeAPFNKG/UM0grAXBktj90fmVyvEbL9O84E/Qn2mP18o7aO2Rh0fCIswn/5I8qnr7uZaN6T42cw6N7K5m+aedDM/9vcsW+g3Jgq/r0wAAk0SzZLTWLK10Cro25f/cALQtnU7eWhyG+5/MnP4kon4yU/y8De3kuDidf5bEF7ZPYmP1Lu7jTGc33h11dBw4UH2qdfJVv224dFLaU+p7G2VjeIxjHpu94X/MkLt/x8xkcFZ7Tqfl04Bw6fKvnnqhZydNqba/mNMfqInNqZWcj1u74KO6LwCgkGjcpmuNm9ip1mh8OESbQ/9L4J+psINnH7TsZ7ClK4C9KrveMnslW8DLRIvl7ez4ZeUZPdUc8dMzynm2Kd37Ht/g/+xUY1dbq1yFSHV4zFk1nvPoNk8qWzbS9JaB3kHBhFpbFuWQJ2Lwt/CvOk8ftWkNtT9QUzHW6ufvenbS76nstQn58642sSEbeW76CJrsGlvoyqbT66bPAQCy19QiYF08SHiPR+p1bBEubNffXxDDiQ/z13GrunpTI+nnpo3SdY3w21ufF3b3WlxX6Law3gI0Zk7qCQT+LqCnMTOTidl5Mdvpku6941F3zyM5TjdNnqWjs49QUGDanVX9I313fVY/074rO75V3Bgbg1vgmMdwW0cNZXs34CwbjcZwG7aNctzQ1si9YqYV+i789TQX3TCTsvSNqYiDHTJSUrRhautCzTrdbKIqNereDzEzbbmlSrWwx1IxkX1XAQC21ORfHRbn4J8vBZz7QgosrJ+aNjS2mRrKNXf3Wlgz1NfJWf/ju6mTszbIMTBWkN9rbG5gaPwYZmhlUG/abCJvYSDT1Li39S01jfbCoy+60OKL3t9NDrEFIERcJEpJDUNB+aVWR/2P3iUscHj5YPHYQ75uFKhXIQ0ZpvBTvjzKTR6DcEHgcM4+AZTGsvzlyAeBw/r6uCB+2eVoHhDm5XsITcIbrqW4EqTgwtzxnpS8goKRDL7mxSNFEpUX2heJomT9K5EBv+ZYZEgiW8NiUiCLAOaCo2SYpUo2yZoTp0geJcrTGUnJLVOdApo1xyZPHulh3C87J4lw/Edn/gLD/D/9soZlCfKaI1j+RZ8vHoWm7I2xCDG8Natdvxz632Aey6qkouai+b9OQi/vzyfc/M9c8M9PEtzHiwEJDbb8EMDSZQGXGoL/j7i8MfefHw4wp3OUCqxq010Zix+CVbMS1pIpNjReQvupGCTejdSAPJsuMbGCELFGNIB0NytUL6GjUxKi9+qqoORJ5oFIzqIFq3tEoVIJrZIiEKnfVwRb9qXvYmBC4x8UeIoOkOO7XAxMaFwShACfpgekugiJ5XQTJKdCzIA0BxSp68qLKOAiBxQ0dEKbjTgk9OpVQRc7oIgJFoYIRrMCsmw7UM2EXhpZiOZHpOAuY9shplwconwnGyDbobMytiwE+yKp2KucbYS2FmVIfn6Qx0Ds4PiHitANogahamEHa3fNLKYjtE78BqGjXQ9+keGE9G23hxOQbtGABkLYI0CP86RVQZe2HsQkb4FIniWOvtidsbJoaYhoqw2AAncG6bKLieMvNmaQKns9F6DAmEFMtihEth8p+K6krRI56O4iDZk88ZIQ8WrcgAI7xsoBKEICiCcdnbwgoA8aah5AlhMDKp/QIAF90NiRgruME4OYchGI8ifEGZbaLlbOPFS6FC+gyHaxmIHQm8AHYYhclmGx44L0fsl7IyDN30DqqqgkCrjU3wANnNAhIA8JfBMfoNDfQLr2d8Q5ljgPSG0+NDYBCp0HKzMoQhguk8ew2HkALQLhdF0bUgQ6fvDrnAeLaQmH3noQWnkB8EsH+YuZCQfQ0NaHdTP4RSN2YrVUhtRyikzOZQbdK1NpQKjcBMGvGnQvuk4SjHPhkIy+WCPlSoPuxQoIB6tGEAVzQuC/GSIvlkA4yzSFSBjfAv6zeS7pxx29CCBrigqNjnCaCG2gnEjBXW6KupiCcBYIfdC6iAKKhpTEkiMESQ6DGCBjwrhygyAF0e24OupamuJK4vDLDBdXFq4CES4gDtY6XCS9KYlYlmyZURCpK/0NUcClc8WVcSUguKoSgPy54soph0FSHkcyOHlLRgoSwhxJLEtGiisHoQRd8JJgDSNFYmHIQMJ4TBIPWUtIAUIgJwUonyaunC1VSLaiySYhL2fQppFWGqxlkLhyUOqQoDwooCEvLHlIWN3k8R3GUXAc7pIBa50hkn6q3yFOtsz4kNRXHRyygLLxITHxfBDxR5alWDo5XFkydBxRRwyPPKHrIUIl5ADRoSHdun98mnAgLgAARu7nb/8LAAD//8jA88epSAAA"); 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-mono.go b/server/internal/library/hggen/internal/packed/template-mono.go
index 67c325d..97f98f2 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 37510b8..c95abb8 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/internal/utility/utils/utils.go b/server/internal/library/hggen/internal/utility/utils/utils.go
index e09d57b..9695c72 100644
--- a/server/internal/library/hggen/internal/utility/utils/utils.go
+++ b/server/internal/library/hggen/internal/utility/utils/utils.go
@@ -75,28 +75,24 @@ func ReplaceGeneratedContentGFV2(folderPath string) (err error) {
}, folderPath, "*.go", true)
}
-// GetImportPath calculates and returns the golang import path for given `filePath`.
+// GetImportPath calculates and returns the golang import path for given `dirPath`.
// Note that it needs a `go.mod` in current working directory or parent directories to detect the path.
-func GetImportPath(filePath string) string {
+func GetImportPath(dirPath string) string {
// If `filePath` does not exist, create it firstly to find the import path.
- var realPath = gfile.RealPath(filePath)
+ var realPath = gfile.RealPath(dirPath)
if realPath == "" {
- _ = gfile.Mkdir(filePath)
- realPath = gfile.RealPath(filePath)
+ _ = gfile.Mkdir(dirPath)
+ realPath = gfile.RealPath(dirPath)
}
var (
newDir = gfile.Dir(realPath)
oldDir string
- suffix string
+ suffix = gfile.Basename(dirPath)
goModName = "go.mod"
goModPath string
importPath string
)
-
- if gfile.IsDir(filePath) {
- suffix = gfile.Basename(filePath)
- }
for {
goModPath = gfile.Join(newDir, goModName)
if gfile.Exists(goModPath) {
diff --git a/server/internal/logic/admin/member.go b/server/internal/logic/admin/member.go
index b7132c8..d4b7977 100644
--- a/server/internal/logic/admin/member.go
+++ b/server/internal/logic/admin/member.go
@@ -796,7 +796,7 @@ func (s *sAdminMember) VerifySuperId(ctx context.Context, verifyId int64) bool {
// LoadSuperAdmin 加载超管数据
func (s *sAdminMember) LoadSuperAdmin(ctx context.Context) {
- value, err := dao.AdminRole.Ctx(ctx).Where(dao.AdminRole.Columns().Key, consts.SuperRoleKey).Value()
+ value, err := dao.AdminRole.Ctx(ctx).Fields("id").Where(dao.AdminRole.Columns().Key, consts.SuperRoleKey).Value()
if err != nil {
g.Log().Errorf(ctx, "LoadSuperAdmin AdminRole err:%+v", err)
return
diff --git a/server/internal/logic/sys/option_tree_demo.go b/server/internal/logic/sys/option_tree_demo.go
index 78e0e24..6bec623 100644
--- a/server/internal/logic/sys/option_tree_demo.go
+++ b/server/internal/logic/sys/option_tree_demo.go
@@ -130,7 +130,8 @@ func (s *sSysOptionTreeDemo) Delete(ctx context.Context, in *sysin.OptionTreeDem
if count > 0 {
return gerror.New("请先删除该选项树表下的所有下级!")
}
- if _, err = s.Model(ctx).WherePri(in.Id).Delete(); err != nil {
+
+ if _, err = s.Model(ctx).WherePri(in.Id).Unscoped().Delete(); err != nil {
err = gerror.Wrap(err, "删除选项树表失败,请稍后重试!")
return
}
diff --git a/server/internal/logic/sys/test_category.go b/server/internal/logic/sys/test_category.go
index 673d415..061a445 100644
--- a/server/internal/logic/sys/test_category.go
+++ b/server/internal/logic/sys/test_category.go
@@ -3,7 +3,7 @@
// @Copyright Copyright (c) 2024 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
-// @AutoGenerate Version 2.15.1
+// @AutoGenerate Version 2.15.7
package sys
import (
@@ -108,7 +108,7 @@ func (s *sSysTestCategory) Edit(ctx context.Context, in *sysin.TestCategoryEditI
// Delete 删除测试分类
func (s *sSysTestCategory) Delete(ctx context.Context, in *sysin.TestCategoryDeleteInp) (err error) {
- if _, err = s.Model(ctx).WherePri(in.Id).Delete(); err != nil {
+ if _, err = s.Model(ctx).WherePri(in.Id).Unscoped().Delete(); err != nil {
err = gerror.Wrap(err, "删除测试分类失败,请稍后重试!")
return
}
@@ -164,4 +164,4 @@ func (s *sSysTestCategory) Option(ctx context.Context) (opts []*model.Option, er
opts[k] = dict.GenHashOption(v.Id, gconv.String(v.Name))
}
return
-}
\ No newline at end of file
+}
diff --git a/server/internal/model/input/sysin/test_category.go b/server/internal/model/input/sysin/test_category.go
index 2dbeed9..5f77439 100644
--- a/server/internal/model/input/sysin/test_category.go
+++ b/server/internal/model/input/sysin/test_category.go
@@ -3,7 +3,7 @@
// @Copyright Copyright (c) 2024 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
-// @AutoGenerate Version 2.15.1
+// @AutoGenerate Version 2.15.7
package sysin
import (
@@ -140,4 +140,4 @@ func (in *TestCategoryStatusInp) Filter(ctx context.Context) (err error) {
return
}
-type TestCategoryStatusModel struct{}
\ No newline at end of file
+type TestCategoryStatusModel struct{}
diff --git a/server/internal/router/genrouter/test_category.go b/server/internal/router/genrouter/test_category.go
index 032d2ed..696e952 100644
--- a/server/internal/router/genrouter/test_category.go
+++ b/server/internal/router/genrouter/test_category.go
@@ -3,11 +3,11 @@
// @Copyright Copyright (c) 2024 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
-// @AutoGenerate Version 2.15.1
+// @AutoGenerate Version 2.15.7
package genrouter
import "hotgo/internal/controller/admin/sys"
func init() {
LoginRequiredRouter = append(LoginRequiredRouter, sys.TestCategory) // 测试分类
-}
\ No newline at end of file
+}
diff --git a/server/resource/generate/default/curd/web.index.vue.template b/server/resource/generate/default/curd/web.index.vue.template
index a0b51de..8efc6e1 100644
--- a/server/resource/generate/default/curd/web.index.vue.template
+++ b/server/resource/generate/default/curd/web.index.vue.template
@@ -8,9 +8,9 @@
@{ if eq .options.Step.IsOptionTreeTable false }@{end}
@{ if eq .options.Step.IsOptionTreeTable true }
-
+
-
+
@{ if eq .options.Step.HasAdd true }
diff --git a/web/package.json b/web/package.json
index 257d1b9..9630be0 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,7 +1,7 @@
{
"name": "hotgo",
"type": "module",
- "version": "2.15.8",
+ "version": "2.15.11",
"author": {
"name": "MengShuai",
"email": "133814250@qq.com",
diff --git a/web/src/styles/common.less b/web/src/styles/common.less
index 94bb26b..c700df3 100644
--- a/web/src/styles/common.less
+++ b/web/src/styles/common.less
@@ -104,7 +104,8 @@ body .n-icon {
}
body .proCard {
- border-radius: 4px;
+ border-radius: 12px;
+ margin-top: 12px;
.n-card__content {
padding: 16px;
@@ -119,11 +120,15 @@ body .n-modal {
border-radius: 6px;
}
+.n-layout-page-header .n-card {
+ border-radius: 12px;
+}
+
//body .proCardTabs{
// .n-card__content{ padding-top: 3px}
// .n-card__content:first-child{ padding-top: 3px}
//}
.n-layout-page-header {
- margin: 0 -10px;
+ margin: 8px 0;
}
diff --git a/web/src/utils/urlUtils.ts b/web/src/utils/urlUtils.ts
index 4eb47f6..3a678bf 100644
--- a/web/src/utils/urlUtils.ts
+++ b/web/src/utils/urlUtils.ts
@@ -63,3 +63,19 @@ export function goBackOrToPage(to: RouteLocationRaw): void {
});
}
}
+
+// 更新hash路由get参数,不刷新页面
+export function pushHashRouterParameter(url, key, value) {
+ const urlParts = url.split('?');
+ let newUrl = '';
+ if (urlParts.length >= 2) {
+ const baseUrl = urlParts[0];
+ const queryString = urlParts[1];
+ const searchParams = new URLSearchParams(queryString);
+ searchParams.set(key, value);
+ newUrl = `${baseUrl}?${searchParams.toString()}`;
+ } else {
+ newUrl = `${url}?${key}=${value}`;
+ }
+ window.history.pushState({ path: newUrl }, '', newUrl);
+}
diff --git a/web/src/views/addons/hgexample/config/system.vue b/web/src/views/addons/hgexample/config/system.vue
index 94c4246..863a69e 100644
--- a/web/src/views/addons/hgexample/config/system.vue
+++ b/web/src/views/addons/hgexample/config/system.vue
@@ -1,6 +1,6 @@
-
+
-
+
diff --git a/web/src/views/addons/hgexample/treeTable/index.vue b/web/src/views/addons/hgexample/treeTable/index.vue
index a36173b..416828d 100644
--- a/web/src/views/addons/hgexample/treeTable/index.vue
+++ b/web/src/views/addons/hgexample/treeTable/index.vue
@@ -3,9 +3,9 @@
-
+
-
+
@@ -88,7 +88,7 @@
-
+
diff --git a/web/src/views/apply/provinces/index.vue b/web/src/views/apply/provinces/index.vue
index 267baba..89bc16d 100644
--- a/web/src/views/apply/provinces/index.vue
+++ b/web/src/views/apply/provinces/index.vue
@@ -3,9 +3,9 @@
-
+
-
+
@@ -88,7 +88,7 @@
-
+
diff --git a/web/src/views/asset/cash/index.vue b/web/src/views/asset/cash/index.vue
index af3bd1b..1e2c4ba 100644
--- a/web/src/views/asset/cash/index.vue
+++ b/web/src/views/asset/cash/index.vue
@@ -1,10 +1,6 @@
-
-
-
+
余额可用于购买付费产品或商城消费
-
+
diff --git a/web/src/views/asset/rechargeLog/index.vue b/web/src/views/asset/rechargeLog/index.vue
index 3351fc2..72b201d 100644
--- a/web/src/views/asset/rechargeLog/index.vue
+++ b/web/src/views/asset/rechargeLog/index.vue
@@ -1,9 +1,6 @@
-
-
+
-
+
diff --git a/web/src/views/dashboard/workplace/workplace.vue b/web/src/views/dashboard/workplace/workplace.vue
index 3fcbcc8..ac44a58 100644
--- a/web/src/views/dashboard/workplace/workplace.vue
+++ b/web/src/views/dashboard/workplace/workplace.vue
@@ -1,6 +1,6 @@
-