diff --git a/client/src/pages/admin/logs.vue b/client/src/pages/admin/logs.vue index 90528dc..0037be7 100644 --- a/client/src/pages/admin/logs.vue +++ b/client/src/pages/admin/logs.vue @@ -53,10 +53,12 @@ 日志查询 - - - {{ selectedDate }} - + + + + {{ selectedDate }} + + @@ -109,7 +111,6 @@ const logLines = ref([]) const loading = ref(false) const page = ref(1) const total = ref(0) -const showDatePicker = ref(false) const noMore = computed(() => logLines.value.length >= total.value && total.value > 0) @@ -178,6 +179,12 @@ function selectDate(date: string) { loadLogs() } +function onDateChange(e: any) { + selectedDate.value = e.detail.value + page.value = 1 + loadLogs() +} + function getBarWidth(count: number): number { if (!stats.value) return 0 const max = Math.max(...stats.value.daily.map(d => d.total), 1) diff --git a/server/src/middleware/logger.ts b/server/src/middleware/logger.ts index 3344658..b043cce 100644 --- a/server/src/middleware/logger.ts +++ b/server/src/middleware/logger.ts @@ -8,15 +8,22 @@ if (!fs.existsSync(LOG_DIR)) { fs.mkdirSync(LOG_DIR, { recursive: true }) } -/** 获取当前日期字符串 YYYY-MM-DD */ +/** 获取 UTC+8 时间 */ +function getChinaTime(date: Date = new Date()): Date { + const utc = date.getTime() + date.getTimezoneOffset() * 60000 + return new Date(utc + 8 * 3600000) +} + +/** 获取当前日期字符串 YYYY-MM-DD(UTC+8) */ function getDateStr(): string { - const d = new Date() + const d = getChinaTime() return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}` } -/** 格式化时间 HH:mm:ss.SSS */ +/** 格式化时间 HH:mm:ss.SSS(UTC+8) */ function formatTime(date: Date): string { - return `${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}.${String(date.getMilliseconds()).padStart(3, '0')}` + const d = getChinaTime(date) + return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')}.${String(d.getMilliseconds()).padStart(3, '0')}` } /** 写入日志文件 */ diff --git a/server/src/routes/logs.ts b/server/src/routes/logs.ts index 5dd7644..69c8de9 100644 --- a/server/src/routes/logs.ts +++ b/server/src/routes/logs.ts @@ -7,6 +7,14 @@ import { requireAdmin } from '../middleware/requireAdmin' const router = Router() const LOG_DIR = path.resolve(process.env.LOG_DIR || './logs') +/** 获取 UTC+8 今日日期字符串 */ +function getTodayStr(): string { + const now = new Date() + const utc = now.getTime() + now.getTimezoneOffset() * 60000 + const d = new Date(utc + 8 * 3600000) + return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}` +} + /** 获取日志列表(最近7天) */ router.get('/files', requireAdmin, (_req, res) => { try { @@ -45,8 +53,7 @@ router.get('/stats', requireAdmin, (_req, res) => { return res.json({ code: 0, data: { today: { total: 0, errors: 0, slow: 0 }, files: [] } }) } - const today = new Date() - const dateStr = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}` + const dateStr = getTodayStr() const todayFile = path.join(LOG_DIR, `${dateStr}.log`) let todayStats = { total: 0, errors: 0, slow: 0, warns: 0 }