diff --git a/src/layout/Header.css b/src/layout/Header.css index 021a913..fd5ccce 100644 --- a/src/layout/Header.css +++ b/src/layout/Header.css @@ -117,6 +117,38 @@ color: #c8363d; } +/* 用户信息区域 */ +.header-actions { + display: flex; + align-items: center; + gap: 12px; + margin-left: 24px; +} + +.user-info { + padding: 4px 12px; + border-radius: 20px; + transition: background-color 0.3s ease; +} + +.user-info:hover { + background-color: rgba(200, 54, 61, 0.08); +} + +.user-nickname { + font-size: 14px; + font-weight: 500; + color: #2c2c2c; + max-width: 120px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.auth-buttons .ant-btn { + font-weight: 500; +} + /* 移动端菜单按钮 */ .mobile-menu-btn { display: none; @@ -146,6 +178,10 @@ .mobile-menu-btn { display: flex; } + + .user-nickname { + max-width: 80px; + } } @media (max-width: 576px) { @@ -166,4 +202,21 @@ .logo-subtitle { font-size: 10px; } + + .header-actions { + margin-left: 8px; + } + + .user-nickname { + display: none; + } + + .auth-buttons { + gap: 4px; + } + + .auth-buttons .ant-btn { + padding: 4px 12px; + font-size: 13px; + } } diff --git a/src/layout/Header.tsx b/src/layout/Header.tsx index cfec5a7..ea9b51f 100644 --- a/src/layout/Header.tsx +++ b/src/layout/Header.tsx @@ -3,8 +3,8 @@ */ import React, { useState, useEffect } from 'react' -import { Link, useLocation } from 'react-router-dom' -import { Menu, Drawer, Button, Space } from 'antd' +import { Link, useLocation, useNavigate } from 'react-router-dom' +import { Menu, Drawer, Button, Space, Avatar, Dropdown } from 'antd' import { MenuOutlined, HomeOutlined, @@ -13,17 +13,25 @@ import { ExperimentOutlined, FileTextOutlined, InfoCircleOutlined, + UserOutlined, + LoginOutlined, + LogoutOutlined, } from '@ant-design/icons' import type { MenuProps } from 'antd' +import { useUserStore } from '@store/useUserStore' import './Header.css' type MenuItem = Required['items'][number] const Header: React.FC = () => { const location = useLocation() + const navigate = useNavigate() const [scrolled, setScrolled] = useState(false) const [mobileMenuOpen, setMobileMenuOpen] = useState(false) + // 获取用户状态 + const { user, isAuthenticated, logout } = useUserStore() + // 监听滚动事件,添加导航栏背景效果 useEffect(() => { const handleScroll = () => { @@ -63,6 +71,30 @@ const Header: React.FC = () => { }, ] + // 处理退出登录 + const handleLogout = () => { + logout() + navigate('/') + } + + // 用户下拉菜单 + const userMenuItems: MenuItem[] = [ + { + key: 'user-center', + icon: , + label: 个人中心, + }, + { + type: 'divider', + }, + { + key: 'logout', + icon: , + label: '退出登录', + onClick: handleLogout, + }, + ] + // 获取当前选中的菜单项 const getSelectedKeys = () => { const path = location.pathname @@ -108,6 +140,29 @@ const Header: React.FC = () => { /> + {/* 用户信息区域 */} +
+ {isAuthenticated && user ? ( + + + } /> + {user.nickname} + + + ) : ( + + + + + + + + + )} +
+ {/* 移动端菜单按钮 */}