router.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  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/deepseek/questionAnswer/list/index')),
  49. },
  50. { /* 问答应用-创建应用 */
  51. path: '/deepseek/questionAnswer/create',
  52. handle: {
  53. menuLevel: 1,
  54. breadcrumbName: '创建应用',
  55. },
  56. element: lazyLoad(() => import('@/pages/deepseek/questionAnswer/info/index')),
  57. },
  58. { /* 问答应用-修改应用 */
  59. path: '/deepseek/questionAnswer/modify',
  60. handle: {
  61. menuLevel: 1,
  62. breadcrumbName: '修改应用',
  63. },
  64. element: lazyLoad(() => import('@/pages/deepseek/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/deepseek/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/deepseek/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/deepseek/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/deepseek/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/deepseek/dataExport/index')),
  122. },
  123. { /* 数据导出 */
  124. path: '/deepseek/audit',
  125. handle: {
  126. menuLevel: 1,
  127. breadcrumbName: '知识库审核',
  128. },
  129. element: lazyLoad(() => import('@/pages/deepseek/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='/zhipu/questionAnswer' />,
  148. },
  149. { /* 问答应用 */
  150. path: '/zhipu/questionAnswer',
  151. handle: {
  152. menuLevel: 1,
  153. breadcrumbName: '问答应用',
  154. },
  155. children: [
  156. {
  157. index: true,
  158. element: lazyLoad(() => import('@/pages/platforms/zhipu/questionAnswer/list/index')),
  159. },
  160. { /* 问答应用-创建应用 */
  161. path: '/zhipu/questionAnswer/create',
  162. handle: {
  163. menuLevel: 1,
  164. breadcrumbName: '创建应用',
  165. },
  166. element: lazyLoad(() => import('@/pages/platforms/zhipu/questionAnswer/info/index')),
  167. },
  168. { /* 问答应用-修改应用 */
  169. path: '/zhipu/questionAnswer/modify',
  170. handle: {
  171. menuLevel: 1,
  172. breadcrumbName: '修改应用',
  173. },
  174. element: lazyLoad(() => import('@/pages/platforms/zhipu/questionAnswer/info/index')),
  175. },
  176. ]
  177. },
  178. { /* 知识库 */
  179. path: '/zhipu/knowledgeLib',
  180. handle: {
  181. menuLevel: 1,
  182. breadcrumbName: '知识库',
  183. },
  184. children: [
  185. {
  186. index: true,
  187. element: lazyLoad(() => import('@/pages/platforms/zhipu/knowledgeLib/list/index')),
  188. },
  189. { /* 知识库-知识库详情 */
  190. path: '/zhipu/knowledgeLib/:knowledgeId',
  191. handle: {
  192. menuLevel: 1,
  193. breadcrumbName: '知识库详情',
  194. },
  195. element: lazyLoad(() => import('@/pages/platforms/zhipu/knowledgeLib/detail/index')),
  196. },
  197. ]
  198. },
  199. { /* 数据导出 */
  200. path: '/zhipu/dataExport',
  201. handle: {
  202. menuLevel: 1,
  203. breadcrumbName: '数据导出',
  204. },
  205. element: lazyLoad(() => import('@/pages/platforms/zhipu/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. // path: '/imgPre',
  223. // element: lazyLoad(() => import('@/pages/deepseek/knowledgeLib/slice/detail/imgPre'))
  224. // },
  225. // { /* 登录 */
  226. // path: '/mdk',
  227. // element: lazyLoad(() => import('@/pages/deepseek/knowledgeLib/slice/detail/mdk'))
  228. // },
  229. // { /* 登录 */
  230. // path: '/testPreImg',
  231. // element: lazyLoad(() => import('@/pages/deepseek/knowledgeLib/slice/detail/testPreImg'))
  232. // }
  233. ]
  234. // 路由模式-浏览器路由
  235. const router = createBrowserRouter(routerList);
  236. // 路由白名单
  237. const whiteList = ['/login'];
  238. // 前置路由
  239. router.routes.forEach((route: any) => {
  240. interface RouterComponentProps {
  241. component?: React.ReactNode,
  242. }
  243. // 路由组件-路由鉴权
  244. function RouterComponent(props: RouterComponentProps) {
  245. const { component } = props;
  246. const location = useLocation();
  247. const path = location.pathname;
  248. const originUrl = window.location.origin;
  249. const fullUrl = window.location.href;
  250. const urlParams = new URLSearchParams(new URL(fullUrl).search);
  251. const code = urlParams.get('code');
  252. const state = urlParams.get('state');
  253. const userInfo = localStorage.getItem('userInfo');
  254. const token = urlParams.get('token');
  255. if (token) {// 通过token登陆
  256. const checkToken = async (token: string) => {
  257. try {
  258. const res = await apis.checkToken(token);
  259. if(res.data.status) {
  260. localStorage.setItem('token', token);
  261. LocalStorage.setPermissions(res.permissions);
  262. LocalStorage.setRoles(res.roles);
  263. LocalStorage.setUserInfo({
  264. id: res.user.userId,
  265. name: res.user.nickName,
  266. });
  267. window.location.replace(originUrl + path);
  268. }
  269. } catch (error: any) {
  270. Modal.error({
  271. title: 'Error',
  272. content: 'token验证失败',
  273. })
  274. }
  275. return <Navigate to='/login' replace={true} />
  276. }
  277. checkToken(token);
  278. } else if (LocalStorage.getToken()) {// 已登录
  279. return <>{component}</>
  280. } else {// 未登录
  281. const jkLogin = async (data: { code: string, redirectUrl: string }, url: string) => {
  282. try {
  283. const res = await apis.jklogin(data);
  284. console.log(res.data,"res.data");
  285. localStorage.setItem('token', res.data.token);
  286. window.location.replace(url);
  287. } catch (error: any) {
  288. Modal.error({
  289. title: '登录失败',
  290. content: error.msg,
  291. })
  292. }
  293. }
  294. if (fullUrl.includes(originUrl + '/?code') && code && state) {// 通过code登陆
  295. if (!userInfo) {
  296. jkLogin({ code: code, redirectUrl: encodeURIComponent(originUrl) }, state);
  297. }
  298. }
  299. // else {
  300. // //测试环境
  301. // //const loginUrl = 'https://esctest.sribs.com.cn/esc-sso/oauth2.0/authorize?client_id=e97f94cf93761f4d69e8&response_type=code';
  302. // //生产环境
  303. // const loginUrl = 'http://esc.sribs.com.cn:8080/esc-sso/oauth2.0/authorize?client_id=e97f94cf93761f4d69e8&response_type=code';
  304. // const externalLoginUrl = loginUrl + `&redirect_uri=${encodeURIComponent(originUrl)}&state=${encodeURIComponent(fullUrl)}`;
  305. // if (!userInfo) {
  306. // window.location.replace(externalLoginUrl);
  307. // }
  308. // }
  309. else {// 未登录
  310. if (whiteList.includes(path)) {
  311. return <>{component}</>
  312. } else {
  313. return <Navigate to='/login' replace={true} />
  314. }
  315. }
  316. }
  317. }
  318. route.element = <RouterComponent component={route.element} />
  319. });
  320. export default router;