一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天。
上一篇文章我们讲到了 Angular 组件通信。本文我们讲讲,在项目开发中,你是否会遇到这样的需求:
请根据用户登陆,限制其访问的内容。
So,这就是要进行权限控制。
对用户的权限限制,我们一般会有下面的处理方式:
- 对用户登陆的菜单做控制
- 对用户的行为做限制
我们结合 Angular
来讲解下这个话题。
菜单路由控制
系统开发的时候,会有很多的菜单,这个时候,就需要后端判断用户的角色,按照用户的权限返回不同的菜单路由。
返回的数据格式需要我们按照自己在 app-routing.module.ts
中编写好的路由路径对应。
比如,我们有路由文件如下:
代码语言:javascript复制// app-routing.module.ts
const routes: Routes = [
{
path: 'user-manage',
component: AuthLayoutComponent, // 通过鉴权的组件
children: [
{
path: '',
redirectTo: 'user',
pathMatch: 'full'
},
{
path: 'user', // 用户列表
component: UserComponent
},
{
path: 'user/detail/:uuid', // 用户详情,类似这种不会出现在菜单里面
component: UserDetailComponent
},
{
path: 'department', // 部门列表
component: DepartmentComponent
}
]
},
// ...
]
在页面中,我们的菜单展示的数据是这样子的:
代码语言:javascript复制<!-- demo.component.html -->
<ul nz-menu nzMode="inline" [nzInlineCollapsed]="isCollapsed">
<li *ngFor="let submenu of menu_data" nz-submenu [nzTitle]="isCollapsed ? '' : submenu.title" [nzIcon]="submenu.icon"
[nzOpen]="submenu.is_open" (nzOpenChange)="selectMenu(submenu)">
<ul>
<li *ngFor="let child of submenu?.children" nz-menu-item nzMatchRouter>
<a [routerLink]="['/' child.url]">{{ child.title }}</a>
</li>
</ul>
</li>
</ul>
定义了一个二级的菜单,拥有下面几个字段:
title
字段 - 菜单的标题url
字段 - 菜单的路由,对应app-routing.module.ts
中的完整的path
icon
字段 - 标题前的小图标,二级标题没有is_open
字段 - 菜单是否展开的标识
此时,后端的菜单接口,应该返回类似下面的数据:
代码语言:javascript复制// demo.component.ts
public menu_data:any = [
{
title: "成员管理",
url: "user-manage",
icon: "user-switch", // 这里是用了 angular ant design 的图标
is_open: false,
children: [
{
title: "用户",
url: "user-manage/user",
icon: undefined,
is_open: false
},
{
title: "部门",
url: "user-manage/department",
icon: undefined,
is_open: false
}
]
},
// ...
]
也许你会有疑问