diff --git a/server/resource/package/server/service/service.go.tpl b/server/resource/package/server/service/service.go.tpl index a1c04f206..abc7eba1f 100644 --- a/server/resource/package/server/service/service.go.tpl +++ b/server/resource/package/server/service/service.go.tpl @@ -7,6 +7,11 @@ {{- if .IsAdd}} +{{- if NeedsGormClause .Fields }} +// service.go import 新增依赖 +import "gorm.io/gorm/clause" +{{- end }} + // Get{{.StructName}}InfoList 新增搜索语句 {{ GenerateSearchConditions .Fields }} // Get{{.StructName}}InfoList 新增排序语句 请自行在搜索语句中添加orderMap内容 @@ -41,6 +46,9 @@ import ( "{{.Module}}/model/{{.Package}}" {{- if not .IsTree}} {{.Package}}Req "{{.Module}}/model/{{.Package}}/request" + {{- if or .NeedSort (NeedsGormClause .Fields) }} + "gorm.io/gorm/clause" + {{- end }} {{- else }} "{{.Module}}/utils" "errors" @@ -158,7 +166,6 @@ func ({{.Abbreviation}}Service *{{.StructName}}Service)Get{{.StructName}}InfoLis return } {{- if .NeedSort}} - var OrderStr string orderMap := make(map[string]bool) {{- if .GvaModel }} orderMap["id"] = true @@ -170,11 +177,10 @@ func ({{.Abbreviation}}Service *{{.StructName}}Service)Get{{.StructName}}InfoLis {{- end}} {{- end}} if orderMap[info.Sort] { - OrderStr = info.Sort - if info.Order == "descending" { - OrderStr = OrderStr + " desc" - } - db = db.Order(OrderStr) + db = db.Order(clause.OrderByColumn{ + Column: clause.Column{Name: info.Sort}, + Desc: info.Order == "descending", + }) } {{- end}} diff --git a/server/resource/plugin/server/service/service.go.tpl b/server/resource/plugin/server/service/service.go.tpl index b156148d8..0095ab77b 100644 --- a/server/resource/plugin/server/service/service.go.tpl +++ b/server/resource/plugin/server/service/service.go.tpl @@ -7,6 +7,11 @@ {{- if .IsAdd}} +{{- if NeedsGormClause .Fields }} +// service.go import 新增依赖 +import "gorm.io/gorm/clause" +{{- end }} + // Get{{.StructName}}InfoList 新增搜索语句 {{ GenerateSearchConditions .Fields }} @@ -37,6 +42,9 @@ import ( "{{.Module}}/plugin/{{.Package}}/model" {{- if not .IsTree }} "{{.Module}}/plugin/{{.Package}}/model/request" + {{- if or .NeedSort (NeedsGormClause .Fields) }} + "gorm.io/gorm/clause" + {{- end }} {{- else }} "errors" {{- end }} @@ -165,7 +173,6 @@ func (s *{{.Abbreviation}}) Get{{.StructName}}InfoList(ctx context.Context, info return } {{- if .NeedSort}} - var OrderStr string orderMap := make(map[string]bool) {{- if .GvaModel }} orderMap["id"] = true @@ -177,11 +184,10 @@ func (s *{{.Abbreviation}}) Get{{.StructName}}InfoList(ctx context.Context, info {{- end}} {{- end}} if orderMap[info.Sort] { - OrderStr = info.Sort - if info.Order == "descending" { - OrderStr = OrderStr + " desc" - } - db = db.Order(OrderStr) + db = db.Order(clause.OrderByColumn{ + Column: clause.Column{Name: info.Sort}, + Desc: info.Order == "descending", + }) } {{- end}} diff --git a/server/utils/autocode/template_funcs.go b/server/utils/autocode/template_funcs.go index 2845aeac0..833ce54db 100644 --- a/server/utils/autocode/template_funcs.go +++ b/server/utils/autocode/template_funcs.go @@ -15,6 +15,7 @@ func GetTemplateFuncMap() template.FuncMap { "GenerateField": GenerateField, "GenerateSearchField": GenerateSearchField, "GenerateSearchConditions": GenerateSearchConditions, + "NeedsGormClause": NeedsGormClause, "GenerateSearchFormItem": GenerateSearchFormItem, "GenerateTableColumn": GenerateTableColumn, "GenerateFormItem": GenerateFormItem, @@ -23,6 +24,20 @@ func GetTemplateFuncMap() template.FuncMap { } } +// NeedsGormClause 判断生成的搜索条件是否使用 GORM clause 表达式。 +func NeedsGormClause(fields []*systemReq.AutoCodeField) bool { + for _, field := range fields { + if field == nil || field.FieldSearchType == "" { + continue + } + if slices.Contains([]string{"pictures", "picture", "video", "json", "richtext", "array"}, field.FieldType) { + continue + } + return true + } + return false +} + // 渲染Model中的字段 func GenerateField(field systemReq.AutoCodeField) string { // 构建gorm标签 @@ -137,15 +152,21 @@ func GenerateSearchConditions(fields []*systemReq.AutoCodeField) string { if field.FieldSearchType == "LIKE" { condition = fmt.Sprintf(` if info.%s != "" { - db = db.Where("%s LIKE ?", "%%"+ info.%s+"%%") + db = db.Where(clause.Expr{ + SQL: "? LIKE ?", + Vars: []any{clause.Column{Name: "%s"}, "%%" + info.%s + "%%"}, + }) }`, field.FieldName, field.ColumnName, field.FieldName) } else { condition = fmt.Sprintf(` if info.%s != "" { - db = db.Where("%s %s ?", info.%s) + db = db.Where(clause.Expr{ + SQL: "? %s ?", + Vars: []any{clause.Column{Name: "%s"}, info.%s}, + }) }`, - field.FieldName, field.ColumnName, field.FieldSearchType, field.FieldName) + field.FieldName, field.FieldSearchType, field.ColumnName, field.FieldName) } } else { condition = fmt.Sprintf(` @@ -158,16 +179,22 @@ func GenerateSearchConditions(fields []*systemReq.AutoCodeField) string { 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]) + db = db.Where(clause.Expr{ + SQL: "? %s ? AND ?", + Vars: []any{clause.Column{Name: "%s"}, info.%sRange[0], info.%sRange[1]}, + }) }`, - field.FieldName, field.ColumnName, field.FieldSearchType, field.FieldName, field.FieldName) + field.FieldName, field.FieldSearchType, field.ColumnName, 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) + db = db.Where(clause.Expr{ + SQL: "? %s ? AND ?", + Vars: []any{clause.Column{Name: "%s"}, *info.Start%s, *info.End%s}, + }) }`, - field.FieldName, field.FieldName, field.ColumnName, - field.FieldSearchType, field.FieldName, field.FieldName) + field.FieldName, field.FieldName, field.FieldSearchType, + field.ColumnName, field.FieldName, field.FieldName) } } else { nullCheck := "info." + field.FieldName + " != nil" @@ -181,14 +208,20 @@ func GenerateSearchConditions(fields []*systemReq.AutoCodeField) string { if field.FieldSearchType == "LIKE" { condition += fmt.Sprintf(` - db = db.Where("%s LIKE ?", "%%"+ *info.%s+"%%") + db = db.Where(clause.Expr{ + SQL: "? LIKE ?", + Vars: []any{clause.Column{Name: "%s"}, "%%" + *info.%s + "%%"}, + }) }`, field.ColumnName, field.FieldName) } else { condition += fmt.Sprintf(` - db = db.Where("%s %s ?", *info.%s) + db = db.Where(clause.Expr{ + SQL: "? %s ?", + Vars: []any{clause.Column{Name: "%s"}, *info.%s}, + }) }`, - field.ColumnName, field.FieldSearchType, field.FieldName) + field.FieldSearchType, field.ColumnName, field.FieldName) } }