• Vue+element 权限管理业务实现


     添加 编辑 删除 角色 都与上一篇 用户类似 只是接口不同 

    我们只关注其他不一样的: 

    展开渲染标签编辑权限

    el-table-column type="expand"  设置了 expand 则显示为一个可展开的按钮

    显示图上的效果 使用了 三重for循环   按照 tree 数据结构 .children 取得下一级数据

    1. <el-table-column type="expand">
    2. <template slot-scope="scope">
    3. <el-row v-for="(rights1,index) in scope.row.children" class="vertical" :key="index">
    4. <el-col :span="5">
    5. <el-tag class="tag1"
    6. disable-transitions
    7. closable
    8. @close="remRight(scope.row,rights1.id)">
    9. {{rights1.authName}}
    10. el-tag>
    11. <i class="el-icon-caret-right">i>
    12. el-col>
    13. <el-col :span="19">
    14. <el-row v-for="(rights2,index2) in rights1.children" class="vertical" :key="index2">
    15. <el-col :span="6">
    16. <el-tag class="tag2"
    17. type="success"
    18. disable-transitions
    19. closable
    20. @close="remRight(scope.row,rights2.id)">
    21. {{rights2.authName}}
    22. el-tag>
    23. <i class="el-icon-caret-right">i>
    24. el-col>
    25. <el-col :span="18">
    26. <el-tag class="tag3"
    27. type="warning"
    28. v-for="(rights3,index3) in rights2.children"
    29. disable-transitions
    30. :key="index3"
    31. closable
    32. @close="remRight(scope.row,rights3.id)">
    33. {{rights3.authName}}
    34. el-tag>
    35. el-col>
    36. el-row>
    37. el-col>
    38. el-row>
    39. pre 标签 整齐的排列 文本 代码
    40. template>
    41. el-table-column>
    1. // 关闭下拉的权限标签 事件
    2. async remRight(role,rightId){
    3. //弹窗询问用户是否删除数据
    4. const confirmResult = await this.$queding(
    5. '确定要为该角色删除此权限吗?',
    6. '提示',
    7. {
    8. confirmButtonText: '确定',
    9. cancelButtonText: '取消',
    10. type: 'warning'
    11. }
    12. ).catch(err => err)
    13. // 如果用户确认删除,则返回值为字符串 confirm
    14. // 如果用户取消删除,则返回值为字符串 cancel
    15. // console.log(confirmResult)
    16. if (confirmResult !== 'confirm'){
    17. return this.$Msg.info('已取消删除')
    18. }
    19. const {data:res} = await this.$http.delete(`roles/${role.id}/rights/${rightId}`)
    20. if (res.meta.status !== 200) return this.$Msg.error('删除此权限失败!')
    21. this.$Msg.success('删除用户成功!')
    22. // 参数不直接引用role.id 为了给 role.children 重新赋值 动态更新 不用刷新页面 再展开查看
    23. // 返回的data, 是当前角色下最新的权限数据
    24. role.children = res.data
    25. },

    对话框内树形组件编辑权限

     显示树形组件的对话框:

    1. <el-dialog
    2. title="修改角色权限"
    3. :visible.sync="editNPCRightBox"
    4. @close="ERNPCClose"
    5. width="45%">
    6. <el-tree
    7. 展示数据源
    8. :data="RightList"
    9. 适用于需要选择层级时使用
    10. show-checkbox
    11. 每个树节点用来作为唯一标识的属性整棵树应该是唯一的
    12. node-key="id"
    13. ref="PushRoleRef"
    14. 默认全部展开
    15. default-expand-all
    16. 默认勾选的节点的 key 的数组
    17. :default-checked-keys="defKeys"
    18. 配置选项
    19. :props="treeProps">
    20. el-tree>
    21. <span slot="footer" class="dialog-footer">
    22. <el-button type="primary" @click="ToEditRightNPC">确 定el-button>
    23. <el-button @click="editNPCRightBox = false">取 消el-button>
    24. span>
    25. el-dialog>
    26. <script>
    27. editNPCRightBox:false,
    28. RightList:null,
    29. // 树形配置 根据哪一个来渲染 名字和children属性
    30. treeProps:{
    31. label:'authName',// 看到的是哪一个属性
    32. children:'children'// 父子嵌套的关系
    33. },
    34. defKeys:[],
    35. // 点击编辑权限按钮时 记录当前ID 供应其他方法使用
    36. PushRolesId:null
    37. script>

    点击编辑权限按钮  先把要展示的数据源 RightList  再使用递归把拥有权限的id push到 defKeys里  之后显示对话框

    1. // 点击表单内的编辑按钮
    2. async editNPCRightBoxShow(role){
    3. this.PushRolesId = role.id
    4. const {data:res} = await this.$http.get('rights/tree')
    5. if (res.meta.status !==200) return this.$Msg.error('获取权限列表失败')
    6. this.RightList = res.data
    7. //console.log(role)
    8. await this.getThreeKeys(role,this.defKeys)
    9. this.editNPCRightBox = true
    10. },
    11. // 通过递归的方式 获取角色下所有的三级权限的id 并保存到defKeys 数组中
    12. getThreeKeys(node,arr){
    13. // 如果当前节点不包含 children 那么他就是三级节点
    14. if(!node.children){
    15. return arr.push(node.id)
    16. }
    17. node.children.forEach(item =>{
    18. this.getThreeKeys(item,arr)
    19. })
    20. },

       点击体检按钮时 通过ref调用

    getCheckedKeys(返回目前被选中的节点所组成的数组)

    getHalfCheckedKeys (返回目前半选中的节点的 key 所组成的数组)

    把他俩合并 并转成字符串 按照接口约定 向服务器发送请求

    1. // 编辑角色权限的对话框 内的确定按钮 发送请求
    2. async ToEditRightNPC(){
    3. const prams = [
    4. ...this.$refs.PushRoleRef.getCheckedKeys(),
    5. ...this.$refs.PushRoleRef.getHalfCheckedKeys()
    6. ]
    7. const xxx = prams.join(',')
    8. //console.log(prams)
    9. const {data:res} = await this.$http.post(`roles/${this.PushRolesId}/rights`,{rids:xxx})
    10. if (res.meta.status !==200) return this.$Msg.error('为此角色修改权限失败')
    11. await this.getNPCList()
    12. this.editNPCRightBox = false
    13. this.$Msg.success('修改角色权限成功')
    14. },
    15. // 编辑角色权限的对话框被关闭时 清空默认选中的值 防止打开时id 重复
    16. ERNPCClose(){
    17. this.defKeys = []
    18. }

    展示所有权限

    很简单 就是请求数据 表格渲染 

    1. <template>
    2. <div>
    3. <el-breadcrumb separator-class="el-icon-arrow-right">
    4. <el-breadcrumb-item :to="{ path: '/home' }" >首页el-breadcrumb-item>
    5. <el-breadcrumb-item>权限管理el-breadcrumb-item>
    6. <el-breadcrumb-item>权限列表el-breadcrumb-item>
    7. el-breadcrumb>
    8. <el-card>
    9. <el-table
    10. :data="RightsList"
    11. style="width: 100%"
    12. stripe
    13. border>
    14. <el-table-column type="index" label="#">el-table-column>
    15. <el-table-column prop="authName" label="权限名称">el-table-column>
    16. <el-table-column prop="path" label="路径">el-table-column>
    17. <el-table-column label="权限等级">
    18. <template slot-scope="scope">
    19. <el-tag v-if="scope.row.level == 0">一级el-tag>
    20. <el-tag v-else-if="scope.row.level == 1" type="success">二级el-tag>
    21. <el-tag v-else type="warning">三级el-tag>
    22. template>
    23. el-table-column>
    24. el-table>
    25. el-card>
    26. div>
    27. template>
    28. <script>
    29. export default {
    30. name: 'Rights-content',
    31. created() {
    32. this.getRightsList()
    33. },
    34. data(){
    35. return{
    36. RightsList:null
    37. }
    38. },
    39. methods:{
    40. async getRightsList(){
    41. const {data:res} = await this.$http.get('rights/list')
    42. if (res.meta.status !==200) return this.$Msg.error('获取权限列表失败')
    43. this.RightsList = res.data
    44. }
    45. }
    46. }
    47. script>

  • 相关阅读:
    18.1 Socket 原生套接字抓包
    特征生成(特征创建)
    FastReport VCL 2022.3
    C++的重大特性之一:继承、菱形继承
    【华为机试真题 JAVA】整型数组按个位值排序-100
    【Android】Google AutoService的使用与源码解析
    小程序在政务服务平台建设中如何发挥价值
    算法训练营day45|动态规划 part07:完全背包 (LeetCode 70. 爬楼梯(进阶)、322. 零钱兑换、279.完全平方数)
    【匠心之作】三道题带你简单复习C++和Java
    Elasticsearch使用——结合MybatisPlus使用ES & es和MySQL数据一致性 & 结合RabbitMQ实现解耦
  • 原文地址:https://blog.csdn.net/benlalagang/article/details/126538792