From 1fb75f491d37d37da775a5f6de5966ecef5ed3fb Mon Sep 17 00:00:00 2001 From: iczer <1126263215@qq.com> Date: Mon, 31 Aug 2020 20:51:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20function=20of=20filtering=20menu?= =?UTF-8?q?=20data=20through=20authority;=20:star:=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0=E9=80=9A=E8=BF=87=E6=9D=83=E9=99=90?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E8=8F=9C=E5=8D=95=E6=95=B0=E6=8D=AE=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/default/setting.config.js | 1 + src/layouts/AdminLayout.vue | 4 ++-- src/store/modules/setting.js | 11 ++++++++++- src/utils/authority-utils.js | 17 ++++++++++++++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/config/default/setting.config.js b/src/config/default/setting.config.js index 6f2c5e8..bcbf470 100644 --- a/src/config/default/setting.config.js +++ b/src/config/default/setting.config.js @@ -18,6 +18,7 @@ module.exports = { copyright: '2018 ICZER 工作室出品', //copyright asyncRoutes: false, //异步加载路由,true:开启,false:不开启 showPageTitle: true, //是否显示页面标题(PageLayout 布局中的页面标题),true:显示,false:不显示 + filterMenu: true, //根据权限过滤菜单,true:过滤,false:不过滤 animate: { //动画设置 disabled: false, //禁用动画,true:禁用,false:启用 name: 'bounce', //动画效果,支持的动画效果可参考 ./animate.config.js diff --git a/src/layouts/AdminLayout.vue b/src/layouts/AdminLayout.vue index dd197fe..ad0dda8 100644 --- a/src/layouts/AdminLayout.vue +++ b/src/layouts/AdminLayout.vue @@ -56,8 +56,8 @@ export default { }, computed: { ...mapState('setting', ['isMobile', 'theme', 'layout', 'footerLinks', 'copyright', 'fixedHeader', 'fixedSideBar', - 'hideSetting', 'menuData']), - ...mapGetters('setting', ['firstMenu', 'subMenu']), + 'hideSetting']), + ...mapGetters('setting', ['firstMenu', 'subMenu', 'menuData']), sideMenuWidth() { return this.collapsed ? '80px' : '256px' }, diff --git a/src/store/modules/setting.js b/src/store/modules/setting.js index 904c173..f6d2aed 100644 --- a/src/store/modules/setting.js +++ b/src/store/modules/setting.js @@ -1,6 +1,8 @@ import config from '@/config' import {ADMIN} from '@/config/default' import {formatFullPath} from '@/utils/i18n' +import {filterMenu} from '@/utils/authority-utils' + export default { namespaced: true, state: { @@ -13,6 +15,13 @@ export default { ...config, }, getters: { + menuData(state, getters, rootState) { + if (state.filterMenu) { + const {permissions, roles} = rootState.account + filterMenu(state.menuData, permissions, roles) + } + return state.menuData + }, firstMenu(state) { const {menuData} = state if (!menuData[0].fullPath) { @@ -30,7 +39,7 @@ export default { formatFullPath(menuData) } const current = menuData.find(menu => menu.fullPath === activatedFirst) - return current ? current.children : [] + return current && current.children ? current.children : [] } }, mutations: { diff --git a/src/utils/authority-utils.js b/src/utils/authority-utils.js index 48dd2ea..71ab473 100644 --- a/src/utils/authority-utils.js +++ b/src/utils/authority-utils.js @@ -47,4 +47,19 @@ function hasAnyRole(required, roles) { } } -export {hasPermission, hasRole} +/** + * 根据权限配置过滤菜单数据 + * @param menuData + * @param permissions + * @param roles + */ +function filterMenu(menuData, permissions, roles) { + menuData.forEach(menu => { + menu.meta.invisible = !hasPermission(menu, permissions) && !hasRole(menu, roles) + if (menu.children && menu.children.length > 0) { + filterMenu(menu.children, permissions, roles) + } + }) +} + +export {hasPermission, hasRole, filterMenu}