feat: 集成 AI 对话与只读查询工具
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { Outlet, useNavigate, useLocation } from 'react-router-dom';
|
||||
import { Layout, Menu, Button, Avatar, Dropdown, Drawer, Grid } from 'antd';
|
||||
import { Sparkles } from 'lucide-react';
|
||||
import { Layout, Menu, Button, Avatar, Dropdown, Drawer, Grid, Tooltip } from 'antd';
|
||||
import {
|
||||
DashboardOutlined,
|
||||
TeamOutlined,
|
||||
@@ -36,6 +37,8 @@ import NotificationBell from '../components/NotificationBell';
|
||||
import RouteDock from '../components/RouteDock';
|
||||
import { buildMenu, type AppMenuItem } from '../auth/menu-policy';
|
||||
|
||||
const AiChatDrawer = React.lazy(() => import('../components/AiChat/AiChatDrawer'));
|
||||
|
||||
const { Header, Sider, Content } = Layout;
|
||||
|
||||
const iconMap: Record<string, React.ReactNode> = {
|
||||
@@ -71,6 +74,7 @@ const iconMap: Record<string, React.ReactNode> = {
|
||||
const MainLayout: React.FC = () => {
|
||||
const [collapsed, setCollapsed] = useState(false);
|
||||
const [drawerOpen, setDrawerOpen] = useState(false);
|
||||
const [aiChatOpen, setAiChatOpen] = useState(false);
|
||||
const [openKeys, setOpenKeys] = useState<string[]>([]);
|
||||
const prevPathname = useRef('');
|
||||
const navigate = useNavigate();
|
||||
@@ -265,6 +269,16 @@ const MainLayout: React.FC = () => {
|
||||
onClick={() => (usesDrawer ? setDrawerOpen(true) : setCollapsed(!collapsed))}
|
||||
/>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 16 }}>
|
||||
{hasPermission('ai:chat:use') && (
|
||||
<Tooltip title="AI 助理">
|
||||
<Button
|
||||
type="text"
|
||||
aria-label="打开 AI 助理"
|
||||
icon={<Sparkles size={17} strokeWidth={1.8} />}
|
||||
onClick={() => setAiChatOpen(true)}
|
||||
/>
|
||||
</Tooltip>
|
||||
)}
|
||||
{hasPermission('notification:view') && <NotificationBell />}
|
||||
<Dropdown
|
||||
menu={{
|
||||
@@ -308,6 +322,11 @@ const MainLayout: React.FC = () => {
|
||||
<Outlet />
|
||||
</Content>
|
||||
</Layout>
|
||||
{hasPermission('ai:chat:use') && aiChatOpen && (
|
||||
<React.Suspense fallback={null}>
|
||||
<AiChatDrawer open onClose={() => setAiChatOpen(false)} />
|
||||
</React.Suspense>
|
||||
)}
|
||||
</Layout>
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user