improve(ui):时间查询器优化
This commit is contained in:
1 parent
6cf68b14b3
commit
b334ff2450
11 files changed
+235
-46
No files matched your search
@@ -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{}
|
||||
@@ -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 ")
|
||||
|
||||
@@ -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 ")
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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" />
|
||||
|
||||
Reference in new issue
Block a user