menu.ts 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // 路由components映射
  2. import type { IRouteProps } from 'umi';
  3. import type { MenuItem } from '@/pages/system/Menu/typing';
  4. /** localStorage key */
  5. export const MENUS_DATA_CACHE = 'MENUS_DATA_CACHE';
  6. /** 路由Code */
  7. export const MENUS_CODE = {
  8. 'Analysis/CPU': 'Analysis/CPU',
  9. 'Analysis/DeviceChart': 'Analysis/DeviceChart',
  10. 'Analysis/DeviceMessage': 'Analysis/DeviceMessage',
  11. 'Analysis/Jvm': 'Analysis/Jvm',
  12. 'Analysis/MessageChart': 'Analysis/MessageChart',
  13. Analysis: 'Analysis',
  14. 'cloud/Aliyun': 'cloud/Aliyun',
  15. 'cloud/Ctwing': 'cloud/Ctwing',
  16. 'cloud/DuerOS': 'cloud/DuerOS',
  17. 'cloud/Onenet': 'cloud/Onenet',
  18. 'device/Alarm': 'device/Alarm',
  19. 'device/Category/Save': 'device/Category/Save',
  20. 'device/Category': 'device/Category',
  21. 'device/Command': 'device/Command',
  22. 'device/DataSource': 'device/DataSource',
  23. 'device/Firmware/Detail/History': 'device/Firmware/Detail/History',
  24. 'device/Firmware/Detail/Task/Detail': 'device/Firmware/Detail/Task/Detail',
  25. 'device/Firmware/Detail/Task/Release': 'device/Firmware/Detail/Task/Release',
  26. 'device/Firmware/Detail/Task/Save': 'device/Firmware/Detail/Task/Save',
  27. 'device/Firmware/Detail/Task': 'device/Firmware/Detail/Task',
  28. 'device/Firmware/Detail': 'device/Firmware/Detail',
  29. 'device/Firmware/Save': 'device/Firmware/Save',
  30. 'device/Firmware': 'device/Firmware',
  31. 'device/Instance/Detail/Config/Tags': 'device/Instance/Detail/Config/Tags',
  32. 'device/Instance/Detail/Config': 'device/Instance/Detail/Config',
  33. 'device/Instance/Detail/Functions': 'device/Instance/Detail/Functions',
  34. 'device/Instance/Detail/Info': 'device/Instance/Detail/Info',
  35. 'device/Instance/Detail/Log': 'device/Instance/Detail/Log',
  36. 'device/Instance/Detail/MetadataLog/Event': 'device/Instance/Detail/MetadataLog/Event',
  37. 'device/Instance/Detail/MetadataLog/Property': 'device/Instance/Detail/MetadataLog/Property',
  38. 'device/Instance/Detail/Running': 'device/Instance/Detail/Running',
  39. 'device/Instance/Detail': 'device/Instance/Detail',
  40. 'device/Instance': 'device/Instance',
  41. 'device/Location': 'device/Location',
  42. 'device/Product/Detail/BaseInfo': 'device/Product/Detail/BaseInfo',
  43. 'device/Product/Detail': 'device/Product/Detail',
  44. 'device/Product/Save': 'device/Product/Save',
  45. 'device/Product': 'device/Product',
  46. 'device/components/Alarm/Edit': 'device/components/Alarm/Edit',
  47. 'device/components/Alarm/Record': 'device/components/Alarm/Record',
  48. 'device/components/Alarm/Setting': 'device/components/Alarm/Setting',
  49. 'device/components/Alarm': 'device/components/Alarm',
  50. 'device/components/Metadata/Base/Edit': 'device/components/Metadata/Base/Edit',
  51. 'device/components/Metadata/Base': 'device/components/Metadata/Base',
  52. 'device/components/Metadata/Cat': 'device/components/Metadata/Cat',
  53. 'device/components/Metadata/Import': 'device/components/Metadata/Import',
  54. 'device/components/Metadata': 'device/components/Metadata',
  55. 'edge/Device': 'edge/Device',
  56. 'edge/Product': 'edge/Product',
  57. 'link/Certificate': 'link/Certificate',
  58. 'link/Gateway': 'link/Gateway',
  59. 'link/Opcua': 'link/Opcua',
  60. 'link/Protocol/Debug': 'link/Protocol/Debug',
  61. 'link/Protocol': 'link/Protocol',
  62. 'link/Type': 'link/Type',
  63. 'log/Access': 'log/Access',
  64. 'log/System': 'log/System',
  65. 'media/Cascade': 'media/Cascade',
  66. 'media/Config': 'media/Config',
  67. 'media/Device': 'media/Device',
  68. 'media/Reveal': 'media/Reveal',
  69. 'notice/Config': 'notice/Config',
  70. 'notice/Template': 'notice/Template',
  71. 'rule-engine/Instance': 'rule-engine/Instance',
  72. 'rule-engine/SQLRule': 'rule-engine/SQLRule',
  73. 'rule-engine/Scene': 'rule-engine/Scene',
  74. 'simulator/Device': 'simulator/Device',
  75. 'system/DataSource': 'system/DataSource',
  76. 'system/Department/Assets': 'system/Department/Assets',
  77. 'system/Department/Member': 'system/Department/Member',
  78. 'system/Department': 'system/Department',
  79. 'system/Menu/Detail': 'system/Menu/Detail',
  80. 'system/Menu': 'system/Menu',
  81. 'system/OpenAPI': 'system/OpenAPI',
  82. 'system/Permission': 'system/Permission',
  83. 'system/Role/Edit/Info': 'system/Role/Edit/Info',
  84. 'system/Role/Edit/UserManage': 'system/Role/Edit/UserManage',
  85. 'system/Role/Edit': 'system/Role/Edit',
  86. 'system/Role': 'system/Role',
  87. 'system/Tenant/Detail/Assets': 'system/Tenant/Detail/Assets',
  88. 'system/Tenant/Detail/Info': 'system/Tenant/Detail/Info',
  89. 'system/Tenant/Detail/Member': 'system/Tenant/Detail/Member',
  90. 'system/Tenant/Detail/Permission': 'system/Tenant/Detail/Permission',
  91. 'system/Tenant/Detail': 'system/Tenant/Detail',
  92. 'system/Tenant': 'system/Tenant',
  93. 'system/User/Save': 'system/User/Save',
  94. 'system/User': 'system/User',
  95. 'user/Login': 'user/Login',
  96. 'visualization/Category': 'visualization/Category',
  97. 'visualization/Configuration': 'visualization/Configuration',
  98. 'visualization/Screen': 'visualization/Screen',
  99. };
  100. const isRedirect = false;
  101. /**
  102. * 根据url获取映射的组件
  103. * @param files
  104. */
  105. const findComponents = (files: __WebpackModuleApi.RequireContext) => {
  106. const modules = {};
  107. files.keys().forEach((key) => {
  108. // 删除路径开头的./ 以及结尾的 /index;
  109. const str = key.replace(/(\.\/|\.tsx)/g, '').replace('/index', '');
  110. modules[str] = files(key).default;
  111. });
  112. return modules;
  113. };
  114. /**
  115. * 扁平化路由树
  116. * @param routes
  117. */
  118. export const flatRoute = (routes: MenuItem[]): MenuItem[] => {
  119. return routes.reduce<MenuItem[]>((pValue, currValue) => {
  120. const menu: MenuItem[] = [];
  121. const { children, ...extraRoute } = currValue;
  122. menu.push(extraRoute);
  123. return [...pValue, ...menu, ...flatRoute(children || [])];
  124. }, []);
  125. };
  126. /**
  127. * 处理为正确的路由格式
  128. * @param extraRoutes 后端菜单数据
  129. * @param level 路由层级
  130. */
  131. const getRoutes = (extraRoutes: MenuItem[], level: number = 1) => {
  132. const allComponents = findComponents(require.context('@/pages', true, /index(\.tsx)$/));
  133. const Menus: IRouteProps[] = [];
  134. extraRoutes.forEach((route) => {
  135. const component = allComponents[route.code] || null;
  136. const _route: IRouteProps = {
  137. key: route.url,
  138. name: route.name,
  139. path: route.url,
  140. };
  141. if (level === 1 && route.children) {
  142. _route.children = [
  143. ...getRoutes(flatRoute(route.children || []), level + 1),
  144. {
  145. path: _route.path,
  146. redirect: route.children[0].url,
  147. },
  148. ];
  149. Menus.push(_route);
  150. }
  151. if (component) {
  152. _route.component = component;
  153. _route.exact = true;
  154. Menus.push(_route);
  155. }
  156. });
  157. if (level === 1 && !isRedirect && extraRoutes.length) {
  158. Menus.push({
  159. path: '/',
  160. redirect: extraRoutes[0].url,
  161. });
  162. }
  163. return Menus;
  164. };
  165. export const getMenus = (extraRoutes: MenuItem[], level: number = 1): any[] => {
  166. return extraRoutes.map((route) => {
  167. const children =
  168. route.children && route.children.length ? getMenus(route.children, level + 1) : [];
  169. return {
  170. key: route.url,
  171. name: route.name,
  172. path: route.url,
  173. hideChildrenInMenu: level === 2,
  174. exact: true,
  175. state: {
  176. params: {
  177. id: 123,
  178. },
  179. },
  180. children: children,
  181. };
  182. });
  183. };
  184. /** 缓存路由数据,格式为 [{ code: url }] */
  185. export const saveMenusCache = (routes: MenuItem[]) => {
  186. const list: MenuItem[] = flatRoute(routes);
  187. const listObject = {};
  188. list.forEach((route) => {
  189. listObject[route.code] = route.url;
  190. });
  191. try {
  192. localStorage.setItem(MENUS_DATA_CACHE, JSON.stringify(listObject));
  193. } catch (e) {
  194. console.log(e);
  195. }
  196. };
  197. /**
  198. * 通过缓存的数据取出相应的路由url
  199. * @param code
  200. */
  201. export const getMenuPathByCode = (code: string): string => {
  202. const menusStr = localStorage.getItem(MENUS_DATA_CACHE) || '{}';
  203. const menusData = JSON.parse(menusStr);
  204. console.log(code, menusData);
  205. return menusData[code];
  206. };
  207. /**
  208. * 通过缓存的数据取出相应的路由url
  209. * @param code 路由Code
  210. * @param id 路由携带参数
  211. * @param regStr 路由参数code
  212. */
  213. export const getMenuPathByParams = (code: string, id: string, regStr: string = ':id') => {
  214. const menusData = getMenuPathByCode(code);
  215. return menusData.replace(regStr, id);
  216. };
  217. export default getRoutes;