Nav.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import * as React from 'react';
  2. import { Layout, Menu, Button } from 'antd';
  3. import {
  4. RobotOutlined,
  5. ReadOutlined,
  6. FileSearchOutlined,
  7. MenuFoldOutlined,
  8. MenuUnfoldOutlined,
  9. CheckSquareOutlined
  10. } from '@ant-design/icons';
  11. import router from '@/router';
  12. import { JSX } from 'react/jsx-runtime';
  13. import LocalStorage from '@/LocalStorage';
  14. const Sider = Layout.Sider;
  15. interface MenuItem {
  16. key : string;
  17. icon : JSX.Element;
  18. label : string;
  19. onClick : () => void;
  20. }
  21. interface Props {
  22. selectedKey : string,
  23. onChangeSelectedKey : ( path : string, menuLevel : number ) => void,
  24. openKeys : string[],
  25. onOpenChange : ( openKeys : string[] ) => void,
  26. collapsed : boolean,
  27. onClickCollapsed : () => void,
  28. menuType : number; // 新增 prop
  29. };
  30. const Nav : React.FC<Props> = ( props : Props ) => {
  31. const {
  32. selectedKey,
  33. onChangeSelectedKey,
  34. openKeys,
  35. onOpenChange,
  36. collapsed,
  37. onClickCollapsed,
  38. menuType
  39. } = props;
  40. const dsItems : MenuItem[] = [
  41. {
  42. key: '/deepseek/questionAnswer',
  43. icon: <RobotOutlined />,
  44. label: '应用广场',
  45. onClick: () => {
  46. router.navigate( { pathname: '/deepseek/questionAnswer' } )
  47. }
  48. },
  49. {
  50. key: '/deepseek/knowledgeLib',
  51. icon: <ReadOutlined />,
  52. label: '知识库',
  53. onClick: () => {
  54. router.navigate( { pathname: '/deepseek/knowledgeLib' } )
  55. }
  56. },
  57. {
  58. key: '/deepseek/dataExport',
  59. icon: <FileSearchOutlined />,
  60. label: '数据导出',
  61. onClick: () => {
  62. router.navigate( { pathname: '/deepseek/dataExport' } )
  63. }
  64. },
  65. {
  66. key: '/deepseek/audit',
  67. icon: <CheckSquareOutlined />,
  68. label: '应用审核',
  69. onClick: () => {
  70. router.navigate( { pathname: '/deepseek/audit' } )
  71. }
  72. },
  73. ].filter( item => {
  74. if ( item.key === '/deepseek/questionAnswer' ) {
  75. return LocalStorage.getStatusFlag( 'deepseek:application:list' );
  76. }
  77. if ( item.key === '/deepseek/knowledgeLib' ) {
  78. return LocalStorage.getStatusFlag( 'deepseek:knowledge:list' );
  79. }
  80. if ( item.key === '/deepseek/dataExport' ) {
  81. return LocalStorage.getStatusFlag( 'deepseek:dialog:list' );
  82. }
  83. if ( item.key === '/deepseek/audit' ) {
  84. return LocalStorage.getStatusFlag( 'system:audit:list' );
  85. }
  86. return true; // 其他菜单默认显示
  87. } );
  88. const zpItems : MenuItem[] = [
  89. {
  90. key: '/zhipu/questionAnswer',
  91. icon: <RobotOutlined />,
  92. label: '问答应用',
  93. onClick: () => {
  94. router.navigate( { pathname: '/zhipu/questionAnswer' } )
  95. }
  96. },
  97. {
  98. key: '/zhipu/knowledgeLib',
  99. icon: <ReadOutlined />,
  100. label: '知识库',
  101. onClick: () => {
  102. router.navigate( { pathname: '/zhipu/knowledgeLib' } )
  103. }
  104. },
  105. {
  106. key: '/zhipu/dataExport',
  107. icon: <FileSearchOutlined />,
  108. label: '数据导出',
  109. onClick: () => {
  110. router.navigate( { pathname: '/zhipu/dataExport' } )
  111. }
  112. }
  113. ];
  114. const items = menuType === 1 ? dsItems : zpItems;
  115. React.useEffect( () => {
  116. // 当selectedKey变化时,确保路由同步
  117. if ( selectedKey && !window.location.pathname.startsWith( selectedKey ) ) {
  118. router.navigate( selectedKey );
  119. }
  120. }, [ selectedKey ] );
  121. return (
  122. <Sider
  123. className='nav'
  124. collapsed={ collapsed }
  125. >
  126. <div className='nav-menu'>
  127. <Menu
  128. mode='inline'
  129. selectedKeys={ [ selectedKey ] }
  130. onSelect={ ( item ) => {
  131. const menuLevel = item.keyPath.length > 1 ? 2 : 1;
  132. onChangeSelectedKey( item.key, menuLevel );
  133. } }
  134. openKeys={ openKeys }
  135. onOpenChange={ ( keys ) => {
  136. // 点击菜单,收起其他展开的所有菜单
  137. const latestOpenKey = keys.find( ( key ) => openKeys.indexOf( key ) === - 1 );
  138. onOpenChange( latestOpenKey ? [ latestOpenKey ] : [] );
  139. } }
  140. items={ items }
  141. />
  142. </div>
  143. <div className='nav-bottom'>
  144. <Button type='primary' onClick={ onClickCollapsed }>
  145. { collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined /> }
  146. </Button>
  147. </div>
  148. </Sider>
  149. );
  150. };
  151. export default Nav;