package autocode import ( "fmt" systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request" "slices" "strings" "text/template" ) // GetTemplateFuncMap 返回模板函数映射,用于在模板中使用 func GetTemplateFuncMap() template.FuncMap { return template.FuncMap{ "title": strings.Title, "GenerateField": GenerateField, "GenerateSearchField": GenerateSearchField, "GenerateSearchConditions": GenerateSearchConditions, "GenerateSearchFormItem": GenerateSearchFormItem, "GenerateTableColumn": GenerateTableColumn, "GenerateFormItem": GenerateFormItem, "GenerateDescriptionItem": GenerateDescriptionItem, "GenerateDefaultFormValue": GenerateDefaultFormValue, } } // 渲染Model中的字段 func GenerateField(field systemReq.AutoCodeField) string { // 构建gorm标签 gormTag := `` if field.FieldIndexType != "" { gormTag += field.FieldIndexType + ";" } if field.PrimaryKey { gormTag += "primarykey;" } if field.DefaultValue != "" { gormTag += fmt.Sprintf("default:%s;", field.DefaultValue) } if field.Comment != "" { gormTag += fmt.Sprintf("comment:%s;", field.Comment) } gormTag += "column:" + field.ColumnName + ";" if field.DataTypeLong != "" && field.FieldType != "enum" { gormTag += fmt.Sprintf("size:%s;", field.DataTypeLong) } requireTag := ` binding:"required"` + "`" // 根据字段类型构建不同的字段定义 var result string switch field.FieldType { case "enum": result = fmt.Sprintf(`%s string `+"`"+`json:"%s" form:"%s" gorm:"%stype:enum(%s);"`+"`", field.FieldName, field.FieldJson, field.FieldJson, gormTag, field.DataTypeLong) case "picture", "video": tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s"`, field.FieldJson, field.FieldJson, gormTag) result = fmt.Sprintf(`%s string `+"`"+`%s`+"`"+``, field.FieldName, tagContent) case "file", "pictures", "array": tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s"`, field.FieldJson, field.FieldJson, gormTag) result = fmt.Sprintf(`%s datatypes.JSON `+"`"+`%s swaggertype:"array,object"`+"`"+``, field.FieldName, tagContent) case "richtext": tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s"`, field.FieldJson, field.FieldJson, gormTag) result = fmt.Sprintf(`%s *string `+"`"+`%stype:text;"`+"`"+``, field.FieldName, tagContent) case "json": tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s"`, field.FieldJson, field.FieldJson, gormTag) result = fmt.Sprintf(`%s datatypes.JSON `+"`"+`%s swaggertype:"object"`+"`"+``, field.FieldName, tagContent) default: tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s"`, field.FieldJson, field.FieldJson, gormTag) result = fmt.Sprintf(`%s *%s `+"`"+`%s`+"`"+``, field.FieldName, field.FieldType, tagContent) } if field.Require { result = result[0:len(result)-1] + requireTag } // 添加字段描述 if field.FieldDesc != "" { result += fmt.Sprintf(" //%s", field.FieldDesc) } return result } // 格式化搜索条件语句 func GenerateSearchConditions(fields []*systemReq.AutoCodeField) string { var conditions []string for _, field := range fields { if field.FieldSearchType == "" { continue } var condition string if slices.Contains([]string{"enum", "pictures", "picture", "video", "json", "richtext", "array"}, field.FieldType) { if field.FieldType == "enum" { if field.FieldSearchType == "LIKE" { condition = fmt.Sprintf(` if info.%s != "" { db = db.Where("%s LIKE ?", "%%"+ info.%s+"%%") }`, field.FieldName, field.ColumnName, field.FieldName) } else { condition = fmt.Sprintf(` if info.%s != "" { db = db.Where("%s %s ?", info.%s) }`, field.FieldName, field.ColumnName, field.FieldSearchType, field.FieldName) } } else { condition = fmt.Sprintf(` if info.%s != "" { // TODO 数据类型为复杂类型,请根据业务需求自行实现复杂类型的查询业务 }`, field.FieldName) } } else if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" { if field.FieldType == "time.Time" { condition = fmt.Sprintf(` if len(info.%sRange) == 2 { db = db.Where("%s %s ? AND ? ", info.%sRange[0], info.%sRange[1]) }`, field.FieldName, field.ColumnName, field.FieldSearchType, field.FieldName, field.FieldName) } else { condition = fmt.Sprintf(` if info.Start%s != nil && info.End%s != nil { db = db.Where("%s %s ? AND ? ", *info.Start%s, *info.End%s) }`, field.FieldName, field.FieldName, field.ColumnName, field.FieldSearchType, field.FieldName, field.FieldName) } } else { nullCheck := "info." + field.FieldName + " != nil" if field.FieldType == "string" { condition = fmt.Sprintf(` if %s && *info.%s != "" {`, nullCheck, field.FieldName) } else { condition = fmt.Sprintf(` if %s {`, nullCheck) } if field.FieldSearchType == "LIKE" { condition += fmt.Sprintf(` db = db.Where("%s LIKE ?", "%%"+ *info.%s+"%%") }`, field.ColumnName, field.FieldName) } else { condition += fmt.Sprintf(` db = db.Where("%s %s ?", *info.%s) }`, field.ColumnName, field.FieldSearchType, field.FieldName) } } conditions = append(conditions, condition) } return strings.Join(conditions, "") } // 格式化前端搜索条件 func GenerateSearchFormItem(field systemReq.AutoCodeField) string { // 开始构建表单项 result := fmt.Sprintf(` `, field.FieldDesc, field.FieldJson) // 根据字段属性生成不同的输入类型 if field.FieldType == "bool" { result += fmt.Sprintf(` `, field.FieldJson) result += ` ` result += ` ` result += ` ` } else if field.DictType != "" { multipleAttr := "" if field.FieldType == "array" { multipleAttr = "multiple " } result += fmt.Sprintf(` `, multipleAttr, field.FieldJson, field.FieldJson) result += fmt.Sprintf(` `, field.DictType) result += ` ` } else if field.CheckDataSource { multipleAttr := "" if field.DataSource.Association == 2 { multipleAttr = "multiple " } result += fmt.Sprintf(` `, multipleAttr, field.FieldJson, field.FieldDesc, field.Clearable) result += fmt.Sprintf(` `, field.FieldJson) result += ` ` } else if field.FieldType == "float64" || field.FieldType == "int" { if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" { result += fmt.Sprintf(` `, field.FieldName) result += ` — ` result += fmt.Sprintf(` `, field.FieldName) } else { result += fmt.Sprintf(` `, field.FieldJson) } } else if field.FieldType == "time.Time" { if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" { result += ` ` result += fmt.Sprintf(``, field.FieldJson) } else { result += fmt.Sprintf(``, field.FieldJson) } } else { result += fmt.Sprintf(` `, field.FieldJson) } // 关闭表单项 result += `` return result } // GenerateTableColumn generates HTML for table column based on field properties func GenerateTableColumn(field systemReq.AutoCodeField) string { // Add sortable attribute if needed sortAttr := "" if field.Sort { sortAttr = " sortable" } // Handle different field types if field.CheckDataSource { result := fmt.Sprintf(` `, sortAttr, field.FieldDesc, field.FieldJson) result += ` ` result += `` return result } else if field.DictType != "" { result := fmt.Sprintf(` `, sortAttr, field.FieldDesc, field.FieldJson) result += ` ` result += `` return result } else if field.FieldType == "bool" { result := fmt.Sprintf(` `, sortAttr, field.FieldDesc, field.FieldJson) result += fmt.Sprintf(` `, field.FieldJson) result += `` return result } else if field.FieldType == "time.Time" { result := fmt.Sprintf(` `, sortAttr, field.FieldDesc, field.FieldJson) result += fmt.Sprintf(` `, field.FieldJson) result += `` return result } else if field.FieldType == "picture" { result := fmt.Sprintf(` `, field.FieldDesc, field.FieldJson) result += ` ` result += `` return result } else if field.FieldType == "pictures" { result := fmt.Sprintf(` `, field.FieldDesc, field.FieldJson) result += ` ` result += `` return result } else if field.FieldType == "video" { result := fmt.Sprintf(` `, field.FieldDesc, field.FieldJson) result += ` ` result += `` return result } else if field.FieldType == "richtext" { result := fmt.Sprintf(` `, field.FieldDesc, field.FieldJson) result += ` ` result += `` return result } else if field.FieldType == "file" { result := fmt.Sprintf(` `, field.FieldDesc, field.FieldJson) result += ` ` result += `` return result } else if field.FieldType == "json" { result := fmt.Sprintf(` `, field.FieldDesc, field.FieldJson) result += ` ` result += `` return result } else if field.FieldType == "array" { result := fmt.Sprintf(` `, field.FieldDesc, field.FieldJson) result += ` ` result += `` return result } else { return fmt.Sprintf(` `, sortAttr, field.FieldDesc, field.FieldJson) } } func GenerateFormItem(field systemReq.AutoCodeField) string { // 开始构建表单项 result := fmt.Sprintf(` `, field.FieldDesc, field.FieldJson) // 处理不同字段类型 if field.CheckDataSource { multipleAttr := "" if field.DataSource.Association == 2 { multipleAttr = " multiple" } result += fmt.Sprintf(` `, multipleAttr, field.FieldJson, field.FieldDesc, field.Clearable) result += fmt.Sprintf(` `, field.FieldJson) result += ` ` } else { switch field.FieldType { case "bool": result += fmt.Sprintf(` `, field.FieldJson) case "string": if field.DictType != "" { result += fmt.Sprintf(` `, field.FieldJson, field.FieldDesc, field.Clearable) result += fmt.Sprintf(` `, field.DictType) result += ` ` } else { result += fmt.Sprintf(` `, field.FieldJson, field.Clearable, field.FieldDesc) } case "richtext": result += fmt.Sprintf(` `, field.FieldJson) case "json": result += fmt.Sprintf(` // 此字段为json结构,可以前端自行控制展示和数据绑定模式 需绑定json的key为 formData.%s 后端会按照json的类型进行存取 `, field.FieldJson) result += fmt.Sprintf(` {{ formData.%s }} `, field.FieldJson) case "array": if field.DictType != "" { result += fmt.Sprintf(` `, field.FieldJson, field.FieldDesc, field.Clearable) result += fmt.Sprintf(` `, field.DictType) result += ` ` } else { result += fmt.Sprintf(` `, field.FieldJson) } case "int": result += fmt.Sprintf(` `, field.FieldJson, field.Clearable, field.FieldDesc) case "time.Time": result += fmt.Sprintf(` `, field.FieldJson, field.Clearable) case "float64": result += fmt.Sprintf(` `, field.FieldJson, field.Clearable) case "enum": result += fmt.Sprintf(` `, field.FieldJson, field.FieldDesc, field.Clearable) result += fmt.Sprintf(` `, field.DataTypeLong) result += ` ` case "picture": result += fmt.Sprintf(` `, field.FieldJson) case "pictures": result += fmt.Sprintf(` `, field.FieldJson) case "video": result += fmt.Sprintf(` `, field.FieldJson) case "file": result += fmt.Sprintf(` `, field.FieldJson) } } // 关闭表单项 result += `` return result } func GenerateDescriptionItem(field systemReq.AutoCodeField) string { // 开始构建描述项 result := fmt.Sprintf(` `, field.FieldDesc) if field.CheckDataSource { result += ` ` } else if field.FieldType != "picture" && field.FieldType != "pictures" && field.FieldType != "file" && field.FieldType != "array" && field.FieldType != "richtext" { result += fmt.Sprintf(` {{ detailFrom.%s }} `, field.FieldJson) } else { switch field.FieldType { case "picture": result += fmt.Sprintf(` `, field.FieldJson, field.FieldJson) case "array": result += fmt.Sprintf(` `, field.FieldJson) case "pictures": result += fmt.Sprintf(` `, field.FieldJson, field.FieldJson) case "richtext": result += fmt.Sprintf(` `, field.FieldJson) case "file": result += fmt.Sprintf(`
`, field.FieldJson) result += ` ` result += ` ` result += ` {{ item.name }} ` result += ` ` result += `
` } } // 关闭描述项 result += `
` return result } func GenerateDefaultFormValue(field systemReq.AutoCodeField) string { // 根据字段类型确定默认值 var defaultValue string switch field.FieldType { case "bool": defaultValue = "false" case "string", "richtext": defaultValue = "''" case "int": if field.DataSource != nil { // 检查数据源是否存在 defaultValue = "undefined" } else { defaultValue = "0" } case "time.Time": defaultValue = "new Date()" case "float64": defaultValue = "0" case "picture", "video": defaultValue = "\"\"" case "pictures", "file", "array": defaultValue = "[]" case "json": defaultValue = "{}" default: defaultValue = "null" } // 返回格式化后的默认值字符串 return fmt.Sprintf(`%s: %s,`, field.FieldJson, defaultValue) } // GenerateSearchField 根据字段属性生成搜索结构体中的字段定义 func GenerateSearchField(field systemReq.AutoCodeField) string { var result string if field.FieldSearchType == "" { return "" // 如果没有搜索类型,返回空字符串 } if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" { // 生成范围搜索字段 // time 的情况 if field.FieldType == "time.Time" { result = fmt.Sprintf("%sRange []time.Time `json:\"%sRange\" form:\"%sRange[]\"`", field.FieldName, field.FieldJson, field.FieldJson) } else { startField := fmt.Sprintf("Start%s *%s `json:\"start%s\" form:\"start%s\"`", field.FieldName, field.FieldType, field.FieldName, field.FieldName) endField := fmt.Sprintf("End%s *%s `json:\"end%s\" form:\"end%s\"`", field.FieldName, field.FieldType, field.FieldName, field.FieldName) result = startField + "\n" + endField } } else { // 生成普通搜索字段 if field.FieldType == "enum" || field.FieldType == "picture" || field.FieldType == "pictures" || field.FieldType == "video" || field.FieldType == "json" || field.FieldType == "richtext" || field.FieldType == "array" { result = fmt.Sprintf("%s string `json:\"%s\" form:\"%s\"` ", field.FieldName, field.FieldJson, field.FieldJson) } else { result = fmt.Sprintf("%s *%s `json:\"%s\" form:\"%s\"` ", field.FieldName, field.FieldType, field.FieldJson, field.FieldJson) } } return result }