style(专题): 「题单」改名「专题」,顶栏、列表、详情、后台、成就说法统一
Deploy / deploy (push) Canceled after 0s

只改界面文字和注释:网址 /problemset、接口、表名、字段名都不动,老链接照常能打开。
设计稿页名「题单重设计」和已执行的迁移文件保留原样。
线上 3 个成就(题单收藏家 / 入门 / 通关)已同步改名。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-11-03 00:12:18 +08:00
1 parent 959c326bc9
commit 1b703d13ae
68 files changed
+306 -306

No files matched your search

@@ -6,11 +6,11 @@ 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)
const showBadges = computed(() => props.group.name === '专题和比赛' && !!props.badges?.length)
</script>
<template>
@@ -27,7 +27,7 @@ const showBadges = computed(() => props.group.name === '题单和比赛' && !!pr
</div>
</div>
<div v-if="showBadges" class="badges">
<span class="masked-title">拿到的题单奖章</span>
<span class="masked-title">拿到的专题奖章</span>
<div class="badge-list">
<n-tooltip v-for="b in badges" :key="b.id" :delay="150">
<template #trigger>
@@ -36,7 +36,7 @@ const showBadges = computed(() => props.group.name === '题单和比赛' && !!pr
<span>{{ b.badge.name }}</span>
</router-link>
</template>
{{ b.badge.description }} · 来自题单「{{ b.problemSet.title }}」
{{ b.badge.description }} · 来自专题「{{ b.problemSet.title }}」
</n-tooltip>
</div>
</div>
+2 -2
View File
@@ -37,9 +37,9 @@ const got = computed(() => data.value?.achievements.filter((item) => item.unlock
const rarities: AchievementRarity[] = ['platinum', 'gold', 'silver', 'bronze']
const countOf = (rarity: AchievementRarity) => got.value.filter((item) => item.rarity === rarity).length
// 桌面两栏:左边做题、其他、彩蛋,右边坚持、题单和比赛 —— 两边差不多高
// 桌面两栏:左边做题、其他、彩蛋,右边坚持、专题和比赛 —— 两边差不多高
const LEFT: GroupName[] = ['做题', '其他', '彩蛋']
const RIGHT: GroupName[] = ['坚持', '题单和比赛']
const RIGHT: GroupName[] = ['坚持', '专题和比赛']
const pick = (names: GroupName[]) => groups.value.filter((group) => names.includes(group.name))
async function load() {
+8 -8
View File
@@ -7,7 +7,7 @@ import type { Achievement } from 'utils/types'
* 指标是后台可配的,这里没登记的指标归到「其他」、拿第一档的名字当线名 —— 不会丢,只是不好看,
* 在后台加了新指标记得回来补一行。
*/
export const GROUPS = ['做题', '坚持', '题单和比赛', '其他', '彩蛋'] as const
export const GROUPS = ['做题', '坚持', '专题和比赛', '其他', '彩蛋'] as const
export type GroupName = (typeof GROUPS)[number]
interface MetricInfo {
@@ -55,19 +55,19 @@ const METRICS: Record<string, MetricInfo> = {
},
submission_count: { group: '坚持', label: '交了几次', unit: '次', remain: (r) => `再交 ${r} 次` },
problemset_completed: {
group: '题单和比赛',
label: '做完的题单',
group: '专题和比赛',
label: '做完的专题',
unit: '个',
remain: (r) => `再做完 ${r} 个题单`,
remain: (r) => `再做完 ${r} 个专题`,
},
badge_count: {
group: '题单和比赛',
label: '题单奖章',
group: '专题和比赛',
label: '专题奖章',
unit: '枚',
remain: (r) => `再拿 ${r} 枚题单奖章`,
remain: (r) => `再拿 ${r} 枚专题奖章`,
},
contest_joined: {
group: '题单和比赛',
group: '专题和比赛',
label: '参加的比赛',
unit: '场',
remain: (r) => `再参加 ${r} 场比赛`,