From 22565978383fd56bf6cd2969f9fb4eb738e3dec8 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 7 Sep 2026 07:18:23 -0600 Subject: [PATCH] =?UTF-8?q?fix(=E5=90=8E=E5=8F=B0=E5=BB=BA=E9=A2=98):=20?= =?UTF-8?q?=E4=BF=AE=E5=A5=BD=20dev=20=E4=BB=A3=E7=90=86=E8=B5=B0=E9=94=99?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=EF=BC=8C=E4=BB=A5=E5=8F=8A=E6=96=B0=E5=BB=BA?= =?UTF-8?q?=E9=A1=B5=E5=B8=A6=E5=87=BA=E4=B8=8A=E4=B8=80=E9=A2=98=20id?= =?UTF-8?q?=E3=80=81=E8=B6=85=E9=95=BF=E6=A0=87=E7=AD=BE=E6=8A=A5=E8=8B=B1?= =?UTF-8?q?=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 三处不相干的小毛病,都在「新建/编辑题目」这条路上。 vite 的 /api 代理写的是 localhost:3000。api 用 Bun.serve 起、只绑 IPv4 的 0.0.0.0:3000,而 Node 解析 localhost 时 ::1 排在前面 —— 别的项目的 dev server 一占 [::1]:3000,两边端口就不冲突(一个 v4 一个 v6,谁都不报错),浏览器发出的 /api/* 整个落到那个站上,表现是后台一进就被弹回首页。改成 127.0.0.1。 新建页和编辑页共用同一个 localStorage 草稿键,而编辑页会把服务器数据连 id 一起 写进去。没保存就离开的话,这个 id 跟着草稿漂到新建页:「下载测试点」下的是那道旧 题的包,SQL 测试点编辑器也会去回显那道旧题的脚本。新建分支进来先把 id 摘掉。 新标签没有长度限制,超过 32 字要到保存时才撞出 zod 的英文原文(Too big: expected string to have <=32 characters)。把 32 提成契约里的 PROBLEM_TAG_MAX_LENGTH,输入框拿它做 maxlength,validateNewTags 再兜一道粘贴 绕过的情况,提示换成中文。校验的松紧没动,32 字仍然存得进、33 字仍然拦下。 editContestProblem 和 editProblem 函数体逐字相同(都是 PUT admin/problems/:id, 比赛由后端从题目自己推导),合成一个。 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01XvmqDsZNyUo9P3sFQtoWVB --- apps/web/src/admin/api.ts | 9 ++------- apps/web/src/admin/problem/detail.vue | 16 ++++++++++++++-- apps/web/vite.config.ts | 6 +++++- packages/contract/src/admin.ts | 14 +++++++++++++- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/apps/web/src/admin/api.ts b/apps/web/src/admin/api.ts index e1945ef..845e83f 100644 --- a/apps/web/src/admin/api.ts +++ b/apps/web/src/admin/api.ts @@ -84,6 +84,8 @@ export function deleteContestProblem(id: number) { return api.delete(`admin/problems/${id}`) } +// 比赛题也走这条:后端是同一条 PUT admin/problems/:id,比赛由题目自己推导, +// 所以不像新建那样需要分两个函数 export function editProblem(problem: AdminProblem | BlankProblem) { return api.put( `admin/problems/${(problem as AdminProblem).id}`, @@ -103,13 +105,6 @@ export function generateFlowchartFromPythonCode(python: string) { }) } -export function editContestProblem(problem: AdminProblem | BlankProblem) { - return api.put( - `admin/problems/${(problem as AdminProblem).id}`, - toProblemBody(problem), - ) -} - export function getProblem(id: string | number) { return api.get(`admin/problems/${id}`) } diff --git a/apps/web/src/admin/problem/detail.vue b/apps/web/src/admin/problem/detail.vue index d75da86..4193213 100644 --- a/apps/web/src/admin/problem/detail.vue +++ b/apps/web/src/admin/problem/detail.vue @@ -1,4 +1,5 @@