Skip to content

Commit 2bd82ea

Browse files
author
piexlMax(奇淼
committed
refactor(搜索功能): 优化时间范围搜索逻辑,使用createdAtRange替代startCreatedAtendCreatedAt
将时间范围搜索逻辑从`startCreatedAt`和`endCreatedAt`改为`createdAtRange`,简化代码并提高可维护性。同时更新了相关模板文件和验证规则,确保前后端一致性和用户体验的连贯性。
1 parent 9f1f72f commit 2bd82ea

File tree

8 files changed

+68
-99
lines changed

8 files changed

+68
-99
lines changed

server/model/system/request/sys_auto_code.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func (r *AutoCode) Pretreatment() error {
158158
r.NeedJSON = true
159159
case "time.Time":
160160
r.HasTimer = true
161-
if r.Fields[i].FieldSearchType != "" {
161+
if r.Fields[i].FieldSearchType != "" && r.Fields[i].FieldSearchType != "BETWEEN" && r.Fields[i].FieldSearchType != "NOT BETWEEN" {
162162
r.HasSearchTimer = true
163163
}
164164
}

server/resource/package/server/model/request/request.go.tpl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@ package request
1515
import (
1616
{{- if not .OnlyTemplate }}
1717
"{{.Module}}/model/common/request"
18-
{{ if or .HasSearchTimer .GvaModel}}"time"{{ end }}
18+
{{ if .HasSearchTimer}}"time"{{ end }}
1919
{{- end }}
2020
)
2121

2222
type {{.StructName}}Search struct{
2323
{{- if not .OnlyTemplate}}
2424
{{- if .GvaModel }}
25-
StartCreatedAt *time.Time `json:"startCreatedAt" form:"startCreatedAt"`
26-
EndCreatedAt *time.Time `json:"endCreatedAt" form:"endCreatedAt"`
25+
CreatedAtRange []string `json:"createdAtRange" form:"createdAtRange[]"`
2726
{{- end }}
2827
{{- range .Fields}}
2928
{{- if ne .FieldSearchType ""}}

server/resource/package/server/service/service.go.tpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ func ({{.Abbreviation}}Service *{{.StructName}}Service)Get{{.StructName}}InfoLis
148148
var {{.Abbreviation}}s []{{.Package}}.{{.StructName}}
149149
// 如果有条件搜索 下方会自动创建搜索语句
150150
{{- if .GvaModel }}
151-
if info.StartCreatedAt !=nil && info.EndCreatedAt !=nil {
152-
db = db.Where("created_at BETWEEN ? AND ?", info.StartCreatedAt, info.EndCreatedAt)
151+
if info.CreatedAtRange !=nil && len(info.CreatedAtRange) == 2 {
152+
db = db.Where("created_at BETWEEN ? AND ?", info.CreatedAtRange[0], info.CreatedAtRange[1])
153153
}
154154
{{- end }}
155155
{{ GenerateSearchConditions .Fields }}

server/resource/package/web/view/table.vue.tpl

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ getDataSourceFunc()
9898
<div class="gva-search-box">
9999
<el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule" @keyup.enter="onSubmit">
100100
{{- if .GvaModel }}
101-
<el-form-item label="创建日期" prop="CreatedAt">
101+
<el-form-item label="创建日期" prop="createdAtRange">
102102
<template #label>
103103
<span>
104104
创建日期
@@ -107,10 +107,16 @@ getDataSourceFunc()
107107
</el-tooltip>
108108
</span>
109109
</template>
110-
<el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期" :disabled-date="time=> searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"></el-date-picker>
111-
112-
<el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期" :disabled-date="time=> searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"></el-date-picker>
113-
</el-form-item>
110+
111+
<el-date-picker
112+
v-model="searchInfo.createdAtRange"
113+
class="w-[380px]"
114+
type="datetimerange"
115+
range-separator=""
116+
start-placeholder="开始时间"
117+
end-placeholder="结束时间"
118+
/>
119+
</el-form-item>
114120
{{ end -}}
115121
{{- range .Fields}} {{- if .FieldSearchType}} {{- if not .FieldSearchHide }}
116122
{{ GenerateSearchFormItem .}}
@@ -374,36 +380,15 @@ const rule = reactive({
374380
})
375381

376382
const searchRule = reactive({
377-
CreatedAt: [
383+
createdAtRange: [
378384
{ validator: (rule, value, callback) => {
379-
if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
380-
callback(new Error('请填写结束日期'))
381-
} else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
382-
callback(new Error('请填写开始日期'))
383-
} else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
384-
callback(new Error('开始日期应当早于结束日期'))
385+
if (!searchInfo.value.createdAtRange || searchInfo.value.createdAtRange.length < 2) {
386+
callback(new Error('请选择开始日期和结束日期'))
385387
} else {
386388
callback()
387389
}
388390
}, trigger: 'change' }
389-
],
390-
{{- range .Fields }}
391-
{{- if .FieldSearchType}}
392-
{{- if eq .FieldType "time.Time" }}
393-
{{.FieldJson }} : [{ validator: (rule, value, callback) => {
394-
if (searchInfo.value.start{{.FieldName}} && !searchInfo.value.end{{.FieldName}}) {
395-
callback(new Error('请填写结束日期'))
396-
} else if (!searchInfo.value.start{{.FieldName}} && searchInfo.value.end{{.FieldName}}) {
397-
callback(new Error('请填写开始日期'))
398-
} else if (searchInfo.value.start{{.FieldName}} && searchInfo.value.end{{.FieldName}} && (searchInfo.value.start{{.FieldName}}.getTime() === searchInfo.value.end{{.FieldName}}.getTime() || searchInfo.value.start{{.FieldName}}.getTime() > searchInfo.value.end{{.FieldName}}.getTime())) {
399-
callback(new Error('开始日期应当早于结束日期'))
400-
} else {
401-
callback()
402-
}
403-
}, trigger: 'change' }],
404-
{{- end }}
405-
{{- end }}
406-
{{- end }}
391+
]
407392
})
408393

409394
const elFormRef = ref()

server/resource/plugin/server/model/request/request.go.tpl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@ package request
1414
{{- if not .OnlyTemplate}}
1515
import (
1616
"{{.Module}}/model/common/request"
17-
{{ if or .HasSearchTimer .GvaModel}}"time"{{ end }}
17+
{{ if .HasSearchTimer}}"time"{{ end }}
1818
)
1919
{{- end}}
2020
type {{.StructName}}Search struct{
2121
{{- if not .OnlyTemplate}}
2222

2323
{{- if .GvaModel }}
24-
StartCreatedAt *time.Time `json:"startCreatedAt" form:"startCreatedAt"`
25-
EndCreatedAt *time.Time `json:"endCreatedAt" form:"endCreatedAt"`
24+
CreatedAtRange []string `json:"createdAtRange" form:"createdAtRange[]"`
2625
{{- end }}
2726
{{- range .Fields}}
2827
{{- if ne .FieldSearchType ""}}
@@ -36,4 +35,4 @@ type {{.StructName}}Search struct{
3635
{{- end}}
3736
{{- end }}
3837
}
39-
{{- end }}
38+
{{- end }}

server/resource/plugin/server/service/service.go.tpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ func (s *{{.Abbreviation}}) Get{{.StructName}}InfoList(ctx context.Context, info
155155
var {{.Abbreviation}}s []model.{{.StructName}}
156156
// 如果有条件搜索 下方会自动创建搜索语句
157157
{{- if .GvaModel }}
158-
if info.StartCreatedAt !=nil && info.EndCreatedAt !=nil {
159-
db = db.Where("created_at BETWEEN ? AND ?", info.StartCreatedAt, info.EndCreatedAt)
158+
if info.CreatedAtRange !=nil && len(info.CreatedAtRange) == 2 {
159+
db = db.Where("created_at BETWEEN ? AND ?", info.CreatedAtRange[0], info.CreatedAtRange[1])
160160
}
161161
{{- end }}
162162
{{ GenerateSearchConditions .Fields }}

server/resource/plugin/web/view/view.vue.tpl

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ getDataSourceFunc()
9797
<div class="gva-search-box">
9898
<el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule" @keyup.enter="onSubmit">
9999
{{- if .GvaModel }}
100-
<el-form-item label="创建日期" prop="CreatedAt">
100+
<el-form-item label="创建日期" prop="createdAtRange">
101101
<template #label>
102102
<span>
103103
创建日期
@@ -106,10 +106,15 @@ getDataSourceFunc()
106106
</el-tooltip>
107107
</span>
108108
</template>
109-
<el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期" :disabled-date="time=> searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"></el-date-picker>
110-
111-
<el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期" :disabled-date="time=> searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"></el-date-picker>
112-
</el-form-item>
109+
<el-date-picker
110+
v-model="searchInfo.createdAtRange"
111+
class="w-[380px]"
112+
type="datetimerange"
113+
range-separator=""
114+
start-placeholder="开始时间"
115+
end-placeholder="结束时间"
116+
/>
117+
</el-form-item>
113118
{{ end -}}
114119
{{- range .Fields}} {{- if .FieldSearchType}} {{- if not .FieldSearchHide }}
115120
{{ GenerateSearchFormItem .}}
@@ -370,36 +375,15 @@ const rule = reactive({
370375
})
371376

372377
const searchRule = reactive({
373-
CreatedAt: [
378+
createdAtRange: [
374379
{ validator: (rule, value, callback) => {
375-
if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
376-
callback(new Error('请填写结束日期'))
377-
} else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
378-
callback(new Error('请填写开始日期'))
379-
} else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
380-
callback(new Error('开始日期应当早于结束日期'))
380+
if (!searchInfo.value.createdAtRange || searchInfo.value.createdAtRange.length < 2) {
381+
callback(new Error('请选择开始日期和结束日期'))
381382
} else {
382383
callback()
383384
}
384385
}, trigger: 'change' }
385-
],
386-
{{- range .Fields }}
387-
{{- if .FieldSearchType}}
388-
{{- if eq .FieldType "time.Time" }}
389-
{{.FieldJson }} : [{ validator: (rule, value, callback) => {
390-
if (searchInfo.value.start{{.FieldName}} && !searchInfo.value.end{{.FieldName}}) {
391-
callback(new Error('请填写结束日期'))
392-
} else if (!searchInfo.value.start{{.FieldName}} && searchInfo.value.end{{.FieldName}}) {
393-
callback(new Error('请填写开始日期'))
394-
} else if (searchInfo.value.start{{.FieldName}} && searchInfo.value.end{{.FieldName}} && (searchInfo.value.start{{.FieldName}}.getTime() === searchInfo.value.end{{.FieldName}}.getTime() || searchInfo.value.start{{.FieldName}}.getTime() > searchInfo.value.end{{.FieldName}}.getTime())) {
395-
callback(new Error('开始日期应当早于结束日期'))
396-
} else {
397-
callback()
398-
}
399-
}, trigger: 'change' }],
400-
{{- end }}
401-
{{- end }}
402-
{{- end }}
386+
]
403387
})
404388

405389
const elFormRef = ref()

server/utils/autocode/template_funcs.go

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,20 @@ func GenerateSearchConditions(fields []*systemReq.AutoCodeField) string {
135135
}
136136

137137
} else if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
138-
condition = fmt.Sprintf(`
139-
if info.Start%s != nil && info.End%s != nil {
140-
db = db.Where("%s %s ? AND ? ", info.Start%s, info.End%s)
141-
}`,
142-
field.FieldName, field.FieldName, field.ColumnName,
143-
field.FieldSearchType, field.FieldName, field.FieldName)
144-
138+
if field.FieldType == "time.Time" {
139+
condition = fmt.Sprintf(`
140+
if info.%sRange != nil && len(info.%sRange) == 2 {
141+
db = db.Where("%s %s ? AND ? ", info.%sRange[0], info.%sRange[1])
142+
}`,
143+
field.FieldName, field.FieldName, field.ColumnName, field.FieldSearchType, field.FieldName, field.FieldName)
144+
} else {
145+
condition = fmt.Sprintf(`
146+
if info.Start%s != nil && info.End%s != nil {
147+
db = db.Where("%s %s ? AND ? ", *info.Start%s, *info.End%s)
148+
}`,
149+
field.FieldName, field.FieldName, field.ColumnName,
150+
field.FieldSearchType, field.FieldName, field.FieldName)
151+
}
145152
} else {
146153
nullCheck := "info." + field.FieldName + " != nil"
147154
if field.FieldType == "string" {
@@ -215,11 +222,11 @@ func GenerateSearchFormItem(field systemReq.AutoCodeField) string {
215222
`
216223
} else if field.FieldType == "float64" || field.FieldType == "int" {
217224
if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
218-
result += fmt.Sprintf(` <el-input v-model.number="searchInfo.start%s" placeholder="最小值" />
225+
result += fmt.Sprintf(` <el-input class="w-40" v-model.number="searchInfo.start%s" placeholder="最小值" />
219226
`, field.FieldName)
220227
result += ` —
221228
`
222-
result += fmt.Sprintf(` <el-input v-model.number="searchInfo.end%s" placeholder="最大值" />
229+
result += fmt.Sprintf(` <el-input class="w-40" v-model.number="searchInfo.end%s" placeholder="最大值" />
223230
`, field.FieldName)
224231
} else {
225232
result += fmt.Sprintf(` <el-input v-model.number="searchInfo.%s" placeholder="搜索条件" />
@@ -243,20 +250,9 @@ func GenerateSearchFormItem(field systemReq.AutoCodeField) string {
243250
`
244251
result += ` </template>
245252
`
246-
result += fmt.Sprintf(` <el-date-picker v-model="searchInfo.start%s" type="datetime" placeholder="开始日期" `+
247-
`:disabled-date="time=> searchInfo.end%s ? time.getTime() > searchInfo.end%s.getTime() : false"></el-date-picker>
248-
`,
249-
field.FieldName, field.FieldName, field.FieldName)
250-
result += ` —
251-
`
252-
result += fmt.Sprintf(` <el-date-picker v-model="searchInfo.end%s" type="datetime" placeholder="结束日期" `+
253-
`:disabled-date="time=> searchInfo.start%s ? time.getTime() < searchInfo.start%s.getTime() : false"></el-date-picker>
254-
`,
255-
field.FieldName, field.FieldName, field.FieldName)
253+
result += fmt.Sprintf(`<el-date-picker class="w-[380px]" v-model="searchInfo.%sRange" type="datetimerange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间"></el-date-picker>`, field.FieldJson)
256254
} else {
257-
result += fmt.Sprintf(` <el-date-picker v-model="searchInfo.%s" type="datetime" placeholder="搜索条件"></el-date-picker>
258-
`,
259-
field.FieldJson)
255+
result += fmt.Sprintf(`<el-date-picker v-model="searchInfo.%s" type="datetime" placeholder="搜索条件"></el-date-picker>`, field.FieldJson)
260256
}
261257
} else {
262258
result += fmt.Sprintf(` <el-input v-model="searchInfo.%s" placeholder="搜索条件" />
@@ -679,11 +675,17 @@ func GenerateSearchField(field systemReq.AutoCodeField) string {
679675

680676
if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
681677
// 生成范围搜索字段
682-
startField := fmt.Sprintf("Start%s *%s `json:\"start%s\" form:\"start%s\"`",
683-
field.FieldName, field.FieldType, field.FieldName, field.FieldName)
684-
endField := fmt.Sprintf("End%s *%s `json:\"end%s\" form:\"end%s\"`",
685-
field.FieldName, field.FieldType, field.FieldName, field.FieldName)
686-
result = startField + "\n" + endField
678+
// time 的情况
679+
if field.FieldType == "time.Time" {
680+
result = fmt.Sprintf("%sRange []string `json:\"%sRange\" form:\"%sRange[]\"`",
681+
field.FieldName, field.FieldJson, field.FieldJson)
682+
} else {
683+
startField := fmt.Sprintf("Start%s *%s `json:\"start%s\" form:\"start%s\"`",
684+
field.FieldName, field.FieldType, field.FieldName, field.FieldName)
685+
endField := fmt.Sprintf("End%s *%s `json:\"end%s\" form:\"end%s\"`",
686+
field.FieldName, field.FieldType, field.FieldName, field.FieldName)
687+
result = startField + "\n" + endField
688+
}
687689
} else {
688690
// 生成普通搜索字段
689691
if field.FieldType == "enum" || field.FieldType == "picture" ||

0 commit comments

Comments
 (0)