2025-10-15 14:07:39 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<div id="app">
|
2025-11-17 17:58:19 +08:00
|
|
|
|
<template v-if="pageLoaded">
|
|
|
|
|
|
<template v-if="!route.meta.screen">
|
2025-11-19 09:17:45 +08:00
|
|
|
|
<Index></Index>
|
2025-11-17 17:58:19 +08:00
|
|
|
|
</template>
|
|
|
|
|
|
<router-view v-else></router-view>
|
|
|
|
|
|
</template>
|
2025-11-19 09:17:45 +08:00
|
|
|
|
<!-- 路由加载中的指示器,避免白屏 -->
|
|
|
|
|
|
<div v-else class="loading-container">
|
|
|
|
|
|
<div class="loading-spinner"></div>
|
|
|
|
|
|
</div>
|
2025-10-15 14:07:39 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
2025-11-07 17:27:41 +08:00
|
|
|
|
<script setup>
|
2025-11-17 17:58:19 +08:00
|
|
|
|
import { ref } from 'vue'
|
2025-11-19 09:17:45 +08:00
|
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
2025-11-07 17:27:41 +08:00
|
|
|
|
import Index from "./views/index.vue";
|
2025-11-17 17:58:19 +08:00
|
|
|
|
import { onMounted } from 'vue';
|
2025-11-19 09:17:45 +08:00
|
|
|
|
|
2025-11-17 17:58:19 +08:00
|
|
|
|
const route = useRoute()
|
2025-11-19 09:17:45 +08:00
|
|
|
|
const router = useRouter()
|
2025-11-17 17:58:19 +08:00
|
|
|
|
const pageLoaded = ref(false)
|
2025-11-19 09:17:45 +08:00
|
|
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 等待路由完全准备好,确保 route.meta 已正确加载
|
|
|
|
|
|
// 这样可以避免大组件懒加载时的竞态条件问题
|
|
|
|
|
|
await router.isReady()
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
// 即使路由加载失败,也要显示页面,避免永久白屏
|
|
|
|
|
|
console.error('路由初始化失败:', error)
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
// 无论成功或失败,都设置 pageLoaded 为 true
|
2025-11-17 17:58:19 +08:00
|
|
|
|
pageLoaded.value = true
|
2025-11-19 09:17:45 +08:00
|
|
|
|
}
|
2025-11-17 17:58:19 +08:00
|
|
|
|
})
|
2025-10-15 14:07:39 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
|
2025-11-07 17:27:41 +08:00
|
|
|
|
<style lang="scss" scoped>
|
2025-10-15 14:07:39 +08:00
|
|
|
|
#app {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100vh;
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
}
|
2025-11-19 09:17:45 +08:00
|
|
|
|
|
|
|
|
|
|
.loading-container {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100vh;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
background-color: #0a0e27;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.loading-spinner {
|
|
|
|
|
|
width: 50px;
|
|
|
|
|
|
height: 50px;
|
|
|
|
|
|
border: 4px solid rgba(255, 255, 255, 0.1);
|
|
|
|
|
|
border-top-color: #409eff;
|
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
|
animation: spin 1s linear infinite;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@keyframes spin {
|
|
|
|
|
|
to {
|
|
|
|
|
|
transform: rotate(360deg);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-10-15 14:07:39 +08:00
|
|
|
|
</style>
|