menu-rewrite.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import { HOME_PATH, HOME_TITLE, isHomeAliasPath } from '@/config/setting';
  2. /**
  3. * 把后端旧菜单(资质管理 / 期限管理)改成工种管理、资质证照管理。
  4. * 注意:保留原 path,避免门户/接口仍走旧地址时路由丢失白屏。
  5. * 首页 path 统一为 HOME_PATH,避免 /homeView 与 /home 双路由双页签。
  6. */
  7. const MENU_REWRITES = [
  8. {
  9. matchPath: [
  10. /term-management/i,
  11. /termManagement/i,
  12. /term_management/i,
  13. /job-management/i,
  14. ],
  15. matchTitle: [/期限管理/, /工种管理/],
  16. matchComponent: [/termManagement/i, /jobManagement/i],
  17. // 不改 path,兼容后端/门户旧地址
  18. component: 'hrManagement/jobManagement/index',
  19. title: '工种管理',
  20. },
  21. {
  22. matchPath: [
  23. /qualification-management/i,
  24. /qualificationManagement/i,
  25. /qualification_management/i,
  26. /qualification-certificate/i,
  27. ],
  28. matchTitle: [/^资质管理$/, /资质证照管理/],
  29. matchComponent: [/qualificationManagement/i, /qualificationCertificate/i],
  30. component: 'hrManagement/qualificationCertificate/index',
  31. title: '资质证照管理',
  32. },
  33. ];
  34. function getMenuTitle(menu) {
  35. return String(
  36. menu?.meta?.title || menu?.title || menu?.name || menu?.menuName || '',
  37. ).trim();
  38. }
  39. function getMenuPath(menu) {
  40. return String(menu?.path || '').trim();
  41. }
  42. function getMenuComponent(menu) {
  43. return String(menu?.component || '').trim();
  44. }
  45. function findRewrite(menu) {
  46. const path = getMenuPath(menu);
  47. const title = getMenuTitle(menu);
  48. const component = getMenuComponent(menu);
  49. return MENU_REWRITES.find(
  50. (rule) =>
  51. rule.matchPath.some((re) => re.test(path)) ||
  52. rule.matchTitle.some((re) => re.test(title)) ||
  53. rule.matchComponent.some((re) => re.test(component)),
  54. );
  55. }
  56. function isHomeMenu(menu) {
  57. if (isHomeAliasPath(getMenuPath(menu))) return true;
  58. const title = getMenuTitle(menu);
  59. if (title === HOME_TITLE || title === 'Home') return true;
  60. return /homeView|(^|\/)home$/i.test(getMenuComponent(menu));
  61. }
  62. /**
  63. * 递归改写菜单树中的旧模块
  64. * - 首页 path 统一为 /home/index(WT 内完整地址 /page-hr/home/index),侧栏仍显示「首页」
  65. * - 顶部只走小房子,不另开可关闭页签
  66. */
  67. export function rewriteLegacyHrMenus(menus = []) {
  68. if (!Array.isArray(menus) || !menus.length) return menus || [];
  69. return menus.map((item) => {
  70. const next = { ...item };
  71. if (isHomeMenu(next)) {
  72. next.path = HOME_PATH;
  73. next.component = 'homeView/index';
  74. next.title = HOME_TITLE;
  75. next.meta = {
  76. ...(next.meta || {}),
  77. title: HOME_TITLE,
  78. icon: next.meta?.icon || next.icon || 'el-icon-house',
  79. closable: false,
  80. };
  81. } else {
  82. const rule = findRewrite(next);
  83. if (rule) {
  84. next.component = rule.component;
  85. next.title = rule.title;
  86. next.meta = {
  87. ...(next.meta || {}),
  88. title: rule.title,
  89. };
  90. }
  91. }
  92. if (Array.isArray(next.children) && next.children.length) {
  93. next.children = rewriteLegacyHrMenus(next.children);
  94. }
  95. return next;
  96. });
  97. }