权限管理(后台界面角色添加+前端路由拦截+按钮级别拦截)

701 阅读1分钟

github: 后台管理系统

1. 后台配置界面

      1.1 通过角色管理添加新角色和新角色的路由权限(路由权限通过读取 src/router/router.ts)

 // permission.ts
 // 解析从router.ts下读取的路由,生成默认权限树
``` js
parseRoutes(routers: Array < any > ) {
    return Array.isArray(routers) && routers.reduce((arr, route) => {
        if (route.hidden) { // hidden为ture时,路由不显示
            return arr
        }
        let o = < any > {}
        o.title = route.name
        o.checked = false

        o.children = route.children && this.parseRoutes(route.children)// 有子级路由时,递归调用 

        return arr.concat(o)
    }, [])
}
```

    1.2 确认添加新角色或者修改角色路由权限,调用addOrEditRole

// permission.ts
// 添加新角色,根据路由权限,筛选指令权限
// 修改角色, 缓存上一次的指令权限,和新指令权限进行对比
``` js
addOrEditRole() {
    let allCheckedNodeName = this.getActiveNodes((this.$refs.routeTree as any).getCheckedNodes()) // 获取所有选中路由权限名
    let prevPermission: any = deepCop(this.role.permission) // 缓存上一次指令权限
    // ...
    this.selectedRoutes(this.role.routes, allCheckedNodeName) // 根据当前角色的路由权限,筛选出指令对应的指令权限

    if (this.ModalType === 'new') {
        // 添加新角色
        // ... 
    } else { // 修改角色指令权限
        /**
         * 路由同步
         * 缓存上次指令权限 和 这次指令权限有相同的 路由权限
         * 缓存上次指令权限覆盖这次指令权限
         */
        prevPermission.length && prevPermission.forEach((oldPermission: any) => {
            this.role.permission.forEach((newPermission: any, index: number, newArray: Array < any > ) => {
                let oldkey = Object.keys(oldPermission)
                if (oldkey.includes(this.gatherKey(newPermission))) {
                    newArray[index] = oldPermission
                }
            })
        })
    }
}
```

     1.3 指令权限修改