123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- 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<string, string[]> = {};
- 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<AppState>) {
- 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;
|