// ============================================================================= // 企微IT智能服务台 — H5用户端应用入口 // ============================================================================= // 说明:Vue3 应用入口文件,负责: // 1. 创建 Vue 应用实例 // 2. 注册 Vant4 移动端组件库 // 3. 注册 Pinia 状态管理 // 4. 注册 Vue Router 路由 // 5. 挂载到 DOM // ============================================================================= import { createApp } from 'vue' // 根组件 import App from './App.vue' // 路由配置 import router from './router' // Pinia 状态管理 import { createPinia } from 'pinia' // 全局样式 import './styles/global.css' // 创建 Vue 应用实例 const app = createApp(App) // -------------------------------------------------------------------------- // 注册插件 // -------------------------------------------------------------------------- // Pinia: 状态管理(存储会话信息、摇人状态等) app.use(createPinia()) // Vue Router: 路由管理(页面跳转) app.use(router) // 注意:Vant 组件通过 vite 插件 unplugin-vue-components 按需自动导入, // 不需要在这里手动注册,减小打包体积 // -------------------------------------------------------------------------- // v0.5.2:挂载应用 + 显式关闭骨架屏(避免 :empty 选择器失效) // -------------------------------------------------------------------------- // 1. 记录挂载开始时间(用于最小显示时间) const mountStart = Date.now() // 2. 最小显示时间 500ms(防止 Vue 太快挂载导致骨架屏"闪一下看不见") const MIN_SKELETON_DISPLAY_MS = 500 app.mount('#app') // 3. 挂载完成后,主动给 body 加 .app-loaded 类名,触发 CSS 隐藏骨架屏 // 比之前用 :empty 选择器更可靠(尤其在 Vue mount < 100ms 的情况下) const elapsed = Date.now() - mountStart if (elapsed >= MIN_SKELETON_DISPLAY_MS) { document.body.classList.add('app-loaded') } else { setTimeout(() => { document.body.classList.add('app-loaded') }, MIN_SKELETON_DISPLAY_MS - elapsed) } // -------------------------------------------------------------------------- // 企微 OAuth2 授权检查(已迁移至路由守卫 router/index.ts) // -------------------------------------------------------------------------- // OAuth2 授权逻辑现在在路由守卫中统一处理: // 1. 检查 URL 中的 code 参数 // 2. 有 code → 调用后端 OAuth2 回调 // 3. 无 code → 跳转企微授权页面 // 参见:frontend-h5/src/router/index.ts 中的 router.beforeEach