|
|
import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'
|
|
|
|
|
|
// 部署在/admin/子路径下时,base必须是/admin/
|
|
|
// 本地开发(npm run dev)时base是/
|
|
|
const routerBase = import.meta.env.BASE_URL
|
|
|
|
|
|
// 管理后台Layout
|
|
|
const AdminLayout = () => import('@/layouts/AdminLayout.vue')
|
|
|
// 大屏Layout
|
|
|
const ScreenLayout = () => import('@/layouts/ScreenLayout.vue')
|
|
|
|
|
|
// 页面组件
|
|
|
const LoginPage = () => import('@/views/login/LoginPage.vue')
|
|
|
const DashboardPage = () => import('@/views/dashboard/DashboardPage.vue')
|
|
|
const MachineListPage = () => import('@/views/machine/MachineListPage.vue')
|
|
|
const MachineDetailPage = () => import('@/views/machine/MachineDetailPage.vue')
|
|
|
const BrandListPage = () => import('@/views/brand/BrandListPage.vue')
|
|
|
const BrandEditPage = () => import('@/views/brand/BrandEditPage.vue')
|
|
|
const CollectAddressListPage = () => import('@/views/collect-address/CollectAddressListPage.vue')
|
|
|
const CollectAddressDetailPage = () => import('@/views/collect-address/CollectAddressDetailPage.vue')
|
|
|
const WorkerListPage = () => import('@/views/worker/WorkerListPage.vue')
|
|
|
const WorkerDetailPage = () => import('@/views/worker/WorkerDetailPage.vue')
|
|
|
const ProductionPage = () => import('@/views/production/ProductionPage.vue')
|
|
|
const AlertPage = () => import('@/views/alert/AlertPage.vue')
|
|
|
const SettingsPage = () => import('@/views/settings/SettingsPage.vue')
|
|
|
const LogPage = () => import('@/views/log/LogPage.vue')
|
|
|
const ScreenConfigPage = () => import('@/views/screen-config/ScreenConfigPage.vue')
|
|
|
const ScreenPage = () => import('@/views/screen/ScreenPage.vue')
|
|
|
const CollectLogPage = () => import('@/views/collect-log/CollectLogPage.vue')
|
|
|
const SimulatorPage = () => import('@/views/simulator/SimulatorPage.vue')
|
|
|
const SimulatorDetailPage = () => import('@/views/simulator/SimulatorDetailPage.vue')
|
|
|
|
|
|
// 正常路由
|
|
|
const normalRoutes: RouteRecordRaw[] = [
|
|
|
{ path: '/login', name: 'Login', component: LoginPage, meta: { title: '登录' } },
|
|
|
{
|
|
|
path: '/',
|
|
|
component: AdminLayout,
|
|
|
redirect: '/dashboard',
|
|
|
children: [
|
|
|
{ path: 'dashboard', name: 'Dashboard', component: DashboardPage, meta: { title: '仪表盘' } },
|
|
|
{ path: 'machine', name: 'MachineList', component: MachineListPage, meta: { title: '设备管理' } },
|
|
|
{ path: 'machine/:id', name: 'MachineDetail', component: MachineDetailPage, meta: { title: '设备详情' } },
|
|
|
{ path: 'brand', name: 'BrandList', component: BrandListPage, meta: { title: '品牌模板' } },
|
|
|
{ path: 'brand/create', name: 'BrandCreate', component: BrandEditPage, meta: { title: '新增品牌' } },
|
|
|
{ path: 'brand/:id/edit', name: 'BrandEdit', component: BrandEditPage, meta: { title: '编辑品牌' } },
|
|
|
{ path: 'collect-address', name: 'CollectAddressList', component: CollectAddressListPage, meta: { title: '采集地址' } },
|
|
|
{ path: 'collect-address/:id', name: 'CollectAddressDetail', component: CollectAddressDetailPage, meta: { title: '采集地址详情' } },
|
|
|
{ path: 'collect-log', name: 'CollectLog', component: CollectLogPage, meta: { title: '采集日志' } },
|
|
|
{ path: 'worker', name: 'WorkerList', component: WorkerListPage, meta: { title: '员工管理' } },
|
|
|
{ path: 'worker/:id', name: 'WorkerDetail', component: WorkerDetailPage, meta: { title: '员工详情' } },
|
|
|
{ path: 'production', name: 'Production', component: ProductionPage, meta: { title: '产量报表' } },
|
|
|
{ path: 'alert', name: 'Alert', component: AlertPage, meta: { title: '告警中心' } },
|
|
|
{ path: 'settings', name: 'Settings', component: SettingsPage, meta: { title: '系统设置' } },
|
|
|
{ path: 'log', name: 'Log', component: LogPage, meta: { title: '操作日志' } },
|
|
|
{ path: 'screen-config', name: 'ScreenConfig', component: ScreenConfigPage, meta: { title: '大屏配置' } },
|
|
|
{ path: 'simulator', name: 'Simulator', component: SimulatorPage, meta: { title: '模拟采集' } },
|
|
|
{ path: 'simulator/:port', name: 'SimulatorDetail', component: SimulatorDetailPage, meta: { title: '模拟详情' } },
|
|
|
],
|
|
|
},
|
|
|
{
|
|
|
path: '/screen',
|
|
|
component: ScreenLayout,
|
|
|
children: [
|
|
|
{ path: '', name: 'Screen', component: ScreenPage, meta: { title: '大屏看板' } },
|
|
|
],
|
|
|
},
|
|
|
]
|
|
|
|
|
|
// Mock路由:复制正常路由,添加/mock前缀
|
|
|
function generateMockRoutes(routes: RouteRecordRaw[]): RouteRecordRaw[] {
|
|
|
const mockRoutes: RouteRecordRaw[] = []
|
|
|
for (const route of routes) {
|
|
|
if (route.path === '/login') {
|
|
|
mockRoutes.push({ path: '/mock/login', name: 'MockLogin', component: route.component!, meta: { ...route.meta, mock: true } })
|
|
|
} else if (route.path === '/') {
|
|
|
mockRoutes.push({
|
|
|
path: '/mock',
|
|
|
component: route.component,
|
|
|
redirect: '/mock/dashboard',
|
|
|
children: (route.children || []).map(child => ({
|
|
|
...child,
|
|
|
path: child.path,
|
|
|
name: `Mock${String(child.name)}`,
|
|
|
meta: { ...child.meta, mock: true },
|
|
|
})),
|
|
|
})
|
|
|
} else if (route.path === '/screen') {
|
|
|
mockRoutes.push({
|
|
|
path: '/mock/screen',
|
|
|
component: route.component,
|
|
|
children: (route.children || []).map(child => ({
|
|
|
...child,
|
|
|
path: child.path,
|
|
|
name: `Mock${String(child.name)}`,
|
|
|
meta: { ...child.meta, mock: true },
|
|
|
})),
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
return mockRoutes
|
|
|
}
|
|
|
|
|
|
const router = createRouter({
|
|
|
history: createWebHistory(routerBase),
|
|
|
routes: [...normalRoutes, ...generateMockRoutes(normalRoutes)],
|
|
|
})
|
|
|
|
|
|
// 路由守卫
|
|
|
router.beforeEach((to, _from, next) => {
|
|
|
const token = localStorage.getItem('token')
|
|
|
const isMock = to.path.startsWith('/mock')
|
|
|
|
|
|
// 大屏免认证
|
|
|
if (to.path === '/screen' || to.path === '/mock/screen') {
|
|
|
next()
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// 访问登录页:已登录则跳转首页
|
|
|
if (to.path === '/login' || to.path === '/mock/login') {
|
|
|
if (token) {
|
|
|
next(isMock ? '/mock/dashboard' : '/dashboard')
|
|
|
} else {
|
|
|
next()
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// 访问管理后台:未登录则跳转登录
|
|
|
if (!token) {
|
|
|
next(isMock ? '/mock/login' : '/login')
|
|
|
return
|
|
|
}
|
|
|
|
|
|
next()
|
|
|
})
|
|
|
|
|
|
export default router
|