From 5eb9a58f6186c94b2d5c5320a393159b6f69252d Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 4 Mar 2022 14:11:49 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=88=A4=E6=96=AD=EF=BC=8C=E6=94=AF=E6=8C=81=E6=88=96=E7=9A=84?= =?UTF-8?q?=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/console/users.js | 6 +++--- src/store/modules/permission.js | 25 +++++-------------------- src/utils/jms.js | 23 +++++++++++++++-------- 3 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/router/console/users.js b/src/router/console/users.js index 7d3add072..77e03d147 100644 --- a/src/router/console/users.js +++ b/src/router/console/users.js @@ -126,7 +126,8 @@ export default [ component: empty, redirect: '', meta: { - permissions: [] + permissions: ['rbac.view_orgrole | rbac.view_systemrole'], + app: 'rbac' }, children: [ { @@ -135,9 +136,8 @@ export default [ name: 'RoleList', meta: { title: i18n.t('route.RoleList'), - permissions: [], app: 'rbac', - resource: 'role' + permissions: ['rbac.view_orgrole | rbac.view_systemrole'] } }, { diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index 3b786a499..acd913e36 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -5,7 +5,7 @@ import { } from '@/router' import empty from '@/layout/empty' import Layout from '@/layout/index' -import { getResourceNameByPath, getBeforeViewRoute } from '@/utils/jms' +import { getResourceNameByPath, getBeforeViewRoute, hasPermission } from '@/utils/jms' function hasLicense(route, rootState) { const licenseIsValid = rootState.settings.hasValidLicense @@ -39,20 +39,6 @@ export function filterHiddenRoutes(routes, rootState) { return res } -function hasPermission(perms, route) { - // console.log('>>> Route: ', route) - const permsRequired = route.meta?.permissions - // Vue.$log.debug('Route permissions required: ', route.path, permsRequired) - let has - if (!permsRequired || permsRequired.length === 0) { - has = true - } else { - has = perms.some(perm => permsRequired.includes(perm)) - } - // Vue.$log.debug('Has permission: ', route.path, ' => ', has) - return has -} - const actionMapper = { create: 'add', update: 'change', @@ -150,9 +136,8 @@ function cleanRoute(tmp, parent) { return tmp } -export function filterPermedRoutes(routes, rootState, permsCache, parent) { +export function filterPermedRoutes(routes, parent) { const res = [] - const perms = permsCache || rootState.users.perms for (const route of routes) { let tmp = { @@ -160,9 +145,9 @@ export function filterPermedRoutes(routes, rootState, permsCache, parent) { } tmp = cleanRoute(tmp, parent) - if (hasPermission(perms, tmp)) { + if (hasPermission(tmp.meta.permissions)) { if (tmp.children) { - tmp.children = filterPermedRoutes(tmp.children, rootState, perms, tmp) + tmp.children = filterPermedRoutes(tmp.children, tmp) } res.push(tmp) } @@ -213,7 +198,7 @@ const actions = { }, generateRoutes({ commit, dispatch, rootState }, { to, from }) { return new Promise(resolve => { - let routes = filterPermedRoutes(allRoutes, rootState) + let routes = filterPermedRoutes(allRoutes, null) routes = filterHiddenRoutes(routes, rootState) if (routes.length === 0) { console.log('No route find') diff --git a/src/utils/jms.js b/src/utils/jms.js index 96452b293..76498933d 100644 --- a/src/utils/jms.js +++ b/src/utils/jms.js @@ -4,21 +4,28 @@ export function openTaskPage(taskId) { window.open(`/#/ops/celery/task/${taskId}/log/`, '', 'width=900,height=600') } -export function hasPermission(permsRequired) { - const perms = store.getters?.currentOrgPerms || [] - +export function checkPermission(permsRequired, permsAll) { if (!permsRequired || permsRequired.length === 0) { return true } - if (typeof permsRequired === 'string') { permsRequired = [permsRequired] } - - const has = perms.some(perm => { - return permsRequired.includes(perm) + return permsRequired.every(perm => { + // 包含 | 是或的关系, 单独处理 + if (perm.indexOf('|') === -1) { + return permsAll.includes(perm) + } + const permOr = perm.split('|').map(item => item.trim()) + return permOr.some(perm => { + return permsAll.includes(perm) + }) }) - return has +} + +export function hasPermission(permsRequired) { + const permsAll = store.getters?.currentOrgPerms || [] + return checkPermission(permsRequired, permsAll) } export function getResourceNameByPath(path) {