diff --git a/novalon-manage-web/src/layouts/DefaultLayout.vue b/novalon-manage-web/src/layouts/DefaultLayout.vue index 6a1ebb1..44fb64a 100644 --- a/novalon-manage-web/src/layouts/DefaultLayout.vue +++ b/novalon-manage-web/src/layouts/DefaultLayout.vue @@ -17,70 +17,11 @@ active-text-color="#409eff" router > - - - 仪表盘 - - - - - 用户管理 - - - 角色管理 - - - 菜单管理 - - - - - - 字典管理 - - - 参数配置 - - - - - - 登录日志 - - - 操作日志 - - - 异常日志 - - - - - - 通知公告 - - - - - - 文件列表 - - + @@ -123,22 +64,24 @@ diff --git a/novalon-manage-web/src/utils/permission.ts b/novalon-manage-web/src/utils/permission.ts new file mode 100644 index 0000000..feae404 --- /dev/null +++ b/novalon-manage-web/src/utils/permission.ts @@ -0,0 +1,50 @@ +import { usePermissionStore } from '@/stores/permission' + +export interface PermissionMapping { + [key: string]: string | string[] +} + +const permissionMapping: PermissionMapping = { + 'GET /users': 'user:list', + 'POST /users': 'user:create', + 'PUT /users': 'user:update', + 'DELETE /users': 'user:delete', + 'GET /roles': 'role:list', + 'POST /roles': 'role:create', + 'PUT /roles': 'role:update', + 'DELETE /roles': 'role:delete', + 'GET /menus': 'menu:list', + 'POST /menus': 'menu:create', + 'PUT /menus': 'menu:update', + 'DELETE /menus': 'menu:delete', + 'GET /dict': 'dict:list', + 'POST /dict': 'dict:create', + 'PUT /dict': 'dict:update', + 'DELETE /dict': 'dict:delete', + 'GET /sys/config': 'config:list', + 'POST /sys/config': 'config:create', + 'PUT /sys/config': 'config:update', + 'DELETE /sys/config': 'config:delete', +} + +export function checkApiPermission(method: string, url: string): boolean { + const permissionStore = usePermissionStore() + + const key = `${method.toUpperCase()} ${url.split('?')[0]}` + const requiredPermission = permissionMapping[key] + + if (!requiredPermission) { + return true + } + + if (Array.isArray(requiredPermission)) { + return requiredPermission.some(p => permissionStore.hasPermission(p)) + } + + return permissionStore.hasPermission(requiredPermission) +} + +export function getRequiredPermission(method: string, url: string): string | string[] | null { + const key = `${method.toUpperCase()} ${url.split('?')[0]}` + return permissionMapping[key] || null +} diff --git a/novalon-manage-web/src/utils/request.ts b/novalon-manage-web/src/utils/request.ts index e2b8511..8202357 100644 --- a/novalon-manage-web/src/utils/request.ts +++ b/novalon-manage-web/src/utils/request.ts @@ -1,5 +1,6 @@ import axios, { AxiosRequestConfig } from 'axios' import { generateSignatureHeaders } from './signature' +import { checkApiPermission } from './permission' const request = axios.create({ baseURL: '/api', @@ -37,6 +38,15 @@ request.interceptors.request.use( config.headers = config.headers || {} Object.assign(config.headers, signatureHeaders) + if (!checkApiPermission(method, url)) { + const error = new Error('无权限访问此接口') + ;(error as any).response = { + status: 403, + data: { message: '无权限访问此接口' } + } + return Promise.reject(error) + } + return config }, (error) => Promise.reject(error)