fix: 隐藏部分路由 & 分权限显示
This commit is contained in:
parent
f31f88c324
commit
a589d7ed37
@ -40,6 +40,8 @@
|
|||||||
</a-breadcrumb>
|
</a-breadcrumb>
|
||||||
</template>
|
</template>
|
||||||
<TabLayout />
|
<TabLayout />
|
||||||
|
|
||||||
|
<!-- 使用更简单的方式处理菜单渲染 -->
|
||||||
</pro-layout>
|
</pro-layout>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -73,7 +75,11 @@ export default {
|
|||||||
...mapGetters(["permissions"]),
|
...mapGetters(["permissions"]),
|
||||||
menus() {
|
menus() {
|
||||||
const root = routes.find((v) => v.path === "/");
|
const root = routes.find((v) => v.path === "/");
|
||||||
return filterRoutes(root?.children || [], this.permissions);
|
// 过滤掉hidden为true的路由
|
||||||
|
const filteredRoutes = this.filterHiddenRoutes(
|
||||||
|
filterRoutes(root?.children || [], this.permissions)
|
||||||
|
);
|
||||||
|
return filteredRoutes;
|
||||||
},
|
},
|
||||||
rightContentClass() {
|
rightContentClass() {
|
||||||
return [
|
return [
|
||||||
@ -98,6 +104,25 @@ export default {
|
|||||||
this.collapsed = false;
|
this.collapsed = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 过滤隐藏路由
|
||||||
|
filterHiddenRoutes(routes) {
|
||||||
|
if (!routes) return [];
|
||||||
|
|
||||||
|
return routes
|
||||||
|
.filter((route) => !(route.meta && route.meta.hidden === true))
|
||||||
|
.map((route) => {
|
||||||
|
// 创建新对象,避免修改原始路由
|
||||||
|
const newRoute = { ...route };
|
||||||
|
|
||||||
|
// 如果有子路由,递归过滤
|
||||||
|
if (newRoute.children && newRoute.children.length > 0) {
|
||||||
|
newRoute.children = this.filterHiddenRoutes(newRoute.children);
|
||||||
|
}
|
||||||
|
|
||||||
|
return newRoute;
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
@ -204,13 +229,13 @@ export default {
|
|||||||
margin: 24px;
|
margin: 24px;
|
||||||
padding: 24px;
|
padding: 24px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
min-height: calc(100vh - 128px); // 移除固定height
|
min-height: calc(100vh - 128px); // 移除固定height
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
|
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
|
||||||
display: flex; // 添加flex布局
|
display: flex; // 添加flex布局
|
||||||
flex-direction: column; // 垂直方向排列
|
flex-direction: column; // 垂直方向排列
|
||||||
flex: 1; // 占用剩余空间
|
flex: 1; // 占用剩余空间
|
||||||
overflow: auto; // 内容过多时显示滚动条
|
overflow: auto; // 内容过多时显示滚动条
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加布局容器样式
|
// 添加布局容器样式
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import VueRouter from 'vue-router';
|
import VueRouter from 'vue-router';
|
||||||
import GlobalLayout from '@/layouts/GlobalLayout';
|
import GlobalLayout from '@/layouts/GlobalLayout';
|
||||||
@ -32,7 +31,7 @@ export const routes = [
|
|||||||
path: '/console/list',
|
path: '/console/list',
|
||||||
name: 'ConsoleLog',
|
name: 'ConsoleLog',
|
||||||
component: () => import('@/views/user/Console.vue'),
|
component: () => import('@/views/user/Console.vue'),
|
||||||
meta: { title: '大数据', auth: 0 },
|
meta: { title: '大数据', auth: [0] },
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@ -107,7 +106,11 @@ export const routes = [
|
|||||||
path: '/community/edit',
|
path: '/community/edit',
|
||||||
name: 'EditArticle',
|
name: 'EditArticle',
|
||||||
component: () => import('@/components/edit/tinymce'),
|
component: () => import('@/components/edit/tinymce'),
|
||||||
meta: { title: '文章编辑', auth: [0,1,2], hidden: true },
|
meta: {
|
||||||
|
title: '文章编辑',
|
||||||
|
auth: [0,1,2],
|
||||||
|
hidden: true // 确保此项存在且为true
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/community/pages',
|
path: '/community/pages',
|
||||||
@ -186,11 +189,16 @@ const filteredRoutes = filterRoutes(routes, userPrivileges);
|
|||||||
const router = new VueRouter({
|
const router = new VueRouter({
|
||||||
mode: 'hash',
|
mode: 'hash',
|
||||||
base: process.env.BASE_URL,
|
base: process.env.BASE_URL,
|
||||||
routes: routes,
|
routes: routes, // 使用原始路由,不过滤
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 修改后的过滤函数
|
||||||
export function filterRoutes(routes, userPrivileges) {
|
export function filterRoutes(routes, userPrivileges) {
|
||||||
|
// 递归处理单个路由
|
||||||
function filterSingleRoute(route, userPrivileges) {
|
function filterSingleRoute(route, userPrivileges) {
|
||||||
|
if (!route) return null; // 空值检查
|
||||||
|
|
||||||
|
// 1. 权限检查
|
||||||
if (route.meta && route.meta.auth) {
|
if (route.meta && route.meta.auth) {
|
||||||
if (Array.isArray(route.meta.auth)) {
|
if (Array.isArray(route.meta.auth)) {
|
||||||
if (!route.meta.auth.some(authLevel => userPrivileges == authLevel)) {
|
if (!route.meta.auth.some(authLevel => userPrivileges == authLevel)) {
|
||||||
@ -202,17 +210,37 @@ export function filterRoutes(routes, userPrivileges) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (route.children && route.children.length >= 0) {
|
// 2. 隐藏检查 - 如果meta.hidden为true,则从菜单中隐藏,但不从路由中移除
|
||||||
route.children = route.children
|
let shouldHideInMenu = route.meta && route.meta.hidden === true;
|
||||||
.map(childRoute => filterSingleRoute(childRoute, userPrivileges))
|
|
||||||
.filter(childRoute => childRoute !== null && childRoute?.meta?.hidden != true);
|
// 创建路由副本,避免修改原始对象
|
||||||
|
let routeCopy = { ...route };
|
||||||
|
|
||||||
|
// 如果需要在菜单中隐藏,添加hideInMenu标记
|
||||||
|
if (shouldHideInMenu) {
|
||||||
|
if (!routeCopy.meta) routeCopy.meta = {};
|
||||||
|
routeCopy.meta.hideInMenu = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return route;
|
// 递归处理子路由
|
||||||
|
if (routeCopy.children && routeCopy.children.length > 0) {
|
||||||
|
routeCopy.children = routeCopy.children
|
||||||
|
.map(childRoute => filterSingleRoute(childRoute, userPrivileges))
|
||||||
|
.filter(childRoute => childRoute !== null && childRoute !== undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
return routeCopy;
|
||||||
}
|
}
|
||||||
|
|
||||||
return routes.map(route => filterSingleRoute(route, userPrivileges)).filter(route => route !== null);
|
// 过滤整个路由树
|
||||||
|
return routes
|
||||||
|
.map(route => filterSingleRoute(route, userPrivileges))
|
||||||
|
.filter(route => {
|
||||||
|
return route !== null &&
|
||||||
|
route !== undefined &&
|
||||||
|
(route?.children?.length > 0 || route?.meta?.alwaysShow);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export default router;
|
export default router;
|
Loading…
x
Reference in New Issue
Block a user