import Util from '@/lin/util/util' let stageMap = {} export const loggedIn = state => state.loggedIn export const user = state => state.user export const alreadyReadMessages = state => state.alreadyReadMessages export const unreadMessages = state => state.unreadMessages /** * 获取有权限的舞台配置 * @param {*} state */ export const permissionStageConfig = state => { const { stageConfig, permissions, user } = state const tempStageConfig = Util.deepClone(stageConfig) const shookConfig = permissionShaking(tempStageConfig, permissions, user) // 设置舞台缓存 const list = {} deepTravel(shookConfig, item => { list[item.name] = item }) stageMap = list return shookConfig } /** * 获取有权限的左侧菜单数据 * @param {*} state * @param {*} getters 其他 getter */ export const sidebarList = (state, getters) => { const { sidebarLevel } = state const { permissionStageConfig } = getters function deepGetSidebar(target, level = 3) { // 集合节点处理 if (Array.isArray(target)) { const acc = target.map(item => deepGetSidebar(item, level - 1)) return acc.filter(item => item !== null) } // 检测是否需要在导航中显示 if (!target.inNav) { return null } if (target.type === 'folder' && level !== 0) { // 处理 folder 模式 const sideConfig = {} sideConfig.name = target.name sideConfig.title = target.title sideConfig.icon = target.icon sideConfig.isElementIcon = target.isElementIcon sideConfig.path = target.route || Util.getRandomStr(6) sideConfig.children = target.children.map(item => deepGetSidebar(item, level - 1)) sideConfig.children = sideConfig.children.filter(item => item !== null) return sideConfig } // 处理一级就是 view 的情况 if (target.type === 'view') { const sideConfig = {} sideConfig.name = target.name sideConfig.title = target.title sideConfig.icon = target.icon sideConfig.isElementIcon = target.isElementIcon sideConfig.path = target.route return sideConfig } // 处理 appTab 情况 if (target.type === 'tab') { const sideConfig = {} sideConfig.name = target.name sideConfig.title = target.title sideConfig.icon = target.icon sideConfig.isElementIcon = target.isElementIcon sideConfig.path = target.route // 如果 Tab 没有设置默认打开的路由, 则设置为第一个子节点路由 if (!sideConfig.path) { if (target.children && target.children.length > 0 && target.children[0].route) { sideConfig.path = target.children[0].route } } return sideConfig } // 最后一层, 都当做子节点处理 if (level <= 0) { const sideConfig = {} sideConfig.name = target.name sideConfig.title = target.title sideConfig.icon = target.icon sideConfig.isElementIcon = target.isElementIcon sideConfig.path = Util.getRandomStr(6) if (target.children && target.children.length > 0 && target.children[0].route) { sideConfig.path = target.children[0].route } return sideConfig } return null } const sideBar = deepGetSidebar(permissionStageConfig, sidebarLevel) return sideBar } /** * 获取有权限的所有节点配置对象 */ export const getStageByName = () => name => stageMap[name] /** * 获取有权限的所有节点配置对象 */ export const getStageByRoute = () => path => { const result = Object.getOwnPropertySymbols(stageMap).find(key => stageMap[key].route === path) return stageMap[result] } export const stageList = () => stageMap export const permissions = state => state.permissions export const getStageInfo = state => { const { stageConfig } = state const cache = {} const findStage = (stages, name) => { let result if (Array.isArray(stages)) { for (let i = 0; i < stages.length; i += 1) { result = findStage(stages[i], name) if (result) { break } } return result } if (stages.children && stages.children.length) { result = findStage(stages.children, name) if (result) { result.unshift(stages) } return result } if (stages.name === name) { return [stages] } return false } return name => { if (cache[name]) { return cache[name] } const stageInfo = findStage(stageConfig, name) if (stageInfo) { cache[name] = stageInfo } return stageInfo } } /** * 递归 * @param {*} obj * @param {*} fuc */ function deepTravel(obj, fuc) { if (Array.isArray(obj)) { obj.forEach(item => { deepTravel(item, fuc) }) return } if (obj && obj.children) { fuc(obj) deepTravel(obj.children, fuc) return } if (obj.name) { fuc(obj) } } /** * 在侧边栏展示时,如果当前路由 children 属性为空,则删除该路由 * @param {*} arr 路由配置项数据 */ function IterationDelateMenuChildren(arr) { if (arr.length) { // eslint-disable-next-line no-unused-vars for (const i in arr) { if (arr[i].children && !arr[i].children.length) { delete arr[i] } else if (arr[i].children && arr[i].children.length) { IterationDelateMenuChildren(arr[i].children) } } } return arr } /** * Shaking 掉无权限路由 * @param {array} stageConfig 路由配置项数据 * @param {array} permissions 当前登录管理员所拥有的权限集合 * @param {object} currentUser 当前登录管理员 */ function permissionShaking(stageConfig, permissions, currentUser) { const shookConfig = stageConfig.filter(route => { if (Util.hasPermission(permissions, route, currentUser)) { if (route.children && route.children.length) { route.children = permissionShaking(route.children, permissions, currentUser) } return true } return false }) return IterationDelateMenuChildren(shookConfig) }