import { createRouter, createWebHistory } from 'vue-router' import type { RouteRecordRaw } from 'vue-router' import Layout from '@/layout/index.vue' import { useUserStore } from '@/stores/user' const routes: Array = [ // 1. 登录页 { path: '/login', name: 'Login', component: () => import('@/views/login/index.vue'), meta: { hidden: true } }, // 2. 首页 Dashboard { path: '/', component: Layout, redirect: '/dashboard', children: [ { path: 'dashboard', name: 'Dashboard', component: () => import('@/views/dashboard/index.vue'), meta: { title: '首页', icon: 'HomeFilled' } } ] }, // 3. 基础信息 { path: '/material', component: Layout, redirect: '/material/index', children: [ { path: 'index', name: 'MaterialBase', component: () => import('@/views/material/list.vue'), meta: { title: '基础信息', icon: 'Box' } } ] }, // 4. 库存管理 { path: '/inventory', component: Layout, meta: { title: '库存管理', icon: 'Shop' }, redirect: '/inventory/buy', children: [ { path: 'buy', name: 'InventoryBuy', component: () => import('@/views/stock/inbound/buy.vue'), meta: { title: '采购件' } }, { path: 'semi', name: 'InventorySemi', component: () => import('@/views/stock/inbound/semi.vue'), meta: { title: '半成品' } }, { path: 'product', name: 'InventoryProduct', component: () => import('@/views/stock/inbound/product.vue'), meta: { title: '成品' } }, { path: 'service', name: 'InventoryService', component: () => import('@/views/stock/inbound/service.vue'), meta: { title: '服务权益' } } ] }, // 5. 业务操作 { path: '/operation', component: Layout, meta: { title: '业务操作', icon: 'Operation' }, redirect: '/operation/borrow', children: [ { path: 'borrow', name: 'OpBorrow', component: () => import('@/views/transaction/borrow.vue'), meta: { title: '借库' } }, { path: 'repair', name: 'OpRepair', component: () => import('@/views/transaction/return.vue'), meta: { title: '维修' } }, { path: 'scrap', name: 'OpScrap', component: () => import('@/views/transaction/scrap.vue'), meta: { title: '报废' } } ] }, // 6. 系统管理 { path: '/system', component: Layout, meta: { title: '系统管理', icon: 'Setting', roles: ['super_admin', 'supervisor'] }, children: [ { path: 'user-create', name: 'UserCreate', component: () => import('@/views/system/UserCreate.vue'), meta: { title: '账号开通', icon: 'User' } } ] }, // 404 路由 { path: '/:pathMatch(.*)*', redirect: '/dashboard', meta: { hidden: true } } ] const router = createRouter({ history: createWebHistory(), routes }) // ========================================== // [关键修改] 全局路由守卫 // ========================================== router.beforeEach((to, from, next) => { const userStore = useUserStore() // 1. 实时获取 Token (优先取 store,防止 store 未初始化取 localStorage) const token = userStore.token || localStorage.getItem('token') const userRole = userStore.role || localStorage.getItem('role') || 'user' // 2. 如果要去的是登录页 if (to.path === '/login') { // 如果有 Token,说明已登录,踢回首页 (防止重复登录) if (token) { next('/') } else { // 没有 Token,允许访问登录页 next() } return } // 3. 如果去的不是登录页,但没有 Token if (!token) { // 强制重定向到登录页 // 使用 replace 防止用户点击浏览器“返回”按钮时进入死循环 next({ path: '/login', replace: true }) return } // 4. 权限判断 (已有 Token) if (to.meta.roles && Array.isArray(to.meta.roles)) { if (to.meta.roles.includes(userRole)) { next() } else { // 权限不足,跳回首页 next('/dashboard') } } else { // 无特殊权限要求,放行 next() } }) export default router