Няма описание
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Config_template_builder.go 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. package models
  2. import (
  3. "encoding/json"
  4. "time"
  5. )
  6. // ConfigTemplateBuilder 配置模板建造者
  7. type ConfigTemplateBuilder struct {
  8. templates []*ConfigTemplate
  9. current *ConfigTemplate
  10. }
  11. // NewConfigTemplateBuilder 创建配置模板建造者
  12. func NewConfigTemplateBuilder() *ConfigTemplateBuilder {
  13. return &ConfigTemplateBuilder{
  14. templates: make([]*ConfigTemplate, 0),
  15. }
  16. }
  17. // StartTemplate 开始创建新模板
  18. func (b *ConfigTemplateBuilder) StartTemplate(name, rootKey, description string) *ConfigTemplateBuilder {
  19. b.current = &ConfigTemplate{
  20. TemplateName: name,
  21. YamlRootKey: rootKey,
  22. Description: description,
  23. IsDefault: true,
  24. SortOrder: len(b.templates) + 1,
  25. Creator: "system",
  26. CreatedAt: time.Now(),
  27. UpdatedAt: time.Now(),
  28. Details: make([]ConfigTemplateDetail, 0),
  29. }
  30. return b
  31. }
  32. // AddInt 添加整型配置项
  33. func (b *ConfigTemplateBuilder) AddInt(key, description string) *DetailBuilder {
  34. return b.addDetail(key, description, "number", "int")
  35. }
  36. // AddString 添加字符串配置项
  37. func (b *ConfigTemplateBuilder) AddString(key, description string) *DetailBuilder {
  38. return b.addDetail(key, description, "string", "string")
  39. }
  40. // AddBoolean 添加布尔型配置项
  41. func (b *ConfigTemplateBuilder) AddBoolean(key, description string) *DetailBuilder {
  42. return b.addDetail(key, description, "boolean", "boolean")
  43. }
  44. // AddEnum 添加枚举型配置项
  45. func (b *ConfigTemplateBuilder) AddEnum(key, description string, enumValues []string) *DetailBuilder {
  46. db := b.addDetail(key, description, "string", "string")
  47. db.detail.ValidationRules = func() string {
  48. rules := ValidationRules{
  49. EnumValues: enumValues,
  50. }
  51. b, _ := json.Marshal(rules)
  52. return string(b)
  53. }()
  54. return db
  55. }
  56. // FinishTemplate 完成当前模板创建
  57. func (b *ConfigTemplateBuilder) FinishTemplate() *ConfigTemplateBuilder {
  58. if b.current != nil {
  59. b.templates = append(b.templates, b.current)
  60. b.current = nil
  61. }
  62. return b
  63. }
  64. // GetTemplates 获取所有模板
  65. func (b *ConfigTemplateBuilder) GetTemplates() []*ConfigTemplate {
  66. return b.templates
  67. }
  68. // // BuildSampleTemplates 构建示例模板
  69. // func (b *ConfigTemplateBuilder) BuildSampleTemplates() *ConfigTemplateBuilder {
  70. // // Service模板
  71. // b.StartTemplate("Service配置", "service", "服务基础配置").
  72. // AddInt("port", "服务监听端口").Default("8080").Min(1024).Max(65535).Required().FinishDetail().
  73. // AddString("service_name", "服务名称").Default("svc-configure").Pattern("^[a-zA-Z][a-zA-Z0-9_-]*$").Required().FinishDetail().
  74. // AddString("instance_name", "实例名称").Default("svc-configure-01").Required().FinishDetail().
  75. // AddInt("read_timeout", "读取超时时间(秒)").Default("30").Min(1).Max(300).Required().FinishDetail().
  76. // AddInt("write_timeout", "写入超时时间(秒)").Default("30").Min(1).Max(300).Required().FinishDetail().
  77. // AddInt("idle_timeout", "空闲超时时间(秒)").Default("60").Min(10).Max(600).Required().FinishDetail().
  78. // FinishTemplate()
  79. // // Log模板
  80. // b.StartTemplate("日志配置", "log", "日志相关配置").
  81. // AddEnum("level", "日志级别", []string{"debug", "info", "warn", "error", "fatal"}).Default("debug").Required().FinishDetail().
  82. // AddString("output", "日志输出目标").Default("console,file").FinishDetail().
  83. // AddBoolean("json_format", "是否以JSON格式输出日志").Default("true").FinishDetail().
  84. // FinishTemplate()
  85. // // Doris模板
  86. // b.StartTemplate("Doris配置", "doris", "Doris数据库连接配置").
  87. // 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().
  88. // AddInt("fe_port", "Doris FE端口号").Default("8040").Min(1).Max(65535).Required().FinishDetail().
  89. // AddString("fe_username", "Doris FE用户名").Default("root").Required().FinishDetail().
  90. // AddString("fe_password", "Doris FE密码").Default("mos8555").Sensitive().Required().MinLength(6).MaxLength(100).FinishDetail().
  91. // AddInt("stream_load_timeout", "Stream Load超时时间(秒)").Default("300").Min(10).Max(3600).FinishDetail().
  92. // AddInt("batch_size", "批量大小").Default("1000").Min(1).Max(10000).FinishDetail().
  93. // FinishTemplate()
  94. // return b
  95. // }
  96. // 私有方法
  97. func (b *ConfigTemplateBuilder) addDetail(key, description, valueType, dataType string) *DetailBuilder {
  98. if b.current == nil {
  99. b.StartTemplate("未命名模板", "untitled", "未描述模板")
  100. }
  101. detail := ConfigTemplateDetail{
  102. ConfigKey: key,
  103. Description: description,
  104. ValueType: valueType,
  105. DataType: dataType,
  106. IsRequired: false,
  107. IsSensitive: false,
  108. IsReadonly: false,
  109. SortOrder: len(b.current.Details) + 1,
  110. Creator: "system",
  111. CreatedAt: time.Now(),
  112. UpdatedAt: time.Now(),
  113. }
  114. return &DetailBuilder{
  115. builder: b,
  116. detail: detail,
  117. }
  118. }
  119. // DetailBuilder 配置详情建造者
  120. type DetailBuilder struct {
  121. builder *ConfigTemplateBuilder
  122. detail ConfigTemplateDetail
  123. }
  124. // Default 设置默认值
  125. func (db *DetailBuilder) Default(value string) *DetailBuilder {
  126. db.detail.DefaultValue = value
  127. db.detail.ConfigValue = value
  128. return db
  129. }
  130. // Required 设置为必填项
  131. func (db *DetailBuilder) Required() *DetailBuilder {
  132. db.detail.IsRequired = true
  133. return db
  134. }
  135. // Sensitive 设置为敏感信息
  136. func (db *DetailBuilder) Sensitive() *DetailBuilder {
  137. db.detail.IsSensitive = true
  138. return db
  139. }
  140. // Readonly 设置为只读
  141. func (db *DetailBuilder) Readonly() *DetailBuilder {
  142. db.detail.IsReadonly = true
  143. return db
  144. }
  145. // Min 设置最小值
  146. func (db *DetailBuilder) Min(min float64) *DetailBuilder {
  147. db.addValidation(func(r *ValidationRules) {
  148. r.Min = &min
  149. })
  150. return db
  151. }
  152. // Max 设置最大值
  153. func (db *DetailBuilder) Max(max float64) *DetailBuilder {
  154. db.addValidation(func(r *ValidationRules) {
  155. r.Max = &max
  156. })
  157. return db
  158. }
  159. // MinLength 设置最小长度
  160. func (db *DetailBuilder) MinLength(length int) *DetailBuilder {
  161. db.addValidation(func(r *ValidationRules) {
  162. r.MinLength = &length
  163. })
  164. return db
  165. }
  166. // MaxLength 设置最大长度
  167. func (db *DetailBuilder) MaxLength(length int) *DetailBuilder {
  168. db.addValidation(func(r *ValidationRules) {
  169. r.MaxLength = &length
  170. })
  171. return db
  172. }
  173. // Pattern 设置正则表达式
  174. func (db *DetailBuilder) Pattern(pattern string) *DetailBuilder {
  175. db.addValidation(func(r *ValidationRules) {
  176. r.Pattern = pattern
  177. })
  178. return db
  179. }
  180. // Message 设置验证错误消息
  181. func (db *DetailBuilder) Message(msg string) *DetailBuilder {
  182. db.addValidation(func(r *ValidationRules) {
  183. r.Message = msg
  184. })
  185. return db
  186. }
  187. // FinishDetail 完成当前详情项
  188. func (db *DetailBuilder) FinishDetail() *ConfigTemplateBuilder {
  189. db.builder.current.Details = append(db.builder.current.Details, db.detail)
  190. return db.builder
  191. }
  192. // 私有方法
  193. func (db *DetailBuilder) addValidation(fn func(*ValidationRules)) {
  194. var rules ValidationRules
  195. if db.detail.ValidationRules != "" {
  196. json.Unmarshal([]byte(db.detail.ValidationRules), &rules)
  197. }
  198. fn(&rules)
  199. b, _ := json.Marshal(rules)
  200. db.detail.ValidationRules = string(b)
  201. }
  202. // 使用示例
  203. func CreateSampleConfigTemplates() []*ConfigTemplate {
  204. builder := NewConfigTemplateBuilder()
  205. //builder.BuildSampleTemplates()
  206. return builder.GetTemplates()
  207. }
  208. // 更简洁的使用示例
  209. func CreateConfigTemplates() []*ConfigTemplate {
  210. builder := NewConfigTemplateBuilder()
  211. // Service模板 - 更简洁的写法
  212. builder.StartTemplate("Service配置", "service", "服务基础配置")
  213. builder.AddInt("port", "服务监听端口").Default("8080").Min(1024).Max(65535).Required().FinishDetail()
  214. builder.AddString("service_name", "服务名称").Default("svc-configure").Required().FinishDetail()
  215. builder.FinishTemplate()
  216. // Log模板
  217. builder.StartTemplate("日志配置", "log", "日志相关配置")
  218. builder.AddEnum("level", "日志级别", []string{"debug", "info", "warn", "error", "fatal"}).Default("debug").Required().FinishDetail()
  219. builder.AddString("output", "日志输出").Default("console,file").FinishDetail()
  220. builder.FinishTemplate()
  221. // Doris模板
  222. builder.StartTemplate("Doris配置", "doris", "Doris连接配置")
  223. builder.AddString("fe_host", "FE主机").Default("localhost").Required().FinishDetail()
  224. builder.AddString("fe_password", "密码").Sensitive().Required().FinishDetail()
  225. builder.FinishTemplate()
  226. return builder.GetTemplates()
  227. }