Преглед изворни кода

增加自动获取所有配置文件方法,成功注册到数据库

qdy пре 1 месец
родитељ
комит
e9dece74ea

models/Config_template_builder.go → internal/models/Config_template_builder.go Прегледај датотеку


models/config_template.go → internal/models/config_template.go Прегледај датотеку


+ 188
- 0
internal/service/create_config_meta.go Прегледај датотеку

@@ -0,0 +1,188 @@
1
+package service
2
+
3
+import (
4
+	"context"
5
+	"fmt"
6
+	"strings"
7
+	"time"
8
+
9
+	"git.x2erp.com/qdy/go-base/config/core"
10
+	_ "git.x2erp.com/qdy/go-base/config/subconfigs"
11
+	"git.x2erp.com/qdy/go-base/ctx"
12
+	"git.x2erp.com/qdy/go-base/logger"
13
+	"git.x2erp.com/qdy/go-base/model/response"
14
+	"git.x2erp.com/qdy/go-base/util"
15
+	"git.x2erp.com/qdy/go-db/factory/database"
16
+	"github.com/jmoiron/sqlx"
17
+)
18
+
19
+// ConfigMetaDB 数据库表结构体
20
+type ConfigMetaDB struct {
21
+	ID         string    `db:"id"`
22
+	ConfigName string    `db:"config_name"`
23
+	FieldType  string    `db:"field_type"`
24
+	YamlName   string    `db:"yaml_name"`
25
+	FieldDesc  string    `db:"field_desc"`
26
+	Creator    string    `db:"creator"`
27
+	CreatedAt  time.Time `db:"created_at"`
28
+}
29
+
30
+// / SyncAllConfigMeta 同步所有配置元信息到数据库
31
+func SyncAllConfigMeta(ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[map[string]interface{}] {
32
+
33
+	logger.Debug("SyncAllConfigMeta-开始同步配置元信息")
34
+	creator := reqCtx.UserID
35
+	allMeta := core.GetAllConfigsMeta()
36
+
37
+	// 记录获取到的配置数量
38
+	logger.Debug(fmt.Sprintf("获取到 %d 个配置的元数据", len(allMeta)))
39
+
40
+	// 1. 获取数据库连接
41
+	db := dbFactory.GetDB()
42
+
43
+	// 2. 开始事务
44
+	tx, err := db.BeginTxx(ctx, nil)
45
+	if err != nil {
46
+		logger.ErrorC(reqCtx, fmt.Sprintf("开始事务失败: %v", err))
47
+		return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("开始事务失败: %v", err), reqCtx)
48
+	}
49
+
50
+	// 确保事务要么提交要么回滚
51
+	defer func() {
52
+		if p := recover(); p != nil {
53
+			tx.Rollback()
54
+			panic(p)
55
+		}
56
+	}()
57
+
58
+	// 3. 遍历每个配置,先删除后插入
59
+	logger.Debug("开始删除各个配置的旧数据")
60
+	for configName := range allMeta {
61
+		logger.Debug(fmt.Sprintf("正在删除配置: %s", configName))
62
+		if err := DeleteConfigMetaByName(ctx, tx, configName); err != nil {
63
+			tx.Rollback()
64
+			logger.ErrorC(reqCtx, fmt.Sprintf("删除配置 %s 失败: %v", configName, err))
65
+			return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("删除配置 %s 失败: %v", configName, err), reqCtx)
66
+		}
67
+		logger.Debug(fmt.Sprintf("已删除配置: %s", configName))
68
+	}
69
+	logger.Debug(fmt.Sprintf("已完成删除 %d 个配置的旧数据", len(allMeta)))
70
+
71
+	// 4. 生成所有记录
72
+	logger.Debug("开始生成配置记录")
73
+	records := GenerateConfigMetaRecords(allMeta, creator)
74
+	logger.Debug(fmt.Sprintf("生成了 %d 条配置记录", len(records)))
75
+
76
+	// 记录每个配置的字段数量
77
+	configFieldCounts := make(map[string]int)
78
+	for _, record := range records {
79
+		configFieldCounts[record.ConfigName]++
80
+	}
81
+	for configName, count := range configFieldCounts {
82
+		logger.Debug(fmt.Sprintf("配置 %s 有 %d 个字段", configName, count))
83
+	}
84
+
85
+	// 5. 批量插入所有记录
86
+	logger.Debug("开始批量插入配置记录")
87
+	if err := BatchInsertConfigMeta(ctx, tx, records); err != nil {
88
+		tx.Rollback()
89
+		logger.ErrorC(reqCtx, fmt.Sprintf("批量插入失败: %v", err))
90
+		return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("批量插入失败: %v", err), reqCtx)
91
+	}
92
+	logger.Debug(fmt.Sprintf("成功插入 %d 条记录", len(records)))
93
+
94
+	// 6. 提交事务
95
+	logger.Debug("正在提交事务")
96
+	if err := tx.Commit(); err != nil {
97
+		logger.ErrorC(reqCtx, fmt.Sprintf("提交事务失败: %v", err))
98
+		return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("提交事务失败: %v", err), reqCtx)
99
+	}
100
+
101
+	logger.Debug("配置元信息同步完成")
102
+	return util.CreateSuccessResult[map[string]interface{}](reqCtx)
103
+}
104
+
105
+// DeleteConfigMetaByName 删除指定配置名称的所有记录
106
+func DeleteConfigMetaByName(ctx context.Context, tx *sqlx.Tx, configName string) error {
107
+	query := "DELETE FROM config_meta WHERE config_name = ?"
108
+
109
+	_, err := tx.ExecContext(ctx, query, configName)
110
+	if err != nil {
111
+		return fmt.Errorf("删除配置 %s 失败: %w", configName, err)
112
+	}
113
+
114
+	return nil
115
+}
116
+
117
+// BatchInsertConfigMeta 批量插入配置元信息
118
+func BatchInsertConfigMeta(ctx context.Context, tx *sqlx.Tx, records []ConfigMetaDB) error {
119
+	if len(records) == 0 {
120
+		return nil
121
+	}
122
+
123
+	logger.Debug(fmt.Sprintf("执行批量插入,记录数: %d", len(records)))
124
+
125
+	// 使用真正的批量VALUES语法
126
+	query := `
127
+        INSERT INTO config_meta
128
+        (id, config_name, field_type, yaml_name, field_desc, creator, created_at) 
129
+        VALUES 
130
+    `
131
+
132
+	// 生成占位符和参数
133
+	var placeholders []string
134
+	var args []interface{}
135
+
136
+	for _, record := range records {
137
+		placeholders = append(placeholders, "(?, ?, ?, ?, ?, ?, ?)")
138
+		args = append(args,
139
+			record.ID,
140
+			record.ConfigName,
141
+			record.FieldType,
142
+			record.YamlName,
143
+			record.FieldDesc,
144
+			record.Creator,
145
+			record.CreatedAt,
146
+		)
147
+	}
148
+
149
+	// 拼接VALUES部分
150
+	query += strings.Join(placeholders, ",")
151
+
152
+	// 执行批量插入
153
+	_, err := tx.ExecContext(ctx, query, args...)
154
+	if err != nil {
155
+		return fmt.Errorf("批量插入失败: %w", err)
156
+	}
157
+
158
+	logger.Debug("批量插入执行成功")
159
+	return nil
160
+}
161
+
162
+// GenerateConfigMetaRecords 将配置元信息转换为数据库记录
163
+func GenerateConfigMetaRecords(configs map[string]*core.ConfigMeta, creator string) []ConfigMetaDB {
164
+	var records []ConfigMetaDB
165
+
166
+	for configName, configInfo := range configs {
167
+		fieldCount := 0
168
+		for fieldName, fieldInfo := range configInfo.Fields {
169
+			fieldCount++
170
+			// 生成唯一ID:配置名:字段名
171
+			id := fmt.Sprintf("%s.%s", configName, fieldName)
172
+
173
+			record := ConfigMetaDB{
174
+				ID:         id,
175
+				ConfigName: configName,
176
+				FieldType:  fieldInfo.Type,
177
+				YamlName:   fieldInfo.YamlName,
178
+				FieldDesc:  fieldInfo.Desc,
179
+				Creator:    creator,
180
+				CreatedAt:  time.Now(),
181
+			}
182
+			records = append(records, record)
183
+		}
184
+		logger.Debug(fmt.Sprintf("配置 %s 生成 %d 个字段", configName, fieldCount))
185
+	}
186
+
187
+	return records
188
+}

+ 52
- 0
internal/tables/config_meta.go Прегледај датотеку

@@ -0,0 +1,52 @@
1
+package tables
2
+
3
+import (
4
+	"time"
5
+
6
+	"git.x2erp.com/qdy/go-db/sqldef"
7
+)
8
+
9
+func init() {
10
+	sqldef.AddRegistration(func(r *sqldef.Registry) {
11
+		// 配置元信息表
12
+		tb := sqldef.NewTable("config_meta", "配置元信息表").
13
+			ID("id", 128).NotNull().Comment("主键").End().
14
+			String("config_name", 48).NotNull().Comment("配置名称").End().
15
+			String("field_type", 32).NotNull().Default("'config'").Comment("字段类型:config/string/bool/int...").End().
16
+			String("yaml_name", 128).NotNull().Default("''").Comment("YAML标签").End().
17
+			String("field_desc", 256).NotNull().Default("''").Comment("字段描述").End().
18
+			String("creator", 32).NotNull().Comment("创建人").End().
19
+			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End()
20
+
21
+		// 添加索引
22
+		tb.AddIndex("idx_config_name", "config_name")
23
+		// 添加索引
24
+		tb.AddIndex("idx_yaml_name", "yaml_name")
25
+
26
+		// 注册表
27
+		r.RegisterTable(tb.Build())
28
+	})
29
+}
30
+
31
+// ConfigMeta 配置元信息表结构体
32
+type ConfigMeta struct {
33
+	// 配置名称
34
+	ConfigName string `gorm:"column:config_name;type:varchar(100);not null;primaryKey;comment:配置名称"`
35
+	// 字段名称
36
+	FieldName string `gorm:"column:field_name;type:varchar(100);not null;primaryKey;comment:字段名称"`
37
+	// 字段类型
38
+	FieldType string `gorm:"column:field_type;type:varchar(50);not null;default:'config';comment:字段类型"`
39
+	// YAML标签
40
+	YamlName string `gorm:"column:yaml_name;type:varchar(100);not null;default:'';comment:YAML标签"`
41
+	// 字段描述
42
+	FieldDesc string `gorm:"column:field_desc;type:varchar(500);not null;default:'';comment:字段描述"`
43
+	// 创建人
44
+	Creator string `gorm:"column:creator;type:varchar(32);not null;comment:创建人"`
45
+	// 创建时间
46
+	CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间"`
47
+}
48
+
49
+// TableName 指定表名
50
+func (ConfigMeta) TableName() string {
51
+	return "config_meta"
52
+}

+ 50
- 0
internal/tables/config_startup.go Прегледај датотеку

@@ -0,0 +1,50 @@
1
+package tables
2
+
3
+import (
4
+	"time"
5
+
6
+	"git.x2erp.com/qdy/go-db/sqldef"
7
+)
8
+
9
+func init() {
10
+	sqldef.AddRegistration(func(r *sqldef.Registry) {
11
+		// 配置元信息表
12
+		tb := sqldef.NewTable("config_startup", "微服务启动配表").
13
+			ID("id", 128).NotNull().Comment("主键").End().
14
+			String("config_name", 100).NotNull().Comment("配置名称").End().
15
+			String("field_name", 100).NotNull().Comment("字段名称").End().
16
+			String("field_type", 50).NotNull().Default("'config'").Comment("字段类型:config/string/bool/int...").End().
17
+			String("yaml_name", 128).NotNull().Default("''").Comment("YAML标签").End().
18
+			String("field_desc", 500).NotNull().Default("''").Comment("字段描述").End().
19
+			String("creator", 32).NotNull().Comment("创建人").End().
20
+			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End()
21
+
22
+		// 添加索引
23
+		tb.AddIndex("idx_config_name", "config_name")
24
+		tb.AddIndex("idx_yaml_name", "yaml_name")
25
+
26
+		// 注册表
27
+		r.RegisterTable(tb.Build())
28
+	})
29
+}
30
+
31
+// ConfigMeta 配置元信息表结构体
32
+type ConfigStartup struct {
33
+	// 配置名称
34
+	ConfigName string `gorm:"column:config_name;type:varchar(100);not null;primaryKey;comment:配置名称"`
35
+	// 字段类型
36
+	FieldType string `gorm:"column:field_type;type:varchar(50);not null;default:'config';comment:字段类型"`
37
+	// YAML标签
38
+	YamlName string `gorm:"column:yaml_name;type:varchar(100);not null;default:'';comment:YAML标签"`
39
+	// 字段描述
40
+	FieldDesc string `gorm:"column:field_desc;type:varchar(500);not null;default:'';comment:字段描述"`
41
+	// 创建人
42
+	Creator string `gorm:"column:creator;type:varchar(32);not null;comment:创建人"`
43
+	// 创建时间
44
+	CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间"`
45
+}
46
+
47
+// TableName 指定表名
48
+func (ConfigStartup) TableName() string {
49
+	return "config_startup"
50
+}

+ 53
- 0
internal/tables/config_startup_svc.go Прегледај датотеку

@@ -0,0 +1,53 @@
1
+package tables
2
+
3
+import (
4
+	"time"
5
+
6
+	"git.x2erp.com/qdy/go-db/sqldef"
7
+)
8
+
9
+func init() {
10
+	sqldef.AddRegistration(func(r *sqldef.Registry) {
11
+		// 配置元信息表
12
+		tb := sqldef.NewTable("config_startup_svc", "微服务启动配表").
13
+			ID("id", 128).NotNull().Comment("主键").End().
14
+			String("service_name", 100).NotNull().Comment("微服务名称").End().
15
+			String("config_name", 100).NotNull().Comment("配置名称").End().
16
+			String("field_type", 50).NotNull().Default("'config'").Comment("字段类型:config/string/bool/int...").End().
17
+			String("yaml_name", 128).NotNull().Default("''").Comment("YAML标签").End().
18
+			String("field_desc", 500).NotNull().Default("''").Comment("字段描述").End().
19
+			String("creator", 32).NotNull().Comment("创建人").End().
20
+			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End()
21
+
22
+		// 添加索引
23
+		tb.AddIndex("idx_config_name", "config_name")
24
+		tb.AddIndex("idx_service_name", "service_name")
25
+		tb.AddIndex("idx_yaml_name", "yaml_name")
26
+
27
+		// 注册表
28
+		r.RegisterTable(tb.Build())
29
+	})
30
+}
31
+
32
+// ConfigMeta 配置元信息表结构体
33
+
34
+type ConfigStartupSVC struct {
35
+	ServiceName string `gorm:"column:service_name;type:varchar(48);not null;primaryKey;comment:配置名称"`
36
+
37
+	ConfigName string `gorm:"column:config_name;type:varchar(100);not null;primaryKey;comment:配置名称"`
38
+	// 字段类型
39
+	FieldType string `gorm:"column:field_type;type:varchar(50);not null;default:'config';comment:字段类型"`
40
+	// YAML标签
41
+	YamlName string `gorm:"column:yaml_name;type:varchar(100);not null;default:'';comment:YAML标签"`
42
+	// 字段描述
43
+	FieldDesc string `gorm:"column:field_desc;type:varchar(500);not null;default:'';comment:字段描述"`
44
+	// 创建人
45
+	Creator string `gorm:"column:creator;type:varchar(32);not null;comment:创建人"`
46
+	// 创建时间
47
+	CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间"`
48
+}
49
+
50
+// TableName 指定表名
51
+func (ConfigStartupSVC) TableName() string {
52
+	return "config_startup_svc"
53
+}

+ 15
- 14
main.go Прегледај датотеку

@@ -1,15 +1,15 @@
1 1
 package main
2 2
 
3 3
 import (
4
+	"context"
4 5
 	"log"
5 6
 
7
+	"git.x2erp.com/qdy/go-base/auth"
6 8
 	"git.x2erp.com/qdy/go-base/config"
7 9
 	"git.x2erp.com/qdy/go-base/container"
8 10
 	"git.x2erp.com/qdy/go-base/ctx"
9 11
 	"git.x2erp.com/qdy/go-base/graceful"
10 12
 	"git.x2erp.com/qdy/go-base/logger"
11
-	"git.x2erp.com/qdy/go-base/middleware"
12
-	"git.x2erp.com/qdy/go-base/model/request"
13 13
 	"git.x2erp.com/qdy/go-base/model/response"
14 14
 	"git.x2erp.com/qdy/go-base/webx"
15 15
 	"git.x2erp.com/qdy/go-base/webx/router"
@@ -17,8 +17,8 @@ import (
17 17
 
18 18
 	"git.x2erp.com/qdy/go-db/sqldef"
19 19
 
20
-	"git.x2erp.com/qdy/go-svc-configure/service"
21
-	_ "git.x2erp.com/qdy/go-svc-configure/tables" // 导入表定义包,触发 init() 函数
20
+	"git.x2erp.com/qdy/go-svc-configure/internal/service"
21
+	_ "git.x2erp.com/qdy/go-svc-configure/internal/tables" // 导入表定义包,触发 init() 函数
22 22
 )
23 23
 
24 24
 var (
@@ -27,6 +27,7 @@ var (
27 27
 )
28 28
 
29 29
 func main() {
30
+
30 31
 	// 0. 初始化日志
31 32
 	logBootFactory := logger.InitBootLog()
32 33
 
@@ -73,23 +74,23 @@ func main() {
73 74
 // 注册所有路由
74 75
 func registerRoutes(ws *router.RouterService, dbFactory *database.DBFactory) {
75 76
 
76
-	ws.POST("/api/query/yaml",
77
-		func(req request.QueryRequest, reqCtx *ctx.RequestContext) (*response.QueryResult[map[string]interface{}], error) {
77
+	// ws.POST("/api/query/yaml",
78
+	// 	func(req request.QueryRequest, reqCtx *ctx.RequestContext) (*response.QueryResult[map[string]interface{}], error) {
78 79
 
79
-			result := service.QueryYamlConfigure(dbFactory, req, reqCtx)
80
+	// 		result := service.QueryYamlConfigure(dbFactory, req, reqCtx)
80 81
 
81
-			return result, nil
82
-		},
83
-	).Use(middleware.JWTAuthMiddleware).Register()
82
+	// 		return result, nil
83
+	// 	},
84
+	// ).Use(middleware.JWTAuthMiddleware).Register()
84 85
 
85
-	ws.POST("/api/init/config/template",
86
-		func(req request.QueryRequest, reqCtx *ctx.RequestContext) (*response.QueryResult[map[string]interface{}], error) {
86
+	ws.POST("/api/init/config/meta",
87
+		func(ctx context.Context, reqCtx *ctx.RequestContext) (*response.QueryResult[map[string]interface{}], error) {
87 88
 
88
-			result := service.InitConfigTemplates(dbFactory, req, reqCtx)
89
+			result := service.SyncAllConfigMeta(ctx, dbFactory, reqCtx)
89 90
 
90 91
 			return result, nil
91 92
 		},
92
-	).Use(middleware.JWTAuthMiddleware).Register()
93
+	).Use(auth.TokenAuth).Register()
93 94
 
94 95
 }
95 96
 

+ 0
- 383
service/create_config_template.go Прегледај датотеку

@@ -1,383 +0,0 @@
1
-package service
2
-
3
-import (
4
-	"fmt"
5
-	"time"
6
-
7
-	"git.x2erp.com/qdy/go-base/ctx"
8
-	"git.x2erp.com/qdy/go-base/logger"
9
-	"git.x2erp.com/qdy/go-base/model/request"
10
-	"git.x2erp.com/qdy/go-base/model/response"
11
-
12
-	"git.x2erp.com/qdy/go-base/util"
13
-
14
-	"git.x2erp.com/qdy/go-db/factory/database"
15
-	"git.x2erp.com/qdy/go-svc-configure/models"
16
-	"github.com/jmoiron/sqlx"
17
-)
18
-
19
-func InitConfigTemplates(dbFactory *database.DBFactory, req request.QueryRequest, reqCtx *ctx.RequestContext) *response.QueryResult[map[string]interface{}] {
20
-	return initConfigTemplates(dbFactory.GetDB(), reqCtx)
21
-
22
-}
23
-
24
-// InitConfigTemplates 初始化默认配置信息
25
-func initConfigTemplates(db *sqlx.DB, reqCtx *ctx.RequestContext) *response.QueryResult[map[string]interface{}] {
26
-
27
-	builder := models.NewConfigTemplateBuilder()
28
-
29
-	templates := builder.
30
-		// Service模板
31
-		StartTemplate("service", "Service配置", "服务基础配置").
32
-		AddInt("port", "服务监听端口").Default("8080").Min(1024).Max(65535).Required().FinishDetail().
33
-		AddString("service_name", "服务名称").Default("svc-configure").Pattern("^[a-zA-Z][a-zA-Z0-9_-]*$").Required().FinishDetail().
34
-		AddString("instance_name", "实例名称").Default("svc-configure-01").Required().FinishDetail().
35
-		AddInt("read_timeout", "读取超时时间(秒)").Default("30").Min(1).Max(300).Required().FinishDetail().
36
-		AddInt("write_timeout", "写入超时时间(秒)").Default("30").Min(1).Max(300).Required().FinishDetail().
37
-		AddInt("idle_timeout", "空闲超时时间(秒)").Default("60").Min(10).Max(600).Required().FinishDetail().
38
-		FinishTemplate().
39
-
40
-		// 通用数据库配置
41
-		StartTemplate("database", "通用数据库配置", "关系型数据库通用连接配置").
42
-		AddEnum("type", "数据库类型", []string{"postgresql", "mysql", "oracle"}).Default("postgresql").Required().FinishDetail().
43
-		AddString("host", "数据库主机地址").Default("localhost").Required().FinishDetail().
44
-		AddInt("port", "数据库端口").Default("5432").Min(1).Max(65535).Required().FinishDetail().
45
-		AddString("database", "数据库名称").Default("").Required().FinishDetail().
46
-		AddString("username", "用户名").Default("").Required().FinishDetail().
47
-		AddString("password", "密码").Default("").Sensitive().Required().FinishDetail().
48
-		AddInt("max_conns", "最大连接数").Default("100").Min(1).Max(1000).FinishDetail().
49
-		AddInt("min_conns", "最小连接数").Default("5").Min(0).Max(100).FinishDetail().
50
-		AddInt("max_lifetime", "连接最大生存时间(秒)").Default("3600").Min(60).Max(86400).FinishDetail().
51
-		AddInt("max_idle_time", "连接最大空闲时间(秒)").Default("1800").Min(30).Max(3600).FinishDetail().
52
-		AddInt("connect_timeout", "连接超时时间(秒)").Default("5").Min(1).Max(30).FinishDetail().
53
-		AddInt("read_timeout", "读取超时时间(秒)").Default("30").Min(1).Max(300).FinishDetail().
54
-		AddInt("write_timeout", "写入超时时间(秒)").Default("30").Min(1).Max(300).FinishDetail().
55
-		AddBoolean("ssl_enabled", "启用SSL加密").Default("false").FinishDetail().
56
-		AddString("ssl_ca", "CA证书路径").Default("").FinishDetail().
57
-		AddString("ssl_cert", "客户端证书路径").Default("").FinishDetail().
58
-		AddString("ssl_key", "客户端密钥路径").Default("").FinishDetail().
59
-		AddString("charset", "字符集").Default("utf8mb4").FinishDetail().
60
-		AddString("timezone", "时区").Default("Asia/Shanghai").FinishDetail().
61
-		AddBoolean("parse_time", "解析时间字段").Default("true").FinishDetail().
62
-		AddString("loc", "时区位置").Default("Asia/Shanghai").FinishDetail().
63
-		AddInt("max_prepared_stmt_count", "最大预处理语句数").Default("128").Min(0).Max(1024).FinishDetail().
64
-		AddInt("max_allowed_packet", "最大允许数据包大小(MB)").Default("64").Min(1).Max(1024).FinishDetail().
65
-		AddInt("timeout", "全局超时时间(秒)").Default("30").Min(1).Max(300).FinishDetail().
66
-		AddBoolean("debug_mode", "调试模式").Default("false").FinishDetail().
67
-		FinishTemplate().
68
-
69
-		// Log模板
70
-		StartTemplate("log", "日志增强配置", "增强版日志配置").
71
-		AddEnum("level", "日志级别", []string{"debug", "info", "warn", "error", "fatal"}).Default("debug").Required().FinishDetail().
72
-		AddString("output", "日志输出目标").Default("console,es").FinishDetail().
73
-		//AddBoolean("json_format", "JSON格式输出").Default("true").FinishDetail().
74
-		AddString("file_path", "日志文件路径").Default("./logs/app-%s.log").FinishDetail().
75
-		AddInt("max_size", "最大文件大小(MB)").Default("100").FinishDetail().
76
-		AddInt("max_backups", "最大备份文件数").Default("30").FinishDetail().
77
-		AddInt("max_age", "最大保存天数").Default("7").FinishDetail().
78
-		AddBoolean("compress", "压缩备份文件").Default("true").FinishDetail().
79
-		AddString("es_path", "ES地址").Default("http://x3cloudb.x2erp.com:9200").FinishDetail().
80
-		AddString("es_username", "ES用户名").Default("").FinishDetail().
81
-		AddString("es_password", "ES密码").Default("").Sensitive().FinishDetail().
82
-		FinishTemplate().
83
-
84
-		// Doris模板
85
-		StartTemplate("doris", "Doris配置", "Doris数据库连接配置").
86
-		AddString("fe_host", "Doris FE节点主机地址").Default("161.189.89.196").Pattern(`^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$`).Required().FinishDetail().
87
-		AddInt("fe_port", "Doris FE端口号").Default("8040").Min(1).Max(65535).Required().FinishDetail().
88
-		AddString("fe_username", "Doris FE用户名").Default("root").Required().FinishDetail().
89
-		AddString("fe_password", "Doris FE密码").Default("").Sensitive().Required().MinLength(6).MaxLength(100).FinishDetail().
90
-		AddInt("stream_load_timeout", "Stream Load超时时间(秒)").Default("300").Min(10).Max(3600).FinishDetail().
91
-		AddInt("batch_size", "批量大小").Default("1000").Min(1).Max(10000).FinishDetail().
92
-		FinishTemplate().
93
-
94
-		// micro 注册发现配置
95
-		StartTemplate("micro", "Micro服务配置", "Micro服务基础配置").
96
-		AddString("service_name", "服务名称").Default("svc-worker").Required().FinishDetail().
97
-		AddString("service_address", "服务地址").Default(":7070").Required().FinishDetail().
98
-		AddString("registry_address", "注册中心地址").Default("localhost:8500").Required().FinishDetail().
99
-		AddString("registry_type", "注册中心类型").Default("consul").Required().FinishDetail().
100
-		AddInt("registry_timeout", "注册中心超时时间").Default("10").Required().FinishDetail().
101
-		FinishTemplate().
102
-
103
-		// rabbitmq
104
-		StartTemplate("rabbitmq", "RabbitMQ配置", "RabbitMQ消息队列配置").
105
-		AddString("host", "主机地址").Default("localhost").Required().FinishDetail().
106
-		AddInt("port", "端口").Default("5672").Required().FinishDetail().
107
-		AddString("username", "用户名").Default("guest").Required().FinishDetail().
108
-		AddString("password", "密码").Default("guest").Sensitive().Required().FinishDetail().
109
-		AddString("vhost", "虚拟主机").Default("/").FinishDetail().
110
-		AddBoolean("use_tls", "启用TLS").Default("false").FinishDetail().
111
-		AddString("ca_cert", "CA证书").Default("").FinishDetail().
112
-		AddString("cert_file", "证书文件").Default("").FinishDetail().
113
-		AddString("key_file", "密钥文件").Default("").FinishDetail().
114
-		AddInt("max_open_channels", "最大通道数").Default("10").FinishDetail().
115
-		AddInt("reconnect_delay", "重连延迟(ms)").Default("5000").FinishDetail().
116
-		AddInt("max_reconnect_attempts", "最大重试次数").Default("10").FinishDetail().
117
-		AddInt("heartbeat", "心跳间隔(s)").Default("30").FinishDetail().
118
-		AddInt("channel_size", "通道大小").Default("100").FinishDetail().
119
-		AddString("default_exchange", "默认交换机").Default("amq.direct").FinishDetail().
120
-		AddString("default_queue", "默认队列").Default("").FinishDetail().
121
-		AddBoolean("auto_ack", "自动确认").Default("false").FinishDetail().
122
-		AddBoolean("mandatory", "强制路由").Default("false").FinishDetail().
123
-		AddBoolean("immediate", "立即发送").Default("false").FinishDetail().
124
-		AddInt("prefetch_count", "预取数量").Default("1").FinishDetail().
125
-		AddInt("prefetch_size", "预取大小").Default("0").FinishDetail().
126
-		AddBoolean("global", "全局设置").Default("false").FinishDetail().
127
-		AddBoolean("publisher_confirms", "发布确认").Default("false").FinishDetail().
128
-		AddInt("confirm_timeout", "确认超时(s)").Default("5").FinishDetail().
129
-		FinishTemplate().
130
-		GetTemplates()
131
-
132
-	return createOrUpdateConfigTemplates(db, templates, reqCtx)
133
-}
134
-
135
-func CreateOrUpdateConfigTemplates(dbFactory *database.DBFactory, req *models.ConfigTemplate, reqCtx *ctx.RequestContext) *response.QueryResult[map[string]interface{}] {
136
-	configTemplates := []*models.ConfigTemplate{req}
137
-	return createOrUpdateConfigTemplates(dbFactory.GetDB(), configTemplates, reqCtx)
138
-
139
-}
140
-
141
-// CreateOrUpdateConfigTemplates 创建或更新配置模板(支持部分更新)
142
-func createOrUpdateConfigTemplates(db *sqlx.DB, templates []*models.ConfigTemplate, reqCtx *ctx.RequestContext) *response.QueryResult[map[string]interface{}] {
143
-
144
-	if db == nil {
145
-		return util.CreateErrorResult[map[string]interface{}]("database connection is nil", reqCtx)
146
-	}
147
-
148
-	// 开始事务
149
-	tx, err := db.Beginx()
150
-	if err != nil {
151
-		return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("begin transaction failed: %v", err), reqCtx)
152
-	}
153
-	defer func() {
154
-		if err != nil {
155
-			tx.Rollback()
156
-		}
157
-	}()
158
-
159
-	now := time.Now()
160
-
161
-	for _, template := range templates {
162
-		// 设置时间
163
-		if template.CreatedAt.IsZero() {
164
-			template.CreatedAt = now
165
-		}
166
-		template.UpdatedAt = now
167
-
168
-		// 1. 插入或更新模板主表
169
-		err := upsertTemplate(tx, template, now, reqCtx)
170
-		if err != nil {
171
-			return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("upsertTemplate: %v", err), reqCtx)
172
-		}
173
-
174
-		// 2. 处理模板详情(部分更新)
175
-		if len(template.Details) > 0 {
176
-			err = upsertTemplateDetails(tx, template.Details, now)
177
-			if err != nil {
178
-				return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("upsertTemplateDetails: %v", err), reqCtx)
179
-
180
-			}
181
-		}
182
-	}
183
-
184
-	errCommit := tx.Commit()
185
-	if errCommit != nil {
186
-		return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("db commit: %v", errCommit), reqCtx)
187
-	}
188
-
189
-	return util.CreateSuccessResult[map[string]interface{}](reqCtx)
190
-}
191
-
192
-// upsertTemplate 插入或更新模板主表
193
-func upsertTemplate(tx *sqlx.Tx, template *models.ConfigTemplate, now time.Time, reqCtx *ctx.RequestContext) error {
194
-	sqlStr := `
195
-		INSERT INTO config_template (
196
-			config_template_id,
197
-			template_name, 
198
-			is_default, 
199
-			sort_order, 
200
-			description, 
201
-			creator, 
202
-			created_at, 
203
-			updated_at
204
-		) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
205
-		ON CONFLICT (config_template_id) DO UPDATE SET
206
-			is_default = EXCLUDED.is_default,
207
-			sort_order = EXCLUDED.sort_order,
208
-			description = EXCLUDED.description,
209
-			creator = EXCLUDED.creator,
210
-			updated_at = $8
211
-		RETURNING config_template_id`
212
-
213
-	var templateID string
214
-	err := tx.QueryRow(sqlStr,
215
-		template.ConfigTemplateID,
216
-		template.TemplateName,
217
-		template.IsDefault,
218
-		template.SortOrder,
219
-		template.Description,
220
-		template.Creator,
221
-		template.CreatedAt,
222
-		now, // 使用事务中的时间
223
-	).Scan(&templateID)
224
-
225
-	if err != nil {
226
-		return logger.ErrorCf(reqCtx, "upsert template failed: %v", err)
227
-	}
228
-	logger.DebugC(reqCtx, "save data:%s", templateID)
229
-	return nil
230
-}
231
-
232
-// upsertTemplateDetails 插入或更新模板详情(基于config_key唯一性)
233
-func upsertTemplateDetails(tx *sqlx.Tx, details []models.ConfigTemplateDetail, now time.Time) error {
234
-	for _, detail := range details {
235
-		// 设置时间和模板ID
236
-		if detail.CreatedAt.IsZero() {
237
-			detail.CreatedAt = now
238
-		}
239
-		detail.UpdatedAt = now
240
-		//detail.ConfigTemplateID = templateID
241
-
242
-		sqlStr := `
243
-			INSERT INTO config_template_detail (
244
-				config_template_detail_id,
245
-				config_template_id,
246
-				config_key,
247
-				config_value,
248
-				value_type,
249
-				data_type,
250
-				is_required,
251
-				default_value,
252
-				validation_rules,
253
-				description,
254
-				sort_order,
255
-				is_sensitive,
256
-				is_readonly,
257
-				creator,
258
-				created_at,
259
-				updated_at
260
-			) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15,$16)
261
-			ON CONFLICT (config_template_detail_id) DO UPDATE SET
262
-				config_value = EXCLUDED.config_value,
263
-				value_type = EXCLUDED.value_type,
264
-				data_type = EXCLUDED.data_type,
265
-				is_required = EXCLUDED.is_required,
266
-				default_value = EXCLUDED.default_value,
267
-				validation_rules = EXCLUDED.validation_rules,
268
-				description = EXCLUDED.description,
269
-				sort_order = EXCLUDED.sort_order,
270
-				is_sensitive = EXCLUDED.is_sensitive,
271
-				is_readonly = EXCLUDED.is_readonly,
272
-				creator = EXCLUDED.creator,
273
-				updated_at = $15`
274
-
275
-		_, err := tx.Exec(sqlStr,
276
-			detail.ConfigTemplateDetailID,
277
-			detail.ConfigTemplateID,
278
-			detail.ConfigKey,
279
-			detail.ConfigValue,
280
-			detail.ValueType,
281
-			detail.DataType,
282
-			detail.IsRequired,
283
-			detail.DefaultValue,
284
-			detail.ValidationRules,
285
-			detail.Description,
286
-			detail.SortOrder,
287
-			detail.IsSensitive,
288
-			detail.IsReadonly,
289
-			detail.Creator,
290
-			detail.CreatedAt,
291
-			now,
292
-		)
293
-
294
-		if err != nil {
295
-			return fmt.Errorf("upsert template detail failed (key: %s): %v", detail.ConfigKey, err)
296
-		}
297
-	}
298
-
299
-	return nil
300
-}
301
-
302
-// 批量版本(如果需要更高性能)
303
-func batchUpsertTemplateDetails(tx *sqlx.Tx, templateID int64, details []models.ConfigTemplateDetail, now time.Time) error {
304
-	if len(details) == 0 {
305
-		return nil
306
-	}
307
-
308
-	// 使用临时表进行批量操作
309
-	_, err := tx.Exec(`
310
-		CREATE TEMP TABLE temp_config_details (
311
-			config_key VARCHAR(100),
312
-			config_value TEXT,
313
-			value_type VARCHAR(20),
314
-			data_type VARCHAR(50),
315
-			is_required BOOLEAN,
316
-			default_value TEXT,
317
-			validation_rules JSONB,
318
-			description TEXT,
319
-			sort_order INTEGER,
320
-			is_sensitive BOOLEAN,
321
-			is_readonly BOOLEAN,
322
-			creator VARCHAR(100)
323
-		) ON COMMIT DROP`)
324
-	if err != nil {
325
-		return fmt.Errorf("create temp table failed: %v", err)
326
-	}
327
-
328
-	// 批量插入到临时表
329
-	stmt, err := tx.Prepare(`
330
-		INSERT INTO temp_config_details VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`)
331
-	if err != nil {
332
-		return err
333
-	}
334
-	defer stmt.Close()
335
-
336
-	for _, detail := range details {
337
-		_, err = stmt.Exec(
338
-			detail.ConfigKey,
339
-			detail.ConfigValue,
340
-			detail.ValueType,
341
-			detail.DataType,
342
-			detail.IsRequired,
343
-			detail.DefaultValue,
344
-			detail.ValidationRules,
345
-			detail.Description,
346
-			detail.SortOrder,
347
-			detail.IsSensitive,
348
-			detail.IsReadonly,
349
-			detail.Creator,
350
-		)
351
-		if err != nil {
352
-			return err
353
-		}
354
-	}
355
-
356
-	// 使用临时表进行批量UPSERT
357
-	_, err = tx.Exec(`
358
-		INSERT INTO config_template_detail (
359
-			config_template_id, config_key, config_value, value_type, data_type,
360
-			is_required, default_value, validation_rules, description, sort_order,
361
-			is_sensitive, is_readonly, creator, created_at, updated_at
362
-		)
363
-		SELECT $1, config_key, config_value, value_type, data_type,
364
-			is_required, default_value, validation_rules, description, sort_order,
365
-			is_sensitive, is_readonly, creator, $2, $3
366
-		FROM temp_config_details
367
-		ON CONFLICT (config_template_id, config_key) DO UPDATE SET
368
-			config_value = EXCLUDED.config_value,
369
-			value_type = EXCLUDED.value_type,
370
-			data_type = EXCLUDED.data_type,
371
-			is_required = EXCLUDED.is_required,
372
-			default_value = EXCLUDED.default_value,
373
-			validation_rules = EXCLUDED.validation_rules,
374
-			description = EXCLUDED.description,
375
-			sort_order = EXCLUDED.sort_order,
376
-			is_sensitive = EXCLUDED.is_sensitive,
377
-			is_readonly = EXCLUDED.is_readonly,
378
-			creator = EXCLUDED.creator,
379
-			updated_at = EXCLUDED.updated_at`,
380
-		templateID, now, now)
381
-
382
-	return err
383
-}

+ 0
- 220
service/query_yaml_configure.go Прегледај датотеку

@@ -1,220 +0,0 @@
1
-package service
2
-
3
-import (
4
-	"fmt"
5
-	"strconv"
6
-	"strings"
7
-	"time"
8
-
9
-	"git.x2erp.com/qdy/go-base/ctx"
10
-	"git.x2erp.com/qdy/go-base/logger"
11
-	"git.x2erp.com/qdy/go-base/model/request"
12
-	"git.x2erp.com/qdy/go-base/model/response"
13
-
14
-	"git.x2erp.com/qdy/go-base/util"
15
-
16
-	"git.x2erp.com/qdy/go-db/factory/database"
17
-	"github.com/jmoiron/sqlx"
18
-)
19
-
20
-func QueryYamlConfigure(dbFactory *database.DBFactory, req request.QueryRequest, reqCtx *ctx.RequestContext) *response.QueryResult[map[string]interface{}] {
21
-	return query(dbFactory.GetDB(), req, reqCtx)
22
-
23
-}
24
-
25
-// QueryYamlConfigure 执行带位置参数的查询
26
-func query(db *sqlx.DB, req request.QueryRequest, reqCtx *ctx.RequestContext) *response.QueryResult[map[string]interface{}] {
27
-
28
-	startTime := time.Now()
29
-
30
-	// 安全检查
31
-	if db == nil {
32
-		return util.CreateErrorResult[map[string]interface{}]("database connection is nil", reqCtx)
33
-	}
34
-
35
-	sqlStr := `
36
-		SELECT b.config_startup_detail_id, b.config_key, b.config_value 
37
-		FROM config_startup a
38
-		JOIN config_startup_detail b ON a.config_startup_id = b.config_startup_id 
39
-		WHERE a.config_environment_id = $1
40
-		  AND a.config_service_id = $2;`
41
-
42
-	params := req.PositionalParams
43
-	logger.DebugC(reqCtx, sqlStr)
44
-	logger.DebugC(reqCtx, fmt.Sprintf("PositionalParams: %v", params))
45
-
46
-	// 执行查询
47
-	rows, err := db.Queryx(sqlStr, params...)
48
-	if err != nil {
49
-		return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("Query execution failed: %v", err), reqCtx)
50
-	}
51
-	defer rows.Close()
52
-
53
-	// 处理结果集
54
-	return processQueryResult(rows, startTime, reqCtx)
55
-}
56
-
57
-func processQueryResult(rows *sqlx.Rows, startTime time.Time, reqCtx *ctx.RequestContext) *response.QueryResult[map[string]interface{}] {
58
-	// 初始化结果结构体
59
-	result := &response.QueryResult[map[string]interface{}]{
60
-		Metadata: reqCtx,
61
-	}
62
-
63
-	// 获取列信息
64
-	columns, err := rows.Columns()
65
-	if err != nil {
66
-		return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("Failed to get columns: %v", err), reqCtx)
67
-	}
68
-
69
-	// 存储最终结果:根key -> 内层配置map
70
-	results := make(map[string]interface{})
71
-	count := 0
72
-
73
-	// 记录已经出现的内层key,用于检测重复
74
-	// outerKey -> innerKey -> rowNumber
75
-	//keyTracker := make(map[string]map[string]int)
76
-
77
-	// 遍历行数据
78
-	for rows.Next() {
79
-		count++
80
-		values := make([]interface{}, len(columns))
81
-		valuePtrs := make([]interface{}, len(columns))
82
-		for i := range columns {
83
-			valuePtrs[i] = &values[i]
84
-		}
85
-
86
-		// 扫描行数据
87
-		if err := rows.Scan(valuePtrs...); err != nil {
88
-			return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("Scan row %d failed: %v", count, err), reqCtx)
89
-		}
90
-
91
-		// 提取当前行的三个核心字段
92
-		var detailID, configKey string
93
-		var configValue interface{}
94
-		for i, col := range columns {
95
-			v := values[i]
96
-			if v == nil {
97
-				continue
98
-			}
99
-
100
-			switch col {
101
-			case "config_startup_detail_id":
102
-				detailID = toString(v) // detailID 需要字符串
103
-			case "config_key":
104
-				configKey = toString(v) // config_key 需要字符串
105
-			case "config_value":
106
-				configValue = convertValue(v) // config_value 需要带类型转换
107
-			}
108
-		}
109
-
110
-		//logger.DebugC(reqCtx, fmt.Sprintf("Row %d - detailID: %s, configKey: %s", count, detailID, configKey))
111
-
112
-		// 解析 detailID 获取根key(倒数第3段)
113
-		parts := strings.Split(detailID, ".")
114
-		if len(parts) < 3 {
115
-			return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("Row %d detailID format error: %s", count, detailID), reqCtx)
116
-		}
117
-
118
-		rootKey := parts[len(parts)-3] // 取倒数第3段,例如 "database"
119
-
120
-		// 获取或创建外层key对应的map
121
-		configMap, exists := results[rootKey]
122
-		if !exists {
123
-			// 不存在则创建
124
-			configMap = make(map[string]interface{})
125
-			results[rootKey] = configMap
126
-		}
127
-
128
-		// 添加或覆盖内层配置
129
-		configMap.(map[string]interface{})[configKey] = configValue
130
-	}
131
-
132
-	// 检查行遍历错误
133
-	if err := rows.Err(); err != nil {
134
-		return util.CreateErrorResult[map[string]interface{}](fmt.Sprintf("Row iteration error: %v", err), reqCtx)
135
-	}
136
-
137
-	// 构建成功结果
138
-	result.Success = true
139
-	result.Data = results
140
-	result.Count = count
141
-	result.Time = time.Since(startTime).String()
142
-	result.Message = "Query success"
143
-
144
-	return result
145
-}
146
-
147
-// 辅助函数:转换为字符串
148
-func toString(v interface{}) string {
149
-	switch val := v.(type) {
150
-	case string:
151
-		return val
152
-	case []byte:
153
-		return string(val)
154
-	case int64:
155
-		return strconv.FormatInt(val, 10)
156
-	case int32:
157
-		return strconv.FormatInt(int64(val), 10)
158
-	case int:
159
-		return strconv.Itoa(val)
160
-	case float64:
161
-		return strconv.FormatFloat(val, 'f', -1, 64)
162
-	case float32:
163
-		return strconv.FormatFloat(float64(val), 'f', -1, 32)
164
-	case bool:
165
-		return strconv.FormatBool(val)
166
-	default:
167
-		return fmt.Sprintf("%v", val)
168
-	}
169
-}
170
-
171
-// 辅助函数:转换值,保持合适的数据类型
172
-func convertValue(v interface{}) interface{} {
173
-	switch val := v.(type) {
174
-	case []byte:
175
-		// 尝试解析为合适的数据类型
176
-		strVal := string(val)
177
-		return parseStringValue(strVal)
178
-
179
-	case string:
180
-		return parseStringValue(val)
181
-
182
-	case int64, int32, int:
183
-		return val
184
-
185
-	case float64, float32:
186
-		return val
187
-
188
-	case bool:
189
-		return val
190
-
191
-	default:
192
-		// 其他类型转换为字符串
193
-		return toString(val)
194
-	}
195
-}
196
-
197
-// 辅助函数:解析字符串值为合适的数据类型
198
-func parseStringValue(strVal string) interface{} {
199
-	// 1. 尝试布尔值 (支持 true/false, yes/no, on/off, 1/0)
200
-	lowerVal := strings.ToLower(strings.TrimSpace(strVal))
201
-	if lowerVal == "true" || lowerVal == "yes" || lowerVal == "on" || lowerVal == "1" {
202
-		return true
203
-	}
204
-	if lowerVal == "false" || lowerVal == "no" || lowerVal == "off" || lowerVal == "0" {
205
-		return false
206
-	}
207
-
208
-	// 2. 尝试整数
209
-	if intVal, err := strconv.ParseInt(strVal, 10, 64); err == nil {
210
-		return intVal
211
-	}
212
-
213
-	// 3. 尝试浮点数
214
-	if floatVal, err := strconv.ParseFloat(strVal, 64); err == nil {
215
-		return floatVal
216
-	}
217
-
218
-	// 4. 保持为字符串
219
-	return strVal
220
-}

+ 0
- 77
tables/config_environment.go Прегледај датотеку

@@ -1,77 +0,0 @@
1
-package tables
2
-
3
-import (
4
-	"fmt"
5
-	"time"
6
-
7
-	"git.x2erp.com/qdy/go-db/sqldef"
8
-)
9
-
10
-func init() {
11
-
12
-	sqldef.AddRegistration(func(r *sqldef.Registry) {
13
-		// 环境表
14
-		tb := sqldef.NewTable("config_environment", "环境表").
15
-			ID("config_environment_id", 8).NotNull().Comment("环境编码,主键").End().
16
-			String("env_name", 64).NotNull().Comment("环境名称").End().
17
-			String("description", 64).Comment("环境描述").End().
18
-			String("creator", 32).NotNull().Comment("创建人").End().
19
-			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End().
20
-			DateTime("updated_at").Default("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").Comment("更新时间").End()
21
-
22
-		// 注册表
23
-		r.RegisterTable(tb.Build())
24
-	})
25
-}
26
-
27
-// ConfigEnvironment 环境表结构体
28
-type ConfigEnvironment struct {
29
-	// 环境编码,主键
30
-	ConfigEnvironmentID string `gorm:"column:config_environment_id;type:varchar(8);primaryKey;not null;comment:环境编码,主键"`
31
-	// 环境名称
32
-	EnvName string `gorm:"column:env_name;type:varchar(64);not null;comment:环境名称"`
33
-	// 环境描述
34
-	Description *string `gorm:"column:description;type:varchar(64);comment:环境描述"`
35
-	// 创建人
36
-	Creator string `gorm:"column:creator;type:varchar(32);not null;comment:创建人"`
37
-	// 创建时间
38
-	CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间"`
39
-	// 更新时间
40
-	UpdatedAt *time.Time `gorm:"column:updated_at;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间"`
41
-}
42
-
43
-// TableName 指定表名
44
-func (ConfigEnvironment) TableName() string {
45
-	return "config_environment"
46
-}
47
-
48
-// GetDefaultDataSQL 获取环境表默认数据的SQL语句(PostgreSQL版本)
49
-func GetDefaultDataSQL() []string {
50
-	now := time.Now().Format("2006-01-02 15:04:05")
51
-
52
-	return []string{
53
-		// 清空表数据(可选,根据需要决定是否包含)
54
-		// "TRUNCATE TABLE config_environment RESTART IDENTITY;",
55
-
56
-		// 单条SQL插入所有数据(PostgreSQL多行插入)
57
-		fmt.Sprintf(`INSERT INTO config_environment 
58
-			(config_environment_id, env_name, description, creator, created_at, updated_at) 
59
-			VALUES 
60
-			('dev', '开发环境', '用于开发人员本地开发和调试的环境', 'system', '%s', '%s'),
61
-			('test', '测试环境', '用于功能测试、集成测试的环境', 'system', '%s', '%s'),
62
-			('pre', '预发布环境', '用于生产前最后验证的环境,与生产环境配置一致', 'system', '%s', '%s'),
63
-			('prod', '生产环境', '正式对外提供服务的生产环境', 'system', '%s', '%s'),
64
-			('demo', '演示环境', '用于产品演示和客户体验的环境', 'system', '%s', '%s')
65
-			ON CONFLICT (config_environment_id) DO UPDATE SET
66
-			env_name = EXCLUDED.env_name,
67
-			description = EXCLUDED.description,
68
-			creator = EXCLUDED.creator,
69
-			updated_at = EXCLUDED.updated_at;`,
70
-			now, now, // dev
71
-			now, now, // test
72
-			now, now, // pre
73
-			now, now, // prod
74
-			now, now, // demo
75
-		),
76
-	}
77
-}

+ 0
- 42
tables/config_service.go Прегледај датотеку

@@ -1,42 +0,0 @@
1
-// 微服务登记表。保存整个项目有哪些微服务
2
-package tables
3
-
4
-import (
5
-	"time"
6
-
7
-	"git.x2erp.com/qdy/go-db/sqldef"
8
-)
9
-
10
-func init() {
11
-	sqldef.AddRegistration(func(r *sqldef.Registry) {
12
-		// 微服务档案表
13
-		tb := sqldef.NewTable("config_service", "微服务档案表").
14
-			ID("config_service_id", 32).NotNull().Comment("服务编码,主键").End().
15
-			String("service_name", 64).NotNull().Comment("服务名称").End().
16
-			String("service_version", 32).NotNull().Default("'1.0.0'").Comment("当前版本").End().
17
-			String("creator", 32).NotNull().Comment("创建人").End().
18
-			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End()
19
-
20
-		// 注册表
21
-		r.RegisterTable(tb.Build())
22
-	})
23
-}
24
-
25
-// ConfigService 微服务档案表结构体
26
-type ConfigService struct {
27
-	// 服务编码,主键
28
-	ConfigServiceID string `gorm:"column:config_service_id;type:varchar(32);primaryKey;not null;comment:服务编码,主键"`
29
-	// 服务名称
30
-	ServiceName string `gorm:"column:service_name;type:varchar(64);not null;comment:服务名称"`
31
-	// 当前版本
32
-	ServiceVersion string `gorm:"column:service_version;type:varchar(32);not null;default:'1.0.0';comment:当前版本"`
33
-	// 创建人
34
-	Creator string `gorm:"column:creator;type:varchar(32);not null;comment:创建人"`
35
-	// 创建时间
36
-	CreatedAt time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP;comment:创建时间"`
37
-}
38
-
39
-// TableName 指定表名
40
-func (ConfigService) TableName() string {
41
-	return "config_service"
42
-}

+ 0
- 26
tables/config_startup.go Прегледај датотеку

@@ -1,26 +0,0 @@
1
-package tables
2
-
3
-import "git.x2erp.com/qdy/go-db/sqldef"
4
-
5
-func init() {
6
-	sqldef.AddRegistration(func(r *sqldef.Registry) {
7
-		// 启动配置表
8
-		tb := sqldef.NewTable("config_startup", "启动配置表").
9
-			ID("config_startup_id", 128).NotNull().Comment("主键ID").End(). // 默认VARCHAR(64)
10
-			String("config_template_id", 64).NotNull().Comment("模板ID,关联config_template表").End().
11
-			String("config_service_id", 64).NotNull().Comment("服务名称").End().
12
-			String("config_environment_id", 8).NotNull().Default("'dev'").Comment("环境ID").End(). //dev/test
13
-			Int("version").NotNull().Default("1").Comment("版本号").End().
14
-			String("creator", 32).NotNull().Comment("创建人").End().
15
-			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End().
16
-			DateTime("updated_at").Default("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").Comment("更新时间").End()
17
-
18
-		// 添加唯一约束和索引
19
-		tb.AddIndex("idx_service_id", "config_service_id").
20
-			AddIndex("idx_template_id", "config_template_id").
21
-			AddIndex("idx_env_id", "config_environment_id")
22
-
23
-		// 注册表
24
-		r.RegisterTable(tb.Build())
25
-	})
26
-}

+ 0
- 26
tables/config_startup_detail.go Прегледај датотеку

@@ -1,26 +0,0 @@
1
-package tables
2
-
3
-import "git.x2erp.com/qdy/go-db/sqldef"
4
-
5
-func init() {
6
-	sqldef.AddRegistration(func(r *sqldef.Registry) {
7
-		// ✅ 修正表名拼写:detall → detail
8
-		tb := sqldef.NewTable("config_startup_detail", "启动配置明细表").
9
-			ID("config_startup_detail_id", 258).NotNull().Comment("主键ID").End().                  // 默认VARCHAR(64)
10
-			String("config_template_detail_id", 128).NotNull().Comment("模版子表主键ID").End().         // ✅ 修正注释
11
-			String("config_startup_id", 128).NotNull().Comment("启动配置ID,关联config_startup表").End(). // ✅ 修正注释
12
-			String("config_key", 64).NotNull().Comment("配置键名").End().
13
-			String("config_value", 512).NotNull().Comment("配置值").End(). // ✅ 修正长度注释
14
-			String("creator", 32).NotNull().Comment("创建人").End().
15
-			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End().
16
-			DateTime("updated_at").Default("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").Comment("更新时间").End()
17
-
18
-		// ✅ 正确的索引
19
-		tb.AddIndex("idx_startup_id", "config_startup_id").
20
-			AddIndex("idx_config_key", "config_key") // 按key查询
21
-		//AddUniqueIndex("uk_startup_key", "config_startup_id", "config_key") // 防止重复key
22
-
23
-		// 注册表
24
-		r.RegisterTable(tb.Build())
25
-	})
26
-}

+ 0
- 30
tables/config_template.go Прегледај датотеку

@@ -1,30 +0,0 @@
1
-// config_template.go
2
-package tables
3
-
4
-import "git.x2erp.com/qdy/go-db/sqldef"
5
-
6
-func init() {
7
-	sqldef.AddRegistration(func(r *sqldef.Registry) {
8
-		// 配置模版表
9
-		tb := sqldef.NewTable("config_template", "配置模版").
10
-			ID("config_template_id", 128).NotNull().Comment("主键ID").End().
11
-			String("template_name", 64).NotNull().Comment("模版名称").End().
12
-			//String("yaml_root_key", 32).NotNull().Comment("YAML配置的根节点名称").End().
13
-			//String("service_type", 32).Comment("适用服务类型,如:auth/order/payment").End().
14
-			Bool("is_default").NotNull().Default("0").Comment("是否默认模版").End().
15
-			Int("sort_order").NotNull().Default("0").Comment("排序号,小的在前").End().
16
-			Text("description").Comment("模版说明").End().
17
-			String("creator", 32).NotNull().Comment("创建人").End().
18
-			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End().
19
-			DateTime("updated_at").Default("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").Comment("更新时间").End()
20
-
21
-		// 添加索引
22
-		//tb.AddIndex("idx_type_code", "yaml_root_key")
23
-		//AddIndex("idx_service_type", "service_type").
24
-		tb.AddIndex("idx_sort_order", "sort_order")
25
-		//AddUniqueIndex("uk_name_type", "template_name", "yaml_root_key")
26
-
27
-		// 注册表
28
-		r.RegisterTable(tb.Build())
29
-	})
30
-}

+ 0
- 38
tables/config_template_detail.go Прегледај датотеку

@@ -1,38 +0,0 @@
1
-package tables
2
-
3
-import "git.x2erp.com/qdy/go-db/sqldef"
4
-
5
-func init() {
6
-	sqldef.AddRegistration(func(r *sqldef.Registry) {
7
-		// 配置模板明细表(K-V格式)
8
-		tb := sqldef.NewTable("config_template_detail", "配置模板明细表").
9
-			ID("config_template_detail_id", 256).NotNull().Comment("主键ID").End().
10
-			String("config_template_id", 128).NotNull().Comment("模板ID,关联config_template表").End().
11
-			String("config_key", 64).NotNull().Comment("配置键名").End().
12
-			Text("config_value").NotNull().Comment("配置值").End().
13
-			String("value_type", 32).NotNull().Default("'string'").Comment("值类型: string/int/bool/float/json").End().
14
-			String("data_type", 32).Comment("数据类型: text/number/boolean/select/array/object").End().
15
-			Bool("is_required").NotNull().Default("0").Comment("是否必填").End().
16
-			Text("default_value").Comment("默认值").End().
17
-			Text("validation_rules").Comment("验证规则JSON").End().
18
-			Text("description").Comment("配置项说明").End().
19
-			Int("sort_order").NotNull().Default("0").Comment("排序号").End().
20
-			Bool("is_sensitive").NotNull().Default("0").Comment("是否敏感数据(如密码)").End().
21
-			Bool("is_readonly").NotNull().Default("0").Comment("是否只读").End().
22
-			String("creator", 32).NotNull().Comment("创建人").End().
23
-			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End().
24
-			DateTime("updated_at").Default("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").Comment("更新时间").End()
25
-
26
-		// 添加索引和约束
27
-		tb.AddUniqueIndex("uk_template_key", "config_template_id", "config_key").
28
-			AddIndex("idx_template_id", "config_template_id").
29
-			AddIndex("idx_sort_order", "sort_order").
30
-			AddIndex("idx_is_sensitive", "is_sensitive")
31
-
32
-		// 可选:添加外键约束(如果数据库支持)
33
-		// tb.AddForeignKey("fk_template_detail_template", "template_id", "config_template", "template_id")
34
-
35
-		// 注册表
36
-		r.RegisterTable(tb.Build())
37
-	})
38
-}

+ 41
- 0
test/my_post_config_meta_test.go Прегледај датотеку

@@ -0,0 +1,41 @@
1
+package main
2
+
3
+import (
4
+	"fmt"
5
+	"io"
6
+	"log"
7
+	"net/http"
8
+	"testing"
9
+)
10
+
11
+func TestConfigMeta(t *testing.T) {
12
+
13
+	httpClient := &http.Client{}
14
+	url := "http://localhost:8080/api/init/config/meta"
15
+	req, err := http.NewRequest("POST", url, nil)
16
+	if err != nil {
17
+		log.Printf("NewRequest:%v", err)
18
+	}
19
+
20
+	req.Header.Set("Authorization", "Bearer 123")
21
+	req.Header.Set("Content-Type", "application/json")
22
+
23
+	resp, err := httpClient.Do(req)
24
+
25
+	if err != nil {
26
+		fmt.Printf("发送请求失败: %v\n", err)
27
+		return
28
+	}
29
+	defer resp.Body.Close()
30
+
31
+	// 读取响应
32
+	body, err := io.ReadAll(resp.Body)
33
+	if err != nil {
34
+		fmt.Printf("读取响应失败: %v\n", err)
35
+		return
36
+	}
37
+
38
+	fmt.Printf("状态码: %d\n", resp.StatusCode)
39
+	fmt.Printf("响应体: %s\n", string(body))
40
+
41
+}

Loading…
Откажи
Сачувај