|
@@ -1,5 +1,5 @@
|
|
|
<template>
|
|
|
- <div>
|
|
|
+ <div class="authority">
|
|
|
<div class="button-box clearflex">
|
|
|
<el-button @click="addAuthority" type="primary">新增角色</el-button>
|
|
|
</div>
|
|
@@ -9,8 +9,7 @@
|
|
|
<el-table-column label="角色名称" min-width="180" prop="authorityName"></el-table-column>
|
|
|
<el-table-column fixed="right" label="操作" width="500">
|
|
|
<template slot-scope="scope">
|
|
|
- <el-button @click="addAuthMenu(scope.row)" size="small" type="text">变更角色菜单</el-button>
|
|
|
- <el-button @click="addAuthApi(scope.row)" size="small" type="text">变更角色Api</el-button>
|
|
|
+ <el-button @click="opdendrawer(scope.row)" size="small" type="text">设置权限</el-button>
|
|
|
<el-button @click="deleteAuth(scope.row)" size="small" type="text">删除角色</el-button>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
@@ -25,6 +24,7 @@
|
|
|
@size-change="handleSizeChange"
|
|
|
layout="total, sizes, prev, pager, next, jumper"
|
|
|
></el-pagination>
|
|
|
+
|
|
|
<!-- 新增角色弹窗 -->
|
|
|
<el-dialog :visible.sync="dialogFormVisible" title="新增角色">
|
|
|
<el-form :model="form">
|
|
@@ -41,43 +41,16 @@
|
|
|
</div>
|
|
|
</el-dialog>
|
|
|
|
|
|
- <!-- 关联menu弹窗 -->
|
|
|
- <el-dialog :visible.sync="menuDialogFlag" title="关联菜单">
|
|
|
- <el-tree
|
|
|
- :data="menuTreeData"
|
|
|
- :default-checked-keys="menuTreeIds"
|
|
|
- :props="menuDefaultProps"
|
|
|
- default-expand-all
|
|
|
- highlight-current
|
|
|
- node-key="ID"
|
|
|
- ref="menuTree"
|
|
|
- show-checkbox
|
|
|
- v-if="menuDialogFlag"
|
|
|
- ></el-tree>
|
|
|
- <div class="dialog-footer" slot="footer">
|
|
|
- <el-button @click="closeDialog">取 消</el-button>
|
|
|
- <el-button @click="relation" type="primary">确 定</el-button>
|
|
|
- </div>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 关联api弹窗 -->
|
|
|
- <el-dialog :visible.sync="apiDialogFlag" title="关联api">
|
|
|
- <el-tree
|
|
|
- :data="apiTreeData"
|
|
|
- :default-checked-keys="apiTreeIds"
|
|
|
- :props="apiDefaultProps"
|
|
|
- default-expand-all
|
|
|
- highlight-current
|
|
|
- node-key="path"
|
|
|
- ref="apiTree"
|
|
|
- show-checkbox
|
|
|
- v-if="apiDialogFlag"
|
|
|
- ></el-tree>
|
|
|
- <div class="dialog-footer" slot="footer">
|
|
|
- <el-button @click="closeDialog">取 消</el-button>
|
|
|
- <el-button @click="authApiEnter" type="primary">确 定</el-button>
|
|
|
- </div>
|
|
|
- </el-dialog>
|
|
|
+ <el-drawer :visible.sync="drawer" v-if="drawer" :with-header="false" size="40%" title="角色配置">
|
|
|
+ <el-tabs class="role-box" type="border-card">
|
|
|
+ <el-tab-pane label="角色菜单">
|
|
|
+ <Menus :row="activeRow" />
|
|
|
+ </el-tab-pane>
|
|
|
+ <el-tab-pane label="角色api">
|
|
|
+ <apis :row="activeRow" />
|
|
|
+ </el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+ </el-drawer>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -89,9 +62,10 @@ import {
|
|
|
deleteAuthority,
|
|
|
createAuthority
|
|
|
} from '@/api/authority'
|
|
|
-import { getBaseMenuTree, addMenuAuthority, getMenuAuthority } from '@/api/menu'
|
|
|
-import { getAllApis } from '@/api/api'
|
|
|
-import { casbinPUpdata, getPolicyPathByAuthorityId } from '@/api/casbin'
|
|
|
+
|
|
|
+import Menus from '@/view/superAdmin/authority/components/menus'
|
|
|
+import Apis from '@/view/superAdmin/authority/components/apis'
|
|
|
+
|
|
|
import infoList from '@/components/mixins/infoList'
|
|
|
export default {
|
|
|
name: 'Authority',
|
|
@@ -100,22 +74,10 @@ export default {
|
|
|
return {
|
|
|
listApi: getAuthorityList,
|
|
|
listKey: 'list',
|
|
|
+ drawer: false,
|
|
|
+ activeRow: {},
|
|
|
activeUserId: 0,
|
|
|
- menuTreeData: [],
|
|
|
- menuTreeIds: [],
|
|
|
- menuDefaultProps: {
|
|
|
- children: 'children',
|
|
|
- label: 'nickName'
|
|
|
- },
|
|
|
-
|
|
|
- apiTreeData: [],
|
|
|
- apiTreeIds: [],
|
|
|
- apiDefaultProps: {
|
|
|
- children: 'children',
|
|
|
- label: 'description'
|
|
|
- },
|
|
|
dialogFormVisible: false,
|
|
|
- menuDialogFlag: false,
|
|
|
apiDialogFlag: false,
|
|
|
form: {
|
|
|
authorityId: '',
|
|
@@ -123,7 +85,15 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
+ components: {
|
|
|
+ Menus,
|
|
|
+ Apis
|
|
|
+ },
|
|
|
methods: {
|
|
|
+ opdendrawer(row) {
|
|
|
+ this.drawer = true
|
|
|
+ this.activeRow = row
|
|
|
+ },
|
|
|
// 删除角色
|
|
|
deleteAuth(row) {
|
|
|
this.$confirm('此操作将永久删除该角色, 是否继续?', '提示', {
|
|
@@ -158,7 +128,6 @@ export default {
|
|
|
closeDialog() {
|
|
|
this.initForm()
|
|
|
this.dialogFormVisible = false
|
|
|
- this.menuDialogFlag = false
|
|
|
this.apiDialogFlag = false
|
|
|
},
|
|
|
// 确定弹窗
|
|
@@ -179,98 +148,23 @@ export default {
|
|
|
// 增加角色
|
|
|
addAuthority() {
|
|
|
this.dialogFormVisible = true
|
|
|
- },
|
|
|
-
|
|
|
- // 关联用户列表关系
|
|
|
- async addAuthMenu(row) {
|
|
|
- const res1 = await getMenuAuthority({ authorityId: row.authorityId })
|
|
|
- const menus = res1.data.menus
|
|
|
- const arr = []
|
|
|
- menus.map(item => {
|
|
|
- // 防止直接选中父级造成全选
|
|
|
- if (!menus.some(same => same.parentId === item.menuId)) {
|
|
|
- arr.push(Number(item.menuId))
|
|
|
- }
|
|
|
- })
|
|
|
- this.menuTreeIds = arr
|
|
|
- this.activeUserId = row.authorityId
|
|
|
- this.menuDialogFlag = true
|
|
|
- },
|
|
|
- // 关联树 确认方法
|
|
|
- async relation() {
|
|
|
- const checkArr = this.$refs.menuTree.getCheckedNodes(false, true)
|
|
|
- const res = await addMenuAuthority({
|
|
|
- menus: checkArr,
|
|
|
- authorityId: this.activeUserId
|
|
|
- })
|
|
|
- if (res.success) {
|
|
|
- this.$message({
|
|
|
- type: 'success',
|
|
|
- message: '添加成功!'
|
|
|
- })
|
|
|
- }
|
|
|
- this.closeDialog()
|
|
|
- },
|
|
|
- // 创建api树方法
|
|
|
- buildApiTree(apis) {
|
|
|
- const apiObj = new Object()
|
|
|
- apis &&
|
|
|
- apis.map(item => {
|
|
|
- if (apiObj.hasOwnProperty(item.group)) {
|
|
|
- apiObj[item.group].push(item)
|
|
|
- } else {
|
|
|
- Object.assign(apiObj, { [item.group]: [item] })
|
|
|
- }
|
|
|
- })
|
|
|
- const apiTree = []
|
|
|
- for (const key in apiObj) {
|
|
|
- const treeNode = {
|
|
|
- ID: key,
|
|
|
- description: key + '组',
|
|
|
- children: apiObj[key]
|
|
|
- }
|
|
|
- apiTree.push(treeNode)
|
|
|
- }
|
|
|
- return apiTree
|
|
|
- },
|
|
|
- // 关联用户api关系
|
|
|
- async addAuthApi(row) {
|
|
|
- const res = await getPolicyPathByAuthorityId({
|
|
|
- authorityId: row.authorityId
|
|
|
- })
|
|
|
- this.activeUserId = row.authorityId
|
|
|
- this.apiTreeIds = res.data.paths || []
|
|
|
- this.apiDialogFlag = true
|
|
|
- },
|
|
|
- // 关联关系确定
|
|
|
- async authApiEnter() {
|
|
|
- const checkArr = this.$refs.apiTree.getCheckedKeys(true)
|
|
|
- const res = await casbinPUpdata({
|
|
|
- authorityId: this.activeUserId,
|
|
|
- paths: checkArr
|
|
|
- })
|
|
|
- if (res.success) {
|
|
|
- this.$message({ type: 'success', message: res.msg })
|
|
|
- this.closeDialog()
|
|
|
- }
|
|
|
}
|
|
|
- },
|
|
|
- async created() {
|
|
|
- // 获取所有菜单树
|
|
|
- const res = await getBaseMenuTree()
|
|
|
- this.menuTreeData = res.data.menus
|
|
|
- // 获取api并整理成树结构
|
|
|
- const res2 = await getAllApis()
|
|
|
- const apis = res2.data.apis
|
|
|
- this.apiTreeData = this.buildApiTree(apis)
|
|
|
}
|
|
|
}
|
|
|
</script>
|
|
|
-<style scoped lang="scss">
|
|
|
-.button-box {
|
|
|
- padding: 10px 20px;
|
|
|
- .el-button {
|
|
|
- float: right;
|
|
|
+<style lang="scss">
|
|
|
+.authority {
|
|
|
+ .button-box {
|
|
|
+ padding: 10px 20px;
|
|
|
+ .el-button {
|
|
|
+ float: right;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+.role-box {
|
|
|
+ .el-tabs__content {
|
|
|
+ height: calc(100vh - 150px);
|
|
|
+ overflow: auto;
|
|
|
+ }
|
|
|
+ }
|
|
|
</style>
|