package autocode
import (
"fmt"
"slices"
"strings"
"text/template"
)
// AutoCodeField 自动代码字段(用于模板函数)
type AutoCodeField struct {
FieldName string `json:"fieldName"`
FieldDesc string `json:"fieldDesc"`
FieldType string `json:"fieldType"`
FieldJson string `json:"fieldJson"`
DataTypeLong string `json:"dataTypeLong"`
Comment string `json:"comment"`
ColumnName string `json:"columnName"`
FieldSearchType string `json:"fieldSearchType"`
FieldSearchHide bool `json:"fieldSearchHide"`
DictType string `json:"dictType"`
Form bool `json:"form"`
Table bool `json:"table"`
Desc bool `json:"desc"`
Excel bool `json:"excel"`
Require bool `json:"require"`
DefaultValue string `json:"defaultValue"`
ErrorText string `json:"errorText"`
Clearable bool `json:"clearable"`
Sort bool `json:"sort"`
PrimaryKey bool `json:"primaryKey"`
DataSource *DataSource `json:"dataSource"`
CheckDataSource bool `json:"checkDataSource"`
FieldIndexType string `json:"fieldIndexType"`
}
// DataSource 数据源
type DataSource struct {
DBName string `json:"dbName"`
Table string `json:"table"`
Label string `json:"label"`
Value string `json:"value"`
Association int `json:"association"`
HasDeletedAt bool `json:"hasDeletedAt"`
}
// CustomMethod 自定义查询方法
// 用于在 GORM Gen 生成的代码中添加自定义查询方法
type CustomMethod struct {
Name string `json:"name"` // 方法名称 (如: FindByName, GetActiveUsers)
Description string `json:"description"` // 方法描述
ReturnType string `json:"returnType"` // 返回类型: single(单个), list(列表), count(计数), exists(存在检查)
Params []*CustomMethodParam `json:"params"` // 方法参数
Conditions []*CustomCondition `json:"conditions"` // 查询条件
OrderBy string `json:"orderBy"` // 排序字段 (如: created_at DESC)
Limit int `json:"limit"` // 限制数量 (0表示不限制)
}
// CustomMethodParam 自定义方法参数
type CustomMethodParam struct {
Name string `json:"name"` // 参数名称
Type string `json:"type"` // 参数类型 (string, int, uint, bool, time.Time等)
FieldName string `json:"fieldName"` // 对应的字段名 (用于生成查询条件)
}
// CustomCondition 自定义查询条件
type CustomCondition struct {
FieldName string `json:"fieldName"` // 字段名
Operator string `json:"operator"` // 操作符: eq, neq, gt, gte, lt, lte, like, in, between, isNull, isNotNull
ParamName string `json:"paramName"` // 参数名 (对应 CustomMethodParam.Name)
}
// ToPascalCase 将字符串转换为 PascalCase 格式
// 支持 snake_case、kebab-case 和普通字符串
// 例如: "article_status" -> "ArticleStatus", "user-role" -> "UserRole"
func ToPascalCase(s string) string {
if s == "" {
return s
}
// 将下划线和连字符替换为空格,然后使用 Title 转换
s = strings.ReplaceAll(s, "_", " ")
s = strings.ReplaceAll(s, "-", " ")
// 使用 strings.Title 转换每个单词首字母大写
s = strings.Title(s)
// 移除空格
return strings.ReplaceAll(s, " ", "")
}
// GetTemplateFuncMap 返回模板函数映射
func GetTemplateFuncMap() template.FuncMap {
return template.FuncMap{
"title": strings.Title,
"toPascalCase": ToPascalCase,
"GenerateField": GenerateField,
"GenerateModelField": GenerateModelField,
"GenerateSearchField": GenerateSearchField,
"GenerateSearchConditions": GenerateSearchConditions,
"GenerateGormGenSearchConditions": GenerateGormGenSearchConditions,
"GenerateSearchFormItem": GenerateSearchFormItem,
"GenerateTableColumn": GenerateTableColumn,
"GenerateFormItem": GenerateFormItem,
"GenerateDescriptionItem": GenerateDescriptionItem,
"GenerateDefaultFormValue": GenerateDefaultFormValue,
// React/TypeScript 相关函数
"GenerateTSType": GenerateTSType,
"GenerateReactSearchFormItem": GenerateReactSearchFormItem,
"GenerateReactTableColumn": GenerateReactTableColumn,
"GenerateReactProTableColumn": GenerateReactProTableColumn,
"GenerateReactFormItem": GenerateReactFormItem,
"GenerateReactDescriptionItem": GenerateReactDescriptionItem,
"GenerateReactDefaultValue": GenerateReactDefaultValue,
// 自定义查询方法相关函数
"GenerateCustomMethodInterface": GenerateCustomMethodInterface,
"GenerateCustomMethodImpl": GenerateCustomMethodImpl,
}
}
// GenerateField 渲染Model中的字段
func GenerateField(field AutoCodeField) string {
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" && field.FieldType != "int" {
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)
var fieldType string
if field.FieldType == "int" {
switch field.DataTypeLong {
case "1", "2", "3":
fieldType = "int8"
case "4", "5":
fieldType = "int16"
case "6", "7", "8", "9", "10":
fieldType = "int32"
default:
fieldType = "int64"
}
} else {
fieldType = field.FieldType
}
result = fmt.Sprintf(`%s *%s `+"`"+`%s`+"`"+``, field.FieldName, fieldType, tagContent)
}
if field.Require {
result = result[0:len(result)-1] + requireTag
}
if field.FieldDesc != "" {
result += fmt.Sprintf(" //%s", field.FieldDesc)
}
return result
}
// GenerateModelField 生成 GORM Gen 风格的模型字段定义
// 用于生成与 GORM Gen 兼容的模型结构体字段
func GenerateModelField(field AutoCodeField) string {
// 构建 GORM 标签
var gormParts []string
// column 标签
gormParts = append(gormParts, fmt.Sprintf("column:%s", field.ColumnName))
// type 标签 - 根据字段类型生成数据库类型
dbType := getDBType(field)
if dbType != "" {
gormParts = append(gormParts, fmt.Sprintf("type:%s", dbType))
}
// index 标签
if field.FieldIndexType != "" {
gormParts = append(gormParts, field.FieldIndexType)
}
// default 标签
if field.DefaultValue != "" {
gormParts = append(gormParts, fmt.Sprintf("default:%s", field.DefaultValue))
}
// comment 标签
comment := field.Comment
if comment == "" {
comment = field.FieldDesc
}
if comment != "" {
gormParts = append(gormParts, fmt.Sprintf("comment:%s", comment))
}
gormTag := strings.Join(gormParts, ";")
// 获取 Go 类型
goType := getModelGoType(field)
// 构建完整的字段定义
var result string
if comment != "" {
result = fmt.Sprintf(`%s %s `+"`"+`gorm:"%s" json:"%s"`+"`"+` // %s`,
field.FieldName, goType, gormTag, field.FieldJson, comment)
} else {
result = fmt.Sprintf(`%s %s `+"`"+`gorm:"%s" json:"%s"`+"`",
field.FieldName, goType, gormTag, field.FieldJson)
}
return result
}
// getDBType 根据字段类型获取数据库类型
func getDBType(field AutoCodeField) string {
switch field.FieldType {
case "string":
if field.DataTypeLong != "" {
return fmt.Sprintf("varchar(%s)", field.DataTypeLong)
}
return "varchar(191)"
case "int":
switch field.DataTypeLong {
case "1", "2", "3":
return "tinyint"
case "4", "5":
return "smallint"
case "6", "7", "8", "9", "10":
return "int"
default:
return "bigint(20)"
}
case "int64":
return "bigint(20)"
case "uint":
return "bigint(20) unsigned"
case "float64":
return "double"
case "bool":
return "tinyint(1)"
case "time.Time":
return "datetime(3)"
case "enum":
if field.DataTypeLong != "" {
return fmt.Sprintf("enum(%s)", field.DataTypeLong)
}
return "varchar(50)"
case "richtext":
return "text"
case "json", "file", "pictures", "array":
return "json"
case "picture", "video":
return "varchar(500)"
default:
return ""
}
}
// getModelGoType 根据字段类型获取 Go 类型(用于 GORM Gen 模型)
func getModelGoType(field AutoCodeField) string {
switch field.FieldType {
case "string", "picture", "video":
return "string"
case "int":
switch field.DataTypeLong {
case "1", "2", "3":
return "int8"
case "4", "5":
return "int16"
case "6", "7", "8", "9", "10":
return "int32"
default:
return "int64"
}
case "int64":
return "int64"
case "uint":
return "int64" // GORM Gen 使用 int64 表示 unsigned
case "float64":
return "float64"
case "bool":
return "bool"
case "time.Time":
return "time.Time"
case "enum":
return "string"
case "richtext":
return "string"
case "json", "file", "pictures", "array":
return "datatypes.JSON"
default:
return "string"
}
}
// GenerateSearchConditions 格式化搜索条件语句
func GenerateSearchConditions(fields []*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 if field.FieldSearchType == "IN" || field.FieldSearchType == "NOT IN" {
// IN 和 NOT IN 需要传递数组
condition = fmt.Sprintf(`
if info.%s != nil && len(info.%s) > 0 {
db = db.Where("%s %s ?", info.%s)
}`, field.FieldName, field.FieldName, field.ColumnName, field.FieldSearchType, 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, "")
}
// GenerateGormGenSearchConditions 生成 GORM Gen 风格的搜索条件语句
// 使用类型安全的 GORM Gen 查询语法,如 q.Where(t.FieldName.Like(...))
func GenerateGormGenSearchConditions(fields []*AutoCodeField, structName string) 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 req.%s != "" {
q = q.Where(t.%s.Like("%%" + req.%s + "%%"))
}`, field.FieldName, field.FieldName, field.FieldName)
} else {
condition = fmt.Sprintf(`
if req.%s != "" {
q = q.Where(t.%s.Eq(req.%s))
}`, field.FieldName, field.FieldName, field.FieldName)
}
} else {
condition = fmt.Sprintf(`
if req.%s != "" {
// TODO 数据类型为复杂类型,请根据业务需求自行实现复杂类型的查询业务
}`, field.FieldName)
}
} else if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
// BETWEEN 查询
if field.FieldType == "time.Time" {
condition = fmt.Sprintf(`
if len(req.%sRange) == 2 {
q = q.Where(t.%s.Between(req.%sRange[0], req.%sRange[1]))
}`, field.FieldName, field.FieldName, field.FieldName, field.FieldName)
} else {
condition = fmt.Sprintf(`
if req.Start%s != nil && req.End%s != nil {
q = q.Where(t.%s.Between(*req.Start%s, *req.End%s))
}`, field.FieldName, field.FieldName, field.FieldName, field.FieldName, field.FieldName)
}
} else {
// 普通查询
nullCheck := "req." + field.FieldName + " != nil"
if field.FieldType == "string" {
condition = fmt.Sprintf(`
if %s && *req.%s != "" {`, nullCheck, field.FieldName)
} else {
condition = fmt.Sprintf(`
if %s {`, nullCheck)
}
// 根据搜索类型生成不同的查询方法
switch field.FieldSearchType {
case "LIKE":
condition += fmt.Sprintf(`
q = q.Where(t.%s.Like("%%" + *req.%s + "%%"))
}`, field.FieldName, field.FieldName)
case "=", "EQ":
if field.FieldType == "string" {
condition += fmt.Sprintf(`
q = q.Where(t.%s.Eq(*req.%s))
}`, field.FieldName, field.FieldName)
} else {
condition += fmt.Sprintf(`
q = q.Where(t.%s.Eq(*req.%s))
}`, field.FieldName, field.FieldName)
}
case ">", "GT":
condition += fmt.Sprintf(`
q = q.Where(t.%s.Gt(*req.%s))
}`, field.FieldName, field.FieldName)
case ">=", "GTE":
condition += fmt.Sprintf(`
q = q.Where(t.%s.Gte(*req.%s))
}`, field.FieldName, field.FieldName)
case "<", "LT":
condition += fmt.Sprintf(`
q = q.Where(t.%s.Lt(*req.%s))
}`, field.FieldName, field.FieldName)
case "<=", "LTE":
condition += fmt.Sprintf(`
q = q.Where(t.%s.Lte(*req.%s))
}`, field.FieldName, field.FieldName)
case "<>", "!=", "NEQ":
condition += fmt.Sprintf(`
q = q.Where(t.%s.Neq(*req.%s))
}`, field.FieldName, field.FieldName)
case "IN":
condition += fmt.Sprintf(`
q = q.Where(t.%s.In(*req.%s...))
}`, field.FieldName, field.FieldName)
case "NOT IN":
condition += fmt.Sprintf(`
q = q.Where(t.%s.NotIn(*req.%s...))
}`, field.FieldName, field.FieldName)
default:
// 默认使用 Eq
condition += fmt.Sprintf(`
q = q.Where(t.%s.Eq(*req.%s))
}`, field.FieldName, field.FieldName)
}
}
conditions = append(conditions, condition)
}
return strings.Join(conditions, "")
}
// GenerateSearchFormItem 格式化前端搜索条件
func GenerateSearchFormItem(field 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(`
`, field.FieldJson, field.FieldDesc, field.DictType, field.Clearable, multipleAttr)
} 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 += `
`
result += fmt.Sprintf(` %s
`, field.FieldDesc)
result += `
`
result += `
`
result += `
`
result += `
`
result += `
`
result += fmt.Sprintf(``, field.FieldJson)
} else {
result += fmt.Sprintf(``, field.FieldJson)
}
} else {
result += fmt.Sprintf(`
`, field.FieldJson)
}
result += ``
return result
}
// GenerateTableColumn 生成表格列HTML
func GenerateTableColumn(field AutoCodeField) string {
sortAttr := ""
if field.Sort {
sortAttr = " sortable"
}
if field.CheckDataSource {
result := fmt.Sprintf(`
`, sortAttr, field.FieldDesc, field.FieldJson)
result += `
`
if field.DataSource.Association == 2 {
result += fmt.Sprintf(`
`, field.FieldJson, field.FieldJson)
result += ` {{ item }}
`
result += `
`
} else {
result += fmt.Sprintf(` {{ filterDataSource(dataSource.%s,scope.row.%s) }}
`, field.FieldJson, field.FieldJson)
}
result += `
`
result += ``
return result
} else if field.DictType != "" {
result := fmt.Sprintf(`
`, sortAttr, field.FieldDesc, field.FieldJson)
result += `
`
if field.FieldType == "array" {
result += fmt.Sprintf(` {{ filterDict(item,%sOptions) }}
`, field.FieldJson, field.DictType)
} else {
result += fmt.Sprintf(` {{ filterDict(scope.row.%s,%sOptions) }}
`, field.FieldJson, field.DictType)
}
result += `
`
result += ``
return result
} else if field.FieldType == "bool" {
result := fmt.Sprintf(`
`, sortAttr, field.FieldDesc, field.FieldJson)
result += fmt.Sprintf(` {{ formatBoolean(scope.row.%s) }}
`, field.FieldJson)
result += ``
return result
} else if field.FieldType == "time.Time" {
result := fmt.Sprintf(`
`, sortAttr, field.FieldDesc, field.FieldJson)
result += fmt.Sprintf(` {{ formatDate(scope.row.%s) }}
`, field.FieldJson)
result += ``
return result
} else if field.FieldType == "picture" {
result := fmt.Sprintf(`
`, field.FieldDesc, field.FieldJson)
result += `
`
result += fmt.Sprintf(`
`, field.FieldJson)
result += `
`
result += ``
return result
} else if field.FieldType == "pictures" {
result := fmt.Sprintf(`
`, field.FieldDesc, field.FieldJson)
result += `
`
result += `
`
result += fmt.Sprintf(`
`, field.FieldJson)
result += `
`
result += `
`
result += ``
return result
} else if field.FieldType == "video" {
result := fmt.Sprintf(`
`, field.FieldDesc, field.FieldJson)
result += `
`
result += `
`
result += `
`
result += ``
return result
} else if field.FieldType == "richtext" {
result := fmt.Sprintf(`
`, field.FieldDesc, field.FieldJson)
result += `
`
result += ` [富文本内容]
`
result += `
`
result += ``
return result
} else if field.FieldType == "file" {
result := fmt.Sprintf(`
`, field.FieldDesc, field.FieldJson)
result += `
`
result += `
`
result += fmt.Sprintf(` {{ file.name }}
`, field.FieldJson)
result += `
`
result += `
`
result += ``
return result
} else if field.FieldType == "json" {
result := fmt.Sprintf(`
`, field.FieldDesc, field.FieldJson)
result += `
`
result += ` [JSON]
`
result += `
`
result += ``
return result
} else if field.FieldType == "array" {
result := fmt.Sprintf(`
`, field.FieldDesc, field.FieldJson)
result += `
`
result += fmt.Sprintf(`
`, field.FieldJson)
result += `
`
result += ``
return result
}
return fmt.Sprintf(`
`, sortAttr, field.FieldDesc, field.FieldJson)
}
// GenerateFormItem 生成表单项
func GenerateFormItem(field 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.DictType, field.Clearable)
} 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
}
// GenerateDescriptionItem 生成描述项
func GenerateDescriptionItem(field AutoCodeField) string {
result := fmt.Sprintf(`
`, field.FieldDesc)
if field.CheckDataSource {
result += `
`
if field.DataSource.Association == 2 {
result += fmt.Sprintf(`
`, field.FieldJson, field.FieldJson)
result += ` {{ item }}
`
result += `
`
} else {
result += fmt.Sprintf(` {{ filterDataSource(dataSource.%s,detailForm.%s) }}
`, field.FieldJson, field.FieldJson)
}
result += `
`
} else if field.FieldType != "picture" && field.FieldType != "pictures" &&
field.FieldType != "file" && field.FieldType != "array" &&
field.FieldType != "richtext" {
result += fmt.Sprintf(` {{ detailForm.%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 += `