feat(frontend): implement P0 optimization baseline

This commit is contained in:
yml2213
2026-05-15 16:07:04 +08:00
parent 11678a7f83
commit f43cee1ba0
4 changed files with 574 additions and 9 deletions
+24 -3
View File
@@ -33,11 +33,11 @@ export function getAdminRole() {
return role
}
return 'operator'
return 'support'
}
export function hasAdminRole(role: 'admin' | 'operator' | 'support') {
if (!getAdminToken()) {
if (!hasAdminSession()) {
return false
}
@@ -74,5 +74,26 @@ export function clearAdminSession() {
}
export function hasAdminSession() {
return Boolean(getAdminToken())
const token = getAdminToken()
const expiresAt = getAdminTokenExpiresAt()
if (!token) {
return false
}
if (isExpired(expiresAt)) {
clearAdminSession()
return false
}
return true
}
function isExpired(expiresAt: string) {
if (!expiresAt) {
return false
}
const expiresAtMs = Date.parse(expiresAt)
return Number.isFinite(expiresAtMs) && expiresAtMs <= Date.now()
}
@@ -30,6 +30,7 @@ const pagination = ref<AdminPagination>({
})
const canReplay = hasAdminRole('admin')
let latestRequestId = 0
const summary = computed(() => ({
processedCount: items.value.filter((item) => item.processed).length,
@@ -38,6 +39,7 @@ const summary = computed(() => ({
}))
async function loadEvents(page = pagination.value.page) {
const requestId = ++latestRequestId
loading.value = true
errorMessage.value = ''
@@ -54,12 +56,23 @@ async function loadEvents(page = pagination.value.page) {
dateFrom: dateFrom.value.trim(),
dateTo: dateTo.value.trim(),
})
if (requestId !== latestRequestId) {
return
}
items.value = response.data.items
pagination.value = response.data.pagination
} catch (error) {
if (requestId !== latestRequestId) {
return
}
errorMessage.value = error instanceof Error ? error.message : '读取 webhook 列表失败'
} finally {
loading.value = false
if (requestId === latestRequestId) {
loading.value = false
}
}
}