import { createApp } from 'vue' import { ElMessage } from 'element-plus' import 'element-plus/theme-chalk/dark/css-vars.css' import App from './App.vue' import router, { installRouter } from './router' import pinia, { installStore } from '@/stores' import { installAssets } from '@/plugins/assets' import { installI18n } from '@/i18n' import { setAuthExpiredHandler } from '@/api/http' import { useAuthStore } from '@/stores/modules/auth' import { useMenuStore } from '@/stores/modules/menu' import { useDictStore } from '@/stores/modules/dict' import { usePermissionStore } from '@/stores/modules/permission' import { useTabsStore } from '@/stores/modules/tabs' import { vPermission } from '@/directives/permission' const app = createApp(App) app.directive('permission', vPermission) installRouter(app) installStore(app) // 会话过期(401 刷新失败)时:清状态 + 跳登录 setAuthExpiredHandler(() => { useAuthStore(pinia).reset() useMenuStore(pinia).reset() useDictStore(pinia).reset() usePermissionStore(pinia).reset() useTabsStore(pinia).removeAll() if (router.currentRoute.value.path !== '/login') { router.push('/login') } }) installI18n(app) installAssets() // 全局兜底:未捕获的组件错误 / Promise 拒绝,统一弹出错误提示(避免静默失败) app.config.errorHandler = (err) => { ElMessage.error(err instanceof Error ? err.message : String(err)) } window.addEventListener('unhandledrejection', (e) => { const reason = e.reason ElMessage.error(reason instanceof Error ? reason.message : String(reason)) }) app.mount('#app')