1权限列表的基本布局
![](https://img-blog.csdnimg.cn/img_convert/dde4060995d0061d50de07d3b04c18b6.png)
1.0 创建组件,
![](https://img-blog.csdnimg.cn/img_convert/048ad14038e3a9480c9864b12076a0c5.png)
通过路由加载进来
![](https://img-blog.csdnimg.cn/img_convert/e70a5e9b5970a34ef1bf521aad9ab4a0.png)
测试:
![](https://img-blog.csdnimg.cn/img_convert/e211ea46cdef5f1e7ce1f1b8294d6ef6.png)
1.1 基本布局
![](https://img-blog.csdnimg.cn/img_convert/f8d26e1ab80b854253720f6a4fbbc8e7.png)
<!-- 面包屑 -->
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
<el-breadcrumb-item>权限管理</el-breadcrumb-item>
<el-breadcrumb-item>权限列表</el-breadcrumb-item>
</el-breadcrumb>
![](https://img-blog.csdnimg.cn/img_convert/0eeea02e75675056e903e3b21e5b1bab.png)
1.2 调用接口
![](https://img-blog.csdnimg.cn/img_convert/8cb05ca77cd7803149ae129b662f6c3b.png)
![](https://img-blog.csdnimg.cn/img_convert/e684d4c213d5d746a3c5fb379cddb159.png)
报错:
![](https://img-blog.csdnimg.cn/img_convert/9a0894e9cfb4b18045847289f1d3f739.png)
1.3展示数据
![](https://img-blog.csdnimg.cn/img_convert/3d23f55ec735aa39630887d6bdb59b01.png)
![](https://img-blog.csdnimg.cn/img_convert/8fa50fe3556f14200fe76eed31cbf9dd.png)
tab标签
![](https://img-blog.csdnimg.cn/img_convert/1c2bee152ed136e99c3ec5d6669e0257.png)
<el-tag>标签一</el-tag>
![](https://img-blog.csdnimg.cn/img_convert/faf6b25697f9881db8fc02f03184c64e.png)
![](https://img-blog.csdnimg.cn/img_convert/ab82aef4cff0d8b893a4dbe4e49c30c0.png)
2权限管理分析
![](https://img-blog.csdnimg.cn/img_convert/0db1c7271bed20fa64b3c6e303ec1b2c.png)
用户绑定了不同的角色
角色下拥有不同的权限
当用户拥有了角色,那角色下的权限都属于用户
3角色列表的基本布局
![](https://img-blog.csdnimg.cn/img_convert/c9773f5163c95af448c2028acbeee69b.png)
3.1 新建角色组件
![](https://img-blog.csdnimg.cn/img_convert/323137c4bd99ee7f88afdeb4be3e43d6.png)
1.1 通过路由形式加载进来
![](https://img-blog.csdnimg.cn/img_convert/5e16a6bab522c773ff5780a4929d6364.png)
![](https://img-blog.csdnimg.cn/img_convert/a21085ba7ae83194f40b908c39ddfada.png)
3.2 布局
1 添加按钮
button最好放在一个row里边
![](https://img-blog.csdnimg.cn/img_convert/272e8ea26e515a5a0cbce851598f4698.png)
2 调用接口
![](https://img-blog.csdnimg.cn/img_convert/6daa21addc3d12f4049542b5e9624d62.png)
![](https://img-blog.csdnimg.cn/img_convert/563dd2da0ba67e68706b87a3473718e9.png)
3 添加表格
![](https://img-blog.csdnimg.cn/img_convert/95d92796de27de5c776e335a61d6a314.png)
![](https://img-blog.csdnimg.cn/img_convert/d964a22f4be8f095264e09446b6e679b.png)
<template>
<div>
<!-- 面包屑 -->
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
<el-breadcrumb-item>权限管理</el-breadcrumb-item>
<el-breadcrumb-item>权限列表</el-breadcrumb-item>
</el-breadcrumb>
<!-- 卡片 -->
<el-card>
<el-row>
<!-- 添加角色 -->
<el-col>
<el-button type="primary" @click="addDialogVisible = true">添加角色</el-button>
</el-col>
<!-- 索引列 -->
<el-col>
<el-table :data="rolesList" border stripe>
<el-table-column type="index" label="#"></el-table-column>
<el-table-column prop="roleName" label="角色名称"></el-table-column>
<el-table-column prop="roleDesc" label="角色描述"></el-table-column>
<el-table-column label="操作">
<template v-slot="scope">
<el-button size="mini" type="primary" icon="el-icon-edit">编辑</el-button>
<el-button size="mini" type="danger" icon="el-icon-delete">删除</el-button>
<el-button size="mini" type="warning" icon="el-icon-search">分配权限</el-button>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</el-card>
</div>
</template>
4添加展开列
![](https://img-blog.csdnimg.cn/img_convert/3d920dbbdea76243a999b005b4280dc5.png)
4.1 添加一行展开列
![](https://img-blog.csdnimg.cn/img_convert/9a17db9e39dbc8e8b5d12e4f80aa84cd.png)
![](https://img-blog.csdnimg.cn/img_convert/adba3e5430ca4001292cecb216b95613.png)
4.2 查看角色下的权限
调用获取角色列表,已经吧角色下的权限带过来了
children 是一级权限,一级权限里边还有个children是二级权限 , 二级里边的children是三级权限
三层for循环吧数据拿出来
![](https://img-blog.csdnimg.cn/img_convert/799194c58389ca9279ed796265e04d61.png)
![](https://img-blog.csdnimg.cn/img_convert/a67fd66e77dea645713177bcf10867bc.png)
4.3 渲染一级权限
1 用栅格进行分布
![](https://img-blog.csdnimg.cn/img_convert/b8d1b2b8a693cdac485e72e1dc0df2fa.png)
<!-- 展开列 -->
<el-table-column type="expand">
<template slot-scope="scope">
<el-row>
<!-- 渲染一级权限 -->
<el-col :span="5"></el-col>
<!-- 渲染二级三级权限 -->
<el-col :span="19"></el-col>
</el-row>
</template>
</el-table-column>
2 一级权限进行for宣化渲染
![](https://img-blog.csdnimg.cn/img_convert/0c094f94cf428f8b0b057cf15376d447.png)
![](https://img-blog.csdnimg.cn/img_convert/cd225e552d8863136c09fda496aa85d3.png)
<el-table-column type="expand">
<template slot-scope="scope">
<el-row v-for="(item1,i1) in scope.row.children" :key="item1.id">
<!-- 渲染一级权限 -->
<el-col :span="5">
<el-tag>{{item1.authName}}</el-tag>
</el-col>
<!-- 渲染二级三级权限 -->
<el-col :span="19"></el-col>
</el-row>
</template>
</el-table-column>
美化:
2.1 每一行下边都有一个底边框 ,第一行还有一个头边框
![](https://img-blog.csdnimg.cn/img_convert/dc30105506ce4fbdaaf167594bedb462.png)
![](https://img-blog.csdnimg.cn/img_convert/248489ac284a07ecd207a5b16ab3a9ca.png)
2.2 添加一个 箭头
![](https://img-blog.csdnimg.cn/img_convert/b441c6c35922a7ce355437ef166a682e.png)
![](https://img-blog.csdnimg.cn/img_convert/f6d54380599da0c306a85dafb2b19e8a.png)
![](https://img-blog.csdnimg.cn/img_convert/e472935c660bfb63bb01031ca51fd1a9.png)
4.4 二级菜单渲染
![](https://img-blog.csdnimg.cn/img_convert/4d77c1c2bd9b7fc8a4e39c09eaefaac0.png)
每一个二级菜单也是一个el-row ,
在一个el-row 里边,让二级菜单占6列, 三级菜单占18列
![](https://img-blog.csdnimg.cn/img_convert/9107e4b8b58e6ad5a025591386d4eb63.png)
渲染每一行
![](https://img-blog.csdnimg.cn/img_convert/a5986af6bccc0960e6fa1f9113c98f64.png)
![](https://img-blog.csdnimg.cn/img_convert/4b3040b4600d728bc357cc996c8c8d78.png)
1 美化
![](https://img-blog.csdnimg.cn/img_convert/44780f4a2c312ffd77c464d9a1a55bb2.png)
4.5 三级权限设置
![](https://img-blog.csdnimg.cn/img_convert/2cf03f6fdbe433b31fc2dcf06498fd32.png)
![](https://img-blog.csdnimg.cn/img_convert/7f5c0966642ebd182304956adc320a0c.png)
1 美化
1 缩小以后, 箭头就会乱了
![](https://img-blog.csdnimg.cn/img_convert/feadd6e255f6759f77cac03de033d86f.png)
缩小以后, 箭头就会乱了
解决:设置一个最小宽度
![](https://img-blog.csdnimg.cn/img_convert/f7a3e96c4541aebcbbea68b4d55ff220.png)
2 一级分类没有居中对齐
![](https://img-blog.csdnimg.cn/img_convert/7e6402cd6daab66967829a15d44c5548.png)
![](https://img-blog.csdnimg.cn/img_convert/6a1897f108c6472b46c27f044340d8f4.png)
同时二级分类也没有居中对齐
![](https://img-blog.csdnimg.cn/img_convert/5bfffe0556b4e19829b82564407b0951.png)
<style lang="less" scoped>
/deep/ .el-table__expanded-cell{
padding:80px;
}
注意:
<style scoped lang="less"> 这样写,样式没有作用,要主要顺序 <style lang="less" scoped>
5删除角色下的权限
![](https://img-blog.csdnimg.cn/img_convert/1a7da45da33151a4f273d5bfecb58dae.png)
为每一个按钮都添加一个删除的小图标,点击图标的时候弹出一个确认框
5.1 添加 删除图标
![](https://img-blog.csdnimg.cn/img_convert/4bf178fc769cc62ca21f4d4b3bf846ba.png)
5.2 添加点击事件
![](https://img-blog.csdnimg.cn/img_convert/04a9129e2bb90833b073db632fd2826b.png)
![](https://img-blog.csdnimg.cn/img_convert/9a080d6229b0a1b55611a6d15e85539e.png)
![](https://img-blog.csdnimg.cn/img_convert/5ef156a224187bcfa61d1817ce9886c1.png)
![](https://img-blog.csdnimg.cn/img_convert/0d2f681b1c040b99e73574d7393b7596.png)
注意close的位置,是再el-tage身上起作用
5.3调用删除接口
![](https://img-blog.csdnimg.cn/img_convert/b64f201fe8f292609efb22a47cba01b5.png)
![](https://img-blog.csdnimg.cn/img_convert/e448098ba77c6c5e1ba7aa574c948662.png)
6分配权限
6.1 调用接口,弹出对话框
![](https://img-blog.csdnimg.cn/img_convert/adbbcc9d2a1985e92d7c6dd97ecbfb8e.png)
6.2 添加tree
![](https://img-blog.csdnimg.cn/img_convert/db290c3163627c6802d52f968b0abef3.png)
![](https://img-blog.csdnimg.cn/img_convert/02913b59bd399440839f9daa192e9a4a.png)
<el-tree :data="rightsList" :props="defaultProps"></el-tree>
rightsList: [],
defaultProps: {
children: 'children',
label: 'authName'
},
![](https://img-blog.csdnimg.cn/img_convert/6de5d1acc5f2c29b04d37bc9837aa81d.png)
6.3 添加复选框
![](https://img-blog.csdnimg.cn/img_convert/e3e34dd15f7264ca8db7155a74c746c3.png)
![](https://img-blog.csdnimg.cn/img_convert/d00bfadff8fa7afdaf06df314f8096ad.png)
![](https://img-blog.csdnimg.cn/img_convert/ff7a5583a5ea75c9891660d097597644.png)
show-checkbox
6.4选中的时候,希望选中的是id值
![](https://img-blog.csdnimg.cn/img_convert/d50eb2a55b6b46f9858f12c860b1ef5d.png)
![](https://img-blog.csdnimg.cn/img_convert/5424cb4d43cff9ebf1a14814da1840b8.png)
6.5 所有节点, 默认都展开
![](https://img-blog.csdnimg.cn/img_convert/7c6e7b5b713b2d45d4ccd32af8fabbc6.png)
![](https://img-blog.csdnimg.cn/img_convert/fac87372fd09e9cba4b65383c380df48.png)
![](https://img-blog.csdnimg.cn/img_convert/9ecd4cf9efb33fac6209e2f3409ef53f.png)
default-expand-all="true"
6.6 已有的权限,默认勾选上
![](https://img-blog.csdnimg.cn/img_convert/36da1f4b7f7a2465d68c39f24c291d47.png)
![](https://img-blog.csdnimg.cn/img_convert/a08ceb18c7546e7670cfe1e94650ad77.png)
:default-checked-keys="defKeys"
项目使用:
![](https://img-blog.csdnimg.cn/img_convert/373c1e2d10d44265b3b51c33bcb6006a.png)
1 获取所有的权限列表
2 获取角色下的权限列表(递归获取角色下所有的三级节点)
将角色下的权限id 都存在 defKey数组即可
就可以得到
![](https://img-blog.csdnimg.cn/img_convert/05346323e1341b216d5bf06a45e38a0a.png)
注意:
![](https://img-blog.csdnimg.cn/img_convert/ed3bfb649e7865d2c9b6bfb5e444bf96.png)
// 展示分配权限的对话框
async showSetRightDialog(roles) {
this.rolesId = roles.id
// 获取所有权限列表
const { data: res } = await this.$http.get('rights/tree')
if (res.meta.status !== 200) {
return this.$message.error('获取权限列表失败!')
}
// 获取到的权限数据保存
this.rightsList = res.data
console.log(this.rightsList)
// 递归获取三级节点
this.getLeafKeys(roles, this.defKeys)
this.SetRightDialogVisible = true
},
// 递归的形式,获取角色下所有的三级权限的id,并保存到 defKeys数组中
getLeafKeys(node, arr) {
// 如果当前node没有children属性则是三级节点
if (!node.children) {
return arr.push(node.id)
}
node.children.forEach(item => this.getLeafKeys(item, arr))
},
6.7 bug
当你点击多个角色的分配权限,你发现后边 角色的已有权限不对了, 多了很多
因为关闭分配角色的时候没有清除权限,长此以往导致权限越来越多
解决:
每次关闭【分配权限】 的时候清空数组
![](https://img-blog.csdnimg.cn/img_convert/c0ca512a4cd4f5a090623611ced059c3.png)
@close="SetRightDialogVisibleClosed"
// 监听分配权限对话框的关闭事件
SetRightDialogVisibleClosed() {
// 清空 defkeys 数组 避免累积
this.defKeys = []
},
6.8 点确定,进行角色授权
![](https://img-blog.csdnimg.cn/img_convert/80d23e0d7ff365039b8a5cd564e35d92.png)
![](https://img-blog.csdnimg.cn/img_convert/cd9585bebf2669354fb2a5e0c908a8d2.png)
获取所以已选中的id 和半选中的ID ,【合并数组】,将【数组】转成【字符串】 ,传送到服务器
怎么获取所以已选中的id (以前有的ID)和半选中的ID (自己添加的id)
![](https://img-blog.csdnimg.cn/img_convert/683b4128bc19eb2cbab21d9ea50081ee.png)
![](https://img-blog.csdnimg.cn/img_convert/4ded0ab5c5ac3fe0d32234f647ab5942.png)
async allotRights() {
const keys = [...this.$refs.treeRef.getCheckedKeys(), ...this.$refs.treeRef.getHalfCheckedKeys()]
const idStr = keys.join(',')
const { data: res } = await this.$http.post(`roles/${this.rolesId}/rights`, { rids: idStr })
if (res.meta.status !== 200) {
return this.$message.error('分配权限失败!')
}
this.$message.success('分配权限成功!')
this.getRolesList()
this.SetRightDialogVisible = false
}
注意: getCheckedKeys,getHalfCheckedKeys 不要写成getHalfCheckedNodes
2 获取成功之后,如果没有清除defKeys,回造成累加,你看的现象是 没有起作用 。记得关闭弹窗,清空数组
3 弹框点确定,拿不到roleId, 需要我们点分配角色的时候,将roleId存起来先
![](https://img-blog.csdnimg.cn/img_convert/8da9d61b810d5706e7b2a90f2d293d87.png)
7用户列表的分配角色
![](https://img-blog.csdnimg.cn/img_convert/8b5682dbd0285b3d6bbd9f9226f44413.png)
![](https://img-blog.csdnimg.cn/img_convert/85bbbb0b7fd6edb799df98e6114ae65a.png)
7.1 点击按钮,先获取数据进行展示
1 先写一个对话框
2 添加点击事件
3 调用函数,获取用户数据 和角色数据
4 渲染数据
![](https://img-blog.csdnimg.cn/img_convert/1a2da04f19e58cf65038a6226d39c6a6.png)
绑定参数 需要定义:
userInfo: {}, //用户信息绑定
selectRoleId: '', //角色绑定
rolesList: [],// 获取角色列表
用户数据需要在弹框中使用, 先再data 中存入
el-select :v-model的值为当前被选中的el-option的 value 属性值
![](https://img-blog.csdnimg.cn/img_convert/4e33e1c67d9c36057ded015e7a0c2e2e.png)
![](https://img-blog.csdnimg.cn/img_convert/5875665b2a5fe840495bcb4293b799a8.png)
<el-dialog title="分配角色" :visible.sync="fenpeiDialogVisble" width="30%">
<div>
<p>当前的用户 : {{ userInfo.username }}</p>
<p>当前的角色 : {{ userInfo.role_name }}</p>
<p>
分配新角色:
<el-select v-model="selectRoleId" placeholder="请选择">
<el-option v-for="item in rolesList" :key="item.id" :label="item.roleName" :value="item.id">
</el-option>
</el-select>
</p>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisble = false">取 消</el-button>
<el-button type="primary" @click="edituserbtn">确 定</el-button>
</span>
</el-dialog>
![](https://img-blog.csdnimg.cn/img_convert/ccf074107a093b503a7e4cc4d50c4141.png)
7.2 点击确定,完成分配角色
![](https://img-blog.csdnimg.cn/img_convert/38a08fb679319d77b839fe8c6b1d7b05.png)
![](https://img-blog.csdnimg.cn/img_convert/5636b461de8859b8a1e19d5a28d94f54.png)
7.3 点击确定,再进去 ,发现弹出框数据还在!!
监听对话框的close事件,清除数据
![](https://img-blog.csdnimg.cn/img_convert/c1b21db51fdd24ed4fe89e2992a7ea22.png)
@close="setRolesDialogClosed"
// 分配角色对话框关闭
setRolesDialogClosed() {
this.selectRoleId = ''
this.userInfo = ''
}