## 分批发布(现场: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 自定义大屏模板设计文档)。
109 lines
5.3 KiB
Batchfile
109 lines
5.3 KiB
Batchfile
@echo off
|
|
chcp 65001 >nul
|
|
REM Build Windows artifacts on the build machine (Meowhome).
|
|
REM Output:
|
|
REM dist\scoreboard.exe server (frontend embedded via go:embed)
|
|
REM dist\console\ Scoreboard Console installer + portable dir
|
|
REM
|
|
REM IMPORTANT: keep this file ASCII-only. cmd.exe mis-parses UTF-8 non-ASCII text
|
|
REM inside batch files (especially inside if(...) blocks). Anything that needs a
|
|
REM non-ASCII path is done by a Node script under deploy\.
|
|
setlocal
|
|
|
|
REM electron / electron-builder downloads: use mirrors so GitHub is reachable
|
|
set "ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/"
|
|
set "ELECTRON_BUILDER_BINARIES_MIRROR=https://gh-proxy.com/https://github.com/electron-userland/electron-builder-binaries/releases/download/"
|
|
set "CSC_IDENTITY_AUTO_DISCOVERY=false"
|
|
|
|
cd /d "%~dp0.."
|
|
|
|
echo === [1/4] git pull ===
|
|
git pull || exit /b 1
|
|
|
|
echo === [2/4] web deps + build ===
|
|
cd web
|
|
call pnpm install --frozen-lockfile || exit /b 1
|
|
call pnpm build || exit /b 1
|
|
cd ..
|
|
|
|
echo === [3/4] server build ===
|
|
REM version: repo-root VERSION is the single source of truth. The Node script
|
|
REM writes deploy\version.gen.bat (pure ASCII, for cmd) and syncs the installer
|
|
REM version in console\package.json. Must run before the go build below.
|
|
node deploy\prepare-extra.mjs || exit /b 1
|
|
call deploy\version.gen.bat || exit /b 1
|
|
cd server
|
|
if not exist ..\dist mkdir ..\dist
|
|
REM internal signature is injected from a machine-local file (gitignored, never in repo).
|
|
REM set /p returns empty under chcp 65001; PowerShell piping re-encodes the text and
|
|
REM corrupts non-ASCII. So a Node script normalizes it (BOM/whitespace stripped) into
|
|
REM deploy\signature.build.txt, and for /f reads that file directly (no re-encoding).
|
|
node ..\deploy\prepare-signature.mjs || exit /b 1
|
|
set "INTERNAL_SIGNATURE="
|
|
if exist "..\deploy\signature.build.txt" for /f "usebackq delims= eol=" %%A in ("..\deploy\signature.build.txt") do if not defined INTERNAL_SIGNATURE set "INTERNAL_SIGNATURE=%%A"
|
|
REM compile-time version: -X main.version targets package main (no import path),
|
|
REM unlike the two vars below which are import-path-qualified.
|
|
set "VERSION_LDFLAG=-X 'main.version=%SCOREBOARD_VERSION%'"
|
|
REM build time for the About page. Do NOT use %DATE%/%TIME%: a localized Windows
|
|
REM prints non-ASCII weekday names, which cmd mis-parses (see the header note).
|
|
set "BUILD_TIME="
|
|
for /f "usebackq delims=" %%T in (`powershell -NoProfile -Command "(Get-Date).ToString('yyyy-MM-dd HH:mm:ss')"`) do if not defined BUILD_TIME set "BUILD_TIME=%%T"
|
|
set "BUILD_TIME_LDFLAG=-X 'git.yeij.top/AskaEth/Scoreboard/server/internal/version.BuildTime=%BUILD_TIME%'"
|
|
if defined INTERNAL_SIGNATURE (
|
|
REM single quotes keep spaces inside the value intact for go's ldflags parser
|
|
go build -ldflags "-X 'git.yeij.top/AskaEth/Scoreboard/server/internal/version.InternalSignature=%INTERNAL_SIGNATURE%' %VERSION_LDFLAG% %BUILD_TIME_LDFLAG%" -o ..\dist\scoreboard.exe . || exit /b 1
|
|
node ..\deploy\verify-signature.mjs || exit /b 1
|
|
echo internal signature injected
|
|
) else (
|
|
go build -ldflags "%VERSION_LDFLAG% %BUILD_TIME_LDFLAG%" -o ..\dist\scoreboard.exe . || exit /b 1
|
|
echo no internal signature
|
|
)
|
|
echo build time %BUILD_TIME%
|
|
echo version %SCOREBOARD_VERSION%
|
|
cd ..
|
|
|
|
echo === [4/4] console package (electron-builder) ===
|
|
REM win.icon is written into the PE resources by electron-builder (via rcedit);
|
|
REM it needs winCodeSign / nsis, fetched through the gh proxy above.
|
|
taskkill /im "Scoreboard_Console.exe" /f >nul 2>&1
|
|
REM builds from before the exe rename used a space in the file name - kill that too
|
|
taskkill /im "Scoreboard Console.exe" /f >nul 2>&1
|
|
taskkill /im scoreboard.exe /f >nul 2>&1
|
|
if not exist "rules" (
|
|
echo [ERROR] rules dir missing - electron-builder extraFiles needs it
|
|
exit /b 1
|
|
)
|
|
REM prepare-extra.mjs already ran in step 3 (version, user docs, installer script).
|
|
cd console
|
|
REM console\pnpm-workspace.yaml uses allowBuilds so electron's install script is
|
|
REM allowed to run; do NOT add --ignore-scripts here, it makes pnpm run fail its
|
|
REM dependency check with ERR_PNPM_IGNORED_BUILDS.
|
|
REM Keep this file ASCII-only: cmd.exe mis-parses UTF-8 text inside .bat files.
|
|
call pnpm install --frozen-lockfile || exit /b 1
|
|
call :ensure_electron || exit /b 1
|
|
call pnpm run dist || exit /b 1
|
|
cd ..
|
|
|
|
echo.
|
|
echo === BUILD OK ===
|
|
echo dist\scoreboard.exe server
|
|
echo dist\console\ console installer + portable dir
|
|
dir /b dist\console
|
|
endlocal
|
|
exit /b 0
|
|
|
|
REM ---- ensure the electron runtime binary is present (fallback for mirror failures) --
|
|
:ensure_electron
|
|
REM path.txt tells the electron package where the binary is; without it
|
|
REM electron-builder tries to download the runtime and hits a Node 24 bug.
|
|
if not exist node_modules\electron\path.txt echo electron.exe> node_modules\electron\path.txt
|
|
if exist node_modules\electron\dist\electron.exe exit /b 0
|
|
set "EV=38.8.6"
|
|
echo downloading electron %EV% ...
|
|
curl -L --fail --max-time 900 -o electron-dl.zip "%ELECTRON_MIRROR%%EV%/electron-v%EV%-win32-x64.zip" || exit /b 1
|
|
powershell -NoProfile -Command "Expand-Archive -LiteralPath 'electron-dl.zip' -DestinationPath 'node_modules/electron/dist' -Force" || exit /b 1
|
|
del /q electron-dl.zip
|
|
echo electron.exe> node_modules\electron\path.txt
|
|
echo electron runtime ready
|
|
exit /b 0
|