88 lines
2.7 KiB
React
88 lines
2.7 KiB
React
import { Menu } from 'antd'
|
||
import { useNavigate, useLocation } from 'react-router-dom'
|
||
import {
|
||
DashboardOutlined,
|
||
FileTextOutlined,
|
||
BookOutlined,
|
||
SyncOutlined,
|
||
UserOutlined,
|
||
TeamOutlined,
|
||
SoundOutlined,
|
||
LineChartOutlined,
|
||
} from '@ant-design/icons'
|
||
import useAuthStore from '../../stores/authStore'
|
||
|
||
function SideNav() {
|
||
const navigate = useNavigate()
|
||
const location = useLocation()
|
||
const { user } = useAuthStore()
|
||
|
||
const allMenuItems = [
|
||
{ key: '/dashboard', icon: <DashboardOutlined />, label: '仪表盘' },
|
||
{ key: '/analytics', icon: <LineChartOutlined />, label: '收视分析' },
|
||
{ key: '/editor-desk', icon: <FileTextOutlined />, label: '责编录入' },
|
||
{ key: '/tps', icon: <FileTextOutlined />, label: 'TPS 选题策划' },
|
||
{ key: '/knowledge', icon: <BookOutlined />, label: '知识库' },
|
||
{ key: '/doco', icon: <SyncOutlined />, label: '文稿对齐' },
|
||
{ key: '/editor-home', icon: <UserOutlined />, label: '个人首页' },
|
||
{ key: '/users', icon: <TeamOutlined />, label: '用户管理' },
|
||
{
|
||
key: 'tts-placeholder',
|
||
icon: <SoundOutlined />,
|
||
label: (
|
||
<span className="menu-item-with-tag">
|
||
蓝皓配音 TTS 2.0
|
||
<span className="menu-soon-tag">即将上线</span>
|
||
</span>
|
||
),
|
||
disabled: true,
|
||
},
|
||
{
|
||
key: 'collab-placeholder',
|
||
icon: <TeamOutlined />,
|
||
label: (
|
||
<span className="menu-item-with-tag">
|
||
内部协作(Mattermost)
|
||
<span className="menu-soon-tag">即将上线</span>
|
||
</span>
|
||
),
|
||
disabled: true,
|
||
},
|
||
]
|
||
|
||
// 按角色过滤菜单项
|
||
// user.role 值来自后端 /api/auth/me,应为字符串 'zhipianren' / 'zebian' / 'biandao'
|
||
const visibleItems = allMenuItems.filter(item => {
|
||
// /dashboard 三角色都可见
|
||
if (item.key === '/dashboard') return true
|
||
// /analytics 三角色都可见
|
||
if (item.key === '/analytics') return true
|
||
// /users 仅 zhipianren
|
||
if (item.key === '/users') return String(user?.role) === 'zhipianren'
|
||
// /editor-desk 仅 zhipianren + zebian
|
||
if (item.key === '/editor-desk') {
|
||
const role = String(user?.role)
|
||
return role === 'zhipianren' || role === 'zebian'
|
||
}
|
||
// 其余三角色都可见(保留后期 Phase 入口)
|
||
return true
|
||
})
|
||
|
||
return (
|
||
<div className="side-nav">
|
||
<div className="side-nav-logo">
|
||
<span className="logo-text">军事科技</span>
|
||
<span className="logo-sub">TPS 工作台</span>
|
||
</div>
|
||
<Menu
|
||
mode="inline"
|
||
selectedKeys={[location.pathname]}
|
||
items={visibleItems}
|
||
onClick={({ key }) => navigate(key)}
|
||
className="side-nav-menu"
|
||
/>
|
||
</div>
|
||
)
|
||
}
|
||
|
||
export default SideNav |