improve(ui):时间查询器优化

This commit is contained in:
qian committed 2026-08-06 00:16:03 +08:00
1 parent 6cf68b14b3
commit b334ff2450
11 files changed
+235 -46

No files matched your search

+4
View File
@@ -11,6 +11,8 @@ type TenantTaskListReq struct {
Status string `json:"status" in:"query" dc:"筛选状态"`
Platform string `json:"platform" in:"query" dc:"筛选平台(sora/kling/midjourney/suno)"`
PublicTaskID string `json:"public_task_id" in:"query" dc:"任务ID(精确匹配)"`
StartDate string `json:"start_date" in:"query" dc:"开始日期 YYYY-MM-DD"`
EndDate string `json:"end_date" in:"query" dc:"结束日期 YYYY-MM-DD"`
}
type TenantTaskItem struct {
@@ -56,6 +58,8 @@ type TenantTaskExportReq struct {
Status string `json:"status" in:"query" dc:"筛选状态"`
Platform string `json:"platform" in:"query" dc:"筛选平台(sora/kling/midjourney/suno)"`
PublicTaskID string `json:"public_task_id" in:"query" dc:"任务ID(精确匹配)"`
StartDate string `json:"start_date" in:"query" dc:"开始日期 YYYY-MM-DD"`
EndDate string `json:"end_date" in:"query" dc:"结束日期 YYYY-MM-DD"`
}
type TenantTaskExportRes struct{}
+4 -4
View File
@@ -150,10 +150,10 @@ func isValidAuditLevel(level string) bool {
// TenantRequestAuditLogs 分页查询租户的请求审计日志(不含 body,性能优先)
func (s *sTenant) TenantRequestAuditLogs(ctx context.Context, req *v1.TenantRequestAuditLogsReq) (*v1.TenantRequestAuditLogsRes, error) {
if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil {
if err := common.ValidateDateTimeParam(req.StartDate, "开始时间"); err != nil {
return nil, err
}
if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil {
if err := common.ValidateDateTimeParam(req.EndDate, "结束时间"); err != nil {
return nil, err
}
@@ -214,11 +214,11 @@ func (s *sTenant) TenantRequestAuditLogs(ctx context.Context, req *v1.TenantRequ
}
if req.StartDate != "" {
conditions = append(conditions, "created_at >= ?")
args = append(args, req.StartDate+" 00:00:00")
args = append(args, common.StartOfRange(req.StartDate))
}
if req.EndDate != "" {
conditions = append(conditions, "created_at <= ?")
args = append(args, req.EndDate+" 23:59:59")
args = append(args, common.EndOfRange(req.EndDate))
}
where := strings.Join(conditions, " AND ")
+8 -8
View File
@@ -163,10 +163,10 @@ func (s *sTenant) WalletTransactions(ctx context.Context, req *v1.TenantWalletTr
// UsageLogs 获取租户用量日志
func (s *sTenant) UsageLogs(ctx context.Context, req *v1.TenantUsageLogsReq) (*v1.TenantUsageLogsRes, error) {
if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil {
if err := common.ValidateDateTimeParam(req.StartDate, "开始时间"); err != nil {
return nil, err
}
if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil {
if err := common.ValidateDateTimeParam(req.EndDate, "结束时间"); err != nil {
return nil, err
}
@@ -203,11 +203,11 @@ func (s *sTenant) UsageLogs(ctx context.Context, req *v1.TenantUsageLogsReq) (*v
}
if req.StartDate != "" {
conditions = append(conditions, "u.created_at >= ?")
args = append(args, req.StartDate+" 00:00:00")
args = append(args, common.StartOfRange(req.StartDate))
}
if req.EndDate != "" {
conditions = append(conditions, "u.created_at <= ?")
args = append(args, req.EndDate+" 23:59:59")
args = append(args, common.EndOfRange(req.EndDate))
}
where := strings.Join(conditions, " AND ")
@@ -273,10 +273,10 @@ func (s *sTenant) UsageLogs(ctx context.Context, req *v1.TenantUsageLogsReq) (*v
// ExportUsageLogs exports the tenant usage logs as CSV or Excel.
func (s *sTenant) ExportUsageLogs(ctx context.Context, req *v1.TenantUsageLogsExportReq) (*v1.TenantUsageLogsExportRes, error) {
if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil {
if err := common.ValidateDateTimeParam(req.StartDate, "开始时间"); err != nil {
return nil, err
}
if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil {
if err := common.ValidateDateTimeParam(req.EndDate, "结束时间"); err != nil {
return nil, err
}
@@ -331,11 +331,11 @@ func (s *sTenant) ExportUsageLogs(ctx context.Context, req *v1.TenantUsageLogsEx
}
if req.StartDate != "" {
conditions = append(conditions, "u.created_at >= ?")
args = append(args, req.StartDate+" 00:00:00")
args = append(args, common.StartOfRange(req.StartDate))
}
if req.EndDate != "" {
conditions = append(conditions, "u.created_at <= ?")
args = append(args, req.EndDate+" 23:59:59")
args = append(args, common.EndOfRange(req.EndDate))
}
where := strings.Join(conditions, " AND ")
+28
View File
@@ -22,6 +22,13 @@ func (s *sTenant) TenantTaskList(ctx context.Context, req *v1.TenantTaskListReq)
role := middleware.GetUserRole(ctx)
userID := middleware.GetUserID(ctx)
if err := common.ValidateDateTimeParam(req.StartDate, "开始时间"); err != nil {
return nil, err
}
if err := common.ValidateDateTimeParam(req.EndDate, "结束时间"); err != nil {
return nil, err
}
m := dao.TskModelTasks.Ctx(ctx).
LeftJoin("tnt_users u", "u.id = tsk_model_tasks.user_id AND u.tenant_id = tsk_model_tasks.tenant_id").
Fields("tsk_model_tasks.*, COALESCE(u.username, '') as username").
@@ -42,6 +49,12 @@ func (s *sTenant) TenantTaskList(ctx context.Context, req *v1.TenantTaskListReq)
if req.PublicTaskID != "" {
m = m.Where("tsk_model_tasks.public_task_id", req.PublicTaskID)
}
if req.StartDate != "" {
m = m.Where("tsk_model_tasks.created_at >= ?", common.StartOfRange(req.StartDate))
}
if req.EndDate != "" {
m = m.Where("tsk_model_tasks.created_at <= ?", common.EndOfRange(req.EndDate))
}
var tasks []struct {
Id int64 `json:"id"`
@@ -191,6 +204,13 @@ func (s *sTenant) ExportTasks(ctx context.Context, req *v1.TenantTaskExportReq)
userID := middleware.GetUserID(ctx)
role := middleware.GetUserRole(ctx)
if err := common.ValidateDateTimeParam(req.StartDate, "开始时间"); err != nil {
return nil, err
}
if err := common.ValidateDateTimeParam(req.EndDate, "结束时间"); err != nil {
return nil, err
}
statusLabel := map[string]string{
"NOT_START": "未开始",
"SUBMITTED": "已提交",
@@ -253,6 +273,14 @@ func (s *sTenant) ExportTasks(ctx context.Context, req *v1.TenantTaskExportReq)
conditions = append(conditions, "t.public_task_id = ?")
args = append(args, req.PublicTaskID)
}
if req.StartDate != "" {
conditions = append(conditions, "t.created_at >= ?")
args = append(args, common.StartOfRange(req.StartDate))
}
if req.EndDate != "" {
conditions = append(conditions, "t.created_at <= ?")
args = append(args, common.EndOfRange(req.EndDate))
}
where := ""
for i, c := range conditions {
+27 -3
View File
@@ -9,6 +9,21 @@ import PageHeader from '@/components/PageHeader.vue'
import TableStats from '@/components/TableStats.vue'
import request from '@/utils/request'
// 日期辅助(native,避免引入 dayjs 依赖)
function pad2(n: number): string {
return String(n).padStart(2, '0')
}
function toDateTimeStr(d: Date): string {
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} ${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`
}
// 默认查询当天:起始时间为当天 0 点,截止时间留空(后端按「到现在」实时处理)。
// 日期选择器里的「现在」仅用于展示;查询时截止仍为默认「现在」则不传 end_date,避免固定截止时间漏掉后续新记录。
const defaultEnd = toDateTimeStr(new Date())
function defaultTodayRange(): string[] {
const d = new Date()
return [`${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} 00:00:00`, defaultEnd]
}
const loading = ref(false)
const data = ref<any[]>([])
const pagination = reactive({
@@ -22,7 +37,7 @@ const pagination = reactive({
const filterStatus = ref<string | null>(null)
const filterPlatform = ref<string | null>(null)
const filterTaskId = ref('')
const filterDateRange = ref<string[]>([])
const filterDateRange = ref<string[]>(defaultTodayRange())
const filterModel = ref('')
const filterTenantId = ref<number | undefined>(undefined)
const filterUserId = ref<number | undefined>(undefined)
@@ -162,7 +177,10 @@ async function fetchData() {
if (filterTaskId.value) params.public_task_id = filterTaskId.value
if (filterDateRange.value && filterDateRange.value.length === 2) {
params.start_date = filterDateRange.value[0]
params.end_date = filterDateRange.value[1]
// 截止时间为默认「现在」时不传 end_date(后端按「到现在」实时处理),仅手动选择后才显式下发
if (filterDateRange.value[1] && filterDateRange.value[1] !== defaultEnd) {
params.end_date = filterDateRange.value[1]
}
}
if (filterModel.value) params.model_name = filterModel.value
if (filterTenantId.value) params.tenant_id = filterTenantId.value
@@ -188,7 +206,7 @@ function resetFilter() {
filterStatus.value = null
filterPlatform.value = null
filterTaskId.value = ''
filterDateRange.value = []
filterDateRange.value = defaultTodayRange()
filterModel.value = ''
filterTenantId.value = undefined
filterUserId.value = undefined
@@ -196,6 +214,11 @@ function resetFilter() {
fetchData()
}
// 刷新:清空所有筛选条件,仅按当天起始时间查询最新记录(截止留空 = 到现在)
function handleRefresh() {
resetFilter()
}
async function cancelTask(row: any) {
try {
await request.post(`/admin/tasks/${row.id}/cancel`)
@@ -300,6 +323,7 @@ onMounted(() => {
/>
<AButton type="primary" @click="handleFilter">搜索</AButton>
<AButton @click="resetFilter">重置</AButton>
<AButton @click="handleRefresh">刷新</AButton>
</ASpace>
</ACard>
@@ -10,6 +10,21 @@ import TableStats from '@/components/TableStats.vue'
import ForwardingTracePanel from '@/components/ForwardingTracePanel.vue'
import request from '@/utils/request'
// 日期辅助(native,避免引入 dayjs 依赖)
function pad2(n: number): string {
return String(n).padStart(2, '0')
}
function toDateTimeStr(d: Date): string {
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} ${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`
}
// 默认查询当天:起始时间为当天 0 点,截止时间留空(后端按「到现在」实时处理)。
// 日期选择器里的「现在」仅用于展示;查询时截止仍为默认「现在」则不传 end_date,避免固定截止时间漏掉后续新记录。
const defaultEnd = toDateTimeStr(new Date())
function defaultTodayRange(): string[] {
const d = new Date()
return [`${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} 00:00:00`, defaultEnd]
}
const router = useRouter()
const loading = ref(false)
@@ -27,7 +42,7 @@ const filter = reactive({
tenant_id: null as number | null,
user_id: null as number | null,
api_key_id: '',
date_range: [] as string[],
date_range: defaultTodayRange(),
})
const tenantOptions = ref<{ label: string; value: number }[]>([])
@@ -202,7 +217,10 @@ async function fetchData() {
if (filter.api_key_id) params.api_key_id = parseInt(filter.api_key_id)
if (filter.date_range.length === 2) {
params.start_date = filter.date_range[0]
params.end_date = filter.date_range[1]
// 截止时间为默认「现在」时不传 end_date(后端按「到现在」实时处理),仅手动选择后才显式下发
if (filter.date_range[1] && filter.date_range[1] !== defaultEnd) {
params.end_date = filter.date_range[1]
}
}
const res: any = await request.get('/admin/audit/request-logs', { params })
const raw = res.data?.data
@@ -247,11 +265,16 @@ function handleReset() {
filter.tenant_id = null
filter.user_id = null
filter.api_key_id = ''
filter.date_range = []
filter.date_range = defaultTodayRange()
pagination.current = 1
fetchData()
}
// 刷新:清空所有筛选条件,仅按当天起始时间查询最新记录(截止留空 = 到现在)
function handleRefresh() {
handleReset()
}
onMounted(() => {
fetchTenantOptions('')
const route = useRoute()
@@ -320,6 +343,7 @@ onMounted(() => {
/>
<a-button type="primary" @click="handleFilter">搜索</a-button>
<a-button @click="handleReset">重置</a-button>
<a-button @click="handleRefresh">刷新</a-button>
</a-space>
</a-card>
+29 -4
View File
@@ -11,6 +11,21 @@ import ForwardingTracePanel from '@/components/ForwardingTracePanel.vue'
import request from '@/utils/request'
import { useExport } from '@/composables/useExport'
// 日期辅助(native,避免引入 dayjs 依赖)
function pad2(n: number): string {
return String(n).padStart(2, '0')
}
function toDateTimeStr(d: Date): string {
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} ${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`
}
// 默认查询当天:起始时间为当天 0 点,截止时间留空(后端按「到现在」实时处理)。
// 日期选择器里的「现在」仅用于展示;查询时截止仍为默认「现在」则不传 end_date,避免固定截止时间漏掉后续新记录。
const defaultEnd = toDateTimeStr(new Date())
function defaultTodayRange(): string[] {
const d = new Date()
return [`${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} 00:00:00`, defaultEnd]
}
const loading = ref(false)
const data = ref<any[]>([])
const pagination = reactive({
@@ -29,7 +44,7 @@ const filterApiKeyId = ref<number | undefined>(undefined)
const filterRequestType = ref<string | undefined>(undefined)
const filterChannelId = ref<number | undefined>(undefined)
const filterStatus = ref<string | undefined>(undefined)
const filterDateRange = ref<string[]>([])
const filterDateRange = ref<string[]>(defaultTodayRange())
const tenantOptions = ref<{ label: string; value: number }[]>([])
const modelOptions = ref<{ label: string; value: string }[]>([])
@@ -402,7 +417,10 @@ async function fetchData() {
if (filterStatus.value) params.status = filterStatus.value
if (filterDateRange.value && filterDateRange.value.length === 2) {
params.start_date = filterDateRange.value[0]
params.end_date = filterDateRange.value[1]
// 截止时间为默认「现在」时不传 end_date(后端按「到现在」实时处理),仅手动选择后才显式下发
if (filterDateRange.value[1] && filterDateRange.value[1] !== defaultEnd) {
params.end_date = filterDateRange.value[1]
}
}
const res: any = await request.get('/admin/usage-logs', { params })
@@ -431,11 +449,16 @@ function handleReset() {
filterRequestType.value = undefined
filterChannelId.value = undefined
filterStatus.value = undefined
filterDateRange.value = []
filterDateRange.value = defaultTodayRange()
pagination.current = 1
fetchData()
}
// 刷新:清空所有筛选条件,仅按当天起始时间查询最新记录(截止留空 = 到现在)
function handleRefresh() {
handleReset()
}
onMounted(() => {
fetchTenantOptions()
fetchModelOptions()
@@ -454,7 +477,8 @@ const { exporting, exportFile } = useExport({
channel_id: filterChannelId.value,
status: filterStatus.value,
start_date: filterDateRange.value?.[0],
end_date: filterDateRange.value?.[1],
// 与列表查询一致:默认截止「现在」不传截止时间,按「到现在」实时导出
end_date: filterDateRange.value?.[1] && filterDateRange.value[1] !== defaultEnd ? filterDateRange.value[1] : undefined,
}),
})
</script>
@@ -471,6 +495,7 @@ const { exporting, exportFile } = useExport({
</template>
</ADropdown>
<a-button size="small" @click="handleReset">重置筛选</a-button>
<a-button size="small" @click="handleRefresh">刷新</a-button>
</template>
</PageHeader>
@@ -0,0 +1,44 @@
<script setup lang="ts">
import { computed } from 'vue'
// 日期时间范围选择器:开始/结束各一个 datetime-local 输入(支持到分钟精度)。
// 对外暴露 v-model:start / v-model:end,值为后端格式字符串 YYYY-MM-DD HH:mm:ss(结束留空 = 到现在)。
const props = defineProps<{
start?: string
end?: string
}>()
const emit = defineEmits<{
'update:start': [value: string]
'update:end': [value: string]
}>()
// datetime-local 值(YYYY-MM-DDTHH:mm)与后端值(YYYY-MM-DD HH:mm:ss)互转
function toInputValue(v: string | undefined): string {
if (!v) return ''
return v.replace(' ', 'T').slice(0, 16)
}
function toBackendValue(v: string): string {
if (!v) return ''
const s = v.replace('T', ' ')
return s.length === 16 ? s + ':00' : s
}
const startInput = computed({
get: () => toInputValue(props.start),
set: (v: string) => emit('update:start', toBackendValue(v)),
})
const endInput = computed({
get: () => toInputValue(props.end),
set: (v: string) => emit('update:end', toBackendValue(v)),
})
</script>
<template>
<div class="flex items-center gap-2">
<label class="text-sm text-gray-500 whitespace-nowrap">开始时间</label>
<input v-model="startInput" type="datetime-local" class="input" style="width:190px" />
<span class="text-gray-400 select-none">~</span>
<label class="text-sm text-gray-500 whitespace-nowrap">结束时间</label>
<input v-model="endInput" type="datetime-local" class="input" style="width:190px" />
</div>
</template>
@@ -4,6 +4,21 @@ import { useRoute } from 'vue-router'
import Icon from '@/components/common/Icon.vue'
import BasePagination from '@/components/common/BasePagination.vue'
import request from '@/utils/request'
import DateTimeRangePicker from '@/components/common/DateTimeRangePicker.vue'
// 日期辅助(native,避免引入 dayjs 依赖)
function pad2(n: number): string {
return String(n).padStart(2, '0')
}
// 默认查询当天:开始 = 当天 0 点,结束 = 当天 23:59:59
function todayStart(): string {
const d = new Date()
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} 00:00:00`
}
function todayEnd(): string {
const d = new Date()
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} 23:59:59`
}
interface RequestLog {
id: number
@@ -34,8 +49,8 @@ const logFilter = reactive({
task_id: '',
path: '',
status_code: '',
start_date: '',
end_date: '',
start_date: todayStart(),
end_date: todayEnd(),
})
const showDetail = ref(false)
@@ -164,8 +179,8 @@ function handleReset() {
logFilter.task_id = ''
logFilter.path = ''
logFilter.status_code = ''
logFilter.start_date = ''
logFilter.end_date = ''
logFilter.start_date = todayStart()
logFilter.end_date = todayEnd()
logPage.value = 1
fetchRequestLogs()
}
@@ -188,14 +203,7 @@ onMounted(() => {
<div class="card">
<div class="card-body !p-4">
<form class="flex flex-wrap items-center gap-x-3 gap-y-3" @submit.prevent="handleFilter">
<div class="flex items-center gap-2">
<label class="text-sm text-gray-500 whitespace-nowrap">开始日期</label>
<input v-model="logFilter.start_date" type="date" class="input" style="width:140px" />
</div>
<div class="flex items-center gap-2">
<label class="text-sm text-gray-500 whitespace-nowrap">结束日期</label>
<input v-model="logFilter.end_date" type="date" class="input" style="width:140px" />
</div>
<DateTimeRangePicker v-model:start="logFilter.start_date" v-model:end="logFilter.end_date" />
<div class="flex items-center gap-2">
<label class="text-sm text-gray-500 whitespace-nowrap">用户名</label>
<input v-model="logFilter.username" class="input" placeholder="搜索用户" style="width:120px" @keydown.enter="handleFilter" />
@@ -7,6 +7,21 @@ import BasePagination from '@/components/common/BasePagination.vue'
import BaseSelect from '../../components/common/BaseSelect.vue'
import request from '@/utils/request'
import { useExport } from '@/composables/useExport'
import DateTimeRangePicker from '@/components/common/DateTimeRangePicker.vue'
// 日期辅助(native,避免引入 dayjs 依赖)
function pad2(n: number): string {
return String(n).padStart(2, '0')
}
// 默认查询当天:开始 = 当天 0 点,结束 = 当天 23:59:59
function todayStart(): string {
const d = new Date()
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} 00:00:00`
}
function todayEnd(): string {
const d = new Date()
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} 23:59:59`
}
interface TaskItem {
id: number
@@ -37,6 +52,8 @@ const total = ref(0)
const filterStatus = ref('')
const filterPlatform = ref('')
const filterTaskId = ref('')
const filterStartDate = ref(todayStart())
const filterEndDate = ref(todayEnd())
const showExportDropdown = ref(false)
const showDetail = ref(false)
@@ -49,6 +66,8 @@ const { exporting, exportFile } = useExport({
status: filterStatus.value || undefined,
platform: filterPlatform.value || undefined,
public_task_id: filterTaskId.value || undefined,
start_date: filterStartDate.value || undefined,
end_date: filterEndDate.value || undefined,
}),
})
@@ -99,6 +118,8 @@ async function fetchTasks() {
if (filterStatus.value) params.status = filterStatus.value
if (filterPlatform.value) params.platform = filterPlatform.value
if (filterTaskId.value) params.public_task_id = filterTaskId.value
if (filterStartDate.value) params.start_date = filterStartDate.value
if (filterEndDate.value) params.end_date = filterEndDate.value
const res: any = await request.get('/tenant/tasks', { params })
const raw = res.data?.data
@@ -138,6 +159,8 @@ function resetFilters() {
filterStatus.value = ''
filterPlatform.value = ''
filterTaskId.value = ''
filterStartDate.value = todayStart()
filterEndDate.value = todayEnd()
page.value = 1
fetchTasks()
}
@@ -162,6 +185,7 @@ onMounted(() => {
<div class="relative z-20 overflow-visible card">
<div class="card-body !p-4">
<form class="flex flex-wrap items-center gap-x-3 gap-y-3" @submit.prevent="applyFilters">
<DateTimeRangePicker v-model:start="filterStartDate" v-model:end="filterEndDate" />
<div class="flex items-center gap-2">
<label class="text-sm text-gray-500 whitespace-nowrap">任务 ID</label>
<input v-model="filterTaskId" class="input" placeholder="搜索任务 ID" style="width:200px" @keydown.enter="applyFilters" />
+20 -12
View File
@@ -7,6 +7,21 @@ import BasePagination from '@/components/common/BasePagination.vue'
import BaseSelect from '../../components/common/BaseSelect.vue'
import request from '@/utils/request'
import { useExport } from '@/composables/useExport'
import DateTimeRangePicker from '@/components/common/DateTimeRangePicker.vue'
// 日期辅助(native,避免引入 dayjs 依赖)
function pad2(n: number): string {
return String(n).padStart(2, '0')
}
// 默认查询当天:开始 = 当天 0 点,结束 = 当天 23:59:59
function todayStart(): string {
const d = new Date()
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} 00:00:00`
}
function todayEnd(): string {
const d = new Date()
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} 23:59:59`
}
const loading = ref(false)
const logs = ref<any[]>([])
@@ -18,8 +33,8 @@ const filterUsername = ref('')
const filterModel = ref('')
const filterStatus = ref('')
const filterRequestType = ref('')
const filterStartDate = ref('')
const filterEndDate = ref('')
const filterStartDate = ref(todayStart())
const filterEndDate = ref(todayEnd())
const showExportDropdown = ref(false)
const { exporting, exportFile } = useExport({
@@ -132,8 +147,8 @@ function resetFilters() {
filterModel.value = ''
filterStatus.value = ''
filterRequestType.value = ''
filterStartDate.value = ''
filterEndDate.value = ''
filterStartDate.value = todayStart()
filterEndDate.value = todayEnd()
page.value = 1
fetchLogs()
}
@@ -230,14 +245,7 @@ onMounted(() => {
<div class="relative z-20 overflow-visible card">
<div class="card-body !p-4">
<form class="flex flex-wrap items-center gap-x-3 gap-y-3" @submit.prevent="applyFilters">
<div class="flex items-center gap-2">
<label class="text-sm text-gray-500 whitespace-nowrap">开始日期</label>
<input v-model="filterStartDate" type="date" class="input" style="width:140px" />
</div>
<div class="flex items-center gap-2">
<label class="text-sm text-gray-500 whitespace-nowrap">结束日期</label>
<input v-model="filterEndDate" type="date" class="input" style="width:140px" />
</div>
<DateTimeRangePicker v-model:start="filterStartDate" v-model:end="filterEndDate" />
<div class="flex items-center gap-2">
<label class="text-sm text-gray-500 whitespace-nowrap">用户名</label>
<input v-model="filterUsername" type="text" placeholder="搜索用户" class="input" style="width:120px" @keyup.enter="applyFilters" />