目前已经做到权限管理下的角色列表:
需要完善第一列的内容,对应代码标签为:
使用作用域插槽的方法:获取到当前行的信息
slot-scope="scope" 来取得作用域插槽:data绑定的数据,scope可以随便替换其他名称,只是定义对象来代表取得的data数据,便于使用
效果:
可以看到children中有对应角色的权限名称,使用pre标签修改一下格式,便于查看。
效果:
下面,正式处理权限数据,需要将对应空白区域分两个部分,左边为一级权限显示区域,右边为二级和三级权限显示区域。 最终效果:
首先,使用el-row,内部使用两个el-col,第一个el-col占用5列,第二个el-rol占用19列,一共是25列。
<el-row>
<el-col></el-col>
<el-col></el-col>
</el-row>
然后,对el-row使用v-for遍历,得到每一行信息,为当前行的第一列添加权限信息,使用el-tag把得到的权限变为有样式的标签。 scope.row.children获得是一级权限。 children数组里面有几个对象,就会遍历得到几个el-row。
<el-row v-for="(item1,i1) in scope.row.children" :key="item1">
<el-col :span="5"><el-tag>{{item1.authName}}</el-tag></el-col>
<el-col :span="19"></el-col>
</el-row>
效果:
接下来对二级和三级部分区域进行处理:
对el-row进行for循环,获得二级权限,遍历的是一级的item1
<el-row v-for="(item2,i2) in item1.children" :key="item2.id">
<el-col :span="6"><el-tag type="success">{{item2.authName}}</el-tag></el-col>
<el-col :span="18">
这里面放三级权限标签
</el-col>
</el-row>
对于三级权限,则遍历二级的item2
小细节:当页面宽度变小时,页面内图标一行展示不下会移到下一行,设置min-width:1366px,强制页面最小宽度为1366px,即使页面缩小,图标展示不会移到下一行。
接下来,给标签调节x的样式状态,点击标签后面的x,删除当前这个权限。ele里面已经配置好了,直接在tag标签中添加closable,然后绑定一个点击事件@close="removeRight()"
对于此点击事件,点击之后,先弹出提升框,是否删除权限,进行二次确认。 使用ele自带的消息提示框:
this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
这是一个异步事件,需要进行下一步完善,添加await,async,捕捉错误。
async removeRight(){
const confirmResult=await this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).catch(err=>err)
if(confirmResult!=='confirm'){
return this.$message.info('取消了删除')
}
}
取消删除会捕获错误,返回info信息。
如果确认删除,需要发起http delete请求:
路径:roles/:roleId/rights/:rightId
如果使用注释的那句刷新数据,页面会重新渲染,点击确认删除后,展开会关闭。使用最后一行的赋值,确认删除后,在当前界面发生删除操作,页面不会整体重新渲染。
最后进入分配权限部分~
点击分配权限,弹出对话框,一个树形结构,勾选中即为分配权限,未勾选即不分配。
首先,给分配权限按钮绑定点击事件
然后,页面添加对话框,先隐藏起来。在data中,set......:false
当点击分配权限,set......:true,把对话框显示出来。同时,获取权限列表所有数据。
发起get请求,获取到的数据保存在data函数的rightslist中。
在对话框中添加树形控件
data属性中配置对应属性:
默认点开对话框时,树形结构是展开的,添加一默认属性即可,具体看ele。
默认哪些权限被勾选?需要在data属性配置,如下:
在data属性中:通过获取三级权限的id。下面是演示。
如何获取三级权限id?递归实现,并保持在defKeys数组中。 递归node,如果node没有children,则push入arr中。
递归函数在点击分配权限的事件中调用,传入的参数role(形参)为当前行的最外层节点。点击事件中的参数,需要先获取scope.row(实参)。
这里会有一个问题,每次点击分配权限,都会得到权限并赋值给data函数里面的defKey,defKey数组会一直增加,因此,在分配完权限之后关闭对话框时,应该清除defKey数组。
接下来是角色授权,给角色额外增加权限,通过勾选权限。之前是获取已经有的,现在是新增~
请求路径:roles/:roleId/rights 请求方法:post
ele的自带方法getCheckedKeys:当节点可以被选择,返回目前被选中的节点的key所组成的数组。
ele的自带方法getHalfCheckedKeys:若节点可以被选择,返回目前半选中的节点的key所组成的数组。
为树形结构添加ref引用,后续可以使用上面这两个方法:
获取到选中和半选中的节点的key,存入数组中:
根据接口要求,将这些节点key使用,拼接起来~
接下来发起post请求~
对于 :roleid 需要获取角色id值,需要在之前的点击分配权限弹出对话框事件中获取role。因此在data函数中增加一个属性来接收id,然后再在点击确定的事件中(allotrights)拿来用。
post请求~
后续~