/* * @Author: wei.li * @Date: 2021-11-17 16:02:30 * @LastEditors: levi7754 levi7754@163.com * @LastEditTime: 2025-10-19 11:58:29 * @Description: file content */ import { defineStore } from 'pinia'; import { store } from '../index'; import type { cacheType } from './types'; import { constantMenus } from '../../router'; import { clone, findLastIndexOf } from 'xe-utils'; import { getKeyList } from '../../utils'; import { ascending, filterTree, formatFlatteningRoutes } from '../../router/utils'; import { useMultiTagsStoreHook } from './multiTags'; export const usePermissionStore = defineStore('udp-permission', { state: () => ({ // 静态路由生成的菜单 constantMenus, // 整体路由生成的菜单(静态、动态) wholeMenus: [], // 深拷贝一个菜单树,与导航菜单不冲突 menusTree: [], // 整体路由(一维数组格式) flatteningRoutes: [], buttonAuth: [], // 缓存页面keepAlive cachePageList: [] }), getters: { getButtonAuth() { return this.buttonAuth; } }, actions: { asyncActionRoutes(routes = []) { if (this.wholeMenus.length > 0) return; const idx = findLastIndexOf(routes, item => item.menuCode === 'SysHome'); const constantMenus = clone(this.constantMenus, true); if (idx !== -1) { const homeRouter = this.constantMenus.find(f => f.name === 'home'); // 过滤非路由分类非菜单的数据 routes[idx].children && homeRouter.children.push(...routes[idx].children); routes.splice(idx, 1); } this.wholeMenus = filterTree(ascending(this.constantMenus.concat(routes))); this.flatteningRoutes = formatFlatteningRoutes(this.constantMenus.concat(routes)); this.menusTree = clone(this.wholeMenus, true); this.constantMenus = constantMenus; }, async changeSetting(routes) { await this.asyncActionRoutes(routes); }, setAuthButton(buttonAuth) { this.buttonAuth = buttonAuth; }, setWholeMenus(wholeMenus) { this.wholeMenus = wholeMenus; }, /** 监听缓存页面是否存在于标签页,不存在则删除 */ clearCache() { let cacheLength = this.cachePageList.length; const nameList = getKeyList(useMultiTagsStoreHook().multiTags, 'name'); while (cacheLength > 0) { nameList.findIndex(v => v === this.cachePageList[cacheLength - 1]) === -1 && this.cachePageList.splice(this.cachePageList.indexOf(this.cachePageList[cacheLength - 1]), 1); cacheLength--; } }, cacheOperate({ mode, name }: cacheType) { const delIndex = this.cachePageList.findIndex(v => v === name); switch (mode) { case 'refresh': this.cachePageList = this.cachePageList.filter(v => v !== name); this.clearCache(); break; case 'add': this.cachePageList.push(name); break; case 'delete': delIndex !== -1 && this.cachePageList.splice(delIndex, 1); this.clearCache(); break; case 'reset': this.cachePageList = []; break; } /** 监听缓存页面是否存在于标签页,不存在则删除 */ // debounce(() => { // let cacheLength = this.cachePageList.length; // const nameList = getKeyList(useMultiTagsStoreHook().multiTags, 'name'); // while (cacheLength > 0) { // nameList.findIndex(v => v === this.cachePageList[cacheLength - 1]) === -1 && // this.cachePageList.splice(this.cachePageList.indexOf(this.cachePageList[cacheLength - 1]), 1); // cacheLength--; // } // }, 500)(); }, /** 清空缓存页面 */ clearAllCachePage() { this.wholeMenus = []; this.menusTree = []; this.buttonAuth = []; this.cachePageList = []; } } }); export function usePermissionStoreHook() { return usePermissionStore(store); }