705 Commits
Author SHA1 Message Date
xuyueandClaude Opus 5.5 0cee4ef779 fix(名字): 比赛成绩、全班情况、看板、题单、统计里的名字不再用真名,一律和排行榜一样显示 ks241XXX;导出成绩去掉姓名列
Deploy / deploy (push) Canceled after 0s
两个写法不同的 UserName 合成 shared/components/UserName.vue 一个。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:44:42 +08:00
xuyueandClaude Opus 5.5 2bb74652a0 style(比赛): 有密码的比赛前面那个彩色盾牌锁换成和全站一样的细线灰锁,放到比赛名后面
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:44:42 +08:00
xuyueandClaude Opus 5.5 0e68c434fc fix(题单): 奖章阶梯下一个奖章的金圈上沿被切掉;「总分」换成「做对几道」后漏发的奖章补上
Deploy / deploy (push) Canceled after 0s
- 阶梯外层为了窄屏横向滚动设了 overflow-x,纵向也跟着被裁,画在图标外的金圈上沿没了
- 0026 只改了奖章条件没按新条件补发:玩家国度每题 5 / 10 分,题数够了、总分不够的人
  没拿到「成分复杂」,页面还显示「再做对 1 道」。0029 按现在的条件只补不收(按 9-29 备份
  只有 1 人;其余两枚换算前后等价,也没有人会因新条件被收回)。排在删列 0028 之后,
  因为 0028 可能已经在线上执行过

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:24:18 +08:00
xuyueandClaude Opus 5.5 d6c94fe4c4 refactor(题单): 删掉不再用的难度、状态、分数、提示、总分、百分比几列和 problemset_submission 表
Deploy / deploy (push) Canceled after 0s
退役第二步(第一步 0027 已在服务器和机房上线)。破坏性迁移,部署要手工放行。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:13:14 +08:00
xuyueandClaude Opus 5.5 646c57c748 refactor(题单): 难度、状态、分数、提示、总分、百分比和 problemset_submission 表不再读写,先补默认值、下一步再删
Deploy / deploy (push) Canceled after 0s
机房和服务器共用一个库、不一定同时升级,所以分两步退役:0027 只给还非空的几列补默认值,
新代码插行不用再填、没升级的那边照旧能跑;两个站点都换上新代码后,再单独一条迁移删列删表
(要手工放行破坏性迁移,语句写在 0027 的注释里)。

进度算法随之去掉分数和百分比,判题记进度不再往 problemset_submission 写一行(从来没人读)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:08:15 +08:00
xuyueandClaude Opus 5.5 c17f88cdbb feat(题单): 题单页重做——布置中的放最上面,详情顶上一条进度和奖章阶梯,没加入看得见题点不进;老师看全班、后台一屏编辑
Deploy / deploy (push) Canceled after 0s
- 列表:布置中的大卡片(做对几道、布置到哪天、再做对几道拿哪个奖章),其余小卡片,加入过的在前
- 详情:进度 + 奖章阶梯(下一个金圈「再做对 n 道」),题目两列写几点做对 / 交过几次;
  以前做对过的标「旧代码先藏着」;做完整条变绿,烟花只在做完那一刻放
- 老师多一个「全班情况」页签;题目页从链接直接进来没加入时,条上给「加入题单」
- 后台一屏编辑:布置一周 / 两周 / 四周 / 选日期,公开开关,粘贴多个题号一次加,拖动排序,奖章只剩两种条件
- 旧代码藏着的地方都说清楚是哪个题单、哪天之后能看
- 修掉列表卡片把选做题数说成「新加了 N 题」

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:01:39 +08:00
xuyueandClaude Opus 5.5 8c53e28dcb feat(题单): 「截止时间」改成「布置期」,布置期内没加入的人也藏旧代码;老师能看全班情况,后台一次加好几道题
- 布置期(列名仍是 end_time,机房共库不改名)+ 新列 assigned_at:布置期内题单里这几道题,
  学生在布置开始之前交的代码先藏起来,不管加没加入,堵住「先抄再加入」;做对或到期放出来,不拦做题
- 「总分达到 N」奖章换成「做对 N 道」,草稿并进「不公开」(0026)
- /problem-sets 带布置期、必做题数、奖章获得时间;题目带做对时刻、错几次、旧代码藏着没有
- 新增 /problem-sets/:id/class-view(老师看一个班:真名 × 每题,加入前就做对过)、/problem-sets/locks
- 后台:批量加题、拖动排序、切必做;去掉状态、难度、分数、提示和单独的进度页

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:01:39 +08:00
xuyue 2224478294 fix
Deploy / deploy (push) Canceled after 0s
2026-10-09 21:35:34 +08:00
xuyueandClaude Opus 5.5 dd10e64b38 style(出题页): 左边写的地方放大、右边「学生看到的样子」缩小,右边能收起来专心写
Deploy / deploy (push) Canceled after 0s
编程题、SQL 题两张出题页一起改:两栏 3 : 2,右栏头上「收起 ›」,收起后剩一条竖着的「学生看到的样子」点了再展开;收没收记在本机

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:03:50 +08:00
xuyueandClaude Opus 5.5 151bbdcb50 feat(比赛): 比赛页一页看题目和自己的名次;排名竞争感做足、结束有领奖台;老师考试中看全班、考完看成绩;新建比赛一屏做完
Deploy / deploy (push) Canceled after 0s
- 学生比赛页(设计稿 B):左边题目带几人做对、谁最先做对;右边我第几名、5 分钟里升了几名、再做对 1 道能到第几名、我前后的人
- 期中、期末考试中只有自己的进度,写明「排名考完公布」,题目页的排名入口也藏起来
- 排名页:按班筛、名次变化、最先做对的深绿格、自己那行钉住;结束后前三名领奖台 + 我的成绩卡;排名曲线和学生的「导出数据」去掉
- 老师的「全班情况」:卡在一道题、15 分钟没交的放最上面,没进来的人对上看板的请假;考完变「成绩」,点格子看代码、标看过了(代替后台审核页),导出成绩
- 比赛列表:进行中的一大块「接着比」,已结束的写我第几名,前三带奖杯
- 新建比赛:默认 10 分钟后开始,时长点按钮,搜题号把题加进来自动编号、拖动排顺序

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:58:59 +08:00
xuyueandClaude Opus 5.5 b94e028ff4 feat(比赛): 榜单一次给全,带名次变化和每题谁最先做对;期中、期末考试中学生看不到排名;老师能看全班情况
- GET /contests/:id/scoreboard 代替 /rank:整张榜、5 分钟前的名次、每题做对 / 做过人数和学生里最先做对的人(不再用 is_first_ac,老师赛中试做会占掉它)
- 期中、期末进行中:学生只拿到自己那一行,人数清零、「全班最先」也不给,考完一起公布
- GET /contests/:id/class-view(老师):真名、每人最后一次交、没进来的人 —— 比赛不绑班,来了一半以上的班才算这场的班
- 比赛列表带题数、参赛人数、我的名次和做对数,能筛「我参加过的」「期中 · 期末」
- PUT /admin/contests/:id/problems/order:比赛题按顺序重编 1、2、3,比赛结束后不让动
- 后台「审核」列表接口去掉,并进前台老师的成绩页;「看过了」的写接口留着

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:58:59 +08:00
xuyueandClaude Opus 5.5 4ef2794552 fix(后台): 出题页读回来的测试数据每组多一行空白;导入大包后原来的例子丢了
Deploy / deploy (push) Canceled after 0s
- 测试点文件末尾的换行读回来时去掉(上传时补回去),比对改没改过也按去掉后的比,没改的题不会白白重传
- 导入超过 100 组的 zip 时先把例子拿下来再切成「不展开」,例子不再丢
- 「不展开」时保存栏改说「加一个例子」;刚导入还没保存时不给「下载 zip」(下到的是库里的旧数据)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:14:36 +08:00
xuyueandClaude Opus 5.5 ba5b9ada0e feat(后台): 编程题出题页重做——左边写,右边是学生看到的样子;例子和测试数据的输出都由标准答案跑出来,改老题能直接看、改测试数据
- 例子就是测试数据里勾了「当例子」的几组,不再手抄输出;老题的例子不在测试数据里的补到最后
- 改了答案,输出变了的那组标黄、写清原来存的是什么;答案在某组上报错就挡住保存
- 没存标准答案的老题输出手写;太大的测试数据(>100 组或单文件 >32KB)只能导入 / 下载 zip
- 预制代码只写学生看得到的那段,前后藏起来的代码收进折叠;语法要求先拿标准答案自测
- 流程图两个互斥开关改成三选一;时间 / 内存限制能改了;草稿只给新建页
- 后端:读回测试点原文、语法要求自测、AI 想测试输入三个接口

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:07:34 +08:00
xuyueandClaude Opus 5.5 033a245abb feat(SQL 题): 增删改题除了第 1 组,其余测试数据可以一行都不改——用来抓学生多改(WHERE 写漏、写宽)
Deploy / deploy (push) Canceled after 0s
原来每组数据都必须有被标准答案改到的行,所以「这组里没有研发部,看学生会不会把别的部门也改了」
这种测试数据建不了。现在只有第 1 组(题面上给学生看的那组)还要求改到行;其余组一行都没改时
出题页写「一行都没改」、预览写「执行后所有表都没有变化」。删掉第 1 组、别的组顶上来时自动按
新位置重查。判题本来就不管这一条,不受影响。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:17:42 +08:00
xuyueandClaude Opus 5.5 2cb39fd96b feat(后台): SQL 题有了自己的出题页——左边写,右边就是学生看到的样子,改答案、改数据马上重跑
- 「新建题目」先选编程题还是 SQL 题,选了就不能改;编辑时按题目本身进对应的页
- SQL 出题页(设计稿「SQL 出题页」方案 B):测试数据一组一行,改完自动重跑,
  跑不通的用中文说原因;保存时才打包上传测试点,不用再手动「预览」「上传」
- 新建时存草稿,误关页面不丢
- 编程题出题页去掉 SQL 那一堆分支(以前勾上 SQL 会静默清掉语法要求和流程图)
- 题目列表能按题型筛,SQL 题标题后面挂标签

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:59:15 +08:00
xuyueandClaude Opus 5.5 25d3296410 feat(SQL 题): 增删改题的期望结果标出执行后变了的格子,删掉的行写清是哪几行
学生原来只能拿两张表逐格对,看不出要改的是哪几行。现在改过的格子、新插的行标黄,
删掉的行在表下面写「删掉了 2 行(id 是 2、3)」。按第一列配对,对不上就不标。
数据表和期望结果抽成一个组件,后台出题页的预览也用它。
题型判断统一走契约的 isSqlProblem()。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:59:15 +08:00
xuyueandClaude Opus 5.5 e01dabc6da fix(题目列表): 亮色模式下「语法要求」标签用的是暗色模式的字色和描边
Deploy / deploy (push) Canceled after 0s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:26:38 +08:00
xuyueandClaude Opus 5.5 fcf63c2ecb fix(课堂看板): 作业里有 SQL 题就布置不上去(报「不能用 C 交」),也没法布置一节 SQL 课
- 布置作业的语言加上 SQL,数据库课整节选 SQL
- C / Python 的作业里可以夹 SQL 题:SQL 题只收 SQL,不受作业语言限制,交对 SQL 就算做完
  (学生首页课堂条、看板格子、班里做了几个人三处一起改)
- 看板点 SQL 题的格子,提交列表按 SQL 筛,不再是一片空白;提交列表「这节课」遇到夹了
  SQL 题的作业不再按 C 筛

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:18:10 +08:00
xuyueandClaude Opus 5.5 98dfcc1e7e fix(题目列表): 「随便来一道」常抽到用自己的语言做不了的题,老师那边「只看没做完」开了看不出藏了什么
Deploy / deploy (push) Canceled after 0s
- 随便来一道:按学生在编辑器里上次用的语言挑(没用过按 Python),C 学生不再抽到 Python 专用题和 SQL 题,Python 学生不再抽到 SQL 题;选了 SQL 知识点或 SQL 类型才从 SQL 题里抽。也跟着「全部类型」的筛选走
- 老师那一版去掉「只看没做完」:没有状态列,开了只是题少了
- 题目页「相似题目」:流程图评到 A / S 的题也算做对,不再推荐,和列表打勾一个口径

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:56:34 +08:00
xuyueandClaude Opus 5.5 84bfb44c20 feat(题目列表): SQL 题混在一般题里看不出来,点进去才发现不是写 C——和画流程图一样挂「SQL」标签,「全部类型」里也能单独筛
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:51:42 +08:00
xuyueandClaude Opus 5.5 e958d69258 fix(题目列表): 连着快点几个知识点,列表偶尔停在前一个知识点的题上
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:49:09 +08:00
xuyueandClaude Opus 5.5 50660abf11 fix(题目列表): 切了几个知识点再按后退,地址回到了全部题目、页面还停在上一个知识点
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:49:09 +08:00
xuyueandClaude Opus 5.5 c3927d522c fix(题目列表): 新生和没登录的人点「随便来一道」,每次都是同一道题
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:49:09 +08:00
xuyueandClaude Opus 5.5 8f21f15c43 feat(提交列表): 同一分钟里连交好几次分不清先后——每行的提交时间带上秒
Deploy / deploy (push) Canceled after 0s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:31:43 +08:00
xuyueandClaude Opus 5.5 b121c2d0ee style(一言): 短句也要点一下弹出一模一样的全文——只有两行放不下的才弹,而且是鼠标移上去就弹
Deploy / deploy (push) Canceled after 0s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:27:27 +08:00
xuyueandClaude Opus 5.5 43ca3c34f1 style(一言): 句子只有一行,稍长一点就被截掉——改成最多两行,出处跟在第二行末尾靠右
Deploy / deploy (push) Canceled after 0s
短句一行时出处就在这一行右边;超过两行截断的是句子,出处始终露在外面。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:21:42 +08:00
xuyueandClaude Opus 5.5 adea781b8e fix(一言): 句子下面多挂了个「· 游戏」「· 动画」的分类,看着啰嗦——不显示分类;本机不用再配 env 就能读到一言数据集
Deploy / deploy (push) Canceled after 0s
- 出处只写「—— 谁《出处》」。接口里的分类还在,只用来判断出处要不要加书名号
- HITOKOTO_DIRECTORY 默认值改成仓库旁边的 ../sentences-bundle,.env.example 里那几行撤掉。
  线上不受影响:镜像里 Dockerfile 写死了 /data/hitokoto

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:14:03 +08:00
xuyueandClaude Opus 5.5 c7a8e05385 feat(一言): 一言挤在角落里,出处被截成「来自 Structure and Interpretatio…」、不知道点一下能换——改成引号 + 句子 + 「—— 谁《出处》· 分类」+ 换一句按钮
设计稿「一言重设计」A 版:
- 句子一行,长句(数据集 p90 44 字、最长 255 字)截断,点句子弹出全文
- 出处写成「雷电将军《原神》· 游戏」:接口多下发 fromWho 和分类名,「佚名」「网络」这类充数的出处不写
- 「换一句」是个看得见的圆按钮,换的时候转一圈
- 契约 quoteSchema 从 string | Record 收成定形对象
- .env.example 说明本机怎么把 HITOKOTO_DIRECTORY 指到 sentences-bundle(不指就一直是内置的三句)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:19:55 +08:00
xuyueandClaude Opus 5.5 dab53c9098 fix(题目列表): 筛空了只说「没有符合条件的题」,点「清空筛选」连左边的知识点一起清掉——说清楚是哪个条件,每个条件一个按钮只去掉它
例如「『函数定义』里没有『画流程图』的题」+「看全部类型」;几个条件一起时每个条件各一个按钮
(看全部类型 / 看全部难度 / 看所有出题者 / 清掉搜索 / 关掉只看没做完)。
「你都做对了」只在「只看没做完」是唯一条件时才说,带着别的筛选空了不再误报。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:10:54 +08:00
xuyueandClaude Opus 5.5 99d3d99128 fix(题目列表): 「全部类型」里 0 道的类型还能点,点了只得到一个空列表——0 道的置灰不能点
已经选中的那一项除外:选了「画流程图」再切到没有这类题的知识点,它仍显示为选中,好让人看出列表为什么空。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:08:30 +08:00
xuyueandClaude Opus 5.5 9cc7f0f60c fix(题目列表): 左边换了知识点,「全部类型」下拉里还是全站的 13 / 13 / 14 道,看着像没生效——题数跟着当前知识点和筛选走
「全部类型」本身也带上题数。手机「筛选」里的类型下拉同样带数。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:06:43 +08:00
xuyueandClaude Opus 5.5 e852bf4498 fix(题目列表): 排序里多了个用不上的「按题号」,原来的最早创建、最多 / 最少提交、通过都没了——换回原来那一套
Deploy / deploy (push) Canceled after 0s
最新创建 / 最早创建 / 最多人做过 / 最少人做过 / 最多人做对 / 最少人做对。排序值和原来一样,
旧链接照样能用;「最多 / 最少」改成按人数,和最后一列「做对 / 做过」对得上。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:58:26 +08:00
xuyueandClaude Opus 5.5 97426f0895 fix(题目列表): 选了知识点后题目改成按题号排,和平时看惯的「最新的在前」不一样——默认一律按最新创建
排序下拉固定三项:最新创建(默认)/ 按题号 / 最多人做对。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:57:14 +08:00
xuyueandClaude Opus 5.5 74af88046e perf(题目列表): 切知识点、翻页有点卡——类型标签每个都让整页重算一遍样式,人数统计要扫整张提交索引
Deploy / deploy (push) Canceled after 0s
- 「画流程图 / 语法要求 / 有参考图」标签不再各自调 useDark():vueuse 每个实例都会重写
  <html> 的 class、插一段禁用过渡的样式再强制整页重算,一页十几个标签就重算十几遍。
  明暗两套色改走 CSS(html.dark)。每次切换 Vue 更新 46ms → 15ms、样式重算 24ms → 1.6ms
- 新索引 submission_public_problem_user_idx(problem_id, user_id, result,只含公开提交):
  每页「做对 / 做过人数」原来要把以 user_id 打头的索引 11 万行扫一遍。
  列表接口 19ms → 9ms,「最多人做对」排序 55ms → 26ms
- 第一次打开、没带筛选时,不再单独多数一次题目总数

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:52:38 +08:00
xuyueandClaude Opus 5.5 ed7752afbb feat(题目列表): 学生自己挑题时只看得到一堆标签和提交数,不知道自己练到哪了——改成左栏知识点进度、顶上先说做到了什么
Deploy / deploy (push) Canceled after 0s
- 左栏是知识点(可切到主题)和自己的进度:做了一部分写 37/96 加进度条,全做对写「通关」,
  一道没做对过的只写题数,不再是一整列 0/108
- 顶上一行:做对几道 · 这周 +n(或连续几周都有做对)· 离哪个成就最近 ·「有 n 道差一点」
  (点开才列出来);新生引去「输出入门」;一言照旧在右边
- 每题最后一列是做对 / 做过的人数,代替提交数和按提交算的通过率(和题目页统计同一个口径)
- 「画流程图 / 语法要求 / 有参考图」挂在题目名后面,「全部类型」下拉单独筛这三类,
  不再混在排序里;题目页的「代码要求」统一叫「语法要求」
- 「只看没做完」开关(默认关)、「随便来一道」(当前知识点里先挑没做对的简单 / 中等题)
- 画流程图的题,流程图评到 A / S 在状态列也打勾,和题单、课堂条一个口径
- 老师看不到状态列和个人进度;出题者筛选保留

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:31:49 +08:00
xuyueandClaude Opus 5.5 1ba8928d41 feat(课堂看板): 「请假隐藏」不会用——改成班级旁一个「请假」按钮勾名单,请假的人变灰排到最后、今天有效
Deploy / deploy (push) Canceled after 0s
原来要先打开开关、名字变成带 × 的标签再点 ×,× 像删除;标完人从页面上消失,
恢复只能全部恢复。现在:

- 班级下拉旁「请假」按钮,标了人之后按钮直接写「请假 2 人:陈言、黄依露 · 修改」
- 弹框只列今天还没交过的人(请假的人一定在里面,刚上课时就是全班),勾上点确定
- 请假的人在表格里变灰排到最后,不算进进度和「还没交过」
- 交了题或举手就算来了,自动取消标记
- 有效期从两小时改成今天(请假一般是一整天),仍然只记在这台电脑上

顺带修掉:被标过的学生后来交了题,会从表格里整个消失、也不算进进度。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 10:38:25 +08:00
xuyueandClaude Opus 5.5 af2ca31de5 fix(学生管理员): 260 班看板 23 人、数据统计只有 22 人,学生管理员还能看同学的作业代码——学生管理员一律按学生算
Deploy / deploy (push) Canceled after 0s
- 统计、题目页各班表、流程图统计的班级名单原来只认普通用户,改成和看板、排行榜一样的
  STUDENT_ROLES,学生管理员进名单、进分母
- 看别人的提交代码和流程图只给老师、超管和出题人;题单防抄对学生管理员也生效。
  原来「比赛进行中学生管理员不能看」那条特例随之去掉
- 题单的「用户进度」原来只给题单创建者,其余老师点开报「题单不存在」;改成所有老师都能看,
  和看板、统计对所有班开放一致。后台能改能删的接口仍只给创建者

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 14:00:11 +08:00
xuyueandClaude Opus 5.5 30f34f0e36 fix(老师权限): 老师在自己比赛里点题目「可见」没反应、看不到学生的智能分析入口等一批权限错位
- 比赛题的可见开关按题目作者判归属,从题库加进比赛的题作者是别人,老师点了 404 且无提示;
  改成和编辑、删除一样按比赛创建者判(canEdit)
- 学生主页「智能分析」和「查看指定用户」只给超管,后端本来就允许老师;改成老师可见
- 排名页班级详情的「AI 分析」学生也看得到,点了权限不足;只给老师显示
- 班级 PK 页解构 store 丢了响应性,资料晚到时老师看不到「AI 分析」
- 学生管理员能给任何人的流程图重新评分且不限流;别人的提交只有老师能重评,免限流也只给老师
- 超管没退登就过期的机房电脑上,下一个登录的老师继承演示模式、看不到后台和看板且关不掉;
  演示模式只对超管生效
- 老师的出题权限能设成「无权限」,设了比赛题目页全是权限不足;后端兜成「仅自己」,
  编辑框里老师不再给这个选项

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 14:00:04 +08:00
xuyue bde387e8bc fix
Deploy / deploy (push) Canceled after 0s
2026-10-08 12:29:35 +08:00
xuyueandClaude Opus 5.5 af63b05d4b fix(班级下拉): 「26计算机11班」这种两位数的班在有的机器上显示成省略号——下拉加宽到 152px
Deploy / deploy (push) Canceled after 0s
132px 时最长的班名只剩两像素余量,字体稍宽就放不下。提交列表和统计面板两处一起改。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:40:08 +08:00
xuyueandClaude Opus 5.5 b7ec65eee8 feat(提交详情): 点了班级筛选之后,要挪到上面班级下拉去点 × 才能取消——右栏那个班级标签原地变成「取消」
已经在筛这个班时,标签不再消失,填色带 ×,悬停变红,再点一下回到全部班级。手机上顺手关掉详情抽屉。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:40:08 +08:00
xuyueandClaude Opus 5.5 2fafb25959 style(提交详情): 状态那一行挤得快放不下——去掉「测试点 1、2、3 答案错误」和耗时、内存
Deploy / deploy (push) Canceled after 0s
测试点小方块本身带颜色、悬停有结果名,后面再写一遍是重复;耗时和内存在课堂上没人看。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:28:59 +08:00
xuyueandClaude Opus 5.5 a8918b41b1 fix(题目统计): 「答案错误几乎都卡在第 1 个测试点」几乎每道题都弹,说了等于没说——答案错误最多时不再给提示
Deploy / deploy (push) Canceled after 0s
七成多的题错得最多的都是答案错误(快照 349 / 484),卡在第 1 个测试点过六成的也有 185 / 320 道,
两句提示对哪道题都一样。具体错在哪,每次提交的结果里已经有「题目里的例子 N 就错了」和三栏对照。
运行时错误、编译失败排第一时的提示保留。后端那条扫 info JSONB 数第 1 个点的查询一起删掉。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:21:00 +08:00
xuyueandClaude Opus 5.5 c22521fb61 fix(答案错误): 说明写「在例子 1 上就错了」,旁边测试点 1 是绿的,看着像写反了——改成「题目里的例子 1 就错了」
例子是题面样例,测试点是隐藏数据,两边都从 1 编号,只写「例子 1」分不开。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:18:06 +08:00
xuyueandClaude Opus 5.5 923f3efeca feat(统计): 没填班级的学生也能和班级一样看——班级下拉多一项「没填班级」,一起上的课能切出来、点进去看小方块;零散提交也能点了
- 班级筛选多一个取值 NO_CLASS("none"),统计、方块串、流程图、提交列表都认;只圈普通学生,
  老师管理员的号本来就不填班级,不挡的话试题的提交会算进去
- 切课时没填班级的号合在一起当一个班切(原来 class_name is null 直接排除,7 月 4 日那两节课看不到)
- 没填班级不是真班:不列「还没交」,课上只写几人不写几人之几
- 「另有零散提交」每一项可点,进那个班那一整天

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:18:06 +08:00
xuyueandClaude Opus 5.5 c2ef55b10b fix(提交): C 代码编译不过时,提交前的自动格式化把出错的几行并成一行,学生认不出自己的代码
Deploy / deploy (push) Canceled after 0s
clang-format 不认中文分号、缺了分号的语句,会把它和下一行并起来(int n; 和 scanf 成了
一行),报错的行号也对不上学生记得的位置。现在 C / C++ 格式化之前先套上题目模板、在
判题机上编一次,编不过就原样返回、不格式化,代码照常提交、照常判成编译错误。

api 容器里没有 gcc,判题机的编译器和参数本来就是判的标准,所以借它编。这一下不进判题
队列、不建提交记录;判题机连不上时照旧格式化。代价是每次交 C 多一次编译,零点几秒。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 11:29:37 +08:00
xuyueandClaude Opus 5.5 fa092d334c feat(编译错误): C / C++ 编译没过时也给中文说明、标出出错位置,中文标点能一键换成英文
Deploy / deploy (push) Canceled after 0s
原来 C / C++ 的编译错误学生看到的是 gcc 的英文原文。现在和 Python 一样一张翻译表
(cError.ts),照全库 2851 条 C / C++ 编译错误用现在的判题机(gcc-14)重新编译出来的
报错定的,只看第一条 error,98% 能给出说明。

三件事先于句式判,因为 gcc 对同一个错报法五花八门:
- 交成了 Python 代码(330 条):gcc 报的是 request for member 之类,直接说换语言;
- C 里写了 C++(iostream、cout);
- 中文标点:gcc-14 不再报 stray,而是把「;」吞进变量名、错报到下一行,所以直接在
  代码里找引号和注释之外的中文标点,行号按代码算。中文标点查找认 C 的 // 和 /* */。

句式上:缺分号报在下一句开头的往回挪一行,把分号写成冒号、关键字拼错(coutinue、
RETURN、return0)、文字没加引号、#include 拼错、main 外面写语句等各有说法。
gcc 的 did you mean 会从库函数里挑(num → enum),只信学生代码里有的名字。
列范围按 gcc 的显示宽度换算(中文占两格),含中文的行也能标到具体位置。

卡片改名 CompileErrorExplain,提交结果、运行例子、提交列表弹框三处都接上了。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 11:22:31 +08:00
xuyueandClaude Opus 5.5 4c6f2e7611 fix(判题): C 里 main() 前面没写 int,升 gcc-14 之后直接编译错误,原来能过
Deploy / deploy (push) Canceled after 0s
gcc-14 把 -Wimplicit-int 也提成了 error。全库判过的 C 提交里有 45 条这么写(8 条 AC),
重新编译一遍:不放行全是 CE,放行后 45 条全部编译通过。最近一条因此 CE 的在 2026-09-28。
冒烟测试那条宽松度用例把 main 改成省略 int 的写法。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 10:56:17 +08:00
xuyueandClaude Opus 5.5 79ca8ac3bd feat(运维): 新增 oj2-api rediagnose,旧提交的运行时错误说明也能用上新规则
诊断是判题时写进库的,规则改了旧提交不跟着变。这个子命令把库里的诊断按现在的规则重做:
Python 只重做已经有诊断的(重跑第一个失败测试点拿回溯,所以要在线上 oj-api 容器里跑),
C / C++ 用 info 里存着的信号和退出码直接补上(原来一条都没有)。比赛提交不诊断,
重跑不出来的保留原样,只写 runtime_error 这一个键。默认只读预演,--apply 才写。

本机验过:dev 与编译两种形态都跑通,--apply 之后再跑是 0 条变化。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 10:51:54 +08:00
xuyueandClaude Opus 5.5 fa0e1ab66c fix(判题): C 的 int 函数里写 return; 升 gcc-14 之后直接编译错误,原来能跑
gcc-14 把 -Wreturn-mismatch 也提成了 error,和另外三个一样 -w 压不住。
cLooseErrors 补上这一个,判定和 gcc-13 一致。冒烟测试加一条对应的用例。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 10:47:21 +08:00