• RBAC权限设计


    目录

    角色分配权限

    操作步骤

    1.准备弹框

    2.注册事件

    3.提供数据方法

    3.1 角色分配权限-获取权限点数据并显示

    3.2角色分配权限-设置el-tree的属性

    小结

    3.3角色分配权限-数据回填

    目标

    思路

    将id从父传子

    将数据回填到el-tree中

    小结

    3.4角色分配权限-数据回填问题:created只执行一次

    原因

    方案二:通过refs来引用子组件,直接调用它的方法来发请求

    3.5角色分配权限-保存设置

    目标

    思路

    准备api

    调用api分配权限-分析

    调用api分配权限-功能实现

    小结

    权限应用

    动态生成左侧菜单

    按钮级控制


    角色分配权限

    用户是什么角色(职位),他就具备某些功能

    权限管理功能比较多,需要封装组件。

    操作步骤

    思路: 准备弹框 -> 注册事件 -> 提供数据方法

    完成给角色分配权限点的业务

    1.准备弹框

    首先要创建文件assignPermission.vue  封装子组件

    在父组件添加弹层并引入子组件  (引入import   注册:components)

    在模板中添加el-dialog组件并引入使用


        title="分配权限(一级为路由页面查看权限-二级为按钮操作权限)" :visible.sync="showDialogAssign">
     

    补充数据

    return {
      //... 省略其它
      showDialogAssign: false, // 分配权限对话框
    }

    2.注册事件

    交互 - 显示弹层  添加点击事件


        分配权限

    在回调中设置showDialogAssign为true

    methods:{
      hAssign() {
        this.showDialogAssign = true
      } 
    }

    交互 - 隐藏弹层

    自定义事件 : 子传父

    1. <el-dialog
    2. title="分配权限(一级为路由页面查看权限-二级为按钮操作权限)"
    3. :visible.sync="showDialogAssign"
    4. >
    5. <assign-permission
    6. + @close="showDialogAssign=false"
    7. />
    8. </el-dialog>

    在子组件

    1. methods: {
    2. hCancel() {
    3. // 通过父组件去关闭弹层
    4. this.$emit('close')
    5. }
    6. }

    3.提供数据方法

    3.1 角色分配权限-获取权限点数据并显示

    在组件assignPermission.vue中,获取当前系统中所有的权限点数据,并以树状结构显示出来,目标效果如下:

    思路:

    1. 准备权限点接口
    2. 弹框展示之后:a:调用api发请求获取数据;   b:对数据进行格式转换(数组转树)c:模板绑定(把数据显示到el-tree上)

    首先呢,要准备一个空的数组存储权限数据    permissionData: [] 

    a: 发送请求获取数据

    引入api 的方法 以及之前把数组转树的方法  然后再created里调用

    1. created() {
    2. this.loadPermissionList()
    3. },
    4. async loadPermissionList() {
    5. // 发送请求, 获取权限列表
    6. const { data } = await getPermissionList()
    7. console.log('权限列表的数据是', data)
    8. this.permissionData = tranListToTreeData(data)
    9. }
    10. //tranListToTreeData 数组转树

    el-tree 中显示数据


        :data="permissionData"
        :props="{ label: 'name' }"
    />

    3.2角色分配权限-设置el-tree的属性

    目标  : 

    对el-tree进一步设置:

    1.显示选择框

    2.默认全部展开

    3.关闭父子关联

    属性配置

    Element - The world's most popular Vue UI framework

    1. show-checkbox 显示选择框
    2. default-expand-all 默认展开
    3. check-strictly  设置true,可以关闭父子关联
    1. <el-tree
    2. :data="permissionData"
    3. :props="{ label: 'name' }"
    4. default-expand-all
    5. :show-checkbox="true"
    6. :check-strictly="true"
    7. />

    default-expand-all写法等价于:default-expand-all="true"

    小结

    业务:一级:表示能否访问某个页面; 二级:表示能点击某个按钮

    语法::default-expend-all=“true”   <====> default-expend-all

    3.3角色分配权限-数据回填

    目标

    当前用户可能有一些已有的权限,需要我们回显出来

    思路

    1. 准备api:  获取当前的角色已有的权限点
    2. 组装 当前 参数 ,调用 api获取数据;
    3. 把数据回填显示到tree中

    准备api   补充个获取角色详情的api

    将id从父传子

    在父组件setting.vue中,定义数据项:

    data () {

         return { // 省略其他...

    roleId: '  '

      }

    }

    在点击分配权限时,保存roleId

    分配权限

    对应的回调是:

    hAssign(id) {
       // 记下来id
       this.roleId = id
       this.showDialogAssign = true
    },


    在子级件中接收roleId

    在assignPerimission.vue中,补充定义props接收roleId值

    1. props: {
    2. roleId: {
    3. type: String,
    4. required: true
    5. }
    6. }

    调用api获取数据

    引入前面封装的api

    1. import {
    2. assignPerm,
    3. + getRoleDetail
    4. } from '@/api/setting'

    在created中调用

    1. created() {
    2. // 调用接口,获取所有的权限点数据
    3. this.loadPermissionList()
    4. // 调用接口,获取当前这个角色已经具备的权限
    5. + this.loadPermissionByRoleId()
    6. },
    7. async loadPermissionByRoleId() {
    8. // 根据roleId获取当前这个角色已经具备的权限
    9. const res = await getRoleDetail(this.roleId)
    10. + console.log('获取当前角色的已有的权限点数据', res.data.permIds)
    11. },

    将数据回填到el-tree中

    已经获取到了数据了,如何把它填充到el-tree中,让某些个复选框处于选中状态?

    答: setCheckedKeys + node-key

    官网: Element - The world's most popular Vue UI framework

    1. 给tree补充属性node-key
    1. <!-- 权限点数据展示 -->
    2. <el-tree
    3. ref="refTree"
    4. :data="permissionData"
    5. :props="{ label: 'name' }"
    6. :default-expand-all="true"
    7. :show-checkbox="true"
    8. :check-strictly="true"
    9. + node-key="id"
    10. />

        2.调用setCheckedKeys    

    1. // 获取角色现有的权限
    2. async loadRoleDetail() {
    3. const res = await getRoleDetail(this.roleId)
    4. console.log('获取角色现有的权限', res.data.permIds)
    5. // 回填
    6. this.$refs.refTree.setCheckedKeys(res.data.permIds)
    7. },

    小结

    业务:在el-tree组件中通过setCheckedKeys方法 + node-key将数据 回显到el-tree组件中:处于选中状态

    语法:父传子

    3.4角色分配权限-数据回填问题:created只执行一次

    原因

    由于子组件在dialog嵌套,所以,它只会创建一次:created只执行一次,后续的显示隐藏操作,都不会导致组件重建,所以:后面打开的内容与第一次是一样的。

    解决

    方案一 : 让弹层隐藏时,把子组件销毁

    1. title="分配角色"
    2. :visible.sync="showDialogRole"
    3. :close-on-click-modal="false"
    4. :close-on-press-escape="false"
    5. >
    6. <子组件
    7. + v-if="showDialogAssign"
    8. />
    9. </el-dialog>

    优点:简单;取到的是最新的数据;

    缺点:销毁组件,有一定性能问题,

    方案二:通过refs来引用子组件,直接调用它的方法来发请求

    1. // 用户点击了权限分配
    2. hAssign(id) {
    3. // alert(id)
    4. // 1. 保存角色编号
    5. // 它会影响子组件中的props,但是,这个传递的过程是异步的
    6. this.roleId = id
    7. // 2. 弹层
    8. this.showDialogAssign = true
    9. // 3. 手动调用子组件的loadPermissionByRoleId, 去根据最新的roleId获取权限信息
    10. this.$nextTick(() => {
    11. this.$refs.permission.loadPermissionByRoleId()
    12. })
    13. }
    14. }

    3.5角色分配权限-保存设置

    目标

    完成权限分配的功能

    思路

    准备api, 在点击保存时调用

    准备api

    文件src\api\settings.js中,补充一个api用来分配权限

    调用api分配权限-分析

    只需要调用上面定义的api,并传入相关参数即可。

    这里的参数有两个:

    1.当前的角色id是什么? 在点击分配权限时,可以从表格中获取, 父传子

    2.对应的权限列表id的是什么?通过el-tree组件的getCheckedKeys来获取用户选中的id列表

    调用api分配权限-功能实现

    1. async hSave() {
    2. const permIds = this.$refs.tree.getCheckedKeys()
    3. // console.log('当前选中的节点数组是', permIds)
    4. const res = await assignPerm({
    5. id: this.roleId,
    6. permIds
    7. })
    8. console.log('保存角色的权限点的结果是', res)
    9. // 提示
    10. this.$message.success('保存角色的权限成功')
    11. // 关闭弹层
    12. this.hCancel()
    13. },
    14. hCancel() {
    15. // 通过父组件去关闭弹层
    16. this.$emit('close-dialog')
    17. // 清空当前的选择
    18. this.$refs.tree.setCheckedKeys([])
    19. }

    最后,在弹层关闭时,去清空el-tree中用户选中的数据(如果在子组件上用v-if,这里就不需要了)

    小结

    • el-tree 获取当前选中的节点的keys: getCheckedKeys  (设置:setCheckedKeys)
    • 对于el-tree组件,清空当前的选择: this.$refs.tree.setCheckedKeys([])

    权限应用

    动态生成左侧菜单

    按钮级控制

  • 相关阅读:
    【C语言学习笔记 --- 位段】
    Aspose.Font for .NET V22.9
    【ArcGIS绘图系列1】在ArcGIS中制作柱状图与饼状图
    架构实战关键知识点
    机器学习第八次课
    java .jks证书在php中的使用
    LotusScript中的命名文档
    vs 2019怎么运行单个的cpp文件以及报错main已存在解决方法
    iterm2免密码连接远程服务器教程
    Shire.run:Prompt 即代码到 Prompt 即程序,思考 Prompt 的无限可能性
  • 原文地址:https://blog.csdn.net/LJM51200/article/details/126440745