Vue角色的权限管理
根据服务器端的数据,对角色的权限管理使用for循环进行遍历,然后渲染了样式使用element-ui实现布局文章目录角色权限的样式角色权限分配权限分配角色功能的实现接口删除角色指定权限的接口所有权限列表接口角色授权接口角色权限的样式先获取角色的一级权限、二级权限、三级权限,然后分别对一级循环、二级权限、三级权限 进行循环下面是 一级权限、二级权限、三级权限 的 数据角色权限权限管理:[外链图片转存失
·
根据服务器端的数据,对角色的权限管理使用for循环进行遍历,然后渲染了样式
使用element-ui实现布局
角色权限的样式
先获取角色的 一级权限、二级权限、三级权限,
然后分别对一级循环、二级权限、三级权限 进行循环
下面是 一级权限、二级权限、三级权限 的 数据
角色权限
权限管理:
Rights.vue
<!-- 角色列表数据 -->
<el-table :data="roleList" border stripe>
<!-- 展开列 -->
<el-table-column type="expand">
<template slot-scope="scope">
<!-- 获取所有权限的数据 -->
<!-- <pre>
{{ scope.row }}
</pre> -->
<!-- el-row 栅格系统,用于编写一、二、三级权限的样式 -->
<!-- item1 ~ 循环遍历出所有的一级权限 -->
<!-- i1 ~ 第几个一级权限 -->
<!-- bdbottom ~ style中的样式 -->
<!-- bdtop ~ style中的样式 -->
<!-- :class="['bdbottom', i1 === 0 ? 'bdtop' : '']" 如果是一级权限的第一行就不加上边框了 -->
<el-row
:class="['bdbottom', i1 === 0 ? 'bdtop' : '', 'vcenter']"
v-for="(item1, i1) in scope.row.children"
:key="item1.id"
>
<!-- 渲染一级权限 -->
<el-col :span="5">
<el-tag
closable
@close="removeRightById(scope.row, item1.id)"
>{{ item1.authName }}</el-tag
>
<i class="el-icon-caret-right"></i>
</el-col>
<!-- 渲染二级和三级权限 -->
<el-col :span="19">
<!-- 二级权限 -->
<!-- 通过 for循环 嵌套 渲染二级权限 -->
<!-- :class="[i2 === 0 ? '' : 'bdtop']" 如果是二级权限的第一行就不加上边框了 -->
<el-row
:class="[i2 === 0 ? '' : 'bdtop', 'vcenter']"
v-for="(item2, i2) in item1.children"
:key="item2.id"
>
<el-col :span="6">
<el-tag
type="success"
closable
@close="removeRightById(scope.row, item2.id)"
>{{ item2.authName }}</el-tag
>
<i class="el-icon-caret-right"></i>
</el-col>
<!-- 三级权限 -->
<!-- , i3 (v-for 的 循环变量)-->
<!-- closable 关闭的图标 -->
<!-- scope.row -- 角色 -->
<!-- item3.id -- 权限id -->
<el-col :span="18">
<el-tag
type="warning"
v-for="item3 in item2.children"
:key="item3.id"
closable
@close="removeRightById(scope.row, item3.id)"
>{{ item3.authName }}</el-tag
>
</el-col>
</el-row>
</el-col>
</el-row>
</template>
</el-table-column>
<!-- 索引列 -->
<el-table-column type="index"></el-table-column>
<el-table-column label="角色名称" prop="roleName"></el-table-column>
<el-table-column label="角色描述" prop="roleDesc"></el-table-column>
<el-table-column label="操作" width="300px">
<!-- slot-scope="scope" -->
<template slot-scope="scope">
<!-- 编辑按钮 -->
<el-button
size="mini"
type="primary"
icon="el-icon-edit"
@click="showEditDialog(scope.row.id)"
>编辑</el-button
>
<!-- 删除按钮 -->
<el-button
size="mini"
type="danger"
icon="el-icon-delete"
@click="removeRoleById(scope.row.id)"
>删除</el-button
>
<!-- 分配权限按钮 -->
<el-button size="mini" type="warning" icon="el-icon-setting"
>分配权限</el-button
>
</template>
</el-table-column>
</el-table>
</el-card>
// 根据Id删除对应的权限
async removeRightById(role, rightId) {
// 弹框提示用户是否要删除
const confirmResult2 = await this.$confirm(
'此操作将永久删除该文件, 是否继续?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
).catch((err) => err)
if (confirmResult2 !== 'confirm') {
return this.$message.info('已经取消删除权限!')
}
// console.log('已经删除')
const { data: res } = await this.$http.delete(
`roles/${role.id}/rights/${rightId}`
)
if (res.meta.status !== 200) {
return this.$message.error('删除权限失败')
}
// 重新获取数据 (缺点:删除成功了后,会自动关闭)
// this.getRolesList()
// 另一种获取数据data的办法
role.children = res.data
}
分配权限
思路:
给角色分配好权限后,将这些权限分别转为字符串形式,不同权限之间用 英文逗号 分开
- 当点击“分配权限”的时候,把角色id存到 roleId中
- 点击“确定”按钮后,将选中的权限 转为 数组,将得到的数组拼接为字符串
样式:
<!-- 底部的按钮区域 -->
<span slot="footer" class="dialog-footer">
<!-- 点击按钮时 对话框隐藏 -->
<el-button @click="setRightDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="allotRights">确 定</el-button>
</span>
数据:
data() {
return {
// 所有角色列表数据
roleList: [],
// 控制分配权限对话框的显示与隐藏
setRightDialogVisible: false,
// 所有权限的数据
rightslist: [],
// 树形控件的属性绑定规则
treeProps: {
label: 'authName',
children: 'children',
},
// 默认选中的节点Id值数组
// []里面是Id值
defKeys: [],
// 当前即将分配权限的角色id
roleId: '',
// 控制 添加角色对话框 的 显示与隐藏
addDialogVisible: false,
// 控制 修改角色对话框 的 显示与隐藏
editDialogVisible: false,
// 查询到的角色信息对象
editForm: {},
addForm: {
roleId: '',
roleName: '',
roleDesc: '',
},
}
}
逻辑:
// 获取所有角色的列表
async getRolesList() {
const { data: res } = await this.$http.get('roles')
if (res.meta.status !== 200) {
return this.$message.error('获取角色列表失败')
}
this.roleList = res.data
console.log(this.roleList)
},
// 点击给角色分配权限
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.roleId}/rights`,
{ rids: idStr }
)
if (res.meta.status !== 200) {
return this.$message.error('分配权限失败!')
}
this.$message.success('分配权限成功!')
this.getRolesList()
this.setRightDialogVisible = false
},
分配角色功能的实现
样式:
<!-- 分配权限的对话框 -->
<el-dialog
title="分配权限"
:visible.sync="setRightDialogVisible"
width="50%"
>
<!-- 树形控件 -->
<!-- show-checkbox 复选框 -->
<!-- node-key="id" 选中某个复选框,选中的是这个复选框中内容的id -->
<!-- default-expand-all 默认展开所有结点 -->
<el-tree
:data="rightslist"
:props="treeProps"
show-checkbox
node-key="id"
default-expand-all
></el-tree>
<!-- 底部的按钮区域 -->
<span slot="footer" class="dialog-footer">
<!-- 点击按钮时 对话框隐藏 -->
<el-button @click="setRightDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="setRightDialogVisible = false"
>确 定</el-button
>
<!-- <el-button type="primary">确 定</el-button> -->
</span>
</el-dialog>
<script>
export default {
data() {
return {
// 所有角色列表数据
roleList: [],
// 控制分配权限对话框的显示与隐藏
setRightDialogVisible: false,
// 所有权限的数据
rightslist: [],
// 树形控件的属性绑定规则
treeProps: {
label: 'authName',
children: 'children',
},
// 控制 添加角色对话框 的 显示与隐藏
addDialogVisible: false,
// 控制 修改角色对话框 的 显示与隐藏
editDialogVisible: false,
// 查询到的角色信息对象
editForm: {},
addForm: {
roleId: '',
roleName: '',
roleDesc: '',
},
}
},
created() {
this.getRolesList()
},
methods: {
// 获取所有角色的列表
async getRolesList() {
const { data: res } = await this.$http.get('roles')
if (res.meta.status !== 200) {
return this.$message.error('获取角色列表失败')
}
this.roleList = res.data
console.log(this.roleList)
},
// 展示分配权限的对话框
async showSetRightDialg() {
// 获取所有权限的数据
const { data: res } = await this.$http.get('rights/tree')
if (res.meta.status !== 200) {
return this.message.error('获取权限数据失败')
}
// 数据获取成功
// 把获取到的权限数据保存到 data 中
this.rightslist = res.data
console.log(this.rightslist)
this.setRightDialogVisible = true
},
},
}
</script>
<!-- 分配权限的对话框 -->
<!-- @close="setRightDialogClosed" 关闭权限管理对话框的时候,将defKeys数组清空 -->
<el-dialog
title="分配权限"
:visible.sync="setRightDialogVisible"
width="50%"
@close="setRightDialogClosed"
>
<!-- 树形控件 -->
<!-- show-checkbox 复选框 -->
<!-- node-key="id" 选中某个复选框,选中的是这个复选框中内容的id -->
<!-- default-expand-all 默认展开所有结点 -->
<!-- :default-checked-keys="defKeys" 默认勾选 -->
<el-tree
:data="rightslist"
:props="treeProps"
show-checkbox
node-key="id"
default-expand-all
:default-checked-keys="defKeys"
></el-tree>
<script>
export default {
data() {
return {
// 所有角色列表数据
roleList: [],
// 控制分配权限对话框的显示与隐藏
setRightDialogVisible: false,
// 所有权限的数据
rightslist: [],
// 树形控件的属性绑定规则
treeProps: {
label: 'authName',
children: 'children',
},
// 默认选中的节点Id值数组
// []里面是Id值
defKeys: [],
// 控制 添加角色对话框 的 显示与隐藏
addDialogVisible: false,
// 控制 修改角色对话框 的 显示与隐藏
editDialogVisible: false,
// 查询到的角色信息对象
editForm: {},
addForm: {
roleId: '',
roleName: '',
roleDesc: '',
},
}
},
created() {
this.getRolesList()
},
methods: {
// 获取所有角色的列表
async getRolesList() {
const { data: res } = await this.$http.get('roles')
if (res.meta.status !== 200) {
return this.$message.error('获取角色列表失败')
}
this.roleList = res.data
console.log(this.roleList)
},
// 展示分配权限的对话框
async showSetRightDialg(role) {
// 获取所有权限的数据
const { data: res } = await this.$http.get('rights/tree')
if (res.meta.status !== 200) {
return this.message.error('获取权限数据失败')
}
// 数据获取成功
// 把获取到的权限数据保存到 data 中
this.rightslist = res.data
console.log(this.rightslist)
// 递归获取三级权限的id
this.getLeafKeys(role, 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)
})
},
// 监听分配权限对话框的关闭事件
setRightDialogClosed() {
this.defKeys = []
}
}
}
接口
删除角色指定权限的接口
-
请求路径:roles/:roleId/rights/:rightId
-
请求方法:delete
-
请求参数
参数名 参数说明 备注 :roleId 角色 ID 不能为空 携带在url中
:rightId 权限 ID 不能为空 携带在url中
-
响应数据说明
- 返回的data, 是当前角色下最新的权限数据
-
响应数据
{ "data": [ { "id": 101, "authName": "商品管理", "path": null, "children": [ { "id": 104, "authName": "商品列表", "path": null, "children": [ { "id": 105, "authName": "添加商品", "path": null }, { "id": 116, "authName": "修改", "path": null } ] } ] } ], "meta": { "msg": "取消权限成功", "status": 200 } }
所有权限列表接口
- 请求路径:rights/:type
- 请求方法:get
- 请求参数
参数名 | 参数说明 | 备注 |
---|---|---|
type | 类型 | 值 list 或 tree , list 列表显示权限, tree 树状显示权限,参数是url参数:type |
- 响应参数
参数名 | 参数说明 | 备注 |
---|---|---|
id | 权限 ID | |
authName | 权限说明 | |
level | 权限层级 | |
pid | 权限父 ID | |
path | 对应访问路径 |
- 响应数据 type=list
{
"data": [
{
"id": 101,
"authName": "商品管理",
"level": "0",
"pid": 0,
"path": null
},
{
"id": 102,
"authName": "订单管理",
"level": "0",
"pid": 0,
"path": null
}
],
"meta": {
"msg": "获取权限列表成功",
"status": 200
}
}
type=tree
{
data: [
{
id: 101,
authName: '商品管理',
path: null,
pid: 0,
children: [
{
id: 104,
authName: '商品列表',
path: null,
pid: 101,
children: [
{
id: 105,
authName: '添加商品',
path: null,
pid: '104,101'
}
]
}
]
}
],
meta: {
msg: '获取权限列表成功',
status: 200
}
}
角色授权 接口
- 请求路径:roles/:roleId/rights
- 请求方法:post
- 请求参数:通过
请求体
发送给后端
参数名 | 参数说明 | 备注 |
---|---|---|
:roleId | 角色 ID | 不能为空携带在url中 |
rids | 权限 ID 列表(字符串) | 以 , 分割的权限 ID 列表(获取所有被选中、叶子节点的key和半选中节点的key, 包括 1,2,3级节点) |
- 响应数据
{
"data": null,
"meta": {
"msg": "更新成功",
"status": 200
}
}
更多推荐
已为社区贡献9条内容
所有评论(0)