2025-09-09 08:23:59 +00:00
|
|
|
|
/*
|
|
|
|
|
|
* 开源代码,仅供学习和交流研究使用,商用请联系三丙
|
|
|
|
|
|
* 微信:mohan_88888
|
|
|
|
|
|
* 抖音:程序员三丙
|
2026-06-10 14:26:04 +08:00
|
|
|
|
* 付费课程:https://www.bilibili.com/cheese/play/ss942400790
|
2025-09-09 08:23:59 +00:00
|
|
|
|
*/
|
|
|
|
|
|
import React from 'react';
|
|
|
|
|
|
import {Navigate} from 'react-router-dom';
|
|
|
|
|
|
import {Spin} from 'antd';
|
|
|
|
|
|
import {useAuth} from '../contexts/AuthContext';
|
|
|
|
|
|
|
|
|
|
|
|
interface ProtectedRouteProps {
|
|
|
|
|
|
children: React.ReactNode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ children }) => {
|
|
|
|
|
|
const { isAuthenticated, loading } = useAuth();
|
|
|
|
|
|
|
|
|
|
|
|
if (loading) {
|
|
|
|
|
|
return (
|
|
|
|
|
|
<div style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
height: '100vh'
|
|
|
|
|
|
}}>
|
|
|
|
|
|
<Spin size="large" />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!isAuthenticated) {
|
|
|
|
|
|
return <Navigate to="/login" replace />;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return <>{children}</>;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
export default ProtectedRoute;
|
|
|
|
|
|
|