 xuyueandClaude Opus 5.5
|
195069450f
|
style(格式化): 改成单引号、一行最长 160,全仓重新格式化
Deploy / deploy (push) Canceled after 0s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
2026-10-26 13:52:24 +08:00 |
|
 xuyueandClaude Opus 5.5
|
df3b4f0dfd
|
style(代码配色): 全站代码换成 Dracula 配色(亮色用官方浅色版 Alucard);编辑器、题面和教程的代码块、练一练、提交详情的颜色一模一样了
Deploy / deploy (push) Canceled after 0s
原来三套配色各管一块:编辑器是 smoothy / One Dark,正文代码块和练一练是仿 GitHub,
提交详情是 Naive 自带的,同一段 printf 在一课里就有两种颜色。现在静态代码也走编辑器
那套 lezer 解析器,颜色只在 shared/highlight.css 写一份,highlight.js 删掉。
填空题顺手修好:空会把语法搅乱,(humidity ____ 40) 被认成类型声明、humidity 染成类型色,
现在空里先填上答案再解析,答案不输出。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
2026-10-13 19:49:20 +08:00 |
|
 xuyueandClaude Opus 5.5
|
0ee5444ede
|
feat(后台设置): 设置页重排成网站、班级、开关、判题机几块,保存挪到右上角;班级按年级分组不用再拖;判题机写出多久没动静;AI 小助手(MaxKB 挂件)整个删掉
Deploy / deploy (push) Canceled after 0s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
2026-10-13 14:37:35 +08:00 |
|
 xuyueandClaude Opus 5.5
|
6216e1cf22
|
chore(依赖): 删掉三个没用到的 vue-flow 插件,代码高亮全站只注册一份
- @vue-flow/minimap、node-resizer、node-toolbar 一处引用都没有
- App.vue 给 n-code 另建了一份 highlight.js,还注册着判题机早就不认的 Java、
JavaScript、Go;改成空闲时加载 shared/highlight.ts 那份。62 条这三种语言的
历史提交改为不上色显示
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
2026-10-12 20:22:32 +08:00 |
|
 xuyueandClaude Opus 5.5
|
5ae830a7f9
|
refactor: 一批名不副实的命名改掉(只动一端,不碰契约)
后端:
- getUserByToken → authenticateToken:它会删会话、续 TTL、记在线,不是纯读
- todayStart → dayStart(instant):本来就接受任意时刻,不只是「今天」
- objectValue → asRecord,删掉 4 份一模一样的私有拷贝和 `as toObject` 别名
- 报错文案 "does not exists" / "Already be a public problem" 改通顺
前端:
- utils/types 里 Contest / User / Problem 三个别名删掉:Contest 原来指后台
比赛、契约里同名的却是学生侧。现在 Contest = 学生侧、AdminContest = 后台,
后台用户表单叫 AdminUserForm,题目详情直接用 ProblemDetail
- SubmissionInfo → ContestSubmissionInfo,免得和 submission.info 撞名
- utoa / atou → compressToBase64 / decompressFromBase64(实际是 zlib + base64),
encode / decode → base64EncodeUtf8 / base64DecodeUtf8
- filterResult → toProblemRow、toProblemListItem → toAdminProblemRow,
行字段 submission / rate → submissionCount / acRate
- 组件:Modal → AddFromLibraryModal、Form → EditorToolbar、
ContestEditor → BasicEditor(题单也在用它)、rank 的 Index → RankMedal、
Name → UserNameCell、Password → PasswordCell、ContestType → ContestAccessTag
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
2026-09-27 16:08:21 +08:00 |
|
 xuyueandClaude Opus 5
|
e62f41f6c7
|
refactor(web): Header 只管顶栏,全局的东西挂回 App
Header 一直兼着「全局挂载点」:课堂求助的提示、新求助 toast、求助列表和
教师端协作弹框都寄生在里面,只因为顶栏是全局的。它其实不是 ——
/admin/* 走的是 admin.vue,没有 Header,老师一进后台这四个消费者全部
卸载:求助照收,提示、角标、弹框一个都不出现,正好是 collab.ts 里写的
「老师可能正在后台改题时收到求助」那个场景。
这些东西跟着连接走,而连接在 App.vue 按登录态开关,所以搬进 CollabHost
挂在同一层。Header 因此不必再是单根组件,default.vue 那个靠 class 传
居中样式的写法也换成外层 div,连带删掉「必须挂在根 n-flex 内部」那段
补丁注释。
顺带:
- 圆环扩散的暗黑切换抽成 useDarkTransition
- 求助的角标/toast/列表不再限桌面端 —— 老师缩窗口也得知道有人在等;
接单确实要在电脑上写代码,那道闸挪进 HelpRequestList
- 站名改 text 按钮,能 tab 到、回车能按
- logout 的两步收进 userStore.signOut()
- 清掉死代码:handleMenuSelect 只认一个不存在的 key、active 里
["user","setting"] 永远不生效的排除、两个 show:false 的菜单项
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqqZwxtXLo2GTqMi51C94D
|
2026-08-31 07:36:14 -06:00 |
|
 xuyueandClaude Opus 5
|
4abaf9c7e4
|
fix(collab): 动态 import 竞态、切走页面的语义、演示模式的身份错位
- collabDoc.start 要 await 六个动态 import,房间可能在这期间就关了(机房首次
加载 y* 那几个 chunk 正是最慢的时候)。stop() 先跑完面对的是 doc === null,
什么也拆不到;import 回来之后 start 的后半段照样建文档、装 binaryHandler、
挂 yCollab、发 SyncStep1——给一个不存在的房间。加会话代号,过期就整个放弃。
- SyncCodeEditor 卸载(切走题目页、把语言切成流程图)原来只是悄悄 stop(),
房间和 active 都还留着,老师那边模态框照开、字照敲,一个也到不了;watch
没有 immediate,学生切回来也不会重建。改成明确 leave() 结束协作。
另外 @ready 也作为起点之一:学生排队时切走、老师这期间接了单,切回来能接上。
- 演示模式下 isTeacherOrAbove 被强制 false,服务端却按库里的 adminType 照样
把他算作在线老师:学生因此拿到 pending 而不是 no_teacher,排队等一个顶栏里
根本没有求助列表的人;他自己看到的求助按钮点下去,服务端回「教师不能发起求助」。
两头都不对,索性对演示模式整个关掉这个功能。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016DHxhKNxXfG89JnVzHbvgj
|
2026-08-30 09:38:04 -06:00 |
|
 xuyueandClaude Opus 5
|
17aa69f8a7
|
feat(web): 课堂求助 store 与全局 collab 连接
连接全局常驻,不跟题目页起落 —— 老师在任何页面都要能收到求助。
列表按题目聚合,同题多人时能一眼看出该全班讲。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1d8B3f4SXJwDvUY625eQd
|
2026-08-28 05:36:51 -06:00 |
|
 xuyueandClaude Opus 5
|
1198895b54
|
refactor(前端): vue-tsc 清零,type-check 可以当 CI 门禁了
接上 vue-tsc 时有 143 条既有错误,上一批迁移带走 89 条,这里把剩下的清完。
大部分是噪音(未使用的回调参数、死变量、少数 unknown),但里面躺着两个真问题:
- 个人主页查不存在的用户会抛:getProfile 返回 null 时后面照样取
.acmProblemsStatus,靠 `!` 压着。加了早返回。
- getProblemSetProgress 我上一批标错了类型:后台这个接口返回的是裸数组,
不是分页信封(和 oj 侧的 /user-progress 不一样)。已改正并加注释区分。
其余处理:
- 未使用的回调参数按 TS 约定加 `_` 前缀(v-for 的项、供子类重写的空钩子、
路由守卫的 from);确认无用的局部变量直接删(clickX/clickY 算了点击位置
但飞出方向用的是随机角度,hasToday 下面已经用 lastDateOnly 判过,
prefix 算了周/月但标签里没用上)。
- App.vue 的 highlight.js 注册:Promise.all([...]).then(m => m.map(x => x.default))
会把元组塌成 (HLJSApi | LanguageFn)[],hljs 上就找不到 registerLanguage。
改成逐个取 .default。
- 给一批 api 补上契约类型(getMetrics / getHitokoto / getTutorials /
formatCode / getProblemBeatRate / getClassUsernames 等),契约相应补了
8 个 z.infer 导出。
- ContestRank.submissionInfo 和 AcmHelperItem.acInfo 在 api 边界窄化成
SubmissionInfo —— 契约里是 Record<string, unknown>(JSONB 原文)。
- FlowchartEditor 的 TS2589:vue-flow 的 Node 嵌套太深,ref<Node[]>([]) 的
UnwrapRef 推导撞上实例化层级上限,改成 ref([]) as Ref<Node[]>。
- api2.ts 的响应拦截器**故意**不返回 AxiosResponse(要把 { data } 信封剥掉),
类型上确实说不通,没硬掰,写注释说明为什么用断言。
- 题目列表的「随机」按钮在模板里一直是注释状态,对应的 getRandom 和
getRandomProblemID 一并删除(后端 /problems/random 保留不动)。
验证:vue-tsc 0 条,apps/api tsc、check:routes、web build 全通过;
修过 key 的列都打接口确认过字段真实存在。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-25 14:04:10 -06:00 |
|
 xuyueandClaude Opus 5
|
2c6f8d11f3
|
fix(前端): 接回阶段 2 临时关掉、之后忘了打开的配置推送和 MaxKB
扫前端死代码时发现 apps/web 比 ojnext 多两个"没人调用的导出":
useConfigUpdate 和 useMaxKB。查下去不是死代码,是**搬运时丢的接线** ——
ojnext 的 App.vue 调了这两个,apps/web 的没调,那里留着一句:
// 配置推送和 MaxKB 仍属于 Phase 3;在它们迁入前不连接旧 WebSocket。
阶段 2 因为后端还没有 /ws/config 而暂时关掉,说好阶段 3 迁完再开,然后就忘了。
阶段 3 早已完成。
表现是两个**静默**的功能缺失:管理员改站点配置后学生要刷新才生效;
知识库挂件根本不出现。都不报错,所以此前所有验证都没发现 ——
包括我昨天那轮浏览器走查,因为我不知道该期待它们出现。
## 验证
后端侧本来就是齐的(POST /admin/website 里已经调 publishConfigUpdate)。
接回来之后实测:
- 浏览器控制台出现 `[WebSocket] 连接成功: ws://localhost:8080/ws/config`
(之前根本不会连)
- 改站点名 → 收到 8 条 config_update 推送
- **页面全程不刷新,站点名从"判题狗-推送测试"自己变成"判题狗-实时生效了"**
中途我一度断言"configUpdateChannel 没有任何发布者",那是错的 ——
路由调的是封装函数 publishConfigUpdate,我 grep 的是常量名。
## 顺带:两边前端的死代码规模已对齐
各 7 个没人调用的导出函数 + 2 个没人引用的 .vue。检测器已确认
unplugin-vue-components 只解析 Naive UI(无 src/components 目录),
本地组件必须显式 import,所以"没人 import"的判定是可靠的;
并用 3 个明确在用的导出反测过检测器本身。这批还没删。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-08 07:29:41 -06:00 |
|
xuyue
|
ec274419c3
|
Build Phase 2 judge vertical slice
|
2026-08-06 22:42:39 -06:00 |
|
xuyue
|
ae1fb329b5
|
feat(阶段1): 搬入 ojnext 为 apps/web,未改业务代码
|
2026-08-06 21:18:16 -06:00 |
|