refactor(搜索功能): 优化时间范围搜索逻辑,使用createdAtRange
替代startCreatedAt
和endCreatedAt
将时间范围搜索逻辑从`startCreatedAt`和`endCreatedAt`改为`createdAtRange`,简化代码并提高可维护性。同时更新了相关模板文件和验证规则,确保前后端一致性和用户体验的连贯性。
This commit is contained in:
@@ -158,7 +158,7 @@ func (r *AutoCode) Pretreatment() error {
|
||||
r.NeedJSON = true
|
||||
case "time.Time":
|
||||
r.HasTimer = true
|
||||
if r.Fields[i].FieldSearchType != "" {
|
||||
if r.Fields[i].FieldSearchType != "" && r.Fields[i].FieldSearchType != "BETWEEN" && r.Fields[i].FieldSearchType != "NOT BETWEEN" {
|
||||
r.HasSearchTimer = true
|
||||
}
|
||||
}
|
||||
|
@@ -15,15 +15,14 @@ package request
|
||||
import (
|
||||
{{- if not .OnlyTemplate }}
|
||||
"{{.Module}}/model/common/request"
|
||||
{{ if or .HasSearchTimer .GvaModel}}"time"{{ end }}
|
||||
{{ if .HasSearchTimer}}"time"{{ end }}
|
||||
{{- end }}
|
||||
)
|
||||
|
||||
type {{.StructName}}Search struct{
|
||||
{{- if not .OnlyTemplate}}
|
||||
{{- if .GvaModel }}
|
||||
StartCreatedAt *time.Time `json:"startCreatedAt" form:"startCreatedAt"`
|
||||
EndCreatedAt *time.Time `json:"endCreatedAt" form:"endCreatedAt"`
|
||||
CreatedAtRange []string `json:"createdAtRange" form:"createdAtRange[]"`
|
||||
{{- end }}
|
||||
{{- range .Fields}}
|
||||
{{- if ne .FieldSearchType ""}}
|
||||
|
@@ -148,8 +148,8 @@ func ({{.Abbreviation}}Service *{{.StructName}}Service)Get{{.StructName}}InfoLis
|
||||
var {{.Abbreviation}}s []{{.Package}}.{{.StructName}}
|
||||
// 如果有条件搜索 下方会自动创建搜索语句
|
||||
{{- if .GvaModel }}
|
||||
if info.StartCreatedAt !=nil && info.EndCreatedAt !=nil {
|
||||
db = db.Where("created_at BETWEEN ? AND ?", info.StartCreatedAt, info.EndCreatedAt)
|
||||
if info.CreatedAtRange !=nil && len(info.CreatedAtRange) == 2 {
|
||||
db = db.Where("created_at BETWEEN ? AND ?", info.CreatedAtRange[0], info.CreatedAtRange[1])
|
||||
}
|
||||
{{- end }}
|
||||
{{ GenerateSearchConditions .Fields }}
|
||||
|
@@ -98,7 +98,7 @@ getDataSourceFunc()
|
||||
<div class="gva-search-box">
|
||||
<el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule" @keyup.enter="onSubmit">
|
||||
{{- if .GvaModel }}
|
||||
<el-form-item label="创建日期" prop="CreatedAt">
|
||||
<el-form-item label="创建日期" prop="createdAtRange">
|
||||
<template #label>
|
||||
<span>
|
||||
创建日期
|
||||
@@ -107,9 +107,15 @@ getDataSourceFunc()
|
||||
</el-tooltip>
|
||||
</span>
|
||||
</template>
|
||||
<el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期" :disabled-date="time=> searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"></el-date-picker>
|
||||
—
|
||||
<el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期" :disabled-date="time=> searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"></el-date-picker>
|
||||
|
||||
<el-date-picker
|
||||
v-model="searchInfo.createdAtRange"
|
||||
class="w-[380px]"
|
||||
type="datetimerange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始时间"
|
||||
end-placeholder="结束时间"
|
||||
/>
|
||||
</el-form-item>
|
||||
{{ end -}}
|
||||
{{- range .Fields}} {{- if .FieldSearchType}} {{- if not .FieldSearchHide }}
|
||||
@@ -374,36 +380,15 @@ const rule = reactive({
|
||||
})
|
||||
|
||||
const searchRule = reactive({
|
||||
CreatedAt: [
|
||||
createdAtRange: [
|
||||
{ validator: (rule, value, callback) => {
|
||||
if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
|
||||
callback(new Error('请填写结束日期'))
|
||||
} else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
|
||||
callback(new Error('请填写开始日期'))
|
||||
} else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
|
||||
callback(new Error('开始日期应当早于结束日期'))
|
||||
if (!searchInfo.value.createdAtRange || searchInfo.value.createdAtRange.length < 2) {
|
||||
callback(new Error('请选择开始日期和结束日期'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}, trigger: 'change' }
|
||||
],
|
||||
{{- range .Fields }}
|
||||
{{- if .FieldSearchType}}
|
||||
{{- if eq .FieldType "time.Time" }}
|
||||
{{.FieldJson }} : [{ validator: (rule, value, callback) => {
|
||||
if (searchInfo.value.start{{.FieldName}} && !searchInfo.value.end{{.FieldName}}) {
|
||||
callback(new Error('请填写结束日期'))
|
||||
} else if (!searchInfo.value.start{{.FieldName}} && searchInfo.value.end{{.FieldName}}) {
|
||||
callback(new Error('请填写开始日期'))
|
||||
} 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())) {
|
||||
callback(new Error('开始日期应当早于结束日期'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}, trigger: 'change' }],
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
]
|
||||
})
|
||||
|
||||
const elFormRef = ref()
|
||||
|
@@ -14,15 +14,14 @@ package request
|
||||
{{- if not .OnlyTemplate}}
|
||||
import (
|
||||
"{{.Module}}/model/common/request"
|
||||
{{ if or .HasSearchTimer .GvaModel}}"time"{{ end }}
|
||||
{{ if .HasSearchTimer}}"time"{{ end }}
|
||||
)
|
||||
{{- end}}
|
||||
type {{.StructName}}Search struct{
|
||||
{{- if not .OnlyTemplate}}
|
||||
|
||||
{{- if .GvaModel }}
|
||||
StartCreatedAt *time.Time `json:"startCreatedAt" form:"startCreatedAt"`
|
||||
EndCreatedAt *time.Time `json:"endCreatedAt" form:"endCreatedAt"`
|
||||
CreatedAtRange []string `json:"createdAtRange" form:"createdAtRange[]"`
|
||||
{{- end }}
|
||||
{{- range .Fields}}
|
||||
{{- if ne .FieldSearchType ""}}
|
||||
|
@@ -155,8 +155,8 @@ func (s *{{.Abbreviation}}) Get{{.StructName}}InfoList(ctx context.Context, info
|
||||
var {{.Abbreviation}}s []model.{{.StructName}}
|
||||
// 如果有条件搜索 下方会自动创建搜索语句
|
||||
{{- if .GvaModel }}
|
||||
if info.StartCreatedAt !=nil && info.EndCreatedAt !=nil {
|
||||
db = db.Where("created_at BETWEEN ? AND ?", info.StartCreatedAt, info.EndCreatedAt)
|
||||
if info.CreatedAtRange !=nil && len(info.CreatedAtRange) == 2 {
|
||||
db = db.Where("created_at BETWEEN ? AND ?", info.CreatedAtRange[0], info.CreatedAtRange[1])
|
||||
}
|
||||
{{- end }}
|
||||
{{ GenerateSearchConditions .Fields }}
|
||||
|
@@ -97,7 +97,7 @@ getDataSourceFunc()
|
||||
<div class="gva-search-box">
|
||||
<el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule" @keyup.enter="onSubmit">
|
||||
{{- if .GvaModel }}
|
||||
<el-form-item label="创建日期" prop="CreatedAt">
|
||||
<el-form-item label="创建日期" prop="createdAtRange">
|
||||
<template #label>
|
||||
<span>
|
||||
创建日期
|
||||
@@ -106,9 +106,14 @@ getDataSourceFunc()
|
||||
</el-tooltip>
|
||||
</span>
|
||||
</template>
|
||||
<el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期" :disabled-date="time=> searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"></el-date-picker>
|
||||
—
|
||||
<el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期" :disabled-date="time=> searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"></el-date-picker>
|
||||
<el-date-picker
|
||||
v-model="searchInfo.createdAtRange"
|
||||
class="w-[380px]"
|
||||
type="datetimerange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始时间"
|
||||
end-placeholder="结束时间"
|
||||
/>
|
||||
</el-form-item>
|
||||
{{ end -}}
|
||||
{{- range .Fields}} {{- if .FieldSearchType}} {{- if not .FieldSearchHide }}
|
||||
@@ -370,36 +375,15 @@ const rule = reactive({
|
||||
})
|
||||
|
||||
const searchRule = reactive({
|
||||
CreatedAt: [
|
||||
createdAtRange: [
|
||||
{ validator: (rule, value, callback) => {
|
||||
if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
|
||||
callback(new Error('请填写结束日期'))
|
||||
} else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
|
||||
callback(new Error('请填写开始日期'))
|
||||
} else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
|
||||
callback(new Error('开始日期应当早于结束日期'))
|
||||
if (!searchInfo.value.createdAtRange || searchInfo.value.createdAtRange.length < 2) {
|
||||
callback(new Error('请选择开始日期和结束日期'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}, trigger: 'change' }
|
||||
],
|
||||
{{- range .Fields }}
|
||||
{{- if .FieldSearchType}}
|
||||
{{- if eq .FieldType "time.Time" }}
|
||||
{{.FieldJson }} : [{ validator: (rule, value, callback) => {
|
||||
if (searchInfo.value.start{{.FieldName}} && !searchInfo.value.end{{.FieldName}}) {
|
||||
callback(new Error('请填写结束日期'))
|
||||
} else if (!searchInfo.value.start{{.FieldName}} && searchInfo.value.end{{.FieldName}}) {
|
||||
callback(new Error('请填写开始日期'))
|
||||
} 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())) {
|
||||
callback(new Error('开始日期应当早于结束日期'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}, trigger: 'change' }],
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
]
|
||||
})
|
||||
|
||||
const elFormRef = ref()
|
||||
|
@@ -135,13 +135,20 @@ func GenerateSearchConditions(fields []*systemReq.AutoCodeField) string {
|
||||
}
|
||||
|
||||
} else if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
|
||||
if field.FieldType == "time.Time" {
|
||||
condition = fmt.Sprintf(`
|
||||
if info.%sRange != nil && len(info.%sRange) == 2 {
|
||||
db = db.Where("%s %s ? AND ? ", info.%sRange[0], info.%sRange[1])
|
||||
}`,
|
||||
field.FieldName, 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)
|
||||
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" {
|
||||
@@ -215,11 +222,11 @@ func GenerateSearchFormItem(field systemReq.AutoCodeField) string {
|
||||
`
|
||||
} else if field.FieldType == "float64" || field.FieldType == "int" {
|
||||
if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
|
||||
result += fmt.Sprintf(` <el-input v-model.number="searchInfo.start%s" placeholder="最小值" />
|
||||
result += fmt.Sprintf(` <el-input class="w-40" v-model.number="searchInfo.start%s" placeholder="最小值" />
|
||||
`, field.FieldName)
|
||||
result += ` —
|
||||
`
|
||||
result += fmt.Sprintf(` <el-input v-model.number="searchInfo.end%s" placeholder="最大值" />
|
||||
result += fmt.Sprintf(` <el-input class="w-40" v-model.number="searchInfo.end%s" placeholder="最大值" />
|
||||
`, field.FieldName)
|
||||
} else {
|
||||
result += fmt.Sprintf(` <el-input v-model.number="searchInfo.%s" placeholder="搜索条件" />
|
||||
@@ -243,20 +250,9 @@ func GenerateSearchFormItem(field systemReq.AutoCodeField) string {
|
||||
`
|
||||
result += ` </template>
|
||||
`
|
||||
result += fmt.Sprintf(` <el-date-picker v-model="searchInfo.start%s" type="datetime" placeholder="开始日期" `+
|
||||
`:disabled-date="time=> searchInfo.end%s ? time.getTime() > searchInfo.end%s.getTime() : false"></el-date-picker>
|
||||
`,
|
||||
field.FieldName, field.FieldName, field.FieldName)
|
||||
result += ` —
|
||||
`
|
||||
result += fmt.Sprintf(` <el-date-picker v-model="searchInfo.end%s" type="datetime" placeholder="结束日期" `+
|
||||
`:disabled-date="time=> searchInfo.start%s ? time.getTime() < searchInfo.start%s.getTime() : false"></el-date-picker>
|
||||
`,
|
||||
field.FieldName, field.FieldName, field.FieldName)
|
||||
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)
|
||||
} else {
|
||||
result += fmt.Sprintf(` <el-date-picker v-model="searchInfo.%s" type="datetime" placeholder="搜索条件"></el-date-picker>
|
||||
`,
|
||||
field.FieldJson)
|
||||
result += fmt.Sprintf(`<el-date-picker v-model="searchInfo.%s" type="datetime" placeholder="搜索条件"></el-date-picker>`, field.FieldJson)
|
||||
}
|
||||
} else {
|
||||
result += fmt.Sprintf(` <el-input v-model="searchInfo.%s" placeholder="搜索条件" />
|
||||
@@ -679,11 +675,17 @@ func GenerateSearchField(field systemReq.AutoCodeField) string {
|
||||
|
||||
if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
|
||||
// 生成范围搜索字段
|
||||
// time 的情况
|
||||
if field.FieldType == "time.Time" {
|
||||
result = fmt.Sprintf("%sRange []string `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" ||
|
||||
|
Reference in New Issue
Block a user