feat(server): 用户管理与变更历史接口;修复 result_revisions.parent_id 从未写入

This commit is contained in:
AskaEth committed 2026-09-09 19:51:50 +08:00
1 parent f3813171d3
commit 72462792ec
39 files changed
+10001 -28

No files matched your search

+41 -17
View File
@@ -5,9 +5,11 @@ import { mix, parseHexColor, readableForeground, toCss } from './color'
import type { DisplayPageKey } from './types'
import { useScoreboard } from './useScoreboard'
import { useStageScale } from './useStageScale'
import { WINDOWED_TITLEBAR_HEIGHT, isWindowed } from './windowed'
import DetailOverlay from './components/DetailOverlay.vue'
import TickerBar from './components/TickerBar.vue'
import TopBar from './components/TopBar.vue'
import WindowedTitleBar from './components/WindowedTitleBar.vue'
import AnnouncementPage from './components/pages/AnnouncementPage.vue'
import AthleteStandingsPage from './components/pages/AthleteStandingsPage.vue'
import EventResultsPage from './components/pages/EventResultsPage.vue'
@@ -23,10 +25,19 @@ const PAGES: Record<DisplayPageKey, Component> = {
}
const { bootstrap, dispose, page, settings } = useScoreboard()
const { scale, offsetX, offsetY } = useStageScale()
// 单屏窗口化才有标题栏;kiosk 下 windowed 为 false,下面所有相关分支都不生效
const windowed = isWindowed()
const { scale, offsetX, offsetY } = useStageScale({
topInset: () => (windowed ? WINDOWED_TITLEBAR_HEIGHT : 0),
})
const currentPage = computed<Component>(() => PAGES[page.value])
const rootStyle = { '--display-titlebar-h': `${WINDOWED_TITLEBAR_HEIGHT}px` }
const barTitle = computed(() => settings.value?.display.title.trim() || '赛事标题待配置')
const barLogo = computed(() => settings.value?.display.logo?.trim() ?? '')
const stageStyle = computed(() => ({
transform: `scale(${scale.value})`,
left: `${offsetX.value}px`,
@@ -72,30 +83,43 @@ onUnmounted(() => {
</script>
<template>
<div class="screen">
<div class="stage" :style="[stageStyle, themeVars]">
<img v-if="background" class="bg" :src="background" alt="" />
<div class="bg-fallback" />
<div class="root" :style="rootStyle">
<WindowedTitleBar v-if="windowed" :title="barTitle" :logo="barLogo" />
<div class="content">
<TopBar />
<main class="main">
<Transition name="page" mode="out-in">
<component :is="currentPage" :key="page" />
</Transition>
</main>
<TickerBar />
<div class="screen">
<div class="stage" :style="[stageStyle, themeVars]">
<img v-if="background" class="bg" :src="background" alt="" />
<div class="bg-fallback" />
<div class="content">
<TopBar />
<main class="main">
<Transition name="page" mode="out-in">
<component :is="currentPage" :key="page" />
</Transition>
</main>
<TickerBar />
</div>
<DetailOverlay />
</div>
<DetailOverlay />
</div>
</div>
</template>
<style scoped>
.root {
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
background: #000;
}
/* kiosk 下 root 里只有 .screen,flex:1 等价于原来的铺满视口 */
.screen {
position: fixed;
inset: 0;
position: relative;
flex: 1;
min-height: 0;
overflow: hidden;
background: #000;
cursor: none;