import { defineStore } from 'pinia'; import { sysMenu } from '@/api/user'; import staticMenu from '@/constants/staticMenu'; import { HOME_PAGE_ROUTE } from '@/router/constants'; import type { UserMenuItem, UserMenuPrivilegeEnum } from '@/api/types/user'; import { AppState, PrivilegeItem, AppMenuItem } from './types'; function initPrivilegeMap(data: UserMenuItem[]) { const privilegeMap: Record = {}; const pageSetTypes: UserMenuPrivilegeEnum[] = [ 'conditions', 'buttons', 'lists', 'links', ]; data.forEach((item) => { privilegeMap[item.url] = [item.id]; pageSetTypes.forEach((type) => { if (item[type]) return; (item[type] as UserMenuItem[]).forEach((elem) => { privilegeMap[item.url].push(`${elem.type}_${elem.url}`.toLowerCase()); }); }); }); return privilegeMap; } function transformMenu(list: UserMenuItem[]): PrivilegeItem[] { return list.map((item) => { return { id: item.id, parentId: item.parentId, name: item.name, type: item.type, url: item.url, }; }); } function getMenu(privilegeData: PrivilegeItem[]): { menuList: AppMenuItem[]; validRoutes: string[]; } { const getChildren = (id: string) => { return privilegeData .filter((item) => item.parentId === id) .map((item) => { return { ...item } as AppMenuItem; }); }; const menuList = getChildren('-1'); const validRoutes: string[] = []; const toTree = (data: AppMenuItem[]) => { data.forEach((menu) => { const children = getChildren(menu.id); if (children.length) { menu.children = children; toTree(menu.children); } else { validRoutes.push(menu.url); } }); }; toTree(menuList); return { menuList, validRoutes }; } const useAppStore = defineStore('app', { state: (): AppState => ({ version: '', privilegeMap: {}, appMenus: [], privilegeList: [], validRoutes: [], device: 'desktop', }), getters: { appInfo(state: AppState): AppState { return { ...state }; }, }, actions: { resetInfo() { this.$reset(); }, setInfo(partial: Partial) { this.$patch(partial); }, async fetchServerMenu() { const res = await sysMenu().catch(() => {}); if (!res) return; const privilegeList: UserMenuItem[] = [...staticMenu, ...res.privileges]; this.privilegeMap = initPrivilegeMap(privilegeList); this.privilegeList = transformMenu(privilegeList); const { menuList, validRoutes } = getMenu(this.privilegeList); this.appMenus = menuList; this.validRoutes = validRoutes; }, getMenuFirstRouter() { let firstRouteName = ''; let menu: AppMenuItem | undefined = this.appMenus[0]; if (menu.url === HOME_PAGE_ROUTE) return { name: HOME_PAGE_ROUTE }; while (menu) { firstRouteName = menu.url; if (menu.children) { menu = menu.children[0]; } else { menu = undefined; } } return { name: firstRouteName }; }, toggleDevice(device: string) { this.device = device; }, }, persist: { storage: sessionStorage, }, }); export default useAppStore;