mirror of
https://github.com/algerkong/AlgerMusicPlayer.git
synced 2026-04-03 14:20:50 +08:00
149 lines
3.9 KiB
Vue
149 lines
3.9 KiB
Vue
<template>
|
||
<div class="app-container" :class="{ mobile: isMobile, noElectron: !isElectron }">
|
||
<n-config-provider :theme="theme === 'dark' ? darkTheme : lightTheme">
|
||
<n-dialog-provider>
|
||
<n-message-provider>
|
||
<router-view></router-view>
|
||
<traffic-warning-drawer v-if="!isElectron"></traffic-warning-drawer>
|
||
</n-message-provider>
|
||
</n-dialog-provider>
|
||
</n-config-provider>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup lang="ts">
|
||
import { cloneDeep } from 'lodash';
|
||
import { darkTheme, lightTheme } from 'naive-ui';
|
||
import { computed, nextTick, onMounted, watch } from 'vue';
|
||
import { useI18n } from 'vue-i18n';
|
||
import { useRouter } from 'vue-router';
|
||
|
||
import TrafficWarningDrawer from '@/components/TrafficWarningDrawer.vue';
|
||
import homeRouter from '@/router/home';
|
||
import { useMenuStore } from '@/store/modules/menu';
|
||
import { usePlayerStore } from '@/store/modules/player';
|
||
import { useSettingsStore } from '@/store/modules/settings';
|
||
import { isElectron, isLyricWindow } from '@/utils';
|
||
|
||
import { initAudioListeners, initMusicHook } from './hooks/MusicHook';
|
||
import { audioService } from './services/audioService';
|
||
import { isMobile } from './utils';
|
||
import { useAppShortcuts } from './utils/appShortcuts';
|
||
|
||
const { locale } = useI18n();
|
||
const settingsStore = useSettingsStore();
|
||
const menuStore = useMenuStore();
|
||
const playerStore = usePlayerStore();
|
||
const router = useRouter();
|
||
|
||
// 监听语言变化
|
||
watch(
|
||
() => settingsStore.setData.language,
|
||
(newLanguage) => {
|
||
if (newLanguage && newLanguage !== locale.value) {
|
||
locale.value = newLanguage;
|
||
}
|
||
},
|
||
{ immediate: true }
|
||
);
|
||
|
||
const theme = computed(() => {
|
||
return settingsStore.theme;
|
||
});
|
||
|
||
// 监听字体变化并应用
|
||
watch(
|
||
() => [settingsStore.setData.fontFamily, settingsStore.setData.fontScope],
|
||
([newFont, fontScope]) => {
|
||
const appElement = document.body;
|
||
if (newFont && fontScope === 'global') {
|
||
appElement.style.fontFamily = newFont;
|
||
} else {
|
||
appElement.style.fontFamily = '';
|
||
}
|
||
}
|
||
);
|
||
|
||
const handleSetLanguage = (value: string) => {
|
||
console.log('应用语言变更:', value);
|
||
if (value) {
|
||
locale.value = value;
|
||
}
|
||
};
|
||
|
||
if (!isLyricWindow.value) {
|
||
settingsStore.initializeSettings();
|
||
settingsStore.initializeTheme();
|
||
settingsStore.initializeSystemFonts();
|
||
if (isMobile.value) {
|
||
menuStore.setMenus(homeRouter.filter((item) => item.meta.isMobile));
|
||
}
|
||
}
|
||
|
||
handleSetLanguage(settingsStore.setData.language);
|
||
|
||
// 监听迷你模式状态
|
||
if (isElectron) {
|
||
window.api.onLanguageChanged(handleSetLanguage);
|
||
window.electron.ipcRenderer.on('mini-mode', (_, value) => {
|
||
settingsStore.setMiniMode(value);
|
||
if (value) {
|
||
// 存储当前路由
|
||
localStorage.setItem('currentRoute', router.currentRoute.value.path);
|
||
router.push('/mini');
|
||
} else {
|
||
// 恢复当前路由
|
||
const currentRoute = localStorage.getItem('currentRoute');
|
||
if (currentRoute) {
|
||
router.push(currentRoute);
|
||
localStorage.removeItem('currentRoute');
|
||
} else {
|
||
router.push('/');
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
// 使用应用内快捷键
|
||
useAppShortcuts();
|
||
|
||
onMounted(async () => {
|
||
if (isLyricWindow.value) {
|
||
return;
|
||
}
|
||
// 先初始化播放状态
|
||
await playerStore.initializePlayState();
|
||
// 初始化 MusicHook,注入 playerStore
|
||
initMusicHook(playerStore);
|
||
|
||
// 如果有正在播放的音乐,则初始化音频监听器
|
||
if (playerStore.playMusic && playerStore.playMusic.id) {
|
||
// 使用 nextTick 确保 DOM 更新后再初始化
|
||
await nextTick();
|
||
initAudioListeners();
|
||
if (isElectron) {
|
||
window.api.sendSong(cloneDeep(playerStore.playMusic));
|
||
}
|
||
}
|
||
|
||
audioService.releaseOperationLock();
|
||
});
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.app-container {
|
||
@apply h-full w-full;
|
||
user-select: none;
|
||
}
|
||
|
||
.mobile {
|
||
.text-base {
|
||
font-size: 14px !important;
|
||
}
|
||
}
|
||
|
||
.html:has(.mobile) {
|
||
font-size: 14px;
|
||
}
|
||
</style>
|