index.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { defineStore } from 'pinia';
  2. import { sysMenu } from '@/api/user';
  3. import staticMenu from '@/constants/staticMenu';
  4. import { HOME_PAGE_ROUTE } from '@/router/constants';
  5. import type { UserMenuItem, UserMenuPrivilegeEnum } from '@/api/types/user';
  6. import { AppState, PrivilegeItem, AppMenuItem } from './types';
  7. function initPrivilegeMap(data: UserMenuItem[]) {
  8. const privilegeMap: Record<string, string[]> = {};
  9. const pageSetTypes: UserMenuPrivilegeEnum[] = [
  10. 'conditions',
  11. 'buttons',
  12. 'lists',
  13. 'links',
  14. ];
  15. data.forEach((item) => {
  16. privilegeMap[item.url] = [item.id];
  17. pageSetTypes.forEach((type) => {
  18. if (item[type]) return;
  19. (item[type] as UserMenuItem[]).forEach((elem) => {
  20. privilegeMap[item.url].push(`${elem.type}_${elem.url}`.toLowerCase());
  21. });
  22. });
  23. });
  24. return privilegeMap;
  25. }
  26. function transformMenu(list: UserMenuItem[]): PrivilegeItem[] {
  27. return list.map((item) => {
  28. return {
  29. id: item.id,
  30. parentId: item.parentId,
  31. name: item.name,
  32. type: item.type,
  33. url: item.url,
  34. };
  35. });
  36. }
  37. function getMenu(privilegeData: PrivilegeItem[]): {
  38. menuList: AppMenuItem[];
  39. validRoutes: string[];
  40. } {
  41. const getChildren = (id: string) => {
  42. return privilegeData
  43. .filter((item) => item.parentId === id)
  44. .map((item) => {
  45. return { ...item } as AppMenuItem;
  46. });
  47. };
  48. const menuList = getChildren('-1');
  49. const validRoutes: string[] = [];
  50. const toTree = (data: AppMenuItem[]) => {
  51. data.forEach((menu) => {
  52. const children = getChildren(menu.id);
  53. if (children.length) {
  54. menu.children = children;
  55. toTree(menu.children);
  56. } else {
  57. validRoutes.push(menu.url);
  58. }
  59. });
  60. };
  61. toTree(menuList);
  62. return { menuList, validRoutes };
  63. }
  64. const useAppStore = defineStore('app', {
  65. state: (): AppState => ({
  66. version: '',
  67. privilegeMap: {},
  68. appMenus: [],
  69. privilegeList: [],
  70. validRoutes: [],
  71. device: 'desktop',
  72. }),
  73. getters: {
  74. appInfo(state: AppState): AppState {
  75. return { ...state };
  76. },
  77. },
  78. actions: {
  79. resetInfo() {
  80. this.$reset();
  81. },
  82. setInfo(partial: Partial<AppState>) {
  83. this.$patch(partial);
  84. },
  85. async fetchServerMenu() {
  86. const res = await sysMenu().catch(() => {});
  87. if (!res) return;
  88. const privilegeList: UserMenuItem[] = [...staticMenu, ...res.privileges];
  89. this.privilegeMap = initPrivilegeMap(privilegeList);
  90. this.privilegeList = transformMenu(privilegeList);
  91. const { menuList, validRoutes } = getMenu(this.privilegeList);
  92. this.appMenus = menuList;
  93. this.validRoutes = validRoutes;
  94. },
  95. getMenuFirstRouter() {
  96. let firstRouteName = '';
  97. let menu: AppMenuItem | undefined = this.appMenus[0];
  98. if (menu.url === HOME_PAGE_ROUTE) return { name: HOME_PAGE_ROUTE };
  99. while (menu) {
  100. firstRouteName = menu.url;
  101. if (menu.children) {
  102. menu = menu.children[0];
  103. } else {
  104. menu = undefined;
  105. }
  106. }
  107. return { name: firstRouteName };
  108. },
  109. toggleDevice(device: string) {
  110. this.device = device;
  111. },
  112. },
  113. persist: {
  114. storage: sessionStorage,
  115. },
  116. });
  117. export default useAppStore;