From e1b6a9e9fa281249084508de9c21e3637b49a6c9 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sun, 27 Sep 2026 20:27:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=89=8D=E5=8F=B0):=20=E9=A2=98=E5=8D=95?= =?UTF-8?q?=E5=8D=A1=E7=89=87=E6=98=BE=E7=A4=BA=E5=AE=8C=E6=88=90=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=EF=BC=8C=E6=89=8B=E6=9C=BA=E4=B8=8A=E9=A2=98=E7=9B=AE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E4=B8=8D=E5=86=8D=E6=A8=AA=E5=90=91=E6=BA=A2?= =?UTF-8?q?=E5=87=BA=EF=BC=8C=E4=B8=AA=E4=BA=BA=E4=B8=BB=E9=A1=B5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8E=92=E5=BE=97=E6=9B=B4=E7=B4=A7=E5=87=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 题单卡片:完成进度条和「已完成 x / y 题」,「已完成」改成绿色,未获得的徽章置灰; 进度按加入时的快照算,题单后来加了题就注明「新加了 N 题」,不再出现「已完成」却是 5 / 6 - 题目列表:手机上只留状态、编号、题目、难度四列;标签默认收起,选中的标签显示在按钮旁 - 个人主页:六项数据保留,改成三列两行的小卡片,头像缩小 Co-Authored-By: Claude Opus 5.5 --- apps/web/src/oj/problem/list.vue | 29 +++- apps/web/src/oj/problemset/list.vue | 236 ++++++++++++++++++---------- apps/web/src/oj/user/index.vue | 131 ++++++++------- 3 files changed, 254 insertions(+), 142 deletions(-) diff --git a/apps/web/src/oj/problem/list.vue b/apps/web/src/oj/problem/list.vue index db7d193..9674be7 100644 --- a/apps/web/src/oj/problem/list.vue +++ b/apps/web/src/oj/problem/list.vue @@ -63,12 +63,11 @@ const router = useRouter() const userStore = useUserStore() -const { isDesktop } = useBreakpoints() +const { isDesktop, isMobile } = useBreakpoints() const problems = ref([]) const total = ref(0) const tags = ref([]) -const [showTag, toggleShowTag] = useToggle(isDesktop.value) // 使用分页 composable const { query, clearQuery } = usePagination({ @@ -79,6 +78,10 @@ const { query, clearQuery } = usePagination({ sort: useRouteQuery("sort", "").value, }) +// 标签默认收起:四十多个标签在桌面上要占三行,把题目表格顶到半屏以下。 +// 从带 ?tag= 的链接进来时展开,让人看得见是哪个标签在起作用 +const [showTag, toggleShowTag] = useToggle(!!query.tag) + async function listProblems() { if (query.page < 1) query.page = 1 const offset = (query.page - 1) * query.limit @@ -208,8 +211,21 @@ const baseColumns: DataTableColumn[] = [ }, ] +// 手机上只留判断「做不做这题」要的几列,其余的挤进 390 宽的屏幕只会横向溢出 +const MOBILE_WIDTHS: Record = { + status: { width: 60 }, + _id: { width: 72 }, + title: { minWidth: 120 }, + difficulty: { width: 72 }, +} + const columns = computed(() => - userStore.isAuthed ? baseColumns : baseColumns.filter((c: any) => c.key !== "status"), + baseColumns + .filter((c: any) => { + if (c.key === "status" && !userStore.isAuthed) return false + return !isMobile.value || c.key in MOBILE_WIDTHS + }) + .map((c: any) => (isMobile.value ? { ...c, ...MOBILE_WIDTHS[c.key] } : c)), ) function rowProps(row: ProblemRow) { @@ -263,12 +279,15 @@ function rowProps(row: ProblemRow) { 标签 + + {{ query.tag }} + diff --git a/apps/web/src/oj/problemset/list.vue b/apps/web/src/oj/problemset/list.vue index b93b333..62a4fc5 100644 --- a/apps/web/src/oj/problemset/list.vue +++ b/apps/web/src/oj/problemset/list.vue @@ -1,15 +1,11 @@