Phase 3.1: Instance password AES-256-GCM encryption Phase 3.2: SQL audit rule engine (10 rules) Phase 3.3: Auto-audit on ticket creation Phase 3.4: Operation audit logs + GET /audit/logs Tests: 44 -> 85 (41 new), Frontend: AuditLogsPage
89 lines
3.2 KiB
TypeScript
89 lines
3.2 KiB
TypeScript
import { BrowserRouter, Routes, Route, Navigate, Outlet } from 'react-router-dom';
|
|
import { AuthProvider, useAuth } from '@/hooks/useAuth';
|
|
import { ThemeProvider } from '@/hooks/useTheme';
|
|
import Layout from '@/components/Layout';
|
|
import LoginPage from '@/pages/LoginPage';
|
|
import Dashboard from '@/pages/Dashboard';
|
|
import InstancePage from '@/pages/InstancePage';
|
|
import TicketsPage from '@/pages/TicketsPage';
|
|
import QueriesPage from '@/pages/QueriesPage';
|
|
import RolesPage from '@/pages/RolesPage';
|
|
import UsersPage from '@/pages/UsersPage';
|
|
import DataPermissionPage from '@/pages/DataPermissionPage';
|
|
import AuditRulesPage from '@/pages/AuditRulesPage';
|
|
import WorkflowPage from '@/pages/WorkflowPage';
|
|
import AutoTaskPage from '@/pages/AutoTaskPage';
|
|
import AnnouncementPage from '@/pages/AnnouncementPage';
|
|
import ConfigPlatformPage from '@/pages/ConfigPlatformPage';
|
|
import AuditLogsPage from '@/pages/AuditLogsPage';
|
|
|
|
// 路由守卫:未登录跳转登录页,无权限跳转仪表盘
|
|
function RouteGuard() {
|
|
const { isLoggedIn, hasPermission } = useAuth();
|
|
const path = location.pathname.slice(1) || 'dashboard';
|
|
|
|
if (!isLoggedIn) {
|
|
return <Navigate to="/login" replace />;
|
|
}
|
|
|
|
// 检查当前路径是否有权限访问
|
|
if (path !== 'dashboard' && !hasPermission(path)) {
|
|
return <Navigate to="/dashboard" replace />;
|
|
}
|
|
|
|
return <Outlet />;
|
|
}
|
|
|
|
// 登录页守卫:已登录用户自动跳转到仪表盘
|
|
function LoginGuard() {
|
|
const { isLoggedIn } = useAuth();
|
|
if (isLoggedIn) {
|
|
return <Navigate to="/dashboard" replace />;
|
|
}
|
|
return <LoginPage />;
|
|
}
|
|
|
|
function AppRoutes() {
|
|
return (
|
|
<Routes>
|
|
<Route path="/login" element={<LoginGuard />} />
|
|
<Route element={<RouteGuard />}>
|
|
<Route path="/" element={<Layout />}>
|
|
<Route index element={<Navigate to="/dashboard" replace />} />
|
|
<Route path="dashboard" element={<Dashboard />} />
|
|
<Route path="mysql" element={<InstancePage />} />
|
|
<Route path="postgres" element={<InstancePage />} />
|
|
<Route path="redis" element={<InstancePage />} />
|
|
<Route path="mongo" element={<InstancePage />} />
|
|
<Route path="tickets" element={<TicketsPage />} />
|
|
<Route path="queries" element={<QueriesPage />} />
|
|
<Route path="roles" element={<RolesPage />} />
|
|
<Route path="users" element={<UsersPage />} />
|
|
<Route path="data-permission" element={<DataPermissionPage />} />
|
|
<Route path="audit-rules" element={<AuditRulesPage />} />
|
|
<Route path="audit-logs" element={<AuditLogsPage />} />
|
|
<Route path="workflow" element={<WorkflowPage />} />
|
|
<Route path="auto-task" element={<AutoTaskPage />} />
|
|
<Route path="announcement" element={<AnnouncementPage />} />
|
|
<Route path="config-platform" element={<ConfigPlatformPage />} />
|
|
<Route path="*" element={<Navigate to="/dashboard" replace />} />
|
|
</Route>
|
|
</Route>
|
|
</Routes>
|
|
);
|
|
}
|
|
|
|
function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<ThemeProvider>
|
|
<AuthProvider>
|
|
<AppRoutes />
|
|
</AuthProvider>
|
|
</ThemeProvider>
|
|
</BrowserRouter>
|
|
);
|
|
}
|
|
|
|
export default App;
|