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
@@ -98,6 +98,13 @@ const drawer = ref<DrawerKey | null>(null)
|
||||
const leftPane = useTemplateRef<HTMLElement>("leftPane")
|
||||
const theme = useThemeVars()
|
||||
|
||||
/**
|
||||
* 分隔条两头按像素卡,不按比例:左栏窄于 360 时题单条的「下一题」箭头被裁掉、三个抽屉按钮
|
||||
* 折成两行;右栏窄于 460 时工具栏收进「⋯」之后也放不下、语言下拉被挤成两行(原来 0.8 在 1280 屏上只给右栏 256)
|
||||
*/
|
||||
const { width: windowWidth } = useWindowSize()
|
||||
const splitMax = computed(() => `${Math.max(360, windowWidth.value - 460)}px`)
|
||||
|
||||
// 协作中的老师看的是学生的提交
|
||||
const teacherCollab = useTeacherCollab()
|
||||
const drawerLabel = (key: DrawerKey) =>
|
||||
@@ -151,8 +158,14 @@ const dialog = useDialog()
|
||||
*/
|
||||
let approvedTarget: string | null = null
|
||||
function confirmLeavingHelp(to: RouteLocationNormalized, from: RouteLocationNormalized) {
|
||||
if (collabStore.isTeacher || collabStore.helpStatus === "idle") return true
|
||||
if (to.name === from.name && to.params.problemID === from.params.problemID) return true
|
||||
// 协作中的老师:「页面即协作现场」,跳走这一页协作就断了、求助退回排队。所以上下文条、
|
||||
// 相似题、下一题这些站内链接一律开新标签,这一页留着(设计文档第 9 节)
|
||||
if (teacherCollab.value) {
|
||||
window.open(router.resolve(to).href, "_blank")
|
||||
return false
|
||||
}
|
||||
if (collabStore.isTeacher || collabStore.helpStatus === "idle") return true
|
||||
if (approvedTarget === to.fullPath) {
|
||||
approvedTarget = null
|
||||
return true
|
||||
@@ -187,9 +200,12 @@ watch(
|
||||
)
|
||||
|
||||
// 结果页签的标题带状态图标(ResultTabLabel),n-tab-pane 的 tab 接受渲染函数
|
||||
const resultTab = () => h(ResultTabLabel)
|
||||
const resultTab = () => h(ResultTabLabel, { active: currentTab.value === "result" })
|
||||
|
||||
// 连着换了几次题,先发的请求后回来的话,地址栏是 C、页面却是 B:只认最后一次
|
||||
let initSeq = 0
|
||||
async function init() {
|
||||
const mine = ++initSeq
|
||||
// 「我的流程图」是上一道题的。这道题也画到了 A/S 的话,SubmitFlowchart 查完会再亮出来
|
||||
myFlowchartStore.hide()
|
||||
// 并行预取右侧编辑器 chunk(CodeMirror ~370K+),
|
||||
@@ -197,8 +213,10 @@ async function init() {
|
||||
loadProblemEditor()
|
||||
try {
|
||||
const res = await getProblem(problemID, contestID)
|
||||
if (mine !== initSeq) return
|
||||
problem.value = res
|
||||
} catch (err) {
|
||||
if (mine !== initSeq) return
|
||||
problem.value = null
|
||||
if (errorCode(err) === "contest-not-started") {
|
||||
errMsg.value = "比赛还没有开始"
|
||||
@@ -247,8 +265,8 @@ onBeforeUnmount(() => {
|
||||
class="problem-split"
|
||||
direction="horizontal"
|
||||
:default-size="0.43"
|
||||
:min="0.2"
|
||||
:max="0.8"
|
||||
min="360px"
|
||||
:max="splitMax"
|
||||
:resize-trigger-size="1"
|
||||
>
|
||||
<template #1>
|
||||
@@ -274,7 +292,7 @@ onBeforeUnmount(() => {
|
||||
:aria-selected="currentTab === 'result'"
|
||||
@click="currentTab = 'result'"
|
||||
>
|
||||
<ResultTabLabel />
|
||||
<ResultTabLabel :active="currentTab === 'result'" />
|
||||
</button>
|
||||
</div>
|
||||
<div v-if="ctx.drawers.length" class="drawer-buttons">
|
||||
|
||||
Reference in new issue
Block a user