index.js 4.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { createRouter, createWebHashHistory } from 'vue-router'
  2. const routes = [
  3. {
  4. path: '/login',
  5. name: 'Login',
  6. component: () => import('../views/auth/LoginView.vue'),
  7. meta: { guest: true, title: '登录' }
  8. },
  9. // Open Design enterprise workspace shell
  10. {
  11. path: '/',
  12. component: () => import('../components/shell/AppShell.vue'),
  13. children: [
  14. { path: '', redirect: '/workspace' },
  15. { path: 'workspace', name: 'Workspace', component: () => import('../views/workspace/WorkspaceView.vue'), meta: { title: '工作台' } },
  16. { path: 'periods', name: 'Periods', component: () => import('../views/period/PeriodListView.vue'), meta: { title: '考核周期' } },
  17. { path: 'period/templates', name: 'KpiTemplates', component: () => import('../views/period/KpiTemplateView.vue'), meta: { title: '绩效模板' } },
  18. { path: 'okr/my', name: 'MyOkr', component: () => import('../views/okr/MyOkrView.vue'), meta: { title: '我的 OKR' }, props: route => ({ periodId: route.query.periodId ? Number(route.query.periodId) : null }) },
  19. { path: 'okr/team', name: 'TeamOkr', component: () => import('../views/okr/TeamOkrView.vue'), meta: { title: '团队 OKR' } },
  20. { path: 'okr/team/:userId', name: 'TeamMemberOkrDetail', component: () => import('../views/okr/TeamMemberOkrDetailView.vue'), meta: { title: '成员 OKR 详情' } },
  21. { path: 'okr/alignment', name: 'OkrAlignment', component: () => import('../views/okr/AlignmentView.vue'), meta: { title: 'OKR 对齐' } },
  22. { path: 'okr/execution', name: 'OkrExecution', component: () => import('../views/okr/OkrExecutionView.vue'), meta: { title: '执行进度' } },
  23. { path: 'scores/my', name: 'MyScores', component: () => import('../views/scoring/MyResultView.vue'), meta: { title: '我的绩效' } },
  24. { path: 'scores/history', name: 'ScoreHistory', component: () => import('../views/scoring/HistoryView.vue'), meta: { title: '历史绩效' } },
  25. { path: 'scores/review', name: 'ScoringList', component: () => import('../views/scoring/ScoringListView.vue'), meta: { title: '绩效打分' } },
  26. { path: 'scores/review/:userId', name: 'ScoringDetail', component: () => import('../views/scoring/ScoringEditView.vue'), meta: { title: '绩效考评' } },
  27. { path: 'scores/peer-review/:invitationId', name: 'PeerReviewInvitation', component: () => import('../views/scoring/PeerReviewInvitationView.vue'), meta: { title: '360 环评' } },
  28. { path: 'scores/appeal', name: 'ScoreAppeals', component: () => import('../views/scoring/ScoreAppealView.vue'), meta: { title: '绩效申诉' } },
  29. { path: 'feedback', name: 'Feedback', component: () => import('../views/feedback/FeedbackView.vue'), meta: { title: '绩效沟通' } },
  30. { path: 'org', name: 'Org', component: () => import('../views/org/OrgView.vue'), meta: { title: '组织架构' } },
  31. { path: 'dimensions', name: 'Dimensions', component: () => import('../views/system/DimensionConfigView.vue'), meta: { title: '考核维度' } },
  32. { path: 'logs', name: 'SystemLogs', component: () => import('../views/system/LogView.vue'), meta: { title: '操作日志' } },
  33. { path: 'notifications', name: 'Notifications', component: () => import('../views/notification/NotificationView.vue'), meta: { title: '消息通知' } }
  34. ]
  35. },
  36. // Legacy shell — keep for backward compatibility
  37. {
  38. path: '/legacy',
  39. component: () => import('../components/MainLayout.vue'),
  40. children: [
  41. { path: 'scoring', name: 'ScoringLegacy', component: () => import('../views/scoring/ScoringListView.vue'), meta: { title: '绩效打分' } },
  42. { path: 'scoring/:userId', name: 'ScoringDetailLegacy', component: () => import('../views/scoring/ScoringEditView.vue'), meta: { title: '绩效考评' } },
  43. { path: 'kpi/templates', name: 'KpiTemplatesLegacy', component: () => import('../views/period/KpiTemplateView.vue'), meta: { title: '绩效模板' } },
  44. { path: 'system/dimensions', name: 'DimensionsLegacy', component: () => import('../views/system/DimensionConfigView.vue'), meta: { title: '考核维度' } },
  45. { path: 'system/logs', name: 'SystemLogsLegacy', component: () => import('../views/system/LogView.vue'), meta: { title: '操作日志' } },
  46. { path: 'score-appeals', name: 'ScoreAppealsLegacy', component: () => import('../views/scoring/ScoreAppealView.vue'), meta: { title: '绩效申诉' } }
  47. ]
  48. }
  49. ]
  50. const router = createRouter({
  51. history: createWebHashHistory(),
  52. routes
  53. })
  54. router.beforeEach((to, from, next) => {
  55. const token = localStorage.getItem('accessToken')
  56. if (to.meta.guest) {
  57. next()
  58. } else if (!token) {
  59. next('/login')
  60. } else {
  61. next()
  62. }
  63. })
  64. export default router