feat: 1. 添加axios全局路由拦截进行自动添加请求jwt。 2.重新整理路由表。 3. 文档列表新增版本差异对比。 4.菜单路由可访问列表通过对接接口返回,添加全局路由检测。
5. 修改统一认证登录和管理员登录是通过接口形式进行,存储返回的accessToken。 6. 修改交叉评查的部分样式
This commit is contained in:
@@ -36,6 +36,8 @@ interface Match {
|
||||
export function Layout({ children, userRole = 'developer' as UserRole, frontendJWT = '' }: LayoutProps) {
|
||||
const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
|
||||
const [selectedApp, setSelectedApp] = useState<AppModule>('');
|
||||
const [effectiveUserRole, setEffectiveUserRole] = useState<UserRole>(userRole);
|
||||
const [effectiveFrontendJWT, setEffectiveFrontendJWT] = useState<string>(frontendJWT);
|
||||
const matches = useMatches() as Match[];
|
||||
const location = useLocation();
|
||||
|
||||
@@ -48,6 +50,39 @@ export function Layout({ children, userRole = 'developer' as UserRole, frontendJ
|
||||
match.handle && match.handle.hideBreadcrumb === true
|
||||
);
|
||||
|
||||
// 从 localStorage 读取用户信息和 JWT 作为备用方案
|
||||
useEffect(() => {
|
||||
if (typeof window === 'undefined') return;
|
||||
|
||||
try {
|
||||
// 如果服务端没有传递 userRole,从 localStorage 读取
|
||||
if (!userRole || userRole === '') {
|
||||
const storedUserInfoStr = localStorage.getItem('user_info');
|
||||
if (storedUserInfoStr) {
|
||||
const storedUserInfo = JSON.parse(storedUserInfoStr);
|
||||
const storedUserRole = storedUserInfo.user_role || 'common';
|
||||
console.log('📖 [Layout] 从 localStorage 读取用户角色:', storedUserRole);
|
||||
setEffectiveUserRole(storedUserRole as UserRole);
|
||||
}
|
||||
} else {
|
||||
setEffectiveUserRole(userRole);
|
||||
}
|
||||
|
||||
// 如果服务端没有传递 frontendJWT,从 localStorage 读取
|
||||
if (!frontendJWT || frontendJWT === '') {
|
||||
const storedToken = localStorage.getItem('access_token');
|
||||
if (storedToken) {
|
||||
console.log('📖 [Layout] 从 localStorage 读取 JWT token');
|
||||
setEffectiveFrontendJWT(storedToken);
|
||||
}
|
||||
} else {
|
||||
setEffectiveFrontendJWT(frontendJWT);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ [Layout] 读取 localStorage 失败:', error);
|
||||
}
|
||||
}, [userRole, frontendJWT]);
|
||||
|
||||
// 从sessionStorage中获取侧边栏状态和reviewType
|
||||
useEffect(() => {
|
||||
// 检查是否为移动端
|
||||
@@ -62,7 +97,7 @@ export function Layout({ children, userRole = 'developer' as UserRole, frontendJ
|
||||
} else if (savedState) {
|
||||
setSidebarCollapsed(savedState === 'true');
|
||||
}
|
||||
|
||||
|
||||
// 从sessionStorage获取reviewType并设置对应的应用模块
|
||||
if (typeof window !== 'undefined') {
|
||||
try {
|
||||
@@ -111,12 +146,12 @@ export function Layout({ children, userRole = 'developer' as UserRole, frontendJ
|
||||
return (
|
||||
<div className="layout-container">
|
||||
{/* 侧边栏始终保留,不再使用条件渲染 */}
|
||||
<Sidebar
|
||||
collapsed={sidebarCollapsed}
|
||||
onToggle={toggleSidebar}
|
||||
userRole={userRole}
|
||||
<Sidebar
|
||||
collapsed={sidebarCollapsed}
|
||||
onToggle={toggleSidebar}
|
||||
userRole={effectiveUserRole}
|
||||
selectedApp={selectedApp}
|
||||
frontendJWT={frontendJWT}
|
||||
frontendJWT={effectiveFrontendJWT}
|
||||
/>
|
||||
|
||||
<div className={`main-content ${sidebarCollapsed ? 'sidebar-collapsed' : ''}`}>
|
||||
|
||||
Reference in New Issue
Block a user