详细记录项目后续之旅之角色列表

198 阅读4分钟

目前已经做到权限管理下的角色列表:

image.png 需要完善第一列的内容,对应代码标签为:

image.png

使用作用域插槽的方法:获取到当前行的信息

image.png

slot-scope="scope" 来取得作用域插槽:data绑定的数据,scope可以随便替换其他名称,只是定义对象来代表取得的data数据,便于使用

效果:

image.png

image.png 可以看到children中有对应角色的权限名称,使用pre标签修改一下格式,便于查看。 效果:

image.png

下面,正式处理权限数据,需要将对应空白区域分两个部分,左边为一级权限显示区域,右边为二级和三级权限显示区域。 最终效果:

image.png

首先,使用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>

效果:

image.png

接下来对二级和三级部分区域进行处理:

image.png

对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

image.png

小细节:当页面宽度变小时,页面内图标一行展示不下会移到下一行,设置min-width:1366px,强制页面最小宽度为1366px,即使页面缩小,图标展示不会移到下一行。

接下来,给标签调节x的样式状态,点击标签后面的x,删除当前这个权限。ele里面已经配置好了,直接在tag标签中添加closable,然后绑定一个点击事件@close="removeRight()"

image.png

对于此点击事件,点击之后,先弹出提升框,是否删除权限,进行二次确认。 使用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

image.png 如果使用注释的那句刷新数据,页面会重新渲染,点击确认删除后,展开会关闭。使用最后一行的赋值,确认删除后,在当前界面发生删除操作,页面不会整体重新渲染。

最后进入分配权限部分~

点击分配权限,弹出对话框,一个树形结构,勾选中即为分配权限,未勾选即不分配。

首先,给分配权限按钮绑定点击事件

image.png

然后,页面添加对话框,先隐藏起来。在data中,set......:false

image.png

当点击分配权限,set......:true,把对话框显示出来。同时,获取权限列表所有数据。

发起get请求,获取到的数据保存在data函数的rightslist中。

image.png

image.png

在对话框中添加树形控件

image.png data属性中配置对应属性:

image.png

默认点开对话框时,树形结构是展开的,添加一默认属性即可,具体看ele。

默认哪些权限被勾选?需要在data属性配置,如下:

image.png

在data属性中:通过获取三级权限的id。下面是演示。

image.png

如何获取三级权限id?递归实现,并保持在defKeys数组中。 递归node,如果node没有children,则push入arr中。

image.png

递归函数在点击分配权限的事件中调用,传入的参数role(形参)为当前行的最外层节点。点击事件中的参数,需要先获取scope.row(实参)。 image.png

这里会有一个问题,每次点击分配权限,都会得到权限并赋值给data函数里面的defKey,defKey数组会一直增加,因此,在分配完权限之后关闭对话框时,应该清除defKey数组。

image.png

image.png

接下来是角色授权,给角色额外增加权限,通过勾选权限。之前是获取已经有的,现在是新增~

请求路径:roles/:roleId/rights 请求方法:post

ele的自带方法getCheckedKeys:当节点可以被选择,返回目前被选中的节点的key所组成的数组。

ele的自带方法getHalfCheckedKeys:若节点可以被选择,返回目前半选中的节点的key所组成的数组。

为树形结构添加ref引用,后续可以使用上面这两个方法:

image.png 获取到选中和半选中的节点的key,存入数组中:

image.png

根据接口要求,将这些节点key使用,拼接起来~

image.png 接下来发起post请求~

对于 :roleid 需要获取角色id值,需要在之前的点击分配权限弹出对话框事件中获取role。因此在data函数中增加一个属性来接收id,然后再在点击确定的事件中(allotrights)拿来用。

image.png

image.png

post请求~

image.png

后续~

image.png