diff --git a/web2/src/components/layout/Header.tsx b/web2/src/components/layout/Header.tsx
index 02e62e0..104edeb 100644
--- a/web2/src/components/layout/Header.tsx
+++ b/web2/src/components/layout/Header.tsx
@@ -1,20 +1,33 @@
/** 顶部 Header(h-14 sticky)
- * 桌面:显示当前页面标题 + 用户信息
+ * 桌面:显示当前页面标题 + 用户信息 + 退出按钮
* 移动:显示 Logo + 通知铃铛
*/
-import { useLocation } from 'react-router-dom'
-import { Bell } from 'lucide-react'
+import { useState } from 'react'
+import { useLocation, useNavigate } from 'react-router-dom'
+import { Bell, LogOut } from 'lucide-react'
import { HEADER_TITLES } from '@/lib/nav-config'
-import { getName } from '@/lib/auth'
+import { getName, clearAuth } from '@/lib/auth'
+import {
+ Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter,
+} from '@/components/ui/dialog'
+import { Button } from '@/components/ui/button'
export function Header() {
const { pathname } = useLocation()
+ const navigate = useNavigate()
const name = getName()
+ const [confirmLogout, setConfirmLogout] = useState(false)
+
// 匹配标题(支持子路由,取最长匹配)
const title = Object.entries(HEADER_TITLES)
.filter(([p]) => pathname === p || (p !== '/' && pathname.startsWith(p)))
.sort((a, b) => b[0].length - a[0].length)[0]?.[1] || '左右 BossAi'
+ const handleLogout = () => {
+ clearAuth()
+ navigate('/login')
+ }
+
return (
{/* 移动端 Logo */}
@@ -36,6 +49,28 @@ export function Header() {
{name && (
{name}
)}
+ {/* 退出按钮(桌面) */}
+
+
+ {/* 退出确认弹窗 */}
+
)
}
diff --git a/web2/src/pages/Me.tsx b/web2/src/pages/Me.tsx
index 7c8acba..a61d7c5 100644
--- a/web2/src/pages/Me.tsx
+++ b/web2/src/pages/Me.tsx
@@ -1,13 +1,25 @@
-/** 移动端"我"聚合页:头像占位+入口列表 */
-import { NavLink } from 'react-router-dom'
+/** 移动端"我"聚合页:头像占位+入口列表+退出 */
+import { useState } from 'react'
+import { NavLink, useNavigate } from 'react-router-dom'
import {
User, History, BookOpen, Settings as SettingsIcon, ChevronRight,
- Scale, TrendingUp, Heart, ShieldCheck, FileText, Users,
+ Scale, TrendingUp, Heart, ShieldCheck, FileText, Users, LogOut,
} from 'lucide-react'
-import { getName } from '@/lib/auth'
+import { getName, clearAuth } from '@/lib/auth'
+import {
+ Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter,
+} from '@/components/ui/dialog'
+import { Button } from '@/components/ui/button'
export function Me() {
+ const navigate = useNavigate()
const name = getName()
+ const [confirmLogout, setConfirmLogout] = useState(false)
+
+ const handleLogout = () => {
+ clearAuth()
+ navigate('/login')
+ }
const brainTrust = [
{ path: '/legal', label: '法务参谋', icon: Scale },
{ path: '/decisions', label: '经营决策', icon: TrendingUp },
@@ -61,6 +73,28 @@ export function Me() {
))}
+
+ {/* 退出登录 */}
+
+
+
)
}