menu.ts 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. 'link/Type/Save': 'link/Type/Save',
  64. 'log/Access': 'log/Access',
  65. 'log/System': 'log/System',
  66. 'media/Cascade': 'media/Cascade',
  67. 'media/Config': 'media/Config',
  68. 'media/Device': 'media/Device',
  69. 'media/Reveal': 'media/Reveal',
  70. 'notice/Config': 'notice/Config',
  71. 'notice/Template': 'notice/Template',
  72. 'rule-engine/Instance': 'rule-engine/Instance',
  73. 'rule-engine/SQLRule': 'rule-engine/SQLRule',
  74. 'rule-engine/Scene': 'rule-engine/Scene',
  75. 'simulator/Device': 'simulator/Device',
  76. 'system/DataSource': 'system/DataSource',
  77. 'system/Department/Assets': 'system/Department/Assets',
  78. 'system/Department/Member': 'system/Department/Member',
  79. 'system/Department': 'system/Department',
  80. 'system/Menu/Detail': 'system/Menu/Detail',
  81. 'system/Menu': 'system/Menu',
  82. 'system/OpenAPI': 'system/OpenAPI',
  83. 'system/Permission': 'system/Permission',
  84. 'system/Role/Edit': 'system/Role/Edit',
  85. 'system/Role': 'system/Role',
  86. 'system/Tenant/Detail/Assets': 'system/Tenant/Detail/Assets',
  87. 'system/Tenant/Detail/Info': 'system/Tenant/Detail/Info',
  88. 'system/Tenant/Detail/Member': 'system/Tenant/Detail/Member',
  89. 'system/Tenant/Detail/Permission': 'system/Tenant/Detail/Permission',
  90. 'system/Tenant/Detail': 'system/Tenant/Detail',
  91. 'system/Tenant': 'system/Tenant',
  92. 'system/User': 'system/User',
  93. 'user/Login': 'user/Login',
  94. 'visualization/Category': 'visualization/Category',
  95. 'visualization/Configuration': 'visualization/Configuration',
  96. 'visualization/Screen': 'visualization/Screen',
  97. };
  98. const isRedirect = false;
  99. /**
  100. * 根据url获取映射的组件
  101. * @param files
  102. */
  103. const findComponents = (files: __WebpackModuleApi.RequireContext) => {
  104. const modules = {};
  105. files.keys().forEach((key) => {
  106. // 删除路径开头的./ 以及结尾的 /index;
  107. const str = key.replace(/(\.\/|\.tsx)/g, '').replace('/index', '');
  108. modules[str] = files(key).default;
  109. });
  110. return modules;
  111. };
  112. /**
  113. * 扁平化路由树
  114. * @param routes
  115. */
  116. export const flatRoute = (routes: MenuItem[]): MenuItem[] => {
  117. return routes.reduce<MenuItem[]>((pValue, currValue) => {
  118. const menu: MenuItem[] = [];
  119. const { children, ...extraRoute } = currValue;
  120. menu.push(extraRoute);
  121. return [...pValue, ...menu, ...flatRoute(children || [])];
  122. }, []);
  123. };
  124. /**
  125. * 处理为正确的路由格式
  126. * @param extraRoutes 后端菜单数据
  127. * @param level 路由层级
  128. */
  129. const getRoutes = (extraRoutes: MenuItem[], level: number = 1) => {
  130. const allComponents = findComponents(require.context('@/pages', true, /index(\.tsx)$/));
  131. const Menus: IRouteProps[] = [];
  132. extraRoutes.forEach((route) => {
  133. const component = allComponents[route.code] || null;
  134. const _route: IRouteProps = {
  135. key: route.url,
  136. name: route.name,
  137. path: route.url,
  138. };
  139. if (level === 1 && route.children) {
  140. _route.children = [
  141. ...getRoutes(flatRoute(route.children || []), level + 1),
  142. {
  143. path: _route.path,
  144. redirect: route.children[0].url,
  145. },
  146. ];
  147. Menus.push(_route);
  148. }
  149. if (component) {
  150. _route.component = component;
  151. _route.exact = true;
  152. Menus.push(_route);
  153. }
  154. });
  155. if (level === 1 && !isRedirect && extraRoutes.length) {
  156. Menus.push({
  157. path: '/',
  158. redirect: extraRoutes[0].url,
  159. });
  160. }
  161. return Menus;
  162. };
  163. export const getMenus = (extraRoutes: MenuItem[], level: number = 1): any[] => {
  164. return extraRoutes.map((route) => {
  165. const children =
  166. route.children && route.children.length ? getMenus(route.children, level + 1) : [];
  167. return {
  168. key: route.url,
  169. name: route.name,
  170. path: route.url,
  171. hideChildrenInMenu: level === 2,
  172. exact: true,
  173. state: {
  174. params: {
  175. id: 123,
  176. },
  177. },
  178. children: children,
  179. };
  180. });
  181. };
  182. /** 缓存路由数据,格式为 [{ code: url }] */
  183. export const saveMenusCache = (routes: MenuItem[]) => {
  184. const list: MenuItem[] = flatRoute(routes);
  185. const listObject = {};
  186. list.forEach((route) => {
  187. listObject[route.code] = route.url;
  188. });
  189. try {
  190. localStorage.setItem(MENUS_DATA_CACHE, JSON.stringify(listObject));
  191. } catch (e) {
  192. console.log(e);
  193. }
  194. };
  195. /**
  196. * 通过缓存的数据取出相应的路由url
  197. * @param code
  198. */
  199. export const getMenuPathByCode = (code: string): string => {
  200. const menusStr = localStorage.getItem(MENUS_DATA_CACHE) || '{}';
  201. const menusData = JSON.parse(menusStr);
  202. console.log(code, menusData);
  203. return menusData[code];
  204. };
  205. /**
  206. * 通过缓存的数据取出相应的路由url
  207. * @param code 路由Code
  208. * @param id 路由携带参数
  209. * @param regStr 路由参数code
  210. */
  211. export const getMenuPathByParams = (code: string, id?: string, regStr: string = ':id') => {
  212. const menusData = getMenuPathByCode(code);
  213. return id ? menusData.replace(regStr, id) : menusData;
  214. };
  215. export default getRoutes;