style(比赛/题单/班级PK/统计): 图例和规则说明跟排名页一样多,读起来像说明书
Deploy / deploy (push) Canceled after 0s

比赛排名表底下的图例和用时规则、比赛题目页的「做对人数随时更新」和计分规则、
老师比赛班级页的「学生看不到这一页 · 15 秒刷新一次」和键盘提示;
题单详情的「加入以后…才算进度」「做对一道会自动回到这里」、题单列表的
「老师现在布置的」「加入过的在前」、老师题单进度表底部的颜色说明;
班级 PK 里「格子里是…」「条 = …」「皇冠 = …」「一根柱一档…」「这学期,最近 N 周」、
只有一个班做过的题那行、「根据上面这些数字写,仅供参考」;
统计里「没选班级,先按班级列出来…」「点方块在新页面打开这一条」;
流程图节点库的「拖拽节点到画布中」,都拿掉。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-10 14:17:42 +08:00
1 parent c2e05d423f
commit da30ae1875
12 files changed
+6 -144

No files matched your search

+3 -27
View File
@@ -70,19 +70,6 @@ const steadier = computed(() => {
return `${nameOf(firstLeft > firstRight ? 0 : 1)}更稳`
})
/** 只有一个班布置过的题:不比,列几道名字 */
const soloText = computed(() => {
const { solo } = props.pk
if (!solo.length) return ""
const names = solo.slice(0, 2).map((item) => `「${item.title}」`)
const owners = new Set(solo.map((item) => item.className))
const who =
owners.size === 1
? `只有${nameOf(props.pk.classes.findIndex((item) => item.className === solo[0]!.className))}做过的`
: "只有一个班做过的"
return `${who} ${solo.length} 道不比:${names.join("、")}${solo.length > 2 ? " 等" : ""}`
})
const SHOW_MOBILE = 7
const expanded = ref(false)
const shownRows = computed(() =>
@@ -136,7 +123,7 @@ const tab = ref<"weekly" | "dist">("weekly")
</span>
</div>
<div class="mid">
<span class="muted">两个班都做过的 {{ rows.length }} 道题 · 谁做对的人多谁赢这道</span>
<span class="muted">{{ rows.length }} 道题</span>
<span class="big">
<b :style="{ color: colors[0] }">{{ score.left }}</b>
<i>:</i>
@@ -154,13 +141,6 @@ const tab = ref<"weekly" | "dist">("weekly")
<div class="card">
<div class="card-head">
<b>同一批题</b>
<span class="muted">
条 = 全班做对的人占几成<template v-if="!compact">
· 皇冠 = 这道赢了 · 按两班差距从大到小</template
>
</span>
<div class="spacer" />
<span v-if="soloText && !compact" class="muted">{{ soloText }}</span>
</div>
<template v-if="!compact">
@@ -288,7 +268,7 @@ const tab = ref<"weekly" | "dist">("weekly")
</div>
<div v-if="!compact || tab === 'weekly'" class="card pad">
<div v-if="!compact" class="card-title">
<b>每周人均新做对</b><span class="muted">这学期,最近 {{ weeks.list.length }} 周</span>
<b>每周人均新做对</b>
</div>
<div class="weeks">
<div v-for="week in weeks.list" :key="week.label" class="week">
@@ -310,7 +290,7 @@ const tab = ref<"weekly" | "dist">("weekly")
</div>
<div v-if="!compact || tab === 'dist'" class="card pad dist">
<div v-if="!compact" class="card-title">
<b>全班分布</b><span class="muted">一根柱一档,横轴是做对几道 · 虚线是中间那位</span>
<b>全班分布</b>
</div>
<div v-for="(item, index) in [left, right]" :key="item.className" class="dist-one">
<span class="dist-name" :style="{ color: colors[index] }">
@@ -451,10 +431,6 @@ const tab = ref<"weekly" | "dist">("weekly")
margin-bottom: 8px;
}
.spacer {
flex-grow: 1;
}
.row {
min-height: 52px;
display: grid;
+1 -14
View File
@@ -90,7 +90,6 @@ const expanded = ref(false)
const shownRows = computed(() =>
props.compact && !expanded.value ? rows.value.slice(0, SHOW_MOBILE) : rows.value,
)
const soloCount = computed(() => props.pk.solo.length)
const tab = ref<"race" | "lead">("race")
const medal = (index: number) => palette.value.medal[index]
@@ -101,14 +100,9 @@ const medal = (index: number) => palette.value.medal[index]
<div class="card table">
<div class="card-title">
<b>同一批题 · 一格一个班</b>
<span class="muted">
格子里是全班做对的人占几成,越深越多<template v-if="!compact">
· 皇冠 = 这道题做得最好的班(一样多就都算)</template
>
</span>
</div>
<div class="line heads">
<span v-if="!compact" class="name muted">至少两个班布置过的 {{ rows.length }} 道</span>
<span v-if="!compact" class="name muted">{{ rows.length }} 道</span>
<span
v-for="(item, index) in pk.classes"
:key="item.className"
@@ -173,9 +167,6 @@ const medal = (index: number) => palette.value.medal[index]
>
{{ expanded ? "收起" : `再看 ${rows.length - SHOW_MOBILE} 道 ›` }}
</button>
<span v-if="!compact && soloCount" class="muted foot">
只有一个班做过的 {{ soloCount }} 道不在格子里 · 鼠标放到格子上看做对几个人、交了几次
</span>
</div>
<div class="side" :class="{ compact }">
@@ -459,10 +450,6 @@ const medal = (index: number) => palette.value.medal[index]
padding: 0 5px;
}
.foot {
padding-top: 4px;
}
.side {
flex: 1;
min-width: 0;
-1
View File
@@ -289,7 +289,6 @@ async function analyze() {
<path d="M12 3l1.8 4.7L18.5 9.5l-4.7 1.8L12 16l-1.8-4.7L5.5 9.5l4.7-1.8z" />
</svg>
<b>AI 分析</b>
<span class="muted">根据上面这些数字写,仅供参考</span>
<div class="spacer" />
<n-button size="small" :loading="ai.running.value" @click="analyze">重新分析</n-button>
</div>
-4
View File
@@ -358,8 +358,6 @@ const gradeColumns = computed(() => `24px 124px 40px 36px repeat(${problems.valu
<b class="amber">{{ idleCount }}</b
><span>{{ IDLE_MINUTES }} 分钟以上没交</span>
</div>
<div class="spacer"></div>
<span class="muted small">学生看不到这一页 · 15 秒刷新一次</span>
</div>
<div class="grid-wrap">
@@ -594,8 +592,6 @@ const gradeColumns = computed(() => `24px 124px 40px 36px repeat(${problems.valu
<span v-if="code" class="muted tiny">
{{ code.language }} · {{ parseTime(code.createTime, "M月D日 HH:mm:ss") }}
</span>
<div class="spacer"></div>
<span class="muted tiny">点格子换人换题 · ← → ↑ ↓ 也行 · 看过的格子右上角有个点</span>
</div>
</template>
<div v-else class="code-empty muted">
@@ -131,8 +131,6 @@ const warning = computed(() => tone("warning"))
· 你做对 {{ solvedCount }} 道</template
>
</span>
<div class="spacer"></div>
<span v-if="running && !contestStore.rankHidden" class="muted small">做对人数随时更新</span>
</div>
<RouterLink
v-for="item in items"
@@ -254,9 +252,6 @@ const warning = computed(() => tone("warning"))
<RankMini :rows="rows" :me="me?.userId" />
<div v-if="!rows.length" class="muted small empty">还没有人交题</div>
</div>
<div class="muted small rule">
先比做对几道;一样多的,比用时:每道题做对时是第几分钟,加起来;错一次多算 20 分钟。
</div>
</template>
</aside>
</div>
@@ -533,11 +528,6 @@ const warning = computed(() => tone("warning"))
padding: 8px 2px;
}
.rule {
line-height: 1.6;
font-size: var(--oj-fs-meta);
}
/* 手机:题目名要留得下,人数和「最先」只在右边的排名里看 */
@media (max-width: 760px) {
.count,
-45
View File
@@ -237,14 +237,6 @@ const columns = computed(
</div>
<div v-if="!rows.length" class="empty muted">还没有人交题</div>
</div>
<div class="legend">
<span><i class="sw first"></i>这题最先做对</span>
<span><i class="sw ac"></i>做对,格子里是第几分钟(-1 是错过 1 次)</span>
<span><i class="sw no"></i>还没对,错了几次</span>
<div class="spacer"></div>
<span>用时 = 每道做对题的分钟数相加,错一次多算 20 分钟</span>
</div>
</div>
</template>
@@ -542,41 +534,4 @@ const columns = computed(
.empty {
padding: 32px var(--oj-pad-x);
}
.legend {
min-height: 42px;
padding: 8px var(--oj-pad-x);
box-sizing: border-box;
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 16px;
font-size: var(--oj-fs-meta);
color: v-bind("theme.textColor3");
border-top: 1px solid v-bind("theme.dividerColor");
}
.legend span {
display: flex;
align-items: center;
gap: 6px;
}
.sw {
width: 28px;
height: 16px;
border-radius: 3px;
}
.sw.first {
background: v-bind("theme.successColor");
}
.sw.ac {
background: v-bind("success.background");
}
.sw.no {
background: v-bind("danger.background");
}
</style>
@@ -150,12 +150,6 @@ const error = computed(() => tone("error"))
</template>
</div>
</div>
<div class="foot muted">
<span>绿 = 在题单里做对(几点做对的)</span><span>黄 = 交过还没对</span
><span>紫色角 = 加入前就做对过</span><span>点格子看这个学生这道题的提交</span>
<div class="spacer"></div>
<span>按学号排</span>
</div>
</template>
<div v-else class="empty"><n-spin size="small" /></div>
</section>
@@ -303,18 +297,6 @@ const error = computed(() => tone("error"))
border-left: 8px solid transparent;
}
.foot {
min-height: 36px;
box-sizing: border-box;
padding: 8px 20px;
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 4px 16px;
font-size: var(--oj-fs-meta);
border-top: 1px solid v-bind("theme.dividerColor");
}
.spacer {
flex-grow: 1;
}
-6
View File
@@ -193,7 +193,6 @@ const purple = { color: "#5b3fa8", background: "rgba(122, 95, 208, 0.12)" }
<n-button type="primary" size="large" :loading="joining" @click="join">
加入题单,开始做
</n-button>
<span class="muted tiny">加入以后,在题单里做对的题才算进度</span>
</div>
</section>
@@ -285,7 +284,6 @@ const purple = { color: "#5b3fa8", background: "rgba(122, 95, 208, 0.12)" }
</section>
</div>
<n-empty v-else description="这个题单还没有题目" />
<div v-if="joined && problems.length" class="muted tiny foot">做对一道会自动回到这里</div>
</template>
</div>
</template>
@@ -578,10 +576,6 @@ a.prow:hover {
flex-shrink: 0;
}
.foot {
text-align: center;
}
.pill {
height: 24px;
padding: 0 9px;
+2 -5
View File
@@ -55,7 +55,6 @@ const others = computed(() =>
return Date.parse(b.createTime) - Date.parse(a.createTime)
}),
)
const joinedOthers = computed(() => others.value.filter((set) => set.userProgress.isJoined).length)
function description(set: ProblemSet) {
// 简介大多就是把标题再抄一遍,一样的就不重复显示
@@ -93,7 +92,7 @@ const doneBackground = computed(() => rgba(theme.value.successColor, 0.05))
<template v-if="assigning.length">
<div class="sect">
布置中<span class="muted">老师现在布置的 · {{ assigning.length }} 个</span>
布置中<span class="muted">{{ assigning.length }} 个</span>
</div>
<div class="big-grid">
<a
@@ -146,9 +145,7 @@ const doneBackground = computed(() => rgba(theme.value.successColor, 0.05))
<div v-if="others.length" class="sect">
{{ assigning.length ? "其他题单" : "题单" }}
<span class="muted"
>{{ others.length }} 个<template v-if="joinedOthers"> · 加入过的在前</template></span
>
<span class="muted">{{ others.length }} 个</span>
</div>
<div class="small-grid">
<a
@@ -110,7 +110,6 @@ const cells = computed(() =>
/>
<span v-else-if="code[cell.id] === 'failed'" class="muted">代码没拉下来,点方块打开看</span>
<span v-else class="muted">代码加载中…</span>
<span class="muted small">点方块在新页面打开这一条</span>
</div>
</n-popover>
</span>
@@ -159,8 +158,4 @@ const cells = computed(() =>
.muted {
opacity: 0.65;
}
.small {
font-size: 12px;
}
</style>
@@ -109,7 +109,6 @@ const classes = computed(() => {
<p v-if="grid.truncated" class="note warn" :style="{ color: tone('warning').color }">
范围太大,只取了最近的 5000 条提交,更早的班级可能少算或不在表里。缩短时间段就准了。
</p>
<p class="note">没选班级,先按班级列出来;点一个班再看每个人。「做完」是这几道题都做对了。</p>
</div>
</div>
</template>
@@ -85,7 +85,6 @@ const saveStatusTitle = computed(() => {
<span v-else>✔</span>
</div>
</div>
<p class="description">拖拽节点到画布中</p>
</div>
<!-- 节点列表 -->
@@ -167,7 +166,6 @@ const saveStatusTitle = computed(() => {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 6px;
}
.toolbar-header h3 {
@@ -231,12 +229,6 @@ const saveStatusTitle = computed(() => {
}
}
.description {
margin: 0;
font-size: 12px;
color: #6b7280;
}
/* 节点列表样式 */
.nodes {
display: flex;