import { useEffect, lazy, Suspense } from 'react'; import { HashRouter, Routes, Route, Navigate } from 'react-router-dom'; import { ConfigProvider, theme as antdTheme, Spin } from 'antd'; import zhCN from 'antd/locale/zh_CN'; import MainLayout from './layouts/MainLayout'; import Login from './pages/Login'; import { ErrorBoundary } from './components/ErrorBoundary'; import { useAuthStore } from './stores/auth'; import { useAppStore } from './stores/app'; const Home = lazy(() => import('./pages/Home')); const Users = lazy(() => import('./pages/Users')); const Roles = lazy(() => import('./pages/Roles')); const Organizations = lazy(() => import('./pages/Organizations')); const Workflow = lazy(() => import('./pages/Workflow')); const Messages = lazy(() => import('./pages/Messages')); const Settings = lazy(() => import('./pages/Settings')); const PluginAdmin = lazy(() => import('./pages/PluginAdmin')); const PluginMarket = lazy(() => import('./pages/PluginMarket')); const PluginCRUDPage = lazy(() => import('./pages/PluginCRUDPage')); const PluginTabsPage = lazy(() => import('./pages/PluginTabsPage').then((m) => ({ default: m.PluginTabsPage }))); const PluginTreePage = lazy(() => import('./pages/PluginTreePage').then((m) => ({ default: m.PluginTreePage }))); const PluginGraphPage = lazy(() => import('./pages/PluginGraphPage').then((m) => ({ default: m.PluginGraphPage }))); const PluginDashboardPage = lazy(() => import('./pages/PluginDashboardPage').then((m) => ({ default: m.PluginDashboardPage }))); const PluginKanbanPage = lazy(() => import('./pages/PluginKanbanPage')); function PrivateRoute({ children }: { children: React.ReactNode }) { const isAuthenticated = useAuthStore((s) => s.isAuthenticated); return isAuthenticated ? <>{children} : ; } const themeConfig = { token: { colorPrimary: '#0075de', colorSuccess: '#1aae39', colorWarning: '#dd5b00', colorError: '#e5534b', colorInfo: '#0075de', colorBgLayout: '#f6f5f4', colorBgContainer: '#ffffff', colorBgElevated: '#ffffff', colorBorder: 'rgba(0, 0, 0, 0.1)', colorBorderSecondary: 'rgba(0, 0, 0, 0.06)', borderRadius: 4, borderRadiusLG: 8, borderRadiusSM: 2, fontFamily: "'Inter', -apple-system, system-ui, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', 'Hiragino Sans GB', Helvetica, Arial, sans-serif", fontSize: 14, fontSizeHeading4: 20, controlHeight: 36, controlHeightLG: 40, controlHeightSM: 28, boxShadow: 'none', boxShadowSecondary: 'rgba(0,0,0,0.04) 0px 4px 18px, rgba(0,0,0,0.027) 0px 2.025px 7.85px', }, components: { Button: { primaryShadow: 'none', fontWeight: 500, }, Card: { paddingLG: 20, }, Table: { headerBg: '#fafaf9', headerColor: '#615d59', rowHoverBg: '#f2f9ff', fontSize: 14, }, Menu: { itemBorderRadius: 4, itemMarginInline: 8, itemHeight: 36, }, Modal: { borderRadiusLG: 12, }, Tag: { borderRadiusSM: 4, }, }, }; const darkThemeConfig = { ...themeConfig, token: { ...themeConfig.token, colorBgLayout: '#191918', colorBgContainer: '#232322', colorBgElevated: '#2a2a29', colorBorder: 'rgba(255, 255, 255, 0.08)', colorBorderSecondary: 'rgba(255, 255, 255, 0.05)', boxShadow: 'none', boxShadowSecondary: 'rgba(0,0,0,0.2) 0px 4px 18px, rgba(0,0,0,0.15) 0px 2px 8px', }, components: { ...themeConfig.components, Table: { headerBg: '#2a2a29', headerColor: '#a39e98', rowHoverBg: '#2a2a29', }, }, }; export default function App() { const loadFromStorage = useAuthStore((s) => s.loadFromStorage); const themeMode = useAppStore((s) => s.theme); useEffect(() => { loadFromStorage(); }, [loadFromStorage]); useEffect(() => { document.documentElement.setAttribute('data-theme', themeMode); }, [themeMode]); const isDark = themeMode === 'dark'; return ( <> 跳转到主要内容 } /> }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); }