## ① 成绩「作废本条 / 重新录入」——手滑填错了怎么办
- 新增 `POST /api/results/{id}/reopen`:把已发布的那条退回草稿(state=draft、
status=ok、rank=NULL、note=原因)并重算推榜;口径与既有 `void` 完全一致
(回滚类动作,不受 `standings.live_on_publish` 约束)。
- 成绩录入页新增「操作」列:已发布行可「作废本条」,已作废行可「重新录入」,
两者都必填原因、确认后立即重算+推大屏。**验收用例**:作废→重录→改→重发,
名次/流水/榜单与「一开始就填对」逐字节一致。
## ② 破纪录的驳回 / 作废
- 迁移 `0021_record_breaks_note.sql`:`record_breaks` 加一列可空 `note`。
- 新增 `GET /api/record-breaks?state=`(recorder 起可读,guest 403)与
`POST /api/record-breaks/{id}/reject`(必填原因):已批准的登记被作废时
**撤回该笔加分、重算推榜、并把该级别当前纪录恢复为上一条**;`approve`
放开为可对 rejected 再次批准。
- 破纪录页新增「已批准的破纪录」卡片(作废入口);原先只存在浏览器内存里的
「拒绝」改为持久化(先登记再驳回,刷新不再复现)。
## ③ 历史纪录的写入路径(`records.source` 以前恒为「本届」)
- 新增 `POST /api/records`(source 只收 history)与 `DELETE /api/records/{id}`
(删当前纪录时恢复上一条)。纪录库卡片新增「新增历史纪录」与「删除」。
- 至此《使用手册》6.2 承诺的「来源(本届/历史)」这一列才真正有意义。
## ④ 仪表盘补齐承诺的卡片
今天的小项(按 scheduledAt 的本地时区当天 + 进度)、草稿待发布、待确认破纪录、
大屏在线数;数据源读不到显示 `—` 而不是 0。文档里「管理端在线数」服务端没有
接口,按实际改写成本机管理端连接状态。
## 旧版数据包兼容(主人特别交代,三处验证)
迁移只加**可空**列、不重建表、不动数据行;旧赛事包导入后由 `main.go` 的
`store.MigrateEvent` 在启动时补跑迁移。证据:`migration_0021_test.go`
(旧库升级 + 幂等 + 老行取 NULL)、`migration_legacy_test.go` 扩到 0021、
`legacy_pack_upgrade_test.go`(真实旧 event.db 走 main 同一条路径后装配 API,
驳回老登记 → 加分撤回、纪录回退、旧数据逐表一行不差),另有真二进制冒烟。
未迁移的库上不存在任何新列读取。
## 文档
升级说明新增 dev_0.3.0(含「旧包仍可导入、自动补跑迁移」);使用手册新增
§4.10 与 §6.1/§6.2 明细;常见问题新增 Q98/Q99/Q100;devdocs 04/05/07/13/02
同步(含新接口表与错误分级)。
自检:服务端 13 包 ×2 全绿(httpapi 新增 reopen/reject/records/旧包 四个用例文件)、
前端 vue-tsc + 604 例 ×2 + build、Console 19 文件 + 54 例。
86 lines
2.0 KiB
JSON
86 lines
2.0 KiB
JSON
{
|
|
"name": "scoreboard-console",
|
|
"productName": "Scoreboard Console",
|
|
"version": "0.3.0",
|
|
"private": true,
|
|
"author": "AskaEth",
|
|
"description": "赛事积分榜 · 桌面宿主:守护 Go 服务端并把大屏投到扩展屏",
|
|
"main": "main/index.js",
|
|
"scripts": {
|
|
"start": "electron .",
|
|
"check": "node scripts/check-syntax.js",
|
|
"dist": "electron-builder --win --x64",
|
|
"pack": "electron-builder --dir"
|
|
},
|
|
"devDependencies": {
|
|
"electron": "^38.0.0",
|
|
"electron-builder": "^26.0.12"
|
|
},
|
|
"build": {
|
|
"appId": "top.yeij.scoreboard.console",
|
|
"productName": "Scoreboard Console",
|
|
"directories": {
|
|
"output": "../dist/console",
|
|
"buildResources": "resources"
|
|
},
|
|
"files": [
|
|
"main/**/*",
|
|
"renderer/**/*",
|
|
"config.json",
|
|
"package.json"
|
|
],
|
|
"extraFiles": [
|
|
{
|
|
"from": "../dist/scoreboard.exe",
|
|
"to": "scoreboard.exe",
|
|
"filter": ["**/*"]
|
|
},
|
|
{
|
|
"from": "../config.yaml",
|
|
"to": "config.yaml"
|
|
},
|
|
{
|
|
"from": "config.json",
|
|
"to": "config.json"
|
|
},
|
|
{
|
|
"from": "scoreboard.png",
|
|
"to": "scoreboard.png"
|
|
},
|
|
{
|
|
"from": "../rules",
|
|
"to": "rules"
|
|
},
|
|
{
|
|
"from": "extra",
|
|
"to": ".",
|
|
"filter": ["**/*", "!.gitkeep"]
|
|
}
|
|
],
|
|
"win": {
|
|
"executableName": "Scoreboard_Console",
|
|
"icon": "resources/icon.ico",
|
|
"target": [
|
|
{
|
|
"target": "nsis",
|
|
"arch": ["x64"]
|
|
},
|
|
{
|
|
"target": "zip",
|
|
"arch": ["x64"]
|
|
}
|
|
],
|
|
"artifactName": "${productName}-${version}-${arch}.${ext}"
|
|
},
|
|
"nsis": {
|
|
"oneClick": false,
|
|
"allowToChangeInstallationDirectory": true,
|
|
"createDesktopShortcut": true,
|
|
"shortcutName": "赛事积分榜",
|
|
"license": "../LICENSE",
|
|
"include": "resources/installer-custom.nsh",
|
|
"language": "2052"
|
|
}
|
|
}
|
|
}
|