You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

0 lines
12 KiB

1 month ago
  1. {"ast":null,"code":"import { createRouter, createWebHistory } from 'vue-router';\nimport store from '@/store';\nimport Layout from '@/components/layout/index.vue';\nimport { ElMessage } from 'element-plus';\nconst routes = [{\n path: '/login',\n name: 'Login',\n component: () => import('@/views/login/index.vue'),\n meta: {\n requiresAuth: false\n }\n}, {\n path: '/register',\n name: 'Register',\n component: () => import('@/views/register/index.vue'),\n meta: {\n requiresAuth: false\n }\n}, {\n path: '/',\n component: Layout,\n meta: {\n requiresAuth: true\n },\n children: [{\n path: '',\n name: 'Home',\n redirect: () => {\n const userInfo = store.state.userInfo;\n if (!userInfo || !userInfo.roles) return '/login';\n\n // 使用 roles 数组判断\n if (userInfo.roles.includes('ROLE_ADMIN') || userInfo.roles.includes('ROLE_LOGISTICS_ADMIN')) {\n return '/admin/orders';\n } else if (userInfo.roles.includes('ROLE_WAREHOUSE_ADMIN')) {\n return '/orders/create';\n } else if (userInfo.roles.includes('ROLE_USER')) {\n return '/orders/my';\n } else {\n return '/orders/my';\n }\n }\n },\n // 普通用户路由\n {\n path: 'orders/my',\n name: 'MyOrders',\n component: () => import('@/views/order/OrderList.vue'),\n meta: {\n title: '我的订单',\n roles: ['ROLE_USER', 'ROLE_WAREHOUSE_ADMIN']\n }\n },\n // 仓库管理员路由\n {\n path: 'orders/create',\n name: 'CreateOrder',\n component: () => import('@/views/order/OrderCreate.vue'),\n meta: {\n title: '创建订单',\n roles: ['ROLE_WAREHOUSE_ADMIN']\n }\n },\n // 所有用户可访问\n {\n path: 'orders/detail/:id',\n name: 'OrderDetail',\n component: () => import('@/views/order/OrderDetail.vue'),\n meta: {\n title: '订单详情',\n requiresAuth: true\n }\n }]\n},\n// 管理员路由组\n{\n path: '/admin',\n component: Layout,\n meta: {\n requiresAuth: true\n },\n children: [{\n path: 'orders',\n name: 'OrderManagement',\n component: () => import('@/views/admin/OrderManagement.vue'),\n meta: {\n title: '订单管理',\n roles: ['ROLE_ADMIN', 'ROLE_LOGISTICS_ADMIN']\n }\n }, {\n path: 'users',\n name: 'UserManagement',\n component: () => import('@/views/admin/UserManagement.vue'),\n meta: {\n title: '用户管理',\n roles: ['ROLE_ADMIN']\n }\n }]\n}];\nconst router = createRouter({\n history: createWebHistory(),\n routes\n});\nrouter.beforeEach((to, from, next) => {\n const token = store.state.token;\n const userRoles = store.state.userInfo?.roles || [];\n\n // 不需要登录的页面直接通过\n if (to.meta.requiresAuth === false) {\n next();\n return;\n }\n\n // 没有token跳转登录\n if (!token) {\n next('/login');\n return;\n }\n\n // 已登录要去登录页,跳转首页\n if (to.path === '/login') {\n next('/');\n return;\n }\n\n // 检查路由是否需要特定角色\n if (to.meta.roles) {\n if (!userRoles.length) {\n ElMessage.error('用户角色信息缺失');\n store.dispatch('logout');\n next('/login');\n return;\n }\n\n // 检查是否有所需的任一角色\n const hasPermission = to.meta.roles.some(role => userRoles.includes(role));\n if (!hasPermission) {\n ElMessage.error('没有权限访问此页面');\n // 根据角色重定向到对应的首页\n if (userRoles.includes('ROLE_ADMIN') || userRoles.includes('ROLE_LOGISTICS_ADMIN')) {\n next('/admin/orders');\n } else if (userRoles.includes('ROLE_WAREHOUSE_ADMIN')) {\n next('/orders/create');\n } else if (userRoles.includes('ROLE_USER')) {\n next('/orders/my');\n } else {\n next('/login');\n }\n return;\n }\n }\n next();\n});\nexport default router;","map":{"version":3,"names":["createRouter","createWebHistory","store","Layout","ElMessage","routes","path","name","component","meta","requiresAuth","children","redire