diff --git a/frontend-h5/src/main.ts b/frontend-h5/src/main.ts
index 4d23dac..a5fd2e8 100644
--- a/frontend-h5/src/main.ts
+++ b/frontend-h5/src/main.ts
@@ -34,10 +34,26 @@ app.use(router)
// 不需要在这里手动注册,减小打包体积
// --------------------------------------------------------------------------
-// 挂载应用到 DOM
+// 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)
// --------------------------------------------------------------------------
diff --git a/frontend-h5/src/router/index.ts b/frontend-h5/src/router/index.ts
index b5052b9..1b3f084 100644
--- a/frontend-h5/src/router/index.ts
+++ b/frontend-h5/src/router/index.ts
@@ -10,6 +10,14 @@
import { createRouter, createWebHistory } from 'vue-router'
+// v0.5.2 优化:ChatView 是 99% 用户唯一访问的页面,改用静态 import
+// 之前用 () => import() 懒加载,首次访问要二次下载 301KB 的 ChatView chunk
+// → 表现为白屏→突然全显示
+import ChatView from '@/views/ChatView.vue'
+// v0.5.4 BC/DR 应急页(身份检测 + H5 右栏)
+import EmergencyDispatcher from '@/views/EmergencyDispatcher.vue'
+import H5PreviewView from '@/views/H5PreviewView.vue'
+
// --------------------------------------------------------------------------
// 企微环境检测工具函数
// --------------------------------------------------------------------------
@@ -33,8 +41,8 @@ const routes = [
{
path: '/',
name: 'ChatView',
- // 懒加载:首次访问时才加载组件,减小首屏体积
- component: () => import('@/views/ChatView.vue'),
+ // v0.5.2:首页静态引入,避免 301KB chunk 二次下载导致白屏
+ component: ChatView,
meta: { title: 'IT智能服务台', requiresAuth: true },
},
{
@@ -49,6 +57,19 @@ const routes = [
component: () => import('@/views/WeworkOnly.vue'),
meta: { title: '请在企业微信中打开', requiresAuth: false },
},
+ // v0.5.4 BC/DR 应急页(身份检测 + 员工右栏视图)
+ {
+ path: '/emergency',
+ name: 'EmergencyDispatcher',
+ component: EmergencyDispatcher,
+ meta: { title: '应急身份检测', requiresAuth: false },
+ },
+ {
+ path: '/h5-preview',
+ name: 'H5Preview',
+ component: H5PreviewView,
+ meta: { title: '员工自助', requiresAuth: false },
+ },
// 404 兜底:未匹配的路径重定向到首页
{
path: '/:pathMatch(.*)*',
@@ -67,8 +88,14 @@ const router = createRouter({
// 路由守卫 — 企微环境检测 + 认证检查
// --------------------------------------------------------------------------
router.beforeEach(async (to, _from, next) => {
- // WeworkOnly 页面和 Login 页面不需要企微检测
- if (to.name === 'WeworkOnly' || to.name === 'Login') {
+ // v0.5.4 应急页(身份检测 + 预览页)不需要企微 OAuth2 认证
+ // 由 EmergencyDispatcher 自己调企微 JS-SDK 检测角色
+ if (
+ to.name === 'WeworkOnly' ||
+ to.name === 'Login' ||
+ to.name === 'EmergencyDispatcher' ||
+ to.name === 'H5Preview'
+ ) {
next()
return
}
diff --git a/frontend-h5/src/views/EmergencyDispatcher.vue b/frontend-h5/src/views/EmergencyDispatcher.vue
new file mode 100644
index 0000000..6af559b
--- /dev/null
+++ b/frontend-h5/src/views/EmergencyDispatcher.vue
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
IT 智能服务台
+
{{ statusText }}
+
+
{{ errorMsg }}
+
+
+
+
+
+
+
diff --git a/frontend-h5/src/views/H5PreviewView.vue b/frontend-h5/src/views/H5PreviewView.vue
new file mode 100644
index 0000000..dcefe66
--- /dev/null
+++ b/frontend-h5/src/views/H5PreviewView.vue
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
🤖
+
+
员工自助
+
IT 智能服务台 · 应急模式
+
+
+
+
+
+
+ userid: {{ userid || 'anonymous' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
💡 电脑端访问可获得完整体验(右栏常驻显示)
+
移动端请点上方"右栏"按钮打开内容
+
+
+
+
+
+
+
diff --git a/frontend-portal/package-lock.json b/frontend-portal/package-lock.json
index 2e287b1..88bab3d 100644
--- a/frontend-portal/package-lock.json
+++ b/frontend-portal/package-lock.json
@@ -20,6 +20,10 @@
"typescript": "^5.5.0",
"vite": "^5.3.0",
"vue-tsc": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=20.0.0 <21.0.0",
+ "pnpm": ">=9.0.0"
}
},
"node_modules/@babel/helper-string-parser": {
diff --git a/frontend-portal/src/views/PortalSelect.vue b/frontend-portal/src/views/PortalSelect.vue
index 9858c48..f4b3619 100644
--- a/frontend-portal/src/views/PortalSelect.vue
+++ b/frontend-portal/src/views/PortalSelect.vue
@@ -123,7 +123,7 @@