本系統實(shí)現了基于后端菜單數據的動(dòng)態(tài)權限角色生成,替代了原有的硬編碼角色列表。
// ? 原有的硬編碼方式
roles: ['UserIndex', 'DashboardBase', 'login']
問(wèn)題:
// ? 新的動(dòng)態(tài)生成方式
const userRoles = this.generateUserRoles(_menuList, _dataInfo);
// ?? 所有登錄用戶(hù)的基礎權限
roles.push('login'); // 登錄權限
roles.push('DashboardBase'); // 儀表盤(pán)權限
roles.push('UserIndex'); // 個(gè)人中心權限
// ??? 菜單路徑到路由名稱(chēng)的映射
const pathToRouteMap = {
'/dashboard': 'DashboardBase',
'/dashboard/base': 'DashboardBase',
'/dashboard/detail': 'Detail',
'/user': 'UserIndex',
'/user/index': 'UserIndex',
'/list': 'List',
'/form': 'Form',
// ... 可擴展
};
// ?? 超級管理員檢查
if (dataInfo.LoginUser?.Username === 'host' ||
dataInfo.LoginUser?.Grade === '0') {
roles.push('all'); // 擁有所有權限
}
generateUserRoles(menuList, dataInfo)
主要權限生成方法
mapMenuPathToRouteName(menuPath)
菜單路徑映射方法
/dashboard/base
)DashboardBase
)extractRolesFromMenuChildren(children)
子菜單權限提取方法
graph TD
A[用戶(hù)登錄](méi) --> B[獲取用戶(hù)信息]
B --> C[獲取菜單列表]
C --> D[generateUserRoles]
D --> E{用戶(hù)類(lèi)型判斷}
E -->|超級管理員| F[添加 'all' 權限]
E -->|普通用戶(hù)| G[基礎權限 + 菜單權限]
F --> H[權限生成完成]
G --> I[遍歷菜單列表]
I --> J[路徑映射轉換]
J --> K[遞歸處理子菜單]
K --> H
H --> L[更新用戶(hù)狀態(tài)]
L --> M[路由權限控制]
['login', 'DashboardBase', 'UserIndex']
// 根據后端菜單動(dòng)態(tài)生成
['List', 'Form', 'Detail', 'Result', ...]
['all']
// 在 mapMenuPathToRouteName 方法中添加
const pathToRouteMap: Record<string, string> = {
// 現有映射...
'/new-module': 'NewModuleIndex', // 新模塊
'/new-module/list': 'NewModuleList', // 新模塊列表
'/new-module/detail': 'NewModuleDetail' // 新模塊詳情
};
// 在 generateUserRoles 方法中添加自定義邏輯
if (dataInfo.LoginUser?.Department === 'IT') {
roles.push('SystemManagement'); // IT部門(mén)特殊權限
}
if (dataInfo.LoginUser?.Level >= 5) {
roles.push('AdvancedFeatures'); // 高級用戶(hù)權限
}
pathToRouteMap
映射表<template>
<div>
<!-- 基于角色顯示內容 -->
<div v-if="userStore.roles.includes('DashboardBase')">
儀表盤(pán)內容
</div>
<!-- 超級管理員專(zhuān)用功能 -->
<div v-if="userStore.roles.includes('all')">
管理員功能
</div>
</div>
</template>
<script setup>
import { useUserStore } from '@/store/modules/user';
const userStore = useUserStore();
</script>
// 路由權限檢查
router.beforeEach((to, from, next) => {
const userStore = useUserStore();
const requiredRole = to.meta.roleCode || to.name;
if (userStore.roles.includes('all') ||
userStore.roles.includes(requiredRole)) {
next(); // 有權限,允許訪(fǎng)問(wèn)
} else {
next('/403'); // 無(wú)權限,跳轉到403頁(yè)面
}
});
現在您的權限系統可以根據后端返回的真實(shí)菜單數據動(dòng)態(tài)生成用戶(hù)角色,實(shí)現了更靈活和精確的權限控制!??