router.tsx 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import { lazy, Suspense } from 'react';
  2. import { RouteObject, Navigate, createBrowserRouter, useLocation } from 'react-router-dom';
  3. import { Spin } from 'antd';
  4. import LocalStorage from '@/LocalStorage';
  5. // 按需加载
  6. const lazyLoad = (loader: () => Promise<any>) => {
  7. const Component = lazy(loader);
  8. const Loading: React.FC = () => {
  9. return (
  10. <div className='router-lazyLoad'>
  11. <Spin />
  12. </div>
  13. )
  14. }
  15. return (
  16. <Suspense fallback={<Loading />}>
  17. <Component />
  18. </Suspense>
  19. );
  20. };
  21. // React-Router-Dom@v6 路由表
  22. const routerList: RouteObject[] = [
  23. {
  24. path: '/',
  25. element: lazyLoad(() => import('@/pages/layout/index')),
  26. children: [
  27. {
  28. index: true,
  29. element: LocalStorage.getStatusFlag('deepseek:application:list') ? <Navigate to='/deepseek/questionAnswer' /> : <Navigate to='/404' />,
  30. },
  31. { /* 问答应用 */
  32. path: '/deepseek/questionAnswer',
  33. handle: {
  34. menuLevel: 1,
  35. breadcrumbName: '问答应用',
  36. },
  37. children: [
  38. {
  39. index: true,
  40. element: lazyLoad(() => import('@/pages/takai/questionAnswer/list/index')),
  41. },
  42. { /* 问答应用-创建应用 */
  43. path: '/deepseek/questionAnswer/create',
  44. handle: {
  45. menuLevel: 1,
  46. breadcrumbName: '创建应用',
  47. },
  48. element: lazyLoad(() => import('@/pages/takai/questionAnswer/info/index')),
  49. },
  50. { /* 问答应用-修改应用 */
  51. path: '/deepseek/questionAnswer/modify',
  52. handle: {
  53. menuLevel: 1,
  54. breadcrumbName: '修改应用',
  55. },
  56. element: lazyLoad(() => import('@/pages/takai/questionAnswer/info/index')),
  57. },
  58. ]
  59. },
  60. { /* 知识库 */
  61. path: '/deepseek/knowledgeLib',
  62. handle: {
  63. menuLevel: 1,
  64. breadcrumbName: '知识库',
  65. },
  66. children: [
  67. {
  68. index: true,
  69. element: lazyLoad(() => import('@/pages/takai/knowledgeLib/list/index')),
  70. },
  71. { /* 知识库-知识库详情 */
  72. path: '/deepseek/knowledgeLib/:knowledgeId',
  73. handle: {
  74. menuLevel: 1,
  75. breadcrumbName: '知识库详情',
  76. },
  77. children: [
  78. {
  79. index: true,
  80. element: lazyLoad(() => import('@/pages/takai/knowledgeLib/detail/index'))
  81. },
  82. { /* 知识库-知识库详情-切片信息 */
  83. path: '/deepseek/knowledgeLib/:knowledgeId/slice/:documentId/:embeddingId',
  84. handle: {
  85. menuLevel: 1,
  86. breadcrumbName: '切片信息',
  87. },
  88. children: [
  89. {
  90. index: true,
  91. element: lazyLoad(() => import('@/pages/takai/knowledgeLib/slice/index')),
  92. },
  93. { /* 知识库-知识库详情-切片信息-切片详情 */
  94. path: '/deepseek/knowledgeLib/:knowledgeId/slice/:documentId/:embeddingId/:sliceId',
  95. handle: {
  96. menuLevel: 1,
  97. breadcrumbName: '切片详情',
  98. },
  99. element: lazyLoad(() => import('@/pages/takai/knowledgeLib/slice/detail/index')),
  100. },
  101. ]
  102. },
  103. ]
  104. },
  105. ]
  106. },
  107. { /* 数据导出 */
  108. path: '/deepseek/dataExport',
  109. handle: {
  110. menuLevel: 1,
  111. breadcrumbName: '数据导出',
  112. },
  113. element: lazyLoad(() => import('@/pages/takai/dataExport/index')),
  114. },
  115. { /* 数据导出 */
  116. path: '/deepseek/audit',
  117. handle: {
  118. menuLevel: 1,
  119. breadcrumbName: '知识库审核',
  120. },
  121. element: lazyLoad(() => import('@/pages/takai/audit/index')),
  122. },
  123. { /* 404 */
  124. path: '/404',
  125. element: lazyLoad(() => import('@/components/404/index')),
  126. },
  127. { /* 路由不存在重定向404 */
  128. path: '/*',
  129. element: <Navigate to='/404' replace={true} />,
  130. },
  131. ]
  132. },
  133. {
  134. path: '/',
  135. element: lazyLoad(() => import('@/pages/layout/index')),
  136. children: [
  137. {
  138. index: true,
  139. element: <Navigate to='/questionAnswer' />,
  140. },
  141. { /* 问答应用 */
  142. path: '/questionAnswer',
  143. handle: {
  144. menuLevel: 1,
  145. breadcrumbName: '问答应用',
  146. },
  147. children: [
  148. {
  149. index: true,
  150. element: lazyLoad(() => import('@/pages/questionAnswer/list/index')),
  151. },
  152. { /* 问答应用-创建应用 */
  153. path: '/questionAnswer/create',
  154. handle: {
  155. menuLevel: 1,
  156. breadcrumbName: '创建应用',
  157. },
  158. element: lazyLoad(() => import('@/pages/questionAnswer/info/index')),
  159. },
  160. { /* 问答应用-修改应用 */
  161. path: '/questionAnswer/modify',
  162. handle: {
  163. menuLevel: 1,
  164. breadcrumbName: '修改应用',
  165. },
  166. element: lazyLoad(() => import('@/pages/questionAnswer/info/index')),
  167. },
  168. ]
  169. },
  170. { /* 知识库 */
  171. path: '/knowledgeLib',
  172. handle: {
  173. menuLevel: 1,
  174. breadcrumbName: '知识库',
  175. },
  176. children: [
  177. {
  178. index: true,
  179. element: lazyLoad(() => import('@/pages/knowledgeLib/list/index')),
  180. },
  181. { /* 知识库-知识库详情 */
  182. path: '/knowledgeLib/:knowledgeId',
  183. handle: {
  184. menuLevel: 1,
  185. breadcrumbName: '知识库详情',
  186. },
  187. element: lazyLoad(() => import('@/pages/knowledgeLib/detail/index')),
  188. },
  189. ]
  190. },
  191. { /* 数据导出 */
  192. path: '/dataExport',
  193. handle: {
  194. menuLevel: 1,
  195. breadcrumbName: '数据导出',
  196. },
  197. element: lazyLoad(() => import('@/pages/dataExport/index')),
  198. },
  199. { /* 404 */
  200. path: '/404',
  201. element: lazyLoad(() => import('@/components/404/index')),
  202. },
  203. { /* 路由不存在重定向404 */
  204. path: '/*',
  205. element: <Navigate to='/404' replace={true} />,
  206. },
  207. ]
  208. },
  209. { /* 登录 */
  210. path: '/login',
  211. element: lazyLoad(() => import('@/pages/login/index')),
  212. }
  213. ]
  214. // 路由模式-浏览器路由
  215. const router = createBrowserRouter(routerList);
  216. // 路由白名单
  217. const whiteList = ['/login'];
  218. // 前置路由
  219. router.routes.forEach((route: any) => {
  220. interface RouterComponentProps {
  221. component?: React.ReactNode,
  222. }
  223. // 路由组件-路由鉴权
  224. function RouterComponent(props: RouterComponentProps) {
  225. const { component } = props;
  226. const location = useLocation();
  227. const path = location.pathname;
  228. if (LocalStorage.getToken()) {// 已登录
  229. if (whiteList.includes(path)) {
  230. return <Navigate to='/404' replace={true} />
  231. } else {
  232. return <>{component}</>
  233. }
  234. } else {// 未登录
  235. if (whiteList.includes(path)) {
  236. return <>{component}</>
  237. } else {
  238. return <Navigate to='/login' replace={true} />
  239. }
  240. }
  241. }
  242. route.element = <RouterComponent component={route.element} />
  243. });
  244. export default router;