router.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. import { lazy, Suspense ,useEffect} from 'react';
  2. import {
  3. RouteObject,
  4. Navigate,
  5. createBrowserRouter,
  6. useLocation,
  7. Routes} from 'react-router-dom';
  8. import { Spin,Modal } from 'antd';
  9. import LocalStorage from '@/LocalStorage';
  10. import { apis, LoginApiParams } from '@/apis';
  11. // 按需加载
  12. const lazyLoad = (loader: () => Promise<any>) => {
  13. const Component = lazy(loader);
  14. const Loading: React.FC = () => {
  15. return (
  16. <div className='router-lazyLoad'>
  17. <Spin />
  18. </div>
  19. )
  20. }
  21. return (
  22. <Suspense fallback={<Loading />}>
  23. <Component />
  24. </Suspense>
  25. );
  26. };
  27. // 定义登录地址常量
  28. const loginUrl = 'http://esc.sribs.com.cn:8080/esc-sso/oauth2.0/authorize?client_id=e97f94cf93761f4d69e8&response_type=code';
  29. // React-Router-Dom@v6 路由表
  30. const routerList: RouteObject[] = [
  31. {
  32. path: '/',
  33. element: lazyLoad(() => import('@/pages/layout/index')),
  34. children: [
  35. {
  36. index: true,
  37. element: LocalStorage.getStatusFlag('deepseek:application:list') ? <Navigate to='/deepseek/questionAnswer' /> : <Navigate to='/404' />,
  38. },
  39. { /* 问答应用 */
  40. path: '/deepseek/questionAnswer',
  41. handle: {
  42. menuLevel: 1,
  43. breadcrumbName: '问答应用',
  44. },
  45. children: [
  46. {
  47. index: true,
  48. element: lazyLoad(() => import('@/pages/takai/questionAnswer/list/index')),
  49. },
  50. { /* 问答应用-创建应用 */
  51. path: '/deepseek/questionAnswer/create',
  52. handle: {
  53. menuLevel: 1,
  54. breadcrumbName: '创建应用',
  55. },
  56. element: lazyLoad(() => import('@/pages/takai/questionAnswer/info/index')),
  57. },
  58. { /* 问答应用-修改应用 */
  59. path: '/deepseek/questionAnswer/modify',
  60. handle: {
  61. menuLevel: 1,
  62. breadcrumbName: '修改应用',
  63. },
  64. element: lazyLoad(() => import('@/pages/takai/questionAnswer/info/index')),
  65. },
  66. ]
  67. },
  68. { /* 知识库 */
  69. path: '/deepseek/knowledgeLib',
  70. handle: {
  71. menuLevel: 1,
  72. breadcrumbName: '知识库',
  73. },
  74. children: [
  75. {
  76. index: true,
  77. element: lazyLoad(() => import('@/pages/takai/knowledgeLib/list/index')),
  78. },
  79. { /* 知识库-知识库详情 */
  80. path: '/deepseek/knowledgeLib/:knowledgeId',
  81. handle: {
  82. menuLevel: 1,
  83. breadcrumbName: '知识库详情',
  84. },
  85. children: [
  86. {
  87. index: true,
  88. element: lazyLoad(() => import('@/pages/takai/knowledgeLib/detail/index'))
  89. },
  90. { /* 知识库-知识库详情-切片信息 */
  91. path: '/deepseek/knowledgeLib/:knowledgeId/slice/:documentId/:embeddingId',
  92. handle: {
  93. menuLevel: 1,
  94. breadcrumbName: '切片信息',
  95. },
  96. children: [
  97. {
  98. index: true,
  99. element: lazyLoad(() => import('@/pages/takai/knowledgeLib/slice/index')),
  100. },
  101. { /* 知识库-知识库详情-切片信息-切片详情 */
  102. path: '/deepseek/knowledgeLib/:knowledgeId/slice/:documentId/:embeddingId/:sliceId',
  103. handle: {
  104. menuLevel: 1,
  105. breadcrumbName: '切片详情',
  106. },
  107. element: lazyLoad(() => import('@/pages/takai/knowledgeLib/slice/detail/index')),
  108. },
  109. ]
  110. },
  111. ]
  112. },
  113. ]
  114. },
  115. { /* 数据导出 */
  116. path: '/deepseek/dataExport',
  117. handle: {
  118. menuLevel: 1,
  119. breadcrumbName: '数据导出',
  120. },
  121. element: lazyLoad(() => import('@/pages/takai/dataExport/index')),
  122. },
  123. { /* 数据导出 */
  124. path: '/deepseek/audit',
  125. handle: {
  126. menuLevel: 1,
  127. breadcrumbName: '知识库审核',
  128. },
  129. element: lazyLoad(() => import('@/pages/takai/audit/index')),
  130. },
  131. { /* 404 */
  132. path: '/404',
  133. element: lazyLoad(() => import('@/components/404/index')),
  134. },
  135. { /* 路由不存在重定向404 */
  136. path: '/*',
  137. element: <Navigate to='/404' replace={true} />,
  138. },
  139. ]
  140. },
  141. {
  142. path: '/',
  143. element: lazyLoad(() => import('@/pages/layout/index')),
  144. children: [
  145. {
  146. index: true,
  147. element: <Navigate to='/questionAnswer' />,
  148. },
  149. { /* 问答应用 */
  150. path: '/questionAnswer',
  151. handle: {
  152. menuLevel: 1,
  153. breadcrumbName: '问答应用',
  154. },
  155. children: [
  156. {
  157. index: true,
  158. element: lazyLoad(() => import('@/pages/questionAnswer/list/index')),
  159. },
  160. { /* 问答应用-创建应用 */
  161. path: '/questionAnswer/create',
  162. handle: {
  163. menuLevel: 1,
  164. breadcrumbName: '创建应用',
  165. },
  166. element: lazyLoad(() => import('@/pages/questionAnswer/info/index')),
  167. },
  168. { /* 问答应用-修改应用 */
  169. path: '/questionAnswer/modify',
  170. handle: {
  171. menuLevel: 1,
  172. breadcrumbName: '修改应用',
  173. },
  174. element: lazyLoad(() => import('@/pages/questionAnswer/info/index')),
  175. },
  176. ]
  177. },
  178. { /* 知识库 */
  179. path: '/knowledgeLib',
  180. handle: {
  181. menuLevel: 1,
  182. breadcrumbName: '知识库',
  183. },
  184. children: [
  185. {
  186. index: true,
  187. element: lazyLoad(() => import('@/pages/knowledgeLib/list/index')),
  188. },
  189. { /* 知识库-知识库详情 */
  190. path: '/knowledgeLib/:knowledgeId',
  191. handle: {
  192. menuLevel: 1,
  193. breadcrumbName: '知识库详情',
  194. },
  195. element: lazyLoad(() => import('@/pages/knowledgeLib/detail/index')),
  196. },
  197. ]
  198. },
  199. { /* 数据导出 */
  200. path: '/dataExport',
  201. handle: {
  202. menuLevel: 1,
  203. breadcrumbName: '数据导出',
  204. },
  205. element: lazyLoad(() => import('@/pages/dataExport/index')),
  206. },
  207. { /* 404 */
  208. path: '/404',
  209. element: lazyLoad(() => import('@/components/404/index')),
  210. },
  211. { /* 路由不存在重定向404 */
  212. path: '/*',
  213. element: <Navigate to='/404' replace={true} />,
  214. },
  215. ]
  216. },
  217. { /* 登录 */
  218. path: '/login',
  219. element: lazyLoad(() => import('@/pages/login/index'))
  220. }
  221. ]
  222. // 路由模式-浏览器路由
  223. const router = createBrowserRouter(routerList);
  224. // 路由白名单
  225. const whiteList = ['/login'];
  226. // 前置路由
  227. router.routes.forEach((route: any) => {
  228. interface RouterComponentProps {
  229. component?: React.ReactNode,
  230. }
  231. // 路由组件-路由鉴权
  232. function RouterComponent(props: RouterComponentProps) {
  233. const { component } = props;
  234. const location = useLocation();
  235. const path = location.pathname;
  236. if (LocalStorage.getToken()) {// 已登录
  237. return <>{component}</>
  238. } else {// 未登录
  239. const jkLogin = async (data: { code: string, redirectUrl: string }, url: string) => {
  240. try {
  241. const res = await apis.jklogin(data);
  242. console.log(res.data,"res.data");
  243. localStorage.setItem('token', res.data.token);
  244. window.location.replace(url);
  245. } catch (error: any) {
  246. Modal.error({
  247. title: '登录失败',
  248. content: error.msg,
  249. })
  250. }
  251. }
  252. const originUrl = window.location.origin;
  253. const fullUrl = window.location.href;
  254. const urlParams = new URLSearchParams(new URL(fullUrl).search);
  255. const code = urlParams.get('code');
  256. const state = urlParams.get('state');
  257. const userInfo = localStorage.getItem('userInfo');
  258. if (fullUrl.includes(originUrl + '/?code') && code && state) {// 通过code登陆
  259. if (!userInfo) {
  260. jkLogin({ code: code, redirectUrl: encodeURIComponent(originUrl) }, state);
  261. }
  262. }
  263. else {
  264. //测试环境
  265. //const loginUrl = 'https://esctest.sribs.com.cn/esc-sso/oauth2.0/authorize?client_id=e97f94cf93761f4d69e8&response_type=code';
  266. //生产环境
  267. const loginUrl = 'http://esc.sribs.com.cn:8080/esc-sso/oauth2.0/authorize?client_id=e97f94cf93761f4d69e8&response_type=code';
  268. const externalLoginUrl = loginUrl + `&redirect_uri=${encodeURIComponent(originUrl)}&state=${encodeURIComponent(fullUrl)}`;
  269. if (!userInfo) {
  270. window.location.replace(externalLoginUrl);
  271. }
  272. }
  273. // else {// 未登录
  274. // if (whiteList.includes(path)) {
  275. // return <>{component}</>
  276. // } else {
  277. // return <Navigate to='/login' replace={true} />
  278. // }
  279. // }
  280. }
  281. }
  282. route.element = <RouterComponent component={route.element} />
  283. });
  284. export default router;