update
Some checks failed
Deploy / deploy (build, debian, 22, /root/OJDeploy/data/clientnext) (push) Has been cancelled
Deploy / deploy (build:staging, school, 8822, /root/OJ/data/dist) (push) Has been cancelled

This commit is contained in:
2026-05-11 04:27:12 -06:00
parent c5a89c6d6a
commit 53a79cd511
2 changed files with 47 additions and 6 deletions

View File

@@ -474,6 +474,6 @@ export function getStuckProblems() {
return http.get("admin/problem/stuck") return http.get("admin/problem/stuck")
} }
export function getTopACTrend() { export function getTopACTrend(params: { since_year: number; until_year: number; min_per_year: number }) {
return http.get("admin/problem/top_ac_trend") return http.get("admin/problem/top_ac_trend", { params })
} }

View File

@@ -35,7 +35,21 @@ interface ProblemTrend {
yearly: YearlyEntry[] yearly: YearlyEntry[]
} }
const loading = ref(true) const currentYear = new Date().getFullYear()
const yearOptions = Array.from({ length: currentYear - 2022 + 1 }, (_, i) => ({
label: String(2022 + i),
value: 2022 + i,
}))
const minPerYearOptions = [
{ label: "50", value: 50 },
{ label: "100", value: 100 },
{ label: "200", value: 200 },
]
const sinceYear = ref(2023)
const untilYear = ref(new Date().getFullYear())
const minPerYear = ref(100)
const loading = ref(false)
const data = ref<ProblemTrend[]>([]) const data = ref<ProblemTrend[]>([])
const acLabelPlugin = { const acLabelPlugin = {
@@ -109,18 +123,45 @@ function getChartOptions(problem: ProblemTrend) {
} }
} }
onMounted(async () => { async function fetchData() {
loading.value = true
try { try {
const res = await getTopACTrend() const res = await getTopACTrend({ since_year: sinceYear.value, until_year: untilYear.value, min_per_year: minPerYear.value })
data.value = res.data data.value = res.data
} finally { } finally {
loading.value = false loading.value = false
} }
}) }
onMounted(fetchData)
</script> </script>
<template> <template>
<h2 style="margin-top: 0">年度趋势</h2> <h2 style="margin-top: 0">年度趋势</h2>
<n-space align="center" style="margin-bottom: 16px">
<span>年份范围</span>
<n-select
v-model:value="sinceYear"
:options="yearOptions"
style="width: 100px"
@update:value="fetchData"
/>
<span></span>
<n-select
v-model:value="untilYear"
:options="yearOptions"
style="width: 100px"
@update:value="fetchData"
/>
<span>年提交下限</span>
<n-select
v-model:value="minPerYear"
:options="minPerYearOptions"
style="width: 90px"
@update:value="fetchData"
/>
<n-tag type="info" size="small"> {{ data.length }} </n-tag>
</n-space>
<n-spin :show="loading"> <n-spin :show="loading">
<div <div
v-if="!loading && data.length === 0" v-if="!loading && data.length === 0"