feat: 前台侧边栏改为分组导航,微信机器人归入 IM Bot 分组
This commit is contained in:
1 parent
950f86325a
commit
2eadd83304
2 files changed
+50
-24
No files matched your search
@@ -80,6 +80,14 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 2px;
|
gap: 2px;
|
||||||
}
|
}
|
||||||
|
.nav-group-title {
|
||||||
|
padding: 14px var(--space-md) 6px;
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.06em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: #9CA3AF;
|
||||||
|
}
|
||||||
|
|
||||||
.nav-item {
|
.nav-item {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|||||||
@@ -3,16 +3,31 @@ import { Outlet, NavLink, useNavigate } from 'react-router-dom';
|
|||||||
import { useAuth } from '@/contexts/AuthContext';
|
import { useAuth } from '@/contexts/AuthContext';
|
||||||
import './FrontLayout.css';
|
import './FrontLayout.css';
|
||||||
|
|
||||||
const navItems = [
|
const navGroups = [
|
||||||
{ path: '/chat', icon: 'chat', label: 'AI聊天' },
|
{
|
||||||
{ path: '/channels', icon: 'channel', label: 'IM Bot' },
|
title: '智能体',
|
||||||
{ path: '/knowledge', icon: 'knowledge', label: '知识库' },
|
items: [
|
||||||
{ path: '/market', icon: 'market', label: '技能市场' },
|
{ path: '/chat', icon: 'chat', label: 'AI聊天' },
|
||||||
{ path: '/token', icon: 'token', label: 'Token驾驶舱' },
|
{ path: '/knowledge', icon: 'knowledge', label: '知识库' },
|
||||||
{ path: '/pricing', icon: 'pricing', label: '付费中心' },
|
{ path: '/market', icon: 'market', label: '技能市场' },
|
||||||
{ path: '/assets', icon: 'assets', label: '资产文件' },
|
{ path: '/evolution', icon: 'evolution', label: 'AI自进化' },
|
||||||
{ path: '/evolution', icon: 'evolution', label: 'AI自进化' },
|
],
|
||||||
{ path: '/wechat-bot', icon: 'wechat', label: '微信机器人' },
|
},
|
||||||
|
{
|
||||||
|
title: 'IM Bot',
|
||||||
|
items: [
|
||||||
|
{ path: '/channels', icon: 'channel', label: '频道管理' },
|
||||||
|
{ path: '/wechat-bot', icon: 'wechat', label: '微信机器人' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '资源中心',
|
||||||
|
items: [
|
||||||
|
{ path: '/assets', icon: 'assets', label: '资产文件' },
|
||||||
|
{ path: '/token', icon: 'token', label: 'Token驾驶舱' },
|
||||||
|
{ path: '/pricing', icon: 'pricing', label: '付费中心' },
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const bottomItems = [
|
const bottomItems = [
|
||||||
@@ -80,20 +95,23 @@ const FrontLayout: React.FC = () => {
|
|||||||
</span>
|
</span>
|
||||||
{!collapsed && <span className="nav-item-label">返回首页</span>}
|
{!collapsed && <span className="nav-item-label">返回首页</span>}
|
||||||
</NavLink>
|
</NavLink>
|
||||||
<div className="nav-section">
|
{navGroups.map(group => (
|
||||||
{navItems.map(item => (
|
<div className="nav-section" key={group.title}>
|
||||||
<NavLink
|
{!collapsed && <div className="nav-group-title">{group.title}</div>}
|
||||||
key={item.path}
|
{group.items.map(item => (
|
||||||
to={item.path}
|
<NavLink
|
||||||
className={({ isActive }) => `nav-item ${isActive ? 'active' : ''}`}
|
key={item.path}
|
||||||
title={collapsed ? item.label : undefined}
|
to={item.path}
|
||||||
>
|
className={({ isActive }) => `nav-item ${isActive ? 'active' : ''}`}
|
||||||
<span className="nav-icon">{iconPaths[item.icon]}</span>
|
title={collapsed ? item.label : undefined}
|
||||||
{!collapsed && <span className="nav-label">{item.label}</span>}
|
>
|
||||||
{!collapsed && <span className="nav-active-dot" />}
|
<span className="nav-icon">{iconPaths[item.icon]}</span>
|
||||||
</NavLink>
|
{!collapsed && <span className="nav-label">{item.label}</span>}
|
||||||
))}
|
{!collapsed && <span className="nav-active-dot" />}
|
||||||
</div>
|
</NavLink>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
<div className="nav-section nav-bottom">
|
<div className="nav-section nav-bottom">
|
||||||
{bottomItems.map(item => (
|
{bottomItems.map(item => (
|
||||||
<NavLink
|
<NavLink
|
||||||
|
|||||||
Reference in new issue
Block a user