package models import ( "encoding/json" "time" ) // ConfigTemplateBuilder 配置模板建造者 type ConfigTemplateBuilder struct { templates []*ConfigTemplate current *ConfigTemplate } // NewConfigTemplateBuilder 创建配置模板建造者 func NewConfigTemplateBuilder() *ConfigTemplateBuilder { return &ConfigTemplateBuilder{ templates: make([]*ConfigTemplate, 0), } } // StartTemplate 开始创建新模板 func (b *ConfigTemplateBuilder) StartTemplate(name, rootKey, description string) *ConfigTemplateBuilder { b.current = &ConfigTemplate{ TemplateName: name, YamlRootKey: rootKey, Description: description, IsDefault: true, SortOrder: len(b.templates) + 1, Creator: "system", CreatedAt: time.Now(), UpdatedAt: time.Now(), Details: make([]ConfigTemplateDetail, 0), } return b } // AddInt 添加整型配置项 func (b *ConfigTemplateBuilder) AddInt(key, description string) *DetailBuilder { return b.addDetail(key, description, "number", "int") } // AddString 添加字符串配置项 func (b *ConfigTemplateBuilder) AddString(key, description string) *DetailBuilder { return b.addDetail(key, description, "string", "string") } // AddBoolean 添加布尔型配置项 func (b *ConfigTemplateBuilder) AddBoolean(key, description string) *DetailBuilder { return b.addDetail(key, description, "boolean", "boolean") } // AddEnum 添加枚举型配置项 func (b *ConfigTemplateBuilder) AddEnum(key, description string, enumValues []string) *DetailBuilder { db := b.addDetail(key, description, "string", "string") db.detail.ValidationRules = func() string { rules := ValidationRules{ EnumValues: enumValues, } b, _ := json.Marshal(rules) return string(b) }() return db } // FinishTemplate 完成当前模板创建 func (b *ConfigTemplateBuilder) FinishTemplate() *ConfigTemplateBuilder { if b.current != nil { b.templates = append(b.templates, b.current) b.current = nil } return b } // GetTemplates 获取所有模板 func (b *ConfigTemplateBuilder) GetTemplates() []*ConfigTemplate { return b.templates } // // BuildSampleTemplates 构建示例模板 // func (b *ConfigTemplateBuilder) BuildSampleTemplates() *ConfigTemplateBuilder { // // Service模板 // b.StartTemplate("Service配置", "service", "服务基础配置"). // AddInt("port", "服务监听端口").Default("8080").Min(1024).Max(65535).Required().FinishDetail(). // AddString("service_name", "服务名称").Default("svc-configure").Pattern("^[a-zA-Z][a-zA-Z0-9_-]*$").Required().FinishDetail(). // AddString("instance_name", "实例名称").Default("svc-configure-01").Required().FinishDetail(). // AddInt("read_timeout", "读取超时时间(秒)").Default("30").Min(1).Max(300).Required().FinishDetail(). // AddInt("write_timeout", "写入超时时间(秒)").Default("30").Min(1).Max(300).Required().FinishDetail(). // AddInt("idle_timeout", "空闲超时时间(秒)").Default("60").Min(10).Max(600).Required().FinishDetail(). // FinishTemplate() // // Log模板 // b.StartTemplate("日志配置", "log", "日志相关配置"). // AddEnum("level", "日志级别", []string{"debug", "info", "warn", "error", "fatal"}).Default("debug").Required().FinishDetail(). // AddString("output", "日志输出目标").Default("console,file").FinishDetail(). // AddBoolean("json_format", "是否以JSON格式输出日志").Default("true").FinishDetail(). // FinishTemplate() // // Doris模板 // b.StartTemplate("Doris配置", "doris", "Doris数据库连接配置"). // 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(). // AddInt("fe_port", "Doris FE端口号").Default("8040").Min(1).Max(65535).Required().FinishDetail(). // AddString("fe_username", "Doris FE用户名").Default("root").Required().FinishDetail(). // AddString("fe_password", "Doris FE密码").Default("mos8555").Sensitive().Required().MinLength(6).MaxLength(100).FinishDetail(). // AddInt("stream_load_timeout", "Stream Load超时时间(秒)").Default("300").Min(10).Max(3600).FinishDetail(). // AddInt("batch_size", "批量大小").Default("1000").Min(1).Max(10000).FinishDetail(). // FinishTemplate() // return b // } // 私有方法 func (b *ConfigTemplateBuilder) addDetail(key, description, valueType, dataType string) *DetailBuilder { if b.current == nil { b.StartTemplate("未命名模板", "untitled", "未描述模板") } detail := ConfigTemplateDetail{ ConfigKey: key, Description: description, ValueType: valueType, DataType: dataType, IsRequired: false, IsSensitive: false, IsReadonly: false, SortOrder: len(b.current.Details) + 1, Creator: "system", CreatedAt: time.Now(), UpdatedAt: time.Now(), } return &DetailBuilder{ builder: b, detail: detail, } } // DetailBuilder 配置详情建造者 type DetailBuilder struct { builder *ConfigTemplateBuilder detail ConfigTemplateDetail } // Default 设置默认值 func (db *DetailBuilder) Default(value string) *DetailBuilder { db.detail.DefaultValue = value db.detail.ConfigValue = value return db } // Required 设置为必填项 func (db *DetailBuilder) Required() *DetailBuilder { db.detail.IsRequired = true return db } // Sensitive 设置为敏感信息 func (db *DetailBuilder) Sensitive() *DetailBuilder { db.detail.IsSensitive = true return db } // Readonly 设置为只读 func (db *DetailBuilder) Readonly() *DetailBuilder { db.detail.IsReadonly = true return db } // Min 设置最小值 func (db *DetailBuilder) Min(min float64) *DetailBuilder { db.addValidation(func(r *ValidationRules) { r.Min = &min }) return db } // Max 设置最大值 func (db *DetailBuilder) Max(max float64) *DetailBuilder { db.addValidation(func(r *ValidationRules) { r.Max = &max }) return db } // MinLength 设置最小长度 func (db *DetailBuilder) MinLength(length int) *DetailBuilder { db.addValidation(func(r *ValidationRules) { r.MinLength = &length }) return db } // MaxLength 设置最大长度 func (db *DetailBuilder) MaxLength(length int) *DetailBuilder { db.addValidation(func(r *ValidationRules) { r.MaxLength = &length }) return db } // Pattern 设置正则表达式 func (db *DetailBuilder) Pattern(pattern string) *DetailBuilder { db.addValidation(func(r *ValidationRules) { r.Pattern = pattern }) return db } // Message 设置验证错误消息 func (db *DetailBuilder) Message(msg string) *DetailBuilder { db.addValidation(func(r *ValidationRules) { r.Message = msg }) return db } // FinishDetail 完成当前详情项 func (db *DetailBuilder) FinishDetail() *ConfigTemplateBuilder { db.builder.current.Details = append(db.builder.current.Details, db.detail) return db.builder } // 私有方法 func (db *DetailBuilder) addValidation(fn func(*ValidationRules)) { var rules ValidationRules if db.detail.ValidationRules != "" { json.Unmarshal([]byte(db.detail.ValidationRules), &rules) } fn(&rules) b, _ := json.Marshal(rules) db.detail.ValidationRules = string(b) } // 使用示例 func CreateSampleConfigTemplates() []*ConfigTemplate { builder := NewConfigTemplateBuilder() //builder.BuildSampleTemplates() return builder.GetTemplates() } // 更简洁的使用示例 func CreateConfigTemplates() []*ConfigTemplate { builder := NewConfigTemplateBuilder() // Service模板 - 更简洁的写法 builder.StartTemplate("Service配置", "service", "服务基础配置") builder.AddInt("port", "服务监听端口").Default("8080").Min(1024).Max(65535).Required().FinishDetail() builder.AddString("service_name", "服务名称").Default("svc-configure").Required().FinishDetail() builder.FinishTemplate() // Log模板 builder.StartTemplate("日志配置", "log", "日志相关配置") builder.AddEnum("level", "日志级别", []string{"debug", "info", "warn", "error", "fatal"}).Default("debug").Required().FinishDetail() builder.AddString("output", "日志输出").Default("console,file").FinishDetail() builder.FinishTemplate() // Doris模板 builder.StartTemplate("Doris配置", "doris", "Doris连接配置") builder.AddString("fe_host", "FE主机").Default("localhost").Required().FinishDetail() builder.AddString("fe_password", "密码").Sensitive().Required().FinishDetail() builder.FinishTemplate() return builder.GetTemplates() }