import { lazy, Suspense, useState, useEffect } from 'react' import { Routes, Route, Navigate } from 'react-router-dom' import { Toaster } from 'sonner' import { useAuthStore } from './store/authStore' import TopNav from './components/layout/TopNav' import SidebarNav from './components/layout/SidebarNav' import MobileTabBar from './components/layout/MobileTabBar' import OnboardingGuide from './components/OnboardingGuide' import PortalLayout from './components/layout/PortalLayout' import PageContainer from './components/layout/PageContainer' import { CommandPalette } from './components/ui/CommandPalette' import { SkeletonPage } from './components/ui/Skeleton' import ErrorBoundary from './components/ui/ErrorBoundary' const Login = lazy(() => import('./pages/auth/Login')) const Register = lazy(() => import('./pages/auth/Register')) const ForgotPassword = lazy(() => import('./pages/auth/ForgotPassword')) const Dashboard = lazy(() => import('./pages/Dashboard')) const Money = lazy(() => import('./pages/Money')) const SocialInsurance = lazy(() => import('./pages/SocialInsurance')) const Roster = lazy(() => import('./pages/Roster')) const OrgChart = lazy(() => import('./pages/OrgChart')) const SupportDashboard = lazy(() => import('./pages/support/SupportDashboard')) const Termination = lazy(() => import('./pages/Termination')) const AIAssistant = lazy(() => import('./pages/AIAssistant')) const Settings = lazy(() => import('./pages/Settings')) const Evidence = lazy(() => import('./pages/Evidence')) const Policies = lazy(() => import('./pages/Policies')) const Attendance = lazy(() => import('./pages/Attendance')) const Templates = lazy(() => import('./pages/Templates')) const AuditLog = lazy(() => import('./pages/AuditLog')) const Notifications = lazy(() => import('./pages/Notifications')) const PortalLogin = lazy(() => import('./pages/portal/PortalLogin')) const Payslip = lazy(() => import('./pages/portal/Payslip')) const MyContract = lazy(() => import('./pages/portal/MyContract')) const Onboarding = lazy(() => import('./pages/portal/Onboarding')) const ContractConfirm = lazy(() => import('./pages/portal/ContractConfirm')) const MyPolicies = lazy(() => import('./pages/portal/MyPolicies')) const AutoLogin = lazy(() => import('./pages/portal/AutoLogin')) const MedicalPeriodCalculator = lazy(() => import('./pages/tools/MedicalPeriodCalculator')) const HealthCheck = lazy(() => import('./pages/tools/HealthCheck')) const AnnualValueReport = lazy(() => import('./pages/tools/AnnualValueReport')) const CalendarPage = lazy(() => import('./pages/Calendar')) const MyAttendance = lazy(() => import('./pages/portal/MyAttendance')) const MyLeave = lazy(() => import('./pages/portal/MyLeave')) const SpecialStatus = lazy(() => import('./pages/SpecialStatus')) const CompanyFiles = lazy(() => import('./pages/CompanyFiles')) const LeaveApproval = lazy(() => import('./pages/LeaveApproval')) const TrainingRecords = lazy(() => import('./pages/roster/TrainingRecords')) const PerformanceRecords = lazy(() => import('./pages/roster/PerformanceRecords')) const DisciplinaryRecords = lazy(() => import('./pages/roster/DisciplinaryRecords')) // Sprint 4-5 新增页面 const EmployeeHome = lazy(() => import('./pages/portal/EmployeeHome')) const OnboardingProgress = lazy(() => import('./pages/portal/OnboardingProgress')) const ResignationApply = lazy(() => import('./pages/portal/ResignationApply')) const MyEsign = lazy(() => import('./pages/portal/MyEsign')) const MyRecords = lazy(() => import('./pages/portal/MyRecords')) const RiskCenter = lazy(() => import('./pages/compliance/RiskCenter')) const SalaryDashboard = lazy(() => import('./pages/SalaryDashboard')) const CommercialInsurance = lazy(() => import('./pages/CommercialInsurance')) const EmployeeBenefits = lazy(() => import('./pages/EmployeeBenefits')) const ESign = lazy(() => import('./pages/ESign')) const CommissionBonus = lazy(() => import('./pages/CommissionBonus')) // 平台管理端 const PlatformLogin = lazy(() => import('./pages/platform/PlatformLogin')) const PlatformDashboard = lazy(() => import('./pages/platform/PlatformDashboard')) const PlatformOrgs = lazy(() => import('./pages/platform/PlatformOrgs')) const PlatformUsers = lazy(() => import('./pages/platform/PlatformUsers')) const PlatformSidebar = lazy(() => import('./components/layout/PlatformSidebar')) function ProtectedRoute({ children }: { children: React.ReactNode }) { const isAuthenticated = useAuthStore((s) => s.isAuthenticated) if (!isAuthenticated) return return <>{children} } function PublicRoute({ children }: { children: React.ReactNode }) { const isAuthenticated = useAuthStore((s) => s.isAuthenticated) if (isAuthenticated) return return <>{children} } function AdminLayout({ children }: { children: React.ReactNode }) { const [sidebarOpen, setSidebarOpen] = useState(false) return (
setSidebarOpen(false)} />
setSidebarOpen(true)} />
}>{children}
) } function PlatformRoute({ children }: { children: React.ReactNode }) { const user = useAuthStore((s) => s.user) const isAuthenticated = useAuthStore((s) => s.isAuthenticated) if (!isAuthenticated || user?.role !== 'SUPER_ADMIN') return return <>{children} } function PlatformLayout({ children }: { children: React.ReactNode }) { const [sidebarOpen, setSidebarOpen] = useState(false) return (
setSidebarOpen(false)} />
平台管理后台 ADMIN
}>{children}
) } function PortalLayoutWrapper({ children, showNav = true }: { children: React.ReactNode; showNav?: boolean }) { if (!showNav) { return (
}>{children}
) } return ( }>{children} ) } export default function App() { const [cmdOpen, setCmdOpen] = useState(false) const isAuthenticated = useAuthStore((s) => s.isAuthenticated) useEffect(() => { const handler = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key === 'k') { e.preventDefault() if (isAuthenticated) setCmdOpen(true) } } window.addEventListener('keydown', handler) return () => window.removeEventListener('keydown', handler) }, [isAuthenticated]) return ( <> setCmdOpen(false)} /> {/* 管理端认证页面 */} }>} /> }>} /> }>} /> {/* 管理端业务页面 */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* 平台管理端 */} }>} /> } /> } /> } /> {/* 员工端 */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* 兜底 */} } /> ) }