Bladeren bron

初始提交

qdy 2 maanden geleden
commit
4db4127681

+ 1
- 0
.gitignore Bestand weergeven

@@ -0,0 +1 @@
1
+logs/

+ 25
- 0
gct.sh Bestand weergeven

@@ -0,0 +1,25 @@
1
+#!/bin/bash
2
+
3
+# 使用命令行参数,如果没有提供则使用默认值
4
+COMMIT_MSG="${1:-初始提交}"
5
+TAG_VERSION="${2:-v0.1.0}"
6
+
7
+echo "提交信息: $COMMIT_MSG"
8
+echo "标签版本: $TAG_VERSION"
9
+
10
+# 提交和推送
11
+git add .
12
+git commit -m "$COMMIT_MSG"
13
+git push -u origin master
14
+
15
+# 创建标签(关键修改在这里)
16
+# 方法1:使用注释标签(推荐,不会打开编辑器)
17
+git tag -a "$TAG_VERSION" -m "Release $TAG_VERSION"
18
+
19
+# 或者方法2:如果你需要GPG签名,使用这个
20
+# GIT_EDITOR=true git tag -s "$TAG_VERSION" -m "Release $TAG_VERSION"
21
+
22
+# 推送标签
23
+git push origin "$TAG_VERSION"
24
+
25
+echo "完成!"

+ 17
- 0
go.mod Bestand weergeven

@@ -0,0 +1,17 @@
1
+module git.x2erp.com/qdy/go-svc-configure
2
+
3
+go 1.25.4
4
+
5
+require (
6
+	git.x2erp.com/qdy/go-base v0.1.70
7
+	git.x2erp.com/qdy/go-db v0.1.70
8
+	go-micro.dev/v4 v4.11.0
9
+)
10
+
11
+require (
12
+	github.com/kr/pretty v0.3.1 // indirect
13
+	github.com/rogpeppe/go-internal v1.14.1 // indirect
14
+	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
15
+)
16
+
17
+require gopkg.in/yaml.v2 v2.4.0 // indirect

+ 14
- 0
go.sum Bestand weergeven

@@ -0,0 +1,14 @@
1
+git.x2erp.com/qdy/go-base v0.1.44 h1:xHpMppSNj79lqdUc+lmgGXOgEvHyNotUayoe5/hHWr4=
2
+git.x2erp.com/qdy/go-base v0.1.44/go.mod h1:Q+YLwpCoU8CVSnzATLdz2LAzVMlz/CEGzo8DePf7cug=
3
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
4
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
5
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
6
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
7
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
8
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
9
+github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
10
+go-micro.dev/v4 v4.11.0 h1:DZ2xcr0pnZJDlp6MJiCLhw4tXRxLw9xrJlPT91kubr0=
11
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
12
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
13
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
14
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

+ 80
- 0
main.go Bestand weergeven

@@ -0,0 +1,80 @@
1
+package main
2
+
3
+import (
4
+	"log"
5
+	"net/http"
6
+
7
+	"git.x2erp.com/qdy/go-base/bootstraps"
8
+	"git.x2erp.com/qdy/go-base/middleware"
9
+	"git.x2erp.com/qdy/go-db/factory/database"
10
+	"git.x2erp.com/qdy/go-db/myhandle"
11
+	"git.x2erp.com/qdy/go-db/sqldef"
12
+	"git.x2erp.com/qdy/go-svc-agent/functions"
13
+	"go-micro.dev/v4/web"
14
+
15
+	// 导入表定义包,触发 init() 函数
16
+	_ "git.x2erp.com/qdy/go-svc-configure/tables" // 确保这里的路径正确
17
+)
18
+
19
+var (
20
+	serviceName    = "svc-agent"
21
+	serviceVersion = "1.0.0"
22
+)
23
+
24
+func main() {
25
+
26
+	// 创建服务启动器
27
+	bootstrapper := bootstraps.NewServiceBootstrapper(serviceName, serviceVersion)
28
+
29
+	//加载配置
30
+	bootstrapper.InitConfig()
31
+
32
+	//构建数据库工厂
33
+	bootstrapper.InitDatabase()
34
+	defer bootstrapper.CleanupDatabase()
35
+
36
+	//创建表到数据库
37
+	cretetabel(bootstrapper.DbFactory)
38
+
39
+	// 启动服务,传入路由注册函数
40
+	bootstrapper.Run(registerRoutes)
41
+
42
+}
43
+
44
+// 注册所有路由
45
+func registerRoutes(webService web.Service, dbFactory *database.DBFactory) {
46
+
47
+	// 查询接口 - JSON
48
+	webService.Handle("/api/query/json", middleware.JWTAuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
49
+		myhandle.QueryHandlerJson(w, r, dbFactory, functions.QueryToJSON)
50
+	})))
51
+
52
+	// 查询接口 - CSV
53
+	webService.Handle("/api/query/csv", middleware.JWTAuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
54
+		myhandle.QueryHandlerBytes(w, r, dbFactory, functions.QueryToCSV)
55
+	})))
56
+
57
+	// 查询接口 - CSV with positional params
58
+	webService.Handle("/api/query/csv/param", middleware.JWTAuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
59
+		myhandle.QueryHandlerBytes(w, r, dbFactory, functions.QueryPositionalToCSV)
60
+	})))
61
+}
62
+
63
+func cretetabel(factory *database.DBFactory) {
64
+	// 获取数据库连接和类型
65
+	db := factory.GetDB()
66
+	dbType := factory.GetDBType()
67
+
68
+	// 创建表同步器
69
+	syncer, err := sqldef.NewTableSyncer(db, dbType)
70
+	if err != nil {
71
+		log.Fatalf("创建 - 建立器失败: %v", err)
72
+	}
73
+
74
+	// 创建表
75
+	if err := syncer.RecreateTables(); err != nil {
76
+		log.Fatalf("建表失败: %v", err)
77
+	}
78
+
79
+	log.Println("数据库表建立完成!")
80
+}

+ 40
- 0
models/config_template.go Bestand weergeven

@@ -0,0 +1,40 @@
1
+package models
2
+
3
+import (
4
+	"database/sql"
5
+	"encoding/json"
6
+	"strings"
7
+	"time"
8
+)
9
+
10
+// ConfigTemplate 配置模板表
11
+type ConfigTemplate struct {
12
+	ID          int64           `json:"id" db:"id"`                               // 技术主键
13
+	Name        string          `json:"name" db:"name"`                           // 模板名称
14
+	TypeCode    string          `json:"type_code" db:"type_code"`                 // 类型编码,关联template_type.code
15
+	Content     json.RawMessage `json:"content" db:"content"`                     // 模板内容JSON
16
+	ServiceType sql.NullString  `json:"service_type,omitempty" db:"service_type"` // 适用服务类型
17
+	IsDefault   bool            `json:"is_default" db:"is_default"`               // 是否默认模板
18
+	SortOrder   int             `json:"sort_order" db:"sort_order"`               // 排序号
19
+	Creator     string          `json:"creator" db:"creator"`                     // 创建人
20
+	CreatedAt   time.Time       `json:"created_at" db:"created_at"`               // 创建时间
21
+}
22
+
23
+// TableName 返回表名
24
+func (ConfigTemplate) TableName() string {
25
+	return "config_template"
26
+}
27
+
28
+// TemplateKey 返回业务键:type_code.name
29
+func (c *ConfigTemplate) TemplateKey() string {
30
+	return c.TypeCode + "." + c.Name
31
+}
32
+
33
+// ParseTemplateKey 解析业务键
34
+func ParseTemplateKey(key string) (typeCode, name string, ok bool) {
35
+	parts := strings.SplitN(key, ".", 2)
36
+	if len(parts) != 2 {
37
+		return "", "", false
38
+	}
39
+	return parts[0], parts[1], true
40
+}

+ 25
- 0
models/service_profile.go Bestand weergeven

@@ -0,0 +1,25 @@
1
+package models
2
+
3
+import (
4
+	"database/sql"
5
+	"time"
6
+)
7
+
8
+// ServiceProfile 微服务档案表
9
+type ServiceProfile struct {
10
+	ServiceCode string         `json:"service_code" db:"service_code"` // 主键,服务编码
11
+	ServiceName string         `json:"service_name" db:"service_name"` // 服务名称
12
+	ServiceType string         `json:"service_type" db:"service_type"` // 服务类型:api/auth/order等
13
+	Version     string         `json:"version" db:"version"`           // 当前版本
14
+	Language    string         `json:"language" db:"language"`         // 开发语言
15
+	Owner       string         `json:"owner" db:"owner"`               // 负责人
16
+	OwnerPhone  sql.NullString `json:"owner_phone,omitempty" db:"owner_phone"`
17
+	Status      string         `json:"status" db:"status"`         // 状态:active/inactive
18
+	Creator     string         `json:"creator" db:"creator"`       // 创建人
19
+	CreatedAt   time.Time      `json:"created_at" db:"created_at"` // 创建时间
20
+}
21
+
22
+// TableName 返回表名
23
+func (ServiceProfile) TableName() string {
24
+	return "service_profile"
25
+}

+ 54
- 0
models/startup_config.go Bestand weergeven

@@ -0,0 +1,54 @@
1
+package models
2
+
3
+import (
4
+	"database/sql"
5
+	"encoding/json"
6
+	"fmt"
7
+	"strconv"
8
+	"strings"
9
+	"time"
10
+)
11
+
12
+// StartupConfig 启动配置表
13
+type StartupConfig struct {
14
+	ID          int64           `json:"id" db:"id"`                           // 技术主键
15
+	ServiceName string          `json:"service_name" db:"service_name"`       // 服务名称
16
+	Environment string          `json:"environment" db:"environment"`         // 环境:dev/test/prod
17
+	Version     int             `json:"version" db:"version"`                 // 配置版本
18
+	ConfigJSON  json.RawMessage `json:"config_json" db:"config_json"`         // 配置内容JSON
19
+	IsActive    bool            `json:"is_active" db:"is_active"`             // 是否生效
20
+	Creator     string          `json:"creator" db:"creator"`                 // 创建人
21
+	CreatedAt   time.Time       `json:"created_at" db:"created_at"`           // 创建时间
22
+	UpdatedAt   sql.NullTime    `json:"updated_at,omitempty" db:"updated_at"` // 更新时间
23
+}
24
+
25
+// TableName 返回表名
26
+func (StartupConfig) TableName() string {
27
+	return "startup_config"
28
+}
29
+
30
+// ConfigKey 返回业务键:service_name.environment.vversion
31
+func (c *StartupConfig) ConfigKey() string {
32
+	return fmt.Sprintf("%s.%s.v%d", c.ServiceName, c.Environment, c.Version)
33
+}
34
+
35
+// ParseConfigKey 解析业务键
36
+func ParseConfigKey(key string) (service, env string, version int, ok bool) {
37
+	parts := strings.Split(key, ".")
38
+	if len(parts) != 3 {
39
+		return "", "", 0, false
40
+	}
41
+
42
+	// 检查版本格式
43
+	if !strings.HasPrefix(parts[2], "v") {
44
+		return "", "", 0, false
45
+	}
46
+
47
+	verStr := strings.TrimPrefix(parts[2], "v")
48
+	version, err := strconv.Atoi(verStr)
49
+	if err != nil {
50
+		return "", "", 0, false
51
+	}
52
+
53
+	return parts[0], parts[1], version, true
54
+}

+ 22
- 0
models/template_type.go Bestand weergeven

@@ -0,0 +1,22 @@
1
+package models
2
+
3
+import (
4
+	"database/sql"
5
+	"time"
6
+)
7
+
8
+// TemplateType 模板类型表
9
+type TemplateType struct {
10
+	Code        string         `json:"code" db:"code"` // 主键,如:db, redis, auth
11
+	Name        string         `json:"name" db:"name"` // 类型名称
12
+	Description sql.NullString `json:"description,omitempty" db:"description"`
13
+	SortOrder   int            `json:"sort_order" db:"sort_order"` // 排序号
14
+	IsSystem    bool           `json:"is_system" db:"is_system"`   // 是否系统类型
15
+	Creator     string         `json:"creator" db:"creator"`       // 创建人
16
+	CreatedAt   time.Time      `json:"created_at" db:"created_at"` // 创建时间
17
+}
18
+
19
+// TableName 返回表名
20
+func (TemplateType) TableName() string {
21
+	return "template_type"
22
+}

+ 22
- 0
tables/config_environment.go Bestand weergeven

@@ -0,0 +1,22 @@
1
+package tables
2
+
3
+import (
4
+	"git.x2erp.com/qdy/go-db/sqldef"
5
+)
6
+
7
+func init() {
8
+
9
+	sqldef.AddRegistration(func(r *sqldef.Registry) {
10
+		// 环境表
11
+		tb := sqldef.NewTable("config_environment", "环境表").
12
+			ID("config_environment_id", 8).NotNull().Comment("环境编码,主键").End().
13
+			String("env_name", 64).NotNull().Comment("环境名称").End().
14
+			String("description", 64).Comment("环境描述").End().
15
+			String("creator", 32).NotNull().Comment("创建人").End().
16
+			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End().
17
+			DateTime("updated_at").Default("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP").Comment("更新时间").End()
18
+
19
+		// 注册表
20
+		r.RegisterTable(tb.Build())
21
+	})
22
+}

+ 19
- 0
tables/config_service.go Bestand weergeven

@@ -0,0 +1,19 @@
1
+// 微服务登记表。保存整个项目有哪些微服务
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_service", "微服务档案表").
10
+			ID("config_service_id", 32).NotNull().Comment("服务编码,主键").End().
11
+			String("service_name", 64).NotNull().Comment("服务名称").End().
12
+			String("service_version", 32).NotNull().Default("'1.0.0'").Comment("当前版本").End().
13
+			String("creator", 32).NotNull().Comment("创建人").End().
14
+			DateTime("created_at").NotNull().Default("CURRENT_TIMESTAMP").Comment("创建时间").End()
15
+
16
+		// 注册表
17
+		r.RegisterTable(tb.Build())
18
+	})
19
+}

+ 26
- 0
tables/config_startup.go Bestand weergeven

@@ -0,0 +1,26 @@
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
+}

+ 26
- 0
tables/config_startup_detail.go Bestand weergeven

@@ -0,0 +1,26 @@
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
+}

+ 30
- 0
tables/config_template.go Bestand weergeven

@@ -0,0 +1,30 @@
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
+		//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
+}

+ 38
- 0
tables/config_template_detail.go Bestand weergeven

@@ -0,0 +1,38 @@
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
+}

Laden…
Annuleren
Opslaan