All files / src/router index.ts

0% Statements 0/20
0% Branches 0/8
0% Functions 0/10
0% Lines 0/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40                                                                               
import { createRouter, createWebHistory } from 'vue-router'
import { userManager, signinRedirect } from '@/utils/oidc'
 
const router = createRouter({
  history: createWebHistory(),
  // 移动端 H5:切页回到顶部,否则从长列表进详情会停在半屏
  scrollBehavior: () => ({ top: 0 }),
  routes: [
    { path: '/', name: 'home', component: () => import('@/views/HomeView.vue') },
    { path: '/statement', name: 'statement', component: () => import('@/views/StatementView.vue') },
    { path: '/statement/:id', name: 'statement-detail', component: () => import('@/views/StatementDetailView.vue') },
    { path: '/policies', name: 'policies', component: () => import('@/views/PoliciesView.vue') },
    { path: '/pipeline', name: 'pipeline', component: () => import('@/views/PipelineView.vue') },
    { path: '/customers', name: 'customers', component: () => import('@/views/CustomersView.vue') },
    { path: '/auth/callback', name: 'auth-callback', component: () => import('@/views/AuthCallbackView.vue') },
    { path: '/logged-out', name: 'logged-out', component: () => import('@/views/LoggedOutView.vue') },
    // 兜底:未登记路径回首页。缺这条时守卫放行后无匹配组件,<RouterView> 直接空白
    { path: '/:pathMatch(.*)*', redirect: '/' }
  ]
})
 
// 认证守卫:除回调/已退出页外,无有效登录态即发起 OIDC 授权(当前路径随授权 state 携带,回跳后还原)。
router.beforeEach(async (to) => {
  if (to.name === 'auth-callback' || to.name === 'logged-out') return true
 
  const user = await userManager.getUser()
  if (user && !user.expired) return true
 
  try {
    await signinRedirect(to.fullPath)
  } catch {
    // IdP 不可达时 signinRedirect 会 reject;不兜住会导致导航中断、整页空白
    return { name: 'logged-out' }
  }
  // 已发起整页跳转,终止本次导航
  return false
})
 
export default router