Skip to content

Commit

Permalink
feat(系统设置): 模块首页的权限控制
Browse files Browse the repository at this point in the history
--story=1008972 --user=李玉号 【项目设置】支持二级菜单的权限管控
https://www.tapd.cn/55049933/s/1221291
  • Loading branch information
shiziyuan9527 authored and f2c-ci-robot[bot] committed Aug 12, 2022
1 parent f7d26d4 commit 3ba6a9c
Show file tree
Hide file tree
Showing 10 changed files with 120 additions and 7 deletions.
27 changes: 27 additions & 0 deletions backend/src/main/resources/permission.json
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,11 @@
"name": "permission.project_custom_code.copy",
"resourceId": "PROJECT_CUSTOM_CODE"
},
{
"id": "PROJECT_TRACK_HOME:READ",
"name": "permission.common.read",
"resourceId": "PROJECT_TRACK_HOME"
},
{
"id": "PROJECT_TRACK_CASE:READ",
"name": "permission.project_track_case.read",
Expand Down Expand Up @@ -664,6 +669,11 @@
"name": "permission.project_track_report.export",
"resourceId": "PROJECT_TRACK_REPORT"
},
{
"id": "PROJECT_API_HOME:READ",
"name": "permission.common.read",
"resourceId": "PROJECT_API_HOME"
},
{
"id": "PROJECT_API_DEFINITION:READ",
"name": "permission.project_api_definition.read",
Expand Down Expand Up @@ -937,6 +947,11 @@
"resourceId": "PROJECT_UI_REPORT",
"license": true
},
{
"id": "PROJECT_PERFORMANCE_HOME:READ",
"name": "permission.common.read",
"resourceId": "PROJECT_PERFORMANCE_HOME"
},
{
"id": "PROJECT_PERFORMANCE_TEST:READ",
"name": "permission.project_performance_test.read",
Expand Down Expand Up @@ -1256,6 +1271,10 @@
"id": "PROJECT_APP_MANAGER",
"name": "permission.project_app_manager.name"
},
{
"id": "PROJECT_TRACK_HOME",
"name": "permission.common.home"
},
{
"id": "PROJECT_TRACK_CASE",
"name": "permission.project_track_case.name"
Expand All @@ -1276,6 +1295,10 @@
"id": "PROJECT_TRACK_REPORT",
"name": "permission.project_track_report.name"
},
{
"id": "PROJECT_API_HOME",
"name": "permission.common.home"
},
{
"id": "PROJECT_API_DEFINITION",
"name": "permission.project_api_definition.name"
Expand Down Expand Up @@ -1303,6 +1326,10 @@
"name": "permission.project_ui_report.name",
"license": true
},
{
"id": "PROJECT_PERFORMANCE_HOME",
"name": "permission.common.home"
},
{
"id": "PROJECT_PERFORMANCE_TEST",
"name": "permission.project_performance_test.name"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<el-col :span="14">
<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") }}
</el-menu-item>
<el-menu-item :index="'/api/definition'" v-permission="['PROJECT_API_DEFINITION:READ']">
Expand Down
49 changes: 47 additions & 2 deletions frontend/src/business/components/common/router/router.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import Track from "@/business/components/track/router";
import ReportStatistics from "@/business/components/reportstatistics/router";
import Project from "@/business/components/project/router";
import {getCurrentUser, getCurrentUserId, hasPermissions} from "@/common/js/utils";
import {SECOND_LEVEL_ROUTE_PERMISSION_MAP} from "@/common/js/constants";

Vue.use(VueRouter);
const requireContext = require.context('@/business/components/xpack/', true, /router\.js$/);
Expand Down Expand Up @@ -66,14 +67,58 @@ function redirectLoginPath(originPath, next) {
sessionStorage.setItem('lastUser', getCurrentUserId());
sessionStorage.setItem('redirectUrl', originPath);
sessionStorage.removeItem('loginSuccess');
let defaultMenuRoute = sessionStorage.getItem('defaultMenuRoute');

if (redirectUrl && loginSuccess) {
// 登录后只执行一次
sessionStorage.removeItem('loginSuccess');
// router.push(redirectUrl);
redirectUrl = getDefaultSecondLevelMenu(redirectUrl);
next({path: redirectUrl});
} 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 '/';
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<project-change :project-name="currentProject"/>
<el-col :span="14">
<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") }}
</el-menu-item>
<el-menu-item :index="'/performance/test/all'" v-permission="['PROJECT_PERFORMANCE_TEST:READ']">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
style="width: 100%">
<el-table-column
prop="type"
:label="$t('group.functional_menu')"
:label="$t('permission.common.first_level_menu')"
width="180">
<template v-slot:default="scope">
<span v-if="scope.row.type !== 'PROJECT'">
Expand All @@ -25,7 +25,7 @@
</el-table-column>
<el-table-column
prop="resource"
:label="$t('group.operation_object')"
:label="$t('permission.common.second_level_menu')"
width="180">
<template v-slot:default="scope">
{{ $t(scope.row.resource.name) }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<el-col :span="14">
<el-menu class="header-menu" :unique-opened="true" mode="horizontal" router
:default-active="pathName">
<el-menu-item :index="'/track/home'">
<el-menu-item :index="'/track/home'" v-permission="['PROJECT_TRACK_HOME:READ']">
{{ $t("i18n.home") }}
</el-menu-item>
<el-menu-item :index="'/track/case/all'" v-permission="['PROJECT_TRACK_CASE:READ']">
Expand Down
23 changes: 23 additions & 0 deletions frontend/src/common/js/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -205,3 +205,26 @@ export const ENV_TYPE = {
}

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']},
]
}
6 changes: 6 additions & 0 deletions frontend/src/i18n/en-US.js
Original file line number Diff line number Diff line change
Expand Up @@ -2921,6 +2921,12 @@ export default {
api_case: 'API Case',
},
permission: {
common: {
home: "HOME",
read: "READ",
first_level_menu: "First Level Menu",
second_level_menu: "Second Level Menu",
},
project_error_report_library: {
name: "Error report library",
read: "READ",
Expand Down
6 changes: 6 additions & 0 deletions frontend/src/i18n/zh-CN.js
Original file line number Diff line number Diff line change
Expand Up @@ -2930,6 +2930,12 @@ export default {
api_case: '接口用例'
},
permission: {
common: {
home: "首页",
read: "查看",
first_level_menu: "一级菜单",
second_level_menu: "二级菜单",
},
project_error_report_library: {
name: "误报库",
read: "查看误报",
Expand Down
6 changes: 6 additions & 0 deletions frontend/src/i18n/zh-TW.js
Original file line number Diff line number Diff line change
Expand Up @@ -2924,6 +2924,12 @@ export default {
api_case: '接口用例'
},
permission: {
common: {
home: "首頁",
read: "查看",
first_level_menu: "一級菜單",
second_level_menu: "二級菜單",
},
project_error_report_library: {
name: "誤報庫",
read: "查看誤報",
Expand Down

0 comments on commit 3ba6a9c

Please sign in to comment.