## 分批发布(现场:100 米跑道只有 8 条,不能等所有人跑完才发) - 空成绩从"错误"降级为"提示",不再阻塞发布;真会算错(写法无法识别、秒位 ≥ 60、 手动名次缺名次)仍挡住。发布确认框说明"只发已填的 M 人,其余保持未发布"。 - 服务端核实:publishResults/computeEventScore 本就不会因缺成绩报错 (collectCandidates 直接跳过没有 results 的报名项),根因在前端防呆。 ## 实时赛况(新大屏页 + 定向接口) - 新增 `GET /api/display/live`(guest 可读):返回「当前项目」判定 + 该项目**全量**已发布成绩 (不受快照 latestResults 的 20 行截断)。回退链:manual 指定 > 排期命中 > 最近发布。 设置键 display.live_events / display.live_source。 - 大屏新页 `live`「实时赛况」:1 个项目单栏、2 个自动左右分栏;失败保留上一次画面 (下一场开始前持续显示上一场);30s 轮询(判定依赖当前时间)+ 快照变更触发。 - 管理端「大屏控制」新增「实时赛况」卡;该卡走 PUT /api/settings(admin-only), 故对非管理员整组置灰 + 提示条(不新增角色)。 ## 显式批次层(组别之下) - 迁移 0019 `entries.heat`;批次仅是录入/展示分组,**不参与算分**(有"分批与不分批结果 完全一致"的断言守住)。批量设置接口 + 导入 CSV 可选列 heat + 录入页批次下拉 + 一键均分(按 N 人切片,已有批次号接着往后排)。 ## 成绩输入框实时悬浮提示 - 聚焦格旁的浮动气泡:pointer-events:none、不占布局不改行高、贴底自动上翻; 合法显示解析结果(1:06 → = 66 秒)、可疑/不合法显示原因并带那一格原文; 与发布防呆共用同一套纯函数(entryGuards.ts),口径不会分叉。 ## 窄屏 / 手机端布局 - 真浏览器(Playwright + chromium)在 1440/1024/768/390 四宽度逐页审计 + 溢出探针, 四轮迭代修复;桌面端 1440 前后像素差异 < 0.25%(无回归);修掉如「修改密码」输入框 塌成 22px 这类真问题。 ## 版本号单一真相 - 新增仓库根 `VERSION`:构建时注入二进制(-X main.version)并同步 console/package.json 的版本(产物名跟随)。源码里不再有人工维护的版本号(兜底值改为 `dev`,故意不写数字)。 测试:服务端 13 包全绿;前端 vue-tsc 通过、249 例全过;Console 18 文件。 docs/ 与 devdocs/ 同步(FAQ 到 Q80、新增 devdocs/16 自定义大屏模板设计文档)。
86 lines
2.0 KiB
JSON
86 lines
2.0 KiB
JSON
{
|
|
"name": "scoreboard-console",
|
|
"productName": "Scoreboard Console",
|
|
"version": "0.1.1",
|
|
"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"
|
|
}
|
|
}
|
|
}
|