diff --git a/frontend/src/components/AdminAuthRoute.tsx b/frontend/src/components/AdminAuthRoute.tsx
index 21d4b8e..3b3c9ed 100644
--- a/frontend/src/components/AdminAuthRoute.tsx
+++ b/frontend/src/components/AdminAuthRoute.tsx
@@ -3,8 +3,9 @@ import { useAuthStore } from '../stores/authStore';
const AdminAuthRoute = () => {
const isAuthenticated = useAuthStore((state) => state.isAuthenticated);
+ const authType = useAuthStore((state) => state.authType);
- if (!isAuthenticated) {
+ if (!isAuthenticated || authType !== 'admin') {
return ;
}
diff --git a/frontend/src/components/AdminLayout.tsx b/frontend/src/components/AdminLayout.tsx
index 28ae72c..66013fc 100644
--- a/frontend/src/components/AdminLayout.tsx
+++ b/frontend/src/components/AdminLayout.tsx
@@ -1,5 +1,5 @@
import { useState } from 'react';
-import { Layout, Menu, Button, theme } from 'antd';
+import { Layout, Menu, Button, theme, App } from 'antd';
import {
MenuFoldOutlined,
MenuUnfoldOutlined,
@@ -10,7 +10,6 @@ import {
import { Outlet, useNavigate, useLocation } from 'react-router-dom';
import { useAuthStore } from '../stores/authStore';
import { adminAuthService } from '../services/adminAuthService';
-import { message } from 'antd';
const { Header, Sider, Content, Footer } = Layout;
@@ -23,11 +22,11 @@ const AdminLayout = () => {
const location = useLocation();
const adminUser = useAuthStore((state) => state.adminUser);
const logout = useAuthStore((state) => state.logout);
+ const { message } = App.useApp();
const handleLogout = async () => {
try {
await adminAuthService.logout();
- localStorage.removeItem('adminToken');
logout();
message.success('登出成功');
navigate('/admin/login');
diff --git a/frontend/src/components/PlayerAuthRoute.tsx b/frontend/src/components/PlayerAuthRoute.tsx
index 826b99b..807b957 100644
--- a/frontend/src/components/PlayerAuthRoute.tsx
+++ b/frontend/src/components/PlayerAuthRoute.tsx
@@ -3,8 +3,25 @@ import { useAuthStore } from '../stores/authStore';
const PlayerAuthRoute = () => {
const isAuthenticated = useAuthStore((state) => state.isAuthenticated);
+ const authType = useAuthStore((state) => state.authType);
+ const setAuth = useAuthStore((state) => state.setAuth);
- if (!isAuthenticated) {
+ // 检查是否有playerToken
+ const playerToken = localStorage.getItem('playerToken');
+ const playerUserStr = localStorage.getItem('playerUser');
+
+ // 如果有playerToken但authType不是player,说明需要重新加载玩家认证
+ if (playerToken && playerUserStr && authType !== 'player') {
+ try {
+ const playerUser = JSON.parse(playerUserStr);
+ setAuth(playerUser, playerToken, 'player');
+ } catch (e) {
+ console.error('解析playerUser失败:', e);
+ }
+ }
+
+ // 如果没有playerToken,重定向到登录页
+ if (!playerToken) {
return ;
}
diff --git a/frontend/src/components/PlayerLayout.tsx b/frontend/src/components/PlayerLayout.tsx
index 3155a3d..a0d6f44 100644
--- a/frontend/src/components/PlayerLayout.tsx
+++ b/frontend/src/components/PlayerLayout.tsx
@@ -1,4 +1,4 @@
-import { Layout, Menu, Button, Dropdown, theme } from 'antd';
+import { Layout, Menu, Button, Dropdown, theme, App } from 'antd';
import {
HomeOutlined,
UserOutlined,
@@ -6,7 +6,6 @@ import {
DownOutlined,
} from '@ant-design/icons';
import { Outlet, useNavigate, useLocation } from 'react-router-dom';
-import { message } from 'antd';
import { playerAuthService } from '../services/playerAuthService';
const { Header, Content, Footer } = Layout;
@@ -17,11 +16,11 @@ const PlayerLayout = () => {
} = theme.useToken();
const navigate = useNavigate();
const location = useLocation();
+ const { message } = App.useApp();
const handleLogout = async () => {
try {
await playerAuthService.logout();
- localStorage.removeItem('playerToken');
message.success('登出成功');
navigate('/player/login');
} catch (error) {
@@ -57,40 +56,67 @@ const PlayerLayout = () => {
style={{
display: 'flex',
alignItems: 'center',
- justifyContent: 'space-between',
- background: colorBgLayout,
- padding: '0 24px',
+ justifyContent: 'center',
+ background: '#001529',
+ padding: '0',
+ height: 64,
}}
>
+ {/* 导航条内容容器 */}
- 梦幻西游玩家服务中心
-
-