feat(系统设置): 模块首页的权限控制

--story=1008972 --user=李玉号 【项目设置】支持二级菜单的权限管控
https://www.tapd.cn/55049933/s/1221291
This commit is contained in:
shiziyuan9527 2022-08-09 18:56:07 +08:00 committed by f2c-ci-robot[bot]
parent f7d26d4e24
commit 3ba6a9caa8
10 changed files with 120 additions and 7 deletions

View File

@ -457,6 +457,11 @@
"name": "permission.project_custom_code.copy", "name": "permission.project_custom_code.copy",
"resourceId": "PROJECT_CUSTOM_CODE" "resourceId": "PROJECT_CUSTOM_CODE"
}, },
{
"id": "PROJECT_TRACK_HOME:READ",
"name": "permission.common.read",
"resourceId": "PROJECT_TRACK_HOME"
},
{ {
"id": "PROJECT_TRACK_CASE:READ", "id": "PROJECT_TRACK_CASE:READ",
"name": "permission.project_track_case.read", "name": "permission.project_track_case.read",
@ -664,6 +669,11 @@
"name": "permission.project_track_report.export", "name": "permission.project_track_report.export",
"resourceId": "PROJECT_TRACK_REPORT" "resourceId": "PROJECT_TRACK_REPORT"
}, },
{
"id": "PROJECT_API_HOME:READ",
"name": "permission.common.read",
"resourceId": "PROJECT_API_HOME"
},
{ {
"id": "PROJECT_API_DEFINITION:READ", "id": "PROJECT_API_DEFINITION:READ",
"name": "permission.project_api_definition.read", "name": "permission.project_api_definition.read",
@ -937,6 +947,11 @@
"resourceId": "PROJECT_UI_REPORT", "resourceId": "PROJECT_UI_REPORT",
"license": true "license": true
}, },
{
"id": "PROJECT_PERFORMANCE_HOME:READ",
"name": "permission.common.read",
"resourceId": "PROJECT_PERFORMANCE_HOME"
},
{ {
"id": "PROJECT_PERFORMANCE_TEST:READ", "id": "PROJECT_PERFORMANCE_TEST:READ",
"name": "permission.project_performance_test.read", "name": "permission.project_performance_test.read",
@ -1256,6 +1271,10 @@
"id": "PROJECT_APP_MANAGER", "id": "PROJECT_APP_MANAGER",
"name": "permission.project_app_manager.name" "name": "permission.project_app_manager.name"
}, },
{
"id": "PROJECT_TRACK_HOME",
"name": "permission.common.home"
},
{ {
"id": "PROJECT_TRACK_CASE", "id": "PROJECT_TRACK_CASE",
"name": "permission.project_track_case.name" "name": "permission.project_track_case.name"
@ -1276,6 +1295,10 @@
"id": "PROJECT_TRACK_REPORT", "id": "PROJECT_TRACK_REPORT",
"name": "permission.project_track_report.name" "name": "permission.project_track_report.name"
}, },
{
"id": "PROJECT_API_HOME",
"name": "permission.common.home"
},
{ {
"id": "PROJECT_API_DEFINITION", "id": "PROJECT_API_DEFINITION",
"name": "permission.project_api_definition.name" "name": "permission.project_api_definition.name"
@ -1303,6 +1326,10 @@
"name": "permission.project_ui_report.name", "name": "permission.project_ui_report.name",
"license": true "license": true
}, },
{
"id": "PROJECT_PERFORMANCE_HOME",
"name": "permission.common.home"
},
{ {
"id": "PROJECT_PERFORMANCE_TEST", "id": "PROJECT_PERFORMANCE_TEST",
"name": "permission.project_performance_test.name" "name": "permission.project_performance_test.name"

View File

@ -5,7 +5,7 @@
<el-col :span="14"> <el-col :span="14">
<el-menu class="header-menu" :unique-opened="true" mode="horizontal" router :default-active='currentPath'> <el-menu class="header-menu" :unique-opened="true" mode="horizontal" router :default-active='currentPath'>
<el-menu-item :index="'/api/home'"> <el-menu-item :index="'/api/home'" v-permission="['PROJECT_API_HOME:READ']">
{{ $t("i18n.home") }} {{ $t("i18n.home") }}
</el-menu-item> </el-menu-item>
<el-menu-item :index="'/api/definition'" v-permission="['PROJECT_API_DEFINITION:READ']"> <el-menu-item :index="'/api/definition'" v-permission="['PROJECT_API_DEFINITION:READ']">

View File

@ -8,6 +8,7 @@ import Track from "@/business/components/track/router";
import ReportStatistics from "@/business/components/reportstatistics/router"; import ReportStatistics from "@/business/components/reportstatistics/router";
import Project from "@/business/components/project/router"; import Project from "@/business/components/project/router";
import {getCurrentUser, getCurrentUserId, hasPermissions} from "@/common/js/utils"; import {getCurrentUser, getCurrentUserId, hasPermissions} from "@/common/js/utils";
import {SECOND_LEVEL_ROUTE_PERMISSION_MAP} from "@/common/js/constants";
Vue.use(VueRouter); Vue.use(VueRouter);
const requireContext = require.context('@/business/components/xpack/', true, /router\.js$/); const requireContext = require.context('@/business/components/xpack/', true, /router\.js$/);
@ -66,15 +67,59 @@ function redirectLoginPath(originPath, next) {
sessionStorage.setItem('lastUser', getCurrentUserId()); sessionStorage.setItem('lastUser', getCurrentUserId());
sessionStorage.setItem('redirectUrl', originPath); sessionStorage.setItem('redirectUrl', originPath);
sessionStorage.removeItem('loginSuccess'); sessionStorage.removeItem('loginSuccess');
let defaultMenuRoute = sessionStorage.getItem('defaultMenuRoute');
if (redirectUrl && loginSuccess) { if (redirectUrl && loginSuccess) {
// 登录后只执行一次
sessionStorage.removeItem('loginSuccess'); sessionStorage.removeItem('loginSuccess');
// router.push(redirectUrl); redirectUrl = getDefaultSecondLevelMenu(redirectUrl);
next({path: redirectUrl}); next({path: redirectUrl});
} else { } else {
next(); if (!defaultMenuRoute) {
// 记录标识,防止死循环
sessionStorage.setItem('defaultMenuRoute', 'sign');
originPath = getDefaultSecondLevelMenu(originPath);
next({path: originPath});
if (router.currentRoute.fullPath === originPath) {
sessionStorage.setItem('redirectUrl', originPath);
// 路径相同时,移除标识
sessionStorage.removeItem("defaultMenuRoute");
}
} else {
sessionStorage.setItem('redirectUrl', originPath);
sessionStorage.removeItem("defaultMenuRoute");
next();
}
} }
} }
function getDefaultSecondLevelMenu(toPath) {
let {TRACK: tracks, API: apis, LOAD: loads} = SECOND_LEVEL_ROUTE_PERMISSION_MAP;
if (tracks.map(r => r.router).indexOf(toPath) > -1) {
return _getDefaultSecondLevelMenu(tracks, toPath);
} else if (apis.map(r => r.router).indexOf(toPath) > -1) {
return _getDefaultSecondLevelMenu(apis, toPath);
} else if (loads.map(r => r.router).indexOf(toPath) > -1) {
return _getDefaultSecondLevelMenu(loads, toPath);
} else {
return toPath;
}
}
function _getDefaultSecondLevelMenu(secondLevelRouters, toPath) {
let toRouter = secondLevelRouters.find(r => r['router'] === toPath);
if (toRouter && hasPermissions(...toRouter['permission'])) {
// 将要跳转的路由有权限则放行
return toPath;
}
for (let router of secondLevelRouters) {
if (hasPermissions(...router['permission'])) {
// 返回第一个有权限的路由路径
return router['router'];
}
}
return '/';
}
export default router; export default router;

View File

@ -4,7 +4,7 @@
<project-change :project-name="currentProject"/> <project-change :project-name="currentProject"/>
<el-col :span="14"> <el-col :span="14">
<el-menu class="header-menu" :unique-opened="true" mode="horizontal" router :default-active="pathName"> <el-menu class="header-menu" :unique-opened="true" mode="horizontal" router :default-active="pathName">
<el-menu-item :index="'/performance/home'"> <el-menu-item :index="'/performance/home'" v-permission="['PROJECT_PERFORMANCE_HOME:READ']">
{{ $t("i18n.home") }} {{ $t("i18n.home") }}
</el-menu-item> </el-menu-item>
<el-menu-item :index="'/performance/test/all'" v-permission="['PROJECT_PERFORMANCE_TEST:READ']"> <el-menu-item :index="'/performance/test/all'" v-permission="['PROJECT_PERFORMANCE_TEST:READ']">

View File

@ -14,7 +14,7 @@
style="width: 100%"> style="width: 100%">
<el-table-column <el-table-column
prop="type" prop="type"
:label="$t('group.functional_menu')" :label="$t('permission.common.first_level_menu')"
width="180"> width="180">
<template v-slot:default="scope"> <template v-slot:default="scope">
<span v-if="scope.row.type !== 'PROJECT'"> <span v-if="scope.row.type !== 'PROJECT'">
@ -25,7 +25,7 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="resource" prop="resource"
:label="$t('group.operation_object')" :label="$t('permission.common.second_level_menu')"
width="180"> width="180">
<template v-slot:default="scope"> <template v-slot:default="scope">
{{ $t(scope.row.resource.name) }} {{ $t(scope.row.resource.name) }}

View File

@ -6,7 +6,7 @@
<el-col :span="14"> <el-col :span="14">
<el-menu class="header-menu" :unique-opened="true" mode="horizontal" router <el-menu class="header-menu" :unique-opened="true" mode="horizontal" router
:default-active="pathName"> :default-active="pathName">
<el-menu-item :index="'/track/home'"> <el-menu-item :index="'/track/home'" v-permission="['PROJECT_TRACK_HOME:READ']">
{{ $t("i18n.home") }} {{ $t("i18n.home") }}
</el-menu-item> </el-menu-item>
<el-menu-item :index="'/track/case/all'" v-permission="['PROJECT_TRACK_CASE:READ']"> <el-menu-item :index="'/track/case/all'" v-permission="['PROJECT_TRACK_CASE:READ']">

View File

@ -205,3 +205,26 @@ export const ENV_TYPE = {
} }
export const DEFAULT_XSS_ATTR = ['style', 'class']; export const DEFAULT_XSS_ATTR = ['style', 'class'];
export const SECOND_LEVEL_ROUTE_PERMISSION_MAP = {
API: [
{router: '/api/home', permission: ['PROJECT_API_HOME:READ']},
{router: '/api/definition', permission: ['PROJECT_API_DEFINITION:READ']},
{router: '/api/automation', permission: ['PROJECT_API_SCENARIO:READ']},
{router: '/api/automation/report', permission: ['PROJECT_API_REPORT:READ']},
],
TRACK: [
{router: '/track/home', permission: ['PROJECT_TRACK_HOME:READ']},
{router: '/track/case/all', permission: ['PROJECT_TRACK_CASE:READ']},
{router: '/track/review/all', permission: ['PROJECT_TRACK_REVIEW:READ']},
{router: '/track/plan/all', permission: ['PROJECT_TRACK_PLAN:READ']},
{router: '/track/issue', permission: ['PROJECT_TRACK_ISSUE:READ']},
{router: '/track/testPlan/reportList', permission: ['PROJECT_TRACK_REPORT:READ']},
],
LOAD: [
{router: '/performance/home', permission: ['PROJECT_PERFORMANCE_HOME:READ']},
{router: '/performance/test/all', permission: ['PROJECT_PERFORMANCE_TEST:READ']},
{router: '/performance/report/all', permission: ['PROJECT_PERFORMANCE_REPORT:READ']},
]
}

View File

@ -2921,6 +2921,12 @@ export default {
api_case: 'API Case', api_case: 'API Case',
}, },
permission: { permission: {
common: {
home: "HOME",
read: "READ",
first_level_menu: "First Level Menu",
second_level_menu: "Second Level Menu",
},
project_error_report_library: { project_error_report_library: {
name: "Error report library", name: "Error report library",
read: "READ", read: "READ",

View File

@ -2930,6 +2930,12 @@ export default {
api_case: '接口用例' api_case: '接口用例'
}, },
permission: { permission: {
common: {
home: "首页",
read: "查看",
first_level_menu: "一级菜单",
second_level_menu: "二级菜单",
},
project_error_report_library: { project_error_report_library: {
name: "误报库", name: "误报库",
read: "查看误报", read: "查看误报",

View File

@ -2924,6 +2924,12 @@ export default {
api_case: '接口用例' api_case: '接口用例'
}, },
permission: { permission: {
common: {
home: "首頁",
read: "查看",
first_level_menu: "一級菜單",
second_level_menu: "二級菜單",
},
project_error_report_library: { project_error_report_library: {
name: "誤報庫", name: "誤報庫",
read: "查看誤報", read: "查看誤報",