chore: 基本服务器版本完成
This commit is contained in:
@@ -42,7 +42,7 @@
|
||||
<h2>🎯 奖金设置</h2>
|
||||
<div class="bonus-rules-row">
|
||||
<div
|
||||
v-for="(rule, index) in bonusRules"
|
||||
v-for="(rule, index) in displayBonusRules"
|
||||
:key="index"
|
||||
class="bonus-rule-item"
|
||||
>
|
||||
@@ -69,9 +69,9 @@
|
||||
<span class="rank-col">排名</span>
|
||||
<span class="avatar-col">头像</span>
|
||||
<span class="name-col">姓名</span>
|
||||
<span class="score-col">{{ displayConfig.individual.scoreColumn.displayName }}</span>
|
||||
<span v-if="displayConfig.individual.showLevel" class="level-col">等级</span>
|
||||
<span v-if="displayConfig.individual.showDepartment" class="dept-col">部门</span>
|
||||
<span class="score-col">{{ localDisplayConfig.individual?.scoreColumn?.displayName || '得分' }}</span>
|
||||
<span v-if="localDisplayConfig.individual?.showLevel" class="level-col">等级</span>
|
||||
<span v-if="localDisplayConfig.individual?.showDepartment" class="dept-col">部门</span>
|
||||
<span class="bonus-col">奖金</span>
|
||||
</div>
|
||||
<div
|
||||
@@ -87,9 +87,9 @@
|
||||
<span class="rank-col">{{ index + 1 }}</span>
|
||||
<span class="avatar-col">{{ item.avatar }}</span>
|
||||
<span class="name-col">{{ item.name }}</span>
|
||||
<span class="score-col">{{ displayConfig.individual.scoreColumn.displayStyle === 'amount' ? '¥' + item.score : item.score }}</span>
|
||||
<span v-if="displayConfig.individual.showLevel" class="level-col" :class="`level-${item.level}`">{{ item.level }}</span>
|
||||
<span v-if="displayConfig.individual.showDepartment" class="dept-col">{{ item.department }}</span>
|
||||
<span class="score-col">{{ localDisplayConfig.individual?.scoreColumn?.displayStyle === 'amount' ? '¥' + item.score : item.score }}</span>
|
||||
<span v-if="localDisplayConfig.individual?.showLevel" class="level-col" :class="`level-${item.level}`">{{ item.level }}</span>
|
||||
<span v-if="localDisplayConfig.individual?.showDepartment" class="dept-col">{{ item.department }}</span>
|
||||
<span class="bonus-col">¥{{ item.bonus }}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -102,9 +102,9 @@
|
||||
<div class="table-header" :style="{ 'grid-template-columns': teamGridTemplate }">
|
||||
<span class="rank-col">排名</span>
|
||||
<span class="name-col">战队名称</span>
|
||||
<span class="score-col">{{ displayConfig.team.totalScoreColumn.displayName }}</span>
|
||||
<span v-if="displayConfig.team.showMemberCount" class="member-col">人数</span>
|
||||
<span v-if="displayConfig.team.showLeader" class="leader-col">队长</span>
|
||||
<span class="score-col">{{ localDisplayConfig.team?.totalScoreColumn?.displayName || '总分' }}</span>
|
||||
<span v-if="localDisplayConfig.team?.showMemberCount" class="member-col">人数</span>
|
||||
<span v-if="localDisplayConfig.team?.showLeader" class="leader-col">队长</span>
|
||||
<span class="bonus-col">奖金</span>
|
||||
</div>
|
||||
<div
|
||||
@@ -119,9 +119,9 @@
|
||||
>
|
||||
<span class="rank-col">{{ index + 1 }}</span>
|
||||
<span class="name-col">{{ item.name }}</span>
|
||||
<span class="score-col">{{ displayConfig.team.totalScoreColumn.displayStyle === 'amount' ? '¥' + item.totalScore : item.totalScore }}</span>
|
||||
<span v-if="displayConfig.team.showMemberCount" class="member-col">{{ item.memberCount }}人</span>
|
||||
<span v-if="displayConfig.team.showLeader" class="leader-col">{{ item.leader }}</span>
|
||||
<span class="score-col">{{ localDisplayConfig.team?.totalScoreColumn?.displayStyle === 'amount' ? '¥' + item.totalScore : item.totalScore }}</span>
|
||||
<span v-if="localDisplayConfig.team?.showMemberCount" class="member-col">{{ item.memberCount }}人</span>
|
||||
<span v-if="localDisplayConfig.team?.showLeader" class="leader-col">{{ item.leader }}</span>
|
||||
<span class="bonus-col">¥{{ item.bonus }}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -141,17 +141,55 @@
|
||||
<script setup>
|
||||
import { ref, onMounted, onUnmounted, watch, computed } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import {
|
||||
individualRankings,
|
||||
teamRankings,
|
||||
import {
|
||||
individualRankings,
|
||||
teamRankings,
|
||||
bonusRules,
|
||||
displayConfig,
|
||||
battleEndTime,
|
||||
drumConfig
|
||||
drumConfig,
|
||||
initializeData
|
||||
} from '../data/mockData.js';
|
||||
|
||||
// 创建本地显示配置的副本,确保深拷贝
|
||||
const localDisplayConfig = ref(JSON.parse(JSON.stringify(displayConfig)));
|
||||
// 创建本地显示配置的副本,确保深拷贝并提供默认值
|
||||
const createDefaultDisplayConfig = () => ({
|
||||
individual: {
|
||||
scoreColumn: {
|
||||
displayName: '得分',
|
||||
displayStyle: 'number'
|
||||
},
|
||||
showLevel: true,
|
||||
showDepartment: true,
|
||||
columnWidths: {}
|
||||
},
|
||||
team: {
|
||||
totalScoreColumn: {
|
||||
displayName: '总分',
|
||||
displayStyle: 'number'
|
||||
},
|
||||
showMemberCount: true,
|
||||
showLeader: true,
|
||||
columnWidths: {}
|
||||
}
|
||||
});
|
||||
|
||||
// 创建默认奖金规则
|
||||
const createDefaultBonusRules = () => [
|
||||
{ rank: '1-3', description: '前三名', individualBonus: '¥10000, ¥8000, ¥5000', teamBonus: '¥50000, ¥30000, ¥20000' },
|
||||
{ rank: '4-10', description: '四至十名', individualBonus: '¥3000/人', teamBonus: '¥10000/队' },
|
||||
{ rank: '11-20', description: '十一至二十名', individualBonus: '¥1000/人', teamBonus: '¥5000/队' }
|
||||
];
|
||||
|
||||
const localDisplayConfig = ref(
|
||||
displayConfig ? JSON.parse(JSON.stringify(displayConfig)) : createDefaultDisplayConfig()
|
||||
);
|
||||
|
||||
// 确保奖金规则有默认值
|
||||
const displayBonusRules = computed(() => {
|
||||
return Array.isArray(bonusRules) && bonusRules.length > 0
|
||||
? bonusRules
|
||||
: createDefaultBonusRules();
|
||||
});
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
@@ -438,16 +476,6 @@ const goToAdmin = () => {
|
||||
router.push('/admin');
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
calculateCountdown();
|
||||
countdownInterval = setInterval(calculateCountdown, 1000);
|
||||
// 延迟初始化音频上下文,避免浏览器自动播放限制
|
||||
setTimeout(() => {
|
||||
// 不自动初始化音频,等待用户交互后再初始化
|
||||
}, 1000);
|
||||
startDrumAnimation();
|
||||
});
|
||||
|
||||
// 监听窗口点击事件,用于用户交互后初始化音频上下文
|
||||
document.addEventListener('click', initAudioContext, { once: true });
|
||||
document.addEventListener('touchstart', initAudioContext, { once: true });
|
||||
@@ -465,7 +493,18 @@ const handleResize = () => {
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
onMounted(async () => {
|
||||
try {
|
||||
// 异步初始化数据
|
||||
await initializeData();
|
||||
// 更新本地显示配置
|
||||
localDisplayConfig.value = displayConfig ? JSON.parse(JSON.stringify(displayConfig)) : createDefaultDisplayConfig();
|
||||
} catch (error) {
|
||||
console.error('初始化数据失败:', error);
|
||||
// 使用默认配置
|
||||
localDisplayConfig.value = createDefaultDisplayConfig();
|
||||
}
|
||||
|
||||
calculateCountdown();
|
||||
countdownInterval = setInterval(calculateCountdown, 10); // 改为10ms更新一次以显示毫秒
|
||||
startDrumAnimation();
|
||||
|
||||
Reference in New Issue
Block a user