# 权限控制详细配置
## 权限模式
### 前端访问控制(frontend)
路由权限在前端固定配置,适合角色较固定的系统。
```ts
// preferences.ts
export const overridesPreferences = defineOverridesPreferences({
app: {
accessMode: 'frontend',
},
});
// 路由配置
{
meta: {
authority: ['super', 'admin'], // 指定角色
},
}
// 登录时设置用户角色
authStore.setUserInfo({
...userInfo,
roles: ['super', 'admin'], // 必须是数组
});
```
### 后端访问控制(backend)
通过接口动态生成路由表。
```ts
// preferences.ts
export const overridesPreferences = defineOverridesPreferences({
app: {
accessMode: 'backend',
},
});
// src/router/access.ts
async function generateAccess(options: GenerateMenuAndRoutesOptions) {
return await generateAccessible(preferences.app.accessMode, {
fetchMenuListAsync: async () => {
return await getAllMenus(); // 后端返回菜单数据
},
});
}
```
后端菜单数据格式:
```ts
const menus = [
{
name: 'Dashboard',
path: '/dashboard',
component: '/dashboard/index', // 视图路径
meta: {
title: '仪表盘',
icon: 'mdi:view-dashboard',
noBasicLayout: false, // 是否不使用基础布局
},
},
];
```
### 混合访问控制(mixed)
同时使用前端和后端权限控制。
```ts
export const overridesPreferences = defineOverridesPreferences({
app: {
accessMode: 'mixed',
},
});
```
## 按钮权限控制
### 获取权限码
```ts
// src/store/auth.ts
const accessCodes = await getAccessCodes();
accessStore.setAccessCodes(accessCodes);
// 返回格式: ['AC_100100', 'AC_100110', 'AC_100120']
```
### 组件方式
```vue
```
### API 方式
```vue
```
### 指令方式
```vue
```
## 菜单可见但禁止访问
```ts
{
meta: {
menuVisibleWithForbidden: true, // 菜单可见,访问跳转403
},
}
```