feat(班级PK): 班级 PK 页重做:两个班看比分和每道题谁赢,三个班以上看题目对照格,学生也能比
Deploy / deploy (push) Canceled after 0s

- 两个班:大比分 + 一次就对副比分,每道题左右两根条、差得最多的在上,下面每周人均和全班分布
- 三个班以上:一行一道题、一格一个班,越深做对的人越多,皇冠是这道做得最好的班;右边谁领先的题多和赛跑
- 学生自己的班标「你们班」,输掉的题写「再 N 人做对就打平」;AI 分析只给老师,直接在页面里出
- 去掉综合分、雷达图、十张柱状图;手机版按稿改成上下排和页签
- 排名页、班级对抗、班级详情的入口对登录的人都开放,带上当前的班

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-10 09:06:21 +08:00
1 parent d83804b814
commit ce0093fc29
12 files changed
+2230 -873

No files matched your search

@@ -14,7 +14,7 @@ const props = defineProps<{
teacher?: boolean
/** 放在手机页签卡里:不要自己的边框和标题 */
bare?: boolean
/** 显示「班级 PK」入口(原来排名页上那个按钮,管理员角色才有) */
/** 显示「班级 PK」入口(登录了就有:学生也能比) */
pk?: boolean
}>()
const emit = defineEmits<{ pick: [className: string] }>()
@@ -56,7 +56,12 @@ function shortLabel(className: string) {
<div class="battle" :class="{ bare }">
<div class="title">
<b v-if="!bare">班级对抗</b><span class="muted">人均做对 · 全服 · 点班名看详情</span>
<router-link v-if="pk" to="/class" class="pk">班级 PK ›</router-link>
<router-link
v-if="pk"
:to="{ path: '/class', query: mine ? { classes: mine } : {} }"
class="pk"
>班级 PK ›</router-link
>
</div>
<div
v-for="item in shown"
@@ -245,7 +245,7 @@ function go(path: string, query: Record<string, string>) {
<MdPreview v-if="report" class="report" :model-value="report" />
</section>
<a v-if="pk" href="#" class="pk" @click.prevent="go('/class', {})"
<a v-if="pk" href="#" class="pk" @click.prevent="go('/class', { classes: className! })"
>和别的班比 → 班级 PK ›</a
>
</div>
+14 -4
View File
@@ -480,7 +480,17 @@ async function restore(userId: number) {
>
班级详情 · AI 分析
</n-button>
<n-button size="small" secondary @click="router.push('/class')">班级 PK</n-button>
<n-button
size="small"
secondary
@click="
router.push({
path: '/class',
query: classContext ? { classes: classContext } : {},
})
"
>班级 PK</n-button
>
</div>
<div class="hidden-list">
<span class="hidden-title">不计入排名的人</span>
@@ -506,7 +516,7 @@ async function restore(userId: number) {
:items="battle"
:mine="classContext"
:teacher="teacher"
:pk="userStore.isAdminRole"
:pk="userStore.isAuthed"
@pick="openDetail"
/>
</aside>
@@ -560,7 +570,7 @@ async function restore(userId: number) {
:items="battle"
:mine="classContext"
:teacher="teacher"
:pk="userStore.isAdminRole"
:pk="userStore.isAuthed"
@pick="openDetail"
/>
<RankTrend
@@ -586,7 +596,7 @@ async function restore(userId: number) {
v-model:show="showDetail"
:class-name="detailClass"
:teacher="teacher"
:pk="userStore.isAdminRole"
:pk="userStore.isAuthed"
/>
</div>
</template>