优化管理页交互与历史同步

This commit is contained in:
2026-06-05 16:03:54 +08:00
parent 90321a5ca4
commit 2cde31f822
6 changed files with 131 additions and 76 deletions
+8 -3
View File
@@ -6,9 +6,14 @@
class="border-b px-6 py-4"
:class="[isDarkMode ? 'border-gray-700/80' : 'border-[#d9e4e6]']"
>
<h3 class="text-lg font-medium" :class="[isDarkMode ? 'text-white' : 'text-gray-800']">
{{ title }}
</h3>
<div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
<h3 class="text-lg font-medium" :class="[isDarkMode ? 'text-white' : 'text-gray-800']">
{{ title }}
</h3>
<div v-if="slots.actions" class="flex shrink-0 flex-wrap items-center gap-2">
<slot name="actions"></slot>
</div>
</div>
<div v-if="slots.toolbar" class="mt-4">
<slot name="toolbar"></slot>
</div>
+15 -31
View File
@@ -100,8 +100,6 @@ const formatBytes = (value: number | string | undefined) => {
return `${(bytes / 1024 ** index).toFixed(index === 0 ? 0 : 1)} ${units[index]}`
}
const lerp = (start: number, end: number, amount: number) => start + (end - start) * amount
const clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value))
const getDefaultWindow = () => {
@@ -259,52 +257,38 @@ const draw = () => {
if (hoverX.value !== null && points.length && total) {
const hoverRatio = clamp((hoverX.value - padLeft) / width, 0, 1)
const sourceIndex = clamp(offset.value + hoverRatio * denominator, 0, total - 1)
const leftIndex = Math.floor(sourceIndex)
const rightIndex = Math.min(total - 1, Math.ceil(sourceIndex))
const mix = sourceIndex - leftIndex
const leftRow = props.rows[leftIndex]
const rightRow = props.rows[rightIndex] || leftRow
const interpolatedX = padLeft + ((sourceIndex - offset.value) / denominator) * width
const downloads = lerp(Number(leftRow.downloads || 0), Number(rightRow.downloads || 0), mix)
const uploads = lerp(Number(leftRow.uploads || 0), Number(rightRow.uploads || 0), mix)
const downloadTraffic = lerp(
Number(leftRow.downloadTraffic || 0),
Number(rightRow.downloadTraffic || 0),
mix
)
const uploadTraffic = lerp(
Number(leftRow.uploadTraffic || 0),
Number(rightRow.uploadTraffic || 0),
mix
)
const sourceIndex = Math.round(clamp(offset.value + hoverRatio * denominator, 0, total - 1))
const row = props.rows[sourceIndex]
const snapX = padLeft + ((sourceIndex - offset.value) / denominator) * width
const downloads = Number(row.downloads || 0)
const uploads = Number(row.uploads || 0)
const downloadTraffic = Number(row.downloadTraffic || 0)
const uploadTraffic = Number(row.uploadTraffic || 0)
const downloadY = padTop + height - (downloads / max) * height
const uploadY = padTop + height - (uploads / max) * height
const anchorY = Math.min(downloadY, uploadY)
const placeBelow = anchorY < 104
const tooltipInset = Math.min(mobile ? 116 : 132, Math.max(48, rect.width / 2 - 8))
const dateText =
leftRow.date === rightRow.date ? leftRow.date : `${leftRow.date} - ${rightRow.date}`
ctx.strokeStyle = props.isDarkMode ? 'rgba(148, 163, 184, 0.35)' : 'rgba(91, 121, 132, 0.28)'
ctx.lineWidth = 1
ctx.beginPath()
ctx.moveTo(interpolatedX, padTop)
ctx.lineTo(interpolatedX, padTop + height)
ctx.moveTo(snapX, padTop)
ctx.lineTo(snapX, padTop + height)
ctx.stroke()
tooltip.value = {
left: clamp(interpolatedX, tooltipInset, rect.width - tooltipInset),
left: clamp(snapX, tooltipInset, rect.width - tooltipInset),
top: placeBelow ? anchorY + 16 : anchorY - 12,
date: dateText,
downloads: Math.round(downloads),
uploads: Math.round(uploads),
date: row.date,
downloads,
uploads,
downloadTraffic: formatBytes(downloadTraffic),
uploadTraffic: formatBytes(uploadTraffic),
transform: placeBelow ? 'translate(-50%, 0)' : 'translate(-50%, -100%)'
}
drawHoverPoint({ x: interpolatedX, y: downloadY }, downloadColor)
drawHoverPoint({ x: interpolatedX, y: uploadY }, uploadColor)
drawHoverPoint({ x: snapX, y: downloadY }, downloadColor)
drawHoverPoint({ x: snapX, y: uploadY }, uploadColor)
} else {
tooltip.value = null
}