1. 权限管理业务分析
通过权限管理模块控制不同的用户可以进行哪些操作,具体可以通过角色的方式进行控制,即每个用户分配一个特定的角色,角色包括不同的功能权限。
2. 权限管理开发开始
码云中也出现了rights分支:
3.权限列表展示
<!-- 卡片视图 -->
<el-card>
<el-table :data="rightsList" border stripe>
<el-table-column type="index" label="#"></el-table-column>
<el-table-column label="权限名称" prop="authName"></el-table-column>
<el-table-column label="路径" prop="path"></el-table-column>
<el-table-column label="权限等级" prop="level">
<template v-slot="scope">
<el-tag v-if="scope.row.level === '0'">一级</el-tag>
<el-tag type="success" v-if="scope.row.level === '1'">二级</el-tag>
<el-tag type="warning" v-else>三级</el-tag>
</template>
</el-table-column>
</el-table>
</el-card>
// 获取所有的权限
async getRightsList () {
const { data: res } = await this.$http.get('rights/list')
if (res.meta.status !== 200) {
return this.$message.error('获取权限列表失败!')
}
this.rightsList = res.data
console.log(this.rightsList)
}
4. 角色列表展示
- 调用后台接口获取角色列表数据
- 角色列表展示
// 获取所有角色的列表
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)
}
5. 角色权限分配
1. 表格行展开效果
- 通过el-table-column 组件的 type=“expand” 方式实现表格行展开效果。
- 在表格展开行渲染一级菜单
- 在表格展开行中渲染二级菜单
<!-- 展开列 -->
<el-table-column type="expand">
<template v-slot="scope">
<el-row v-for="(item1,i1) in scope.row.children" :key="item1.id"
:class="['bdbottom',i1 === 0 ? 'bdtop':'','vcenter']">
<!-- 渲染一级权限 -->
<el-col :span="5">
<el-tag closable @close="removeRightsById(scope.row,item1.id)">{{item1.authName}}</el-tag>
<i class="el-icon-caret-right"></i>
</el-col>
<!-- 渲染二级和三级权限 -->
<el-col :span="19">
<!-- 通过for循环 嵌套渲染二级权限 -->
<el-row v-for="(item2,i2) in item1.children" :key="item2.id"
:class="[i2 === 0? '':'bdtop','vcenter']">
<el-col :span="6">
<el-tag type="success" closable @close="removeRightsById(scope.row,item2.id)">{{item2.authName}}</el-tag>
<i class="el-icon-caret-right"></i>
</el-col>
<el-col :span="18">
<el-tag v-for="(item3) in item2.children" :key="item3.id"
type="warning" closable @close="removeRightsById(scope.row,item3.id)">
{{item3.authName}}
</el-tag>
</el-col>
</el-row>
</el-col>
</el-row>
</template>
</el-table-column>
2. 删除角色下的权限
// 根据id 删除对应的权限
async removeRightsById (role, rightId) {
// 弹框提示用户是否要删除
const confirmResult = await this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).catch(err => err)
if (confirmResult !== 'confirm') {
return this.$message.info('取消了删除!')
}
const { data: res } = await this.$http.delete(`roles/${role.id}/rights/${rightId}`)
if (res.meta.status !== 200) {
return this.$message.error('删除权限失败!')
}
role.children = res.data
}
3. 给角色分配权限流程
- 实现角色分配权限对话框布局:
<!-- 分配权限对话框 -->
<el-dialog title="分配权限" :visible.sync="setRightDialogVisible"
width="50%">
<span slot="footer" class="dialog-footer">
<el-button @click="setRightDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="setRightDialogVisible = false">确 定</el-button>
</span>
</el-dialog>
- 渲染权限的树形结构,会使用到element-ui中的 el-tree组件:
// 展示分配权限的对话框
async showSetRightDialog () {
// 获取所有权限的数据
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
}
- 设置默认权限菜单选中:
// 通过递归的形式获取角色下所有三级权限的id,并保存到数组中
getLeafKeys (node, arr) {
if (!node.children) {
// 如果当前是三级节点,则把id放入数组
return arr.push(node.id)
}
// 如果不是三级结点,就递归去找
node.children.forEach(item => this.getLeafKeys(item, arr))
}
- 完成角色授权:
// 点击为角色分配权限的函数
async allowRights () {
// 获取树形控件中,所有全选的和半选的结点的id数组
const keys = [...this.$refs.treeRef.getCheckedKeys(),
...this.$refs.treeRef.getHalfCheckedKeys()]
// console.log(keys)
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
}