Files
OJ2/apps/web/src/oj/achievement/components/GroupCard.vue
T
xuyueandClaude Opus 5.5 1b703d13ae
Deploy / deploy (push) Canceled after 0s
style(专题): 「题单」改名「专题」,顶栏、列表、详情、后台、成就说法统一
只改界面文字和注释:网址 /problemset、接口、表名、字段名都不动,老链接照常能打开。
设计稿页名「题单重设计」和已执行的迁移文件保留原样。
线上 3 个成就(题单收藏家 / 入门 / 通关)已同步改名。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:12:18 +08:00

108 lines
2.9 KiB
Vue

<script setup lang="ts">
import { useThemeVars } from 'naive-ui'
import AchievementIcon from 'shared/components/AchievementIcon.vue'
import type { UserBadge } from 'utils/types'
import type { Group } from '../series'
import Medal from './Medal.vue'
import SeriesRow from './SeriesRow.vue'
/** 一组成就线(做题 / 坚持 / …),「彩蛋」组末尾是还没找到的问号,「专题和比赛」组末尾是拿到的专题奖章 */
const props = defineProps<{ group: Group; badges?: UserBadge[]; compact?: boolean }>()
const theme = useThemeVars()
const showBadges = computed(() => props.group.name === '专题和比赛' && !!props.badges?.length)
</script>
<template>
<section class="card" :class="{ compact }">
<h3>
{{ group.name }}
<small>{{ group.got }} / {{ group.total }}</small>
</h3>
<SeriesRow v-for="item in group.series" :key="item.metric" :series="item" :compact="compact" />
<div v-if="group.masked" class="masked">
<span class="masked-title">还有 {{ group.masked }} 个没找到</span>
<div class="masked-list">
<Medal v-for="i in group.masked" :key="i" state="unknown" :size="compact ? 30 : 34" />
</div>
</div>
<div v-if="showBadges" class="badges">
<span class="masked-title">拿到的专题奖章</span>
<div class="badge-list">
<n-tooltip v-for="b in badges" :key="b.id" :delay="150">
<template #trigger>
<router-link :to="{ name: 'problemset', params: { problemSetId: b.problemSet.id } }" class="badge">
<AchievementIcon :icon="b.badge.icon" :size="24" />
<span>{{ b.badge.name }}</span>
</router-link>
</template>
{{ b.badge.description }} · 来自专题「{{ b.problemSet.title }}」
</n-tooltip>
</div>
</div>
</section>
</template>
<style scoped>
.card {
padding: 14px 20px 20px;
border: 1px solid v-bind('theme.borderColor');
border-radius: var(--oj-radius);
background: v-bind('theme.cardColor');
}
h3 {
margin: 0;
display: flex;
align-items: baseline;
gap: 8px;
font-size: var(--oj-fs-h2);
}
h3 small {
font-size: var(--oj-fs-meta);
font-weight: 400;
color: v-bind('theme.textColor3');
font-variant-numeric: tabular-nums;
}
.masked,
.badges {
margin-top: 22px;
display: flex;
flex-direction: column;
gap: 8px;
}
.masked-title {
font-size: 13px;
color: v-bind('theme.textColor2');
}
.masked-list,
.badge-list {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
/* 奖章名最长 9 个字(「有趣和无趣的观察者」),竖排在格子里放不下,横排写全 */
.badge {
display: inline-flex;
align-items: center;
gap: 6px;
height: 34px;
padding: 0 10px 0 6px;
border-radius: 6px;
font-size: var(--oj-fs-sec);
white-space: nowrap;
color: v-bind('theme.textColor1');
background: v-bind('theme.actionColor');
text-decoration: none;
}
.compact {
padding: 12px 14px 16px;
}
</style>