router.tsx 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  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/:createBy',
  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/:createBy/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/:createBy/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. { /* 帮助文档 */
  132. path: '/help/*',
  133. handle: {
  134. menuLevel: 1,
  135. breadcrumbName: '帮助文档',
  136. },
  137. element: lazyLoad(() => import('@/help/components/HelpLayout')),
  138. },
  139. { /* 404 */
  140. path: '/404',
  141. element: lazyLoad(() => import('@/components/404/index')),
  142. },
  143. { /* 路由不存在重定向404 */
  144. path: '/*',
  145. element: <Navigate to='/404' replace={true} />,
  146. },
  147. ]
  148. },
  149. {
  150. path: '/',
  151. element: lazyLoad(() => import('@/pages/layout/index')),
  152. children: [
  153. {
  154. index: true,
  155. element: <Navigate to='/zhipu/questionAnswer' />,
  156. },
  157. { /* 问答应用 */
  158. path: '/zhipu/questionAnswer',
  159. handle: {
  160. menuLevel: 1,
  161. breadcrumbName: '问答应用',
  162. },
  163. children: [
  164. {
  165. index: true,
  166. element: lazyLoad(() => import('@/pages/platforms/zhipu/questionAnswer/list/index')),
  167. },
  168. { /* 问答应用-创建应用 */
  169. path: '/zhipu/questionAnswer/create',
  170. handle: {
  171. menuLevel: 1,
  172. breadcrumbName: '创建应用',
  173. },
  174. element: lazyLoad(() => import('@/pages/platforms/zhipu/questionAnswer/info/index')),
  175. },
  176. { /* 问答应用-修改应用 */
  177. path: '/zhipu/questionAnswer/modify',
  178. handle: {
  179. menuLevel: 1,
  180. breadcrumbName: '修改应用',
  181. },
  182. element: lazyLoad(() => import('@/pages/platforms/zhipu/questionAnswer/info/index')),
  183. },
  184. ]
  185. },
  186. { /* 知识库 */
  187. path: '/zhipu/knowledgeLib',
  188. handle: {
  189. menuLevel: 1,
  190. breadcrumbName: '知识库',
  191. },
  192. children: [
  193. {
  194. index: true,
  195. element: lazyLoad(() => import('@/pages/platforms/zhipu/knowledgeLib/list/index')),
  196. },
  197. { /* 知识库-知识库详情 */
  198. path: '/zhipu/knowledgeLib/:knowledgeId',
  199. handle: {
  200. menuLevel: 1,
  201. breadcrumbName: '知识库详情',
  202. },
  203. element: lazyLoad(() => import('@/pages/platforms/zhipu/knowledgeLib/detail/index')),
  204. },
  205. ]
  206. },
  207. { /* 数据导出 */
  208. path: '/zhipu/dataExport',
  209. handle: {
  210. menuLevel: 1,
  211. breadcrumbName: '数据导出',
  212. },
  213. element: lazyLoad(() => import('@/pages/platforms/zhipu/dataExport/index')),
  214. },
  215. { /* 404 */
  216. path: '/404',
  217. element: lazyLoad(() => import('@/components/404/index')),
  218. },
  219. { /* 路由不存在重定向404 */
  220. path: '/*',
  221. element: <Navigate to='/404' replace={true} />,
  222. },
  223. ]
  224. },
  225. { /* 登录 */
  226. path: '/login',
  227. element: lazyLoad(() => import('@/pages/login/index'))
  228. },
  229. // { /* 登录 */
  230. // path: '/imgPre',
  231. // element: lazyLoad(() => import('@/pages/deepseek/knowledgeLib/slice/detail/imgPre'))
  232. // },
  233. // { /* 登录 */
  234. // path: '/mdk',
  235. // element: lazyLoad(() => import('@/pages/deepseek/knowledgeLib/slice/detail/mdk'))
  236. // },
  237. // { /* 登录 */
  238. // path: '/testPreImg',
  239. // element: lazyLoad(() => import('@/pages/deepseek/knowledgeLib/slice/detail/testPreImg'))
  240. // }
  241. ]
  242. // 路由模式-浏览器路由
  243. const router = createBrowserRouter(routerList);
  244. // 路由白名单
  245. const whiteList = ['/login'];
  246. // 前置路由
  247. router.routes.forEach((route: any) => {
  248. interface RouterComponentProps {
  249. component?: React.ReactNode,
  250. }
  251. // 路由组件-路由鉴权
  252. function RouterComponent(props: RouterComponentProps) {
  253. const { component } = props;
  254. const location = useLocation();
  255. const path = location.pathname;
  256. const originUrl = window.location.origin;
  257. const fullUrl = window.location.href;
  258. const urlParams = new URLSearchParams(new URL(fullUrl).search);
  259. const code = urlParams.get('code');
  260. const state = urlParams.get('state');
  261. const userInfo = localStorage.getItem('userInfo');
  262. const token = urlParams.get('token');
  263. if (token) {// 通过token登陆
  264. const checkToken = async (token: string) => {
  265. try {
  266. const res = await apis.checkToken(token);
  267. if(res.data.status) {
  268. localStorage.setItem('token', token);
  269. LocalStorage.setPermissions(res.permissions);
  270. LocalStorage.setRoles(res.roles);
  271. LocalStorage.setUserInfo({
  272. id: res.user.userId,
  273. name: res.user.nickName,
  274. });
  275. // 重新登录时,重置引导展开状态为默认展开
  276. localStorage.removeItem('appGuideExpanded');
  277. localStorage.removeItem('knowledgeGuideExpanded');
  278. localStorage.removeItem('knowledgeDocGuideExpanded');
  279. window.location.replace(originUrl + path);
  280. }
  281. } catch (error: any) {
  282. Modal.error({
  283. title: 'Error',
  284. content: 'token验证失败',
  285. })
  286. }
  287. return <Navigate to='/login' replace={true} />
  288. }
  289. checkToken(token);
  290. } else if (LocalStorage.getToken()) {// 已登录
  291. return <>{component}</>
  292. } else {// 未登录
  293. const jkLogin = async (data: { code: string, redirectUrl: string }, url: string) => {
  294. try {
  295. const res = await apis.jklogin(data);
  296. console.log(res.data,"res.data");
  297. localStorage.setItem('token', res.data.token);
  298. window.location.replace(url);
  299. } catch (error: any) {
  300. Modal.error({
  301. title: '登录失败',
  302. content: error.msg,
  303. })
  304. }
  305. }
  306. if (fullUrl.includes(originUrl + '/?code') && code && state) {// 通过code登陆
  307. if (!userInfo) {
  308. jkLogin({ code: code, redirectUrl: encodeURIComponent(originUrl) }, state);
  309. }
  310. }
  311. // else {
  312. // //测试环境
  313. // //const loginUrl = 'https://esctest.sribs.com.cn/esc-sso/oauth2.0/authorize?client_id=e97f94cf93761f4d69e8&response_type=code';
  314. // //生产环境
  315. // const loginUrl = 'http://esc.sribs.com.cn:8080/esc-sso/oauth2.0/authorize?client_id=e97f94cf93761f4d69e8&response_type=code';
  316. // const externalLoginUrl = loginUrl + `&redirect_uri=${encodeURIComponent(originUrl)}&state=${encodeURIComponent(fullUrl)}`;
  317. // if (!userInfo) {
  318. // window.location.replace(externalLoginUrl);
  319. // }
  320. // }
  321. else {// 未登录
  322. if (whiteList.includes(path)) {
  323. return <>{component}</>
  324. } else {
  325. return <Navigate to='/login' replace={true} />
  326. }
  327. }
  328. }
  329. }
  330. route.element = <RouterComponent component={route.element} />
  331. });
  332. export default router;