fix(题目): 修掉题目页重构审查查出的问题——提交途中换题会把结果算到新题上、运行例子把对的菱形判错、点评完「下一题」不跳等
题目页重构之后按「功能对照 / 状态 / 结果页 / 布局与后端」四路审查了一遍,查出的问题一起修: 提交与换题 - 提交、画流程图途中换题:A 题格式化好的代码会盖掉 B 的草稿,A 判对了把 B 标成已解决、 弹 B 的点评、题单里跳回题单。现在每个请求回来先核对题目,轮询和推送回来的也核对提交编号 - 画着流程图换到不能画的题,语言退到题目的第一门、还被记成偏好;现在回到学生习惯的那门 - 强制点评评完点「继续 / 下一题」,学生之前在看「题目」页签的话会停在原题 - 离开题目页之后判题、流程图的 WebSocket 一直连着,现在闲 15 分钟断开 运行例子 - 输出开头的空格被削掉,打印菱形这类题对的代码也显示「没对上」 - C 的编译警告拼进了「你的输出」(后台生成测试点也会写进 .out) - Python 的语法错误(中文标点)被说成「下标有没有越界、除数是不是 0」 - 比赛里仍然把空格画成「·」、把不同的地方标红 入口与协作 - 比赛里不给「课堂统计」、不绑协作:房间和统计都按题号找,比赛题号和公开题撞号 - 「看他交过什么」按整名匹配,不再混进学号相近的同学 - 协作中点上下文条、相似题、下一题开新标签,协作不断 - 题单入口给管理员的「⋯」里留「本题提交」 结果与题面 - 「去自己输入拿 51 这些数试试」取到了题面 HTML 里的颜色值;「题目原话」露出 " - 流程图 A 级的学生标题下还写着「还没交过」 - 「我的提交」上方补回「答案错误 × 3」这样的计数 - 流程图历次评分能点开看那一版的图;读分数失败不再说「还没交过流程图」;手机上能看流程图点评 - 「结果」页签有新结果没看时加粗上色,看过就恢复 - 空画布拖进第一个节点画布会跳一下;画布底下空着一条 - 比赛没开始写成「已结束」、倒计时超过一个月算错;分隔条拖到头工具栏被挤坏;题单里的题目页有备案页脚 - 流程图历次分数只读需要的几列(一个学生一道题 23 次提交:96 kB → 2 kB) - 比赛密码、比赛没开始等几条学生看得到的英文报错换成中文 设计文档照实际做法更新了第 5.5、5.6、6、8、9、10、11 节。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ee66cef367
commit
e7b95d211d
34 files changed
+579
-108
No files matched your search
@@ -1,7 +1,7 @@
|
||||
# OJ2 设计文档:题目详情页重设计
|
||||
|
||||
日期:2026-09-28
|
||||
状态:**第 14 节的 6 步和第 7 节都已实施**(2026-09-28),界面已照画布「机房(方案 B)」的画板逐块对齐过。和本文有出入的地方:协作中上下文条的跳转没有改成开新标签(老师不在课堂名单里,题库入口下这一条本来就不出现)。效果图在 claude.ai 的私有画布「题目详情页重设计」里(「机房(方案 B)」
|
||||
状态:**第 14 节的 6 步和第 7 节都已实施**(2026-09-28),界面已照画布「机房(方案 B)」的画板逐块对齐过。2026-09-28 实施后又做过一轮全面审查并修掉查出的问题,和本文原稿有出入的地方都已改进正文。效果图在 claude.ai 的私有画布「题目详情页重设计」里(「机房(方案 B)」
|
||||
那一页是定稿,「初稿 1280×800」那一页已作废,只留着对照)。**画布管样子,本文管规则**:
|
||||
版式、颜色、文案照画板,效果图表达不了的规则写在这里。
|
||||
|
||||
@@ -169,13 +169,17 @@ B 看得到。
|
||||
「放回编辑器」后提示「已放回,按 Ctrl+Z 撤回」—— 要确认编辑器的撤销能撤回这次替换。
|
||||
- **统计**:出题人、创建时间、标签、数字卡、结果饼图、历年通过率,内容原样。
|
||||
- **点评**:和强制弹窗同一个轮盘(第 7 节),每人只能评一次。
|
||||
- 题单入口三个按钮都不出现。比赛入口没有「点评」。
|
||||
- **我的提交**列表上方另有一行「答案错误 × 3」「答案正确 × 1」(这一页各种结果各几次,和原来一样;
|
||||
被题单闸门锁住的那几次不数)。
|
||||
- 题单入口三个按钮都不出现;管理员角色的「看这道题所有人的提交」挪进「⋯」(叫「本题提交」)。
|
||||
比赛入口没有「点评」。
|
||||
|
||||
### 5.6 手机
|
||||
|
||||
三个页签:题目 / 代码 / 结果,底部固定「运行例子 / 提交」两个按钮(高 44+)。
|
||||
措辞和桌面一致(「这节课 做完 2/5」「正确输出」)。语言选择放在「代码」页签顶部;
|
||||
统计 / 点评 / 我的提交和 ⋯ 菜单里的各项放进页签行右侧的「⋯」。流程图题在手机上只能看点评、不能画(节点库是 HTML5 拖放,手机上拖不动)。
|
||||
统计 / 点评 / 我的提交和 ⋯ 菜单里的各项放进页签行右侧的「⋯」。流程图题在手机上只能看点评、不能画(节点库是 HTML5 拖放,手机上拖不动):「结果」页签多一段
|
||||
「流程图点评」,只读,没有「照着它写代码」「载回画布」。
|
||||
|
||||
## 6. 结果页签里每种情况显示什么
|
||||
|
||||
@@ -190,7 +194,7 @@ B 看得到。
|
||||
| 运行例子(试跑) | ✕ 试跑:N 个例子没对上(不算提交)+ 各例子 ✓/✕ 芯片 | 选中那个例子的差异说明;底部「例子对了也可能在别的测试点上错,提交才算数」 |
|
||||
| 自己输入 | —— | 输入框 +「用这组数据运行」+「填入例子 1 / 2」+ 输出;「这里不判对错」 |
|
||||
| 流程图评分中 | AI 正在看你的图(一般 5 秒左右) | 评的时候画布还能改,改了不影响这一次 |
|
||||
| 流程图评完 | 86 分 A 级 + 一句评语 + 历史分数条 | 四项分数与评语、改进建议;A/S 时「照着它写代码 →」;「把这一版载回画布」**只在画布改过之后**出现 |
|
||||
| 流程图评完 | 86 分 A 级 + 一句评语 + 历史分数条 | 四项分数与评语、改进建议;点历史分数条上的某一次,看那一版画的图(只读缩略图,可放大,不动画布);A/S 时「照着它写代码 →」;「把这一版载回画布」**只在画布改过之后**出现 |
|
||||
| 管理员 | —— | 测试点表格原样(只有管理员有数据) |
|
||||
|
||||
**运行例子的判定**:两边都去掉末尾空白再比(现在只 trim 了运行输出,末尾带空格的样例永远「不通过」,
|
||||
@@ -237,6 +241,8 @@ B 看得到。
|
||||
| 统计 / 点评 / 我的提交 | ✓ | 全部隐藏 | 统计、我的提交 ✓;点评 ✗ |
|
||||
| 「已解决 / 尝试过」标签 | ✓ | 隐藏 | ✓ |
|
||||
| 相似题 | ✓ | ✗(点进去会离开题单) | ✗ |
|
||||
| 老师协作 | ✓ | ✓ | ✗(房间只记题号,比赛题号 1、2、3 和公开题撞号) |
|
||||
| 课堂统计(教师) | ✓ | ✓ | ✗(统计接口按题号在公开题库里找题) |
|
||||
| SQL 题 | 隐藏「运行例子」「自己输入」(Judge0 跑不了 SQL);数据表可横向滚动 | 同左 | 同左 |
|
||||
|
||||
一道题既在这节课里、又是从题单进来的:按入口路由,显示题单条。
|
||||
@@ -248,6 +254,9 @@ B 看得到。
|
||||
(现在的「复制回到题目」走 `setCode`,协作中会经 Yjs 直接覆盖学生的代码)。
|
||||
- **协作中所有跳转开新标签页**:抽屉里的链接、班级排名旁的「查看」、上下文条都算(现在只有工具栏
|
||||
「本题提交」这么做)。「看他交过什么」要带上学生用户名,现在只带题号。
|
||||
实现:抽屉里的链接各自 `window.open`;站内的 router-link(上下文条、相似题、下一题)统一由
|
||||
`detail.vue` 的路由守卫接住,协作中离开这道题就开新标签、这一页不动。「看他交过什么」带
|
||||
`exactUsername=1`,提交列表按整名匹配(默认的「包含」会混进学号相近的同学)。
|
||||
- 老师接单后落在 `/problem/:id`,「结果」页签是空的 —— 显示学生最近一次提交的结果(这一项是新增,
|
||||
需要接口支持;做不到就显示「学生还没提交过」之类的空状态,别留白)。
|
||||
- **学生在求助排队中或已接入时换题,会断开协作**(`SyncCodeEditor` 的 detach):换题入口要先确认。
|
||||
@@ -257,8 +266,9 @@ B 看得到。
|
||||
1. **提交状态上移到 store**:当前提交、判题跟踪(WebSocket + 轮询)、AI 提示、失败计数、
|
||||
流程图评分(含 WebSocket 订阅与 3 分钟超时)都不再挂在按钮组件上。结果页签只负责显示。
|
||||
这是修掉「编辑器一卸载结果就丢」的前提。
|
||||
2. **错误标记也进 store**:`PythonErrorExplain` / `RuntimeErrorExplain` 现在挂载时标红、卸载时清掉,
|
||||
切到「题目」页签红线就没了。改成由结果决定,和显示组件解耦。
|
||||
2. **错误标记不能跟着页签消失**:`PythonErrorExplain` / `RuntimeErrorExplain` 挂载时标红、卸载时清掉,
|
||||
原来切到「题目」页签红线就没了。实际做法没挪进 store:「结果」页签第一次打开之后就一直挂着、
|
||||
只是藏起来(`detail.vue` 的 `resultMounted`),标红跟着结果走,换题时由换题重置清掉。
|
||||
3. **三种入口用同一个编辑器**:合并 `ProblemEditor` 与 `BasicEditor`,协作、错误标记、中文标点替换
|
||||
在三种入口都有;比赛里是否允许协作由第 8 节的表决定。
|
||||
4. **换题 = 完整重置**:例子、语言、流程图状态、结果页签、定时器全部重来。`1b149a4` 已经修了
|
||||
@@ -267,9 +277,12 @@ B 看得到。
|
||||
|
||||
## 11. 后端前置改动
|
||||
|
||||
1. **流程图 A/S 算完成**:提交流程图的请求带上 `problemSetId`;评分落库后,A/S 走和
|
||||
`recordSolvedProblem`(`services/problemset.ts`)同样的题单记账;课堂条的 `myStatus`
|
||||
(`classroom` 路由)把流程图 A/S 算作 accepted。
|
||||
1. **流程图 A/S 算完成**:评分落库后,A/S 走和 `recordSolvedProblem`(`services/problemset.ts`)
|
||||
同样的题单记账 —— 和判代码那一路一样,记进**所有已加入、且含这道题**的题单,所以提交请求不用带
|
||||
`problemSetId`。`classroom` 路由里「流程图 A/S 算做完、交过流程图算做过」是同一个口径,
|
||||
用在课堂条的 `myStatus`、看板的格子,也用在推断「这节课做哪几道」、「班上 M 人做完」、
|
||||
看板上「最近几节课来了几次」和猜正在上课的班(用户 2026-09-28 拍板一起改)。
|
||||
班级对比、个人资料里的通过数仍然只数代码。
|
||||
2. **流程图历史分数**:新增一个接口,一次返回这道题自己所有流程图提交的 id、分数、等级、时间
|
||||
(现在 `/flowchart/history` 一次只给一条)。
|
||||
3. **流程图历史的防抄闸门**:加入题单之前画的图,照 `canViewSubmission`(`routes/submission.ts`)
|
||||
|
||||
Reference in new issue
Block a user