From 2dd6e48247e1135da5b6a36a7000248287214a3c Mon Sep 17 00:00:00 2001 From: ltx <1006158920@qq.com> Date: Wed, 21 Oct 2026 13:10:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(scoring):=20=E5=AE=8C=E5=96=84=E5=A4=A7?= =?UTF-8?q?=E5=B1=8F=E5=8F=8C=E8=AF=AD=E4=B8=BB=E9=A2=98=E4=B8=8E=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=8A=A0=E8=BD=BD=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 检录大屏:统一中文在上、英文在下的标题与状态标签,放大关键信息;按实际视口延展 1920x1080 基准画布,使非 16:9 屏幕充分利用显示区域。 成绩与排名大屏:重整赛事标题、项目组别、选手成绩和分项卡片的双语层级及动画;加入仅开发环境可用的成绩/排名样例预览,并优化自适应全屏布局。 赛事控制台:增加亮色/暗色主题切换、主题色和文字色设置及预览;按赛事在本机保存配置,通过 BroadcastChannel 和 storage 事件同步到已打开的大屏,兼容旧配色记录。 路由稳定性:动态导入因短暂断网或开发服务器重启失败时,限一次重新打开目标页;持续失败或离线时显示提示,避免循环刷新。 验证:npm run build:local 通过;1920x1080 成绩与排名亮色预览已检查;git diff --cached --check 通过。 --- src/router/index.ts | 26 ++ src/views/scoring/checkin-screen/index.vue | 56 +++- src/views/scoring/score-screen-theme.mjs | 39 +++ src/views/scoring/screen/index.vue | 353 +++++++++++++++++++-- src/views/scoring/workbench/index.vue | 68 +++- 5 files changed, 504 insertions(+), 38 deletions(-) create mode 100644 src/views/scoring/score-screen-theme.mjs diff --git a/src/router/index.ts b/src/router/index.ts index a844906..8113db3 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,6 +1,7 @@ import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router'; import NProgress from 'nprogress'; import 'nprogress/nprogress.css'; +import { ElMessage } from 'element-plus'; import pinia from '/@/stores/index'; import { storeToRefs } from 'pinia'; import { useKeepALiveNames } from '/@/stores/keepAliveNames'; @@ -140,5 +141,30 @@ router.afterEach(() => { NProgress.done(); }); +// 开发服务器短暂重启或网络抖动会使浏览器缓存一次失败的动态 import。 +// 重新请求同一个模块并不能清除该失败记录,必须重新加载文档;每个目标页限一次,避免故障持续时循环刷新。 +router.onError((error, to) => { + NProgress.done(); + const message = error instanceof Error ? error.message : String(error); + if (!/Failed to fetch dynamically imported module|Importing a module script failed|error loading dynamically imported module/i.test(message)) return; + if (!navigator.onLine) { + ElMessage.error('网络已断开,恢复连接后请重新进入该页面'); + return; + } + const href = router.resolve(to).href; + const retryKey = `route-import-retry:${href}`; + try { + const lastRetry = Number(sessionStorage.getItem(retryKey) || 0); + if (Date.now() - lastRetry > 60_000) { + sessionStorage.setItem(retryKey, String(Date.now())); + window.location.replace(new URL(href, window.location.href).href); + return; + } + } catch (storageError) { + console.warn('无法记录路由模块重试状态', storageError); + } + ElMessage.error('页面资源加载失败,请确认本地服务正常运行后刷新页面'); +}); + // 导出路由 export default router; diff --git a/src/views/scoring/checkin-screen/index.vue b/src/views/scoring/checkin-screen/index.vue index bdcdf13..305cd20 100644 --- a/src/views/scoring/checkin-screen/index.vue +++ b/src/views/scoring/checkin-screen/index.vue @@ -4,14 +4,14 @@
-
CHECK-IN PROGRESS

{{ data.eventName || route.query.eventName || '赛事检录大屏' }}

检录进度
+

{{ data.eventName || route.query.eventName || '赛事检录大屏' }}

检录进度CHECK-IN PROGRESS
{{ timeText }}{{ dateText }} · {{ week }}