1cde345ed9
2.修复deepseek模型调用问题,舍弃思考过程AI响应内容,只获取结果内容 3.新增会话过期机制,更新后添加到.env中 4.支持用户在生成章节内容时设置字数
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import type { ReactNode } from 'react';
|
|
import { Navigate, useLocation } from 'react-router-dom';
|
|
import { Spin } from 'antd';
|
|
import { authApi } from '../services/api';
|
|
import { sessionManager } from '../utils/sessionManager';
|
|
|
|
interface ProtectedRouteProps {
|
|
children: ReactNode;
|
|
}
|
|
|
|
export default function ProtectedRoute({ children }: ProtectedRouteProps) {
|
|
const [isAuthenticated, setIsAuthenticated] = useState<boolean | null>(null);
|
|
const location = useLocation();
|
|
|
|
useEffect(() => {
|
|
const checkAuth = async () => {
|
|
try {
|
|
await authApi.getCurrentUser();
|
|
setIsAuthenticated(true);
|
|
// 启动会话管理器
|
|
sessionManager.start();
|
|
} catch {
|
|
setIsAuthenticated(false);
|
|
// 停止会话管理器
|
|
sessionManager.stop();
|
|
}
|
|
};
|
|
checkAuth();
|
|
|
|
return () => {
|
|
// 组件卸载时不停止会话管理器,让它在整个应用生命周期内运行
|
|
};
|
|
}, []);
|
|
|
|
if (isAuthenticated === null) {
|
|
return (
|
|
<div style={{
|
|
display: 'flex',
|
|
justifyContent: 'center',
|
|
alignItems: 'center',
|
|
minHeight: '100vh',
|
|
}}>
|
|
<Spin size="large" />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (!isAuthenticated) {
|
|
return <Navigate to={`/login?redirect=${encodeURIComponent(location.pathname)}`} replace />;
|
|
}
|
|
|
|
return <>{children}</>;
|
|
} |