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(id, name, description string) *ConfigTemplateBuilder { b.current = &ConfigTemplate{ ConfigTemplateID: id, TemplateName: name, 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 } // 私有方法 func (b *ConfigTemplateBuilder) addDetail(key, description, valueType, dataType string) *DetailBuilder { if b.current == nil { b.StartTemplate("untitled", "未命名模板", "未描述模板") } detailID := b.current.ConfigTemplateID + "." + key detail := ConfigTemplateDetail{ ConfigTemplateDetailID: detailID, ConfigTemplateID: b.current.ConfigTemplateID, 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() // }