Files
silk/web/src/router.tsx
T

56 lines
2.8 KiB
TypeScript

import { Navigate, createBrowserRouter } from 'react-router-dom';
import Login from './pages/Login';
import Dashboard from './pages/Dashboard';
import Silkworm from './pages/Silkworm';
import Device from './pages/Device';
import Energy from './pages/Energy';
import Control from './pages/Control';
import IRControl from './pages/IRControl';
import Threshold from './pages/Threshold';
import Alert from './pages/Alert';
import Video from './pages/Video';
import Log from './pages/Log';
import Knowledge from './pages/Knowledge';
import NotFound from './pages/NotFound';
import { BasicLayout } from './layout/BasicLayout';
import { authService } from './services/auth';
const RequireAuth = ({ children }: { children: React.ReactNode }) => {
if (!authService.isLoggedIn()) return <Navigate to="/login" replace />;
return <>{children}</>;
};
// 路由权限守卫:未登录跳登录页,无权限跳仪表盘
const RequirePermission = ({ permission, children }: { permission: string; children: React.ReactNode }) => {
if (!authService.isLoggedIn()) return <Navigate to="/login" replace />;
if (!authService.hasPermission(permission)) return <Navigate to="/dashboard" replace />;
return <>{children}</>;
};
export const router = createBrowserRouter([
{ path: '/login', element: <Login /> },
{
element: (
<RequireAuth>
<BasicLayout />
</RequireAuth>
),
children: [
{ index: true, element: <Navigate to="/dashboard" replace /> },
{ path: 'dashboard', element: <RequirePermission permission="dashboard:view"><Dashboard /></RequirePermission> },
{ path: 'houses', element: <RequirePermission permission="room:read"><Silkworm /></RequirePermission> },
{ path: 'devices', element: <RequirePermission permission="device:read"><Device /></RequirePermission> },
{ path: 'energy', element: <RequirePermission permission="energy:view"><Energy /></RequirePermission> },
{ path: 'control', element: <RequirePermission permission="device:control"><Control /></RequirePermission> },
{ path: 'ir', element: <RequirePermission permission="device:control"><IRControl /></RequirePermission> },
{ path: 'thresholds', element: <RequirePermission permission="threshold:read"><Threshold /></RequirePermission> },
{ path: 'alerts', element: <RequirePermission permission="alarm:read"><Alert /></RequirePermission> },
{ path: 'videos', element: <RequirePermission permission="video:read"><Video /></RequirePermission> },
{ path: 'logs', element: <RequirePermission permission="log:read"><Log /></RequirePermission> },
{ path: 'knowledge', element: <RequirePermission permission="knowledge:read"><Knowledge /></RequirePermission> },
{ path: '404', element: <NotFound /> },
],
},
{ path: '*', element: <NotFound /> },
]);