新增 GORM clause 支持,优化搜索条件生成

This commit is contained in:
PiexlMax(奇淼
2026-10-07 16:32:57 +08:00
parent e8d675c891
commit 3504119686
3 changed files with 68 additions and 23 deletions
@@ -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}}
@@ -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}}
+44 -11
View File
@@ -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)
}
}