fix(display): 隐藏调试标识 + 积分榜显示单位 logo

- TopBar 的「实例 N · 屏 N」只在该窗口确实处于调试态时渲染:非 windowed(kiosk)不显示,
  窗口化下按 F11 全屏也不显示(同时监听 fullscreenchange,与 App.vue 口径一致)
- 积分榜与团体奖牌榜的队名左侧渲染单位 logo:数据本来就下发了(dto/standings.go 的
  LogoPath),只是页面没画。图标 1em 随行字号浮动、object-fit:contain,行高不会被撑开;
  无 logo 不占位,加载失败 visibility:hidden 保留占位避免队名跳动,@load 会复原
- resolveAssetUrl(路径归一化)从 admin 目录收敛到 web/src/shared/asset.ts,
  管理端与大屏共用一份;原 image-path 测试随之迁到 shared/tests

未做(需服务端 DTO 支持,本次未授权):分项成绩页与个人榜的单位列同样没有 logoPath 字段,
所以那两个页面仍无法显示单位 logo。

自检:vue-tsc + pnpm build 通过;前端 node --test 69/69。
This commit is contained in:
AskaEth committed 2026-09-10 10:20:03 +08:00
1 parent 407abec3b0
commit 6f47849e1e
7 files changed
+79 -5

No files matched your search

+12
View File
@@ -2,6 +2,7 @@
import { computed, onUnmounted, ref } from 'vue'
import { formatClock } from '@/shared'
import { useScoreboard } from '../useScoreboard'
import { isWindowed } from '../windowed'
import OfflineBadge from './OfflineBadge.vue'
const { settings, options } = useScoreboard()
@@ -19,7 +20,18 @@ const subtitle = computed(() => display.value?.subtitle?.trim() ?? '')
const host = computed(() => settings.value?.event.host?.trim() || '主办方待配置')
const logo = computed(() => display.value?.logo?.trim() || '')
const clock = computed(() => formatClock(now.value))
// 单屏窗口化时用来分辨「这块屏是哪个实例」;现场展示(kiosk,或窗口化后按 F11 全屏)都不该出现。
// 监听在 setup 阶段就挂上,onUnmounted 里摘掉,不引入额外 import。
const fullscreen = ref(document.fullscreenElement !== null)
function onFullscreenChange(): void {
fullscreen.value = document.fullscreenElement !== null
}
document.addEventListener('fullscreenchange', onFullscreenChange)
onUnmounted(() => document.removeEventListener('fullscreenchange', onFullscreenChange))
// 实例/屏号都缺失时返回空串,模板的 v-if 顺带挡掉空元素。
const identity = computed(() => {
if (!isWindowed() || fullscreen.value) return ''
const parts: string[] = []
if (options.value.instance !== null) parts.push(`实例 ${options.value.instance}`)
if (options.value.screen !== null) parts.push(`屏 ${options.value.screen}`)