feat: 分批发布 + 实时赛况页 + 显式批次层 + 成绩框实时提示 + 窄屏适配 + 版本号单一真相
## 分批发布(现场: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 自定义大屏模板设计文档)。
This commit is contained in:
1 parent
e5e0944d26
commit
08a5740fb2
64 files changed
+4968
-270
No files matched your search
@@ -66,6 +66,12 @@ body {
|
||||
transition:
|
||||
border-color var(--mx-d1) var(--mx-ease),
|
||||
box-shadow var(--mx-d1) var(--mx-ease);
|
||||
/*
|
||||
* 表格是 table-layout:auto,width:100% 对列的 min-content 没有贡献;
|
||||
* 窄屏下这些格子会被压到二十几像素,连一个字都看不到。
|
||||
* 给一个下限,让宽表撑出横向滚动而不是把输入框压扁。
|
||||
*/
|
||||
min-width: 80px;
|
||||
}
|
||||
.mx-cell-input:focus {
|
||||
border-color: var(--mx-primary);
|
||||
@@ -96,3 +102,79 @@ body {
|
||||
.mx-table-entry tbody tr.is-focus {
|
||||
background: var(--mx-primary-glow);
|
||||
}
|
||||
|
||||
/*
|
||||
* 窄屏表格:回退成「表头 + 横向滚动」,不用 vendor 的卡片化。
|
||||
*
|
||||
* vendor 的 @media(max-width:767px) 卡片模式要求每个 td 带 data-label(::before 靠它
|
||||
* 显示字段名)才成立;管理端所有表格都没有这个属性,套上去的结果是表头消失、
|
||||
* 每格只留一个无名值,而且同一段规则还把 .mx-table-wrap 的 overflow-x 改成了 visible,
|
||||
* 宽表(运动员、日志、录入)会直接顶破卡片和整页。现场手机端更需要"能横向滑着看",
|
||||
* 所以这里在管理端范围内把表格恢复成常规表格并保留横向滚动。
|
||||
*/
|
||||
@media (max-width: 767px) {
|
||||
.admin-shell .mx-table-wrap {
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
.admin-shell .mx-table thead {
|
||||
display: table-header-group;
|
||||
}
|
||||
.admin-shell .mx-table tbody {
|
||||
display: table-row-group;
|
||||
}
|
||||
.admin-shell .mx-table tbody tr {
|
||||
display: table-row;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
background: transparent;
|
||||
}
|
||||
.admin-shell .mx-table tbody td {
|
||||
display: table-cell;
|
||||
padding: 8px 10px;
|
||||
border-bottom: 1px solid var(--mx-divider);
|
||||
white-space: nowrap;
|
||||
}
|
||||
.admin-shell .mx-table tbody td::before {
|
||||
content: none;
|
||||
}
|
||||
.admin-shell .mx-table tbody tr:hover td {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
/* 手机端表格内输入框触控目标补齐到 ~40px(vendor 的 ≤767 规则停在 34px)。 */
|
||||
.admin-shell .mx-cell-input {
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
/*
|
||||
* 卡片头在窄屏允许换行:像「破纪录」页把标题与一排筛选页签放同一行时,
|
||||
* 页签作为 flex 子项的 min-width:auto 会按 min-content 撑开(320px 尤其明显),
|
||||
* 把卡片头顶出屏幕。允许换行 + 让页签容器可以收缩,标题与筛选都还能用。
|
||||
*/
|
||||
.admin-shell .mx-card-head {
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
.admin-shell .mx-card-head .mx-tabs {
|
||||
min-width: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 分页按钮 / 弹窗关闭按钮:vendor 在窄屏把分页压到 32px、关闭按钮 28px,
|
||||
* 现场用手机或平板点这些很容易点空。1024 以下统一补到 40px。
|
||||
*/
|
||||
@media (max-width: 1023px) {
|
||||
.admin-shell .mx-page-btn,
|
||||
.admin-shell .mx-page-ellipsis {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
.admin-shell .mx-modal-close {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user