You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

app.tsx 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import type { RequestConfig } from "@umijs/max";
  2. import { message, Modal, Dropdown, MenuProps, theme } from "antd";
  3. import { BulbOutlined, LogoutOutlined } from '@ant-design/icons';
  4. import { baseUrl } from './constants/index'
  5. import routes from '../config/routes'
  6. import { history } from '@umijs/max';
  7. import {
  8. ProBreadcrumb,
  9. } from '@ant-design/pro-components';
  10. import { GetUserMenulist } from '@/apis/api';
  11. export async function getInitialState(): Promise<{ permissions: object[] }> {
  12. const token = sessionStorage.getItem('token');
  13. let permissions = [];
  14. if (!token) {
  15. sessionStorage.clear();
  16. history.push('/login');
  17. return { permissions };
  18. }
  19. try {
  20. const res = await GetUserMenulist();
  21. permissions = flattenPermissions(res.data.menulist);
  22. } catch (error) {
  23. console.error('Failed to fetch user permissions:', error);
  24. }
  25. if (permissions.length === 0) {
  26. history.push('/login');
  27. }
  28. return { permissions };
  29. }
  30. function flattenPermissions(permissions: { id: number; action: string; childs?: { id: number; action: string }[] }[]): string[] {
  31. const flattenedPermissions: string[] = [];
  32. permissions.forEach(permission => {
  33. flattenedPermissions.push(permission.action);
  34. if (permission.childs) {
  35. flattenedPermissions.push(...flattenPermissions(permission.childs));
  36. }
  37. });
  38. return flattenedPermissions;
  39. }
  40. export const layout = () => {
  41. return {
  42. name: '菊城人才市场',
  43. logo: '/images/logo_1.jpg',
  44. // copy from pro site
  45. navTheme: 'dark',
  46. primaryColor: '#1890ff',
  47. layout: 'mix',
  48. contentWidth: 'Fluid',
  49. fixedHeader: true,
  50. fixSiderbar: true,
  51. // splitMenus: true,
  52. siderWidth: 240,
  53. title: '菊城人才市场',
  54. pwa: false,
  55. iconfontUrl: '',
  56. headerContentRender: () => (<> <ProBreadcrumb /></>),
  57. avatarProps: {
  58. src: 'https://gw.alipayobjects.com/zos/antfincdn/efFD%24IOql2/weixintupian_20170331104822.jpg',
  59. size: 'small',
  60. title: '管理员',
  61. render: (props, dom) => {
  62. return (
  63. <Dropdown
  64. menu={{
  65. items: [
  66. {
  67. key: 'logout',
  68. icon: <LogoutOutlined />,
  69. label: '退出登录',
  70. }
  71. ],
  72. onClick: ({ key }) => {
  73. sessionStorage.clear();
  74. history.replace('/login');
  75. }
  76. }}
  77. >
  78. {dom}
  79. </Dropdown>
  80. );
  81. }
  82. },
  83. token: {
  84. sider: {
  85. //侧边菜单的配置 ,这里具体看文档
  86. colorBgMenuItemSelected: '#19be6e',
  87. colorTextMenuItemSelected: '#ffffff',
  88. },
  89. },
  90. };
  91. };
  92. export function onRouteChange({
  93. location,
  94. }) {
  95. sessionStorage.setItem('path', location.pathname)
  96. }
  97. export const request: RequestConfig = {
  98. baseURL: baseUrl,
  99. errorConfig: {
  100. // 错误抛出
  101. errorThrower: (res) => {
  102. const { success, data, errorCode, errorMessage, showType } = res;
  103. if (!success) {
  104. }
  105. },
  106. },
  107. // 配置请求头
  108. requestInterceptors: [
  109. (config: object) => {
  110. // 拦截请求配置,进行个性化处理。
  111. const token = sessionStorage.getItem('token');
  112. if (token) {
  113. config.headers.Authorization = `${token}`;
  114. }
  115. return config;
  116. },
  117. ],
  118. // 配置响应拦截
  119. responseInterceptors: [
  120. (response) => {
  121. const msgModel = (val: String, code: number) => {
  122. Modal.error({
  123. title: val,
  124. centered: true
  125. });
  126. }
  127. // 拦截响应数据,进行个性化处理
  128. const { data } = response;
  129. switch (data.code) {
  130. case -1:
  131. msgModel(data.msg, data.code)
  132. break;
  133. case 0:
  134. break;
  135. case 1:
  136. return response;
  137. break;
  138. case 401:
  139. msgModel(data.msg, data.code)
  140. sessionStorage.clear();
  141. history.push('/login');
  142. break;
  143. case 403:
  144. msgModel(data.msg, data.code)
  145. break;
  146. case 404:
  147. break;
  148. case 600:
  149. if (data.errors && Object.keys(data.errors).length > 0) {
  150. msgModel(data.errors, data.code)
  151. } else {
  152. msgModel(data.msg, data.code)
  153. }
  154. }
  155. return response;
  156. }
  157. ]
  158. }