李磊
3 years ago
5 changed files with 280 additions and 24 deletions
@ -0,0 +1,9 @@ |
|||||
|
import api from '@/utils/api' |
||||
|
|
||||
|
export function getAll(params) { |
||||
|
return api({ |
||||
|
url: '/dataScopeDepartment/all', |
||||
|
method: 'get', |
||||
|
params |
||||
|
}) |
||||
|
} |
@ -0,0 +1,247 @@ |
|||||
|
<template> |
||||
|
<el-drawer title="数据权限" :visible="show" size="90%" :destroy-on-close="true" @close="close"> |
||||
|
<el-form ref="permission" :model="permission" label-width="100px"> |
||||
|
<el-form-item label="角色名称"> |
||||
|
{{ permission.roleName }} |
||||
|
</el-form-item> |
||||
|
<el-form-item label="角色代码"> |
||||
|
{{ permission.roleCode }} |
||||
|
</el-form-item> |
||||
|
<el-form-item label="权限范围"> |
||||
|
<el-select v-model="permission.dataScope"> |
||||
|
<el-option v-for="(item, index) in dataScopes" :key="index" :label="item" :value="index" /> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item v-if="permission.dataScope === 1" label="数据权限"> |
||||
|
<el-table |
||||
|
ref="departments" |
||||
|
:data="departments" |
||||
|
border |
||||
|
fit |
||||
|
height="650" |
||||
|
highlight-current-row |
||||
|
row-key="id" |
||||
|
:tree-props="{children: 'children', hasChildren: 'hasChildren'}" |
||||
|
style="width: 99%;" |
||||
|
> |
||||
|
<el-table-column label="部门名称"> |
||||
|
<template slot-scope="scope"> |
||||
|
<el-checkbox v-model="scope.row.checked" :indeterminate="scope.row.indeterminate" @change="handleCheckAllChange(scope.row, $event)"> |
||||
|
{{ scope.row.name }} |
||||
|
</el-checkbox> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<el-row :gutter="20"> |
||||
|
<el-col :span="4" :offset="2"> |
||||
|
<el-select v-if="permission.dataScope === 1" v-model="showMode" @change="changeShowMode"> |
||||
|
<el-option |
||||
|
v-for="(item, index) in showModes" |
||||
|
:key="index" |
||||
|
:label="item" |
||||
|
:value="index" |
||||
|
/> |
||||
|
</el-select> |
||||
|
</el-col> |
||||
|
<el-col :span="4" :offset="14"> |
||||
|
<el-button type="primary" @click="update"> |
||||
|
确 认 |
||||
|
</el-button> |
||||
|
<el-button @click="close"> |
||||
|
取 消 |
||||
|
</el-button> |
||||
|
</el-col> |
||||
|
</el-row> |
||||
|
</el-drawer> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import CrudRole from '@/api/role' |
||||
|
import { getAll } from '@/api/data_scope_department' |
||||
|
|
||||
|
export default { |
||||
|
name: 'DataPermission', |
||||
|
data() { |
||||
|
return { |
||||
|
show: false, |
||||
|
permission: {}, |
||||
|
dataScopes: ['全部数据权限', '自定义数据权限', '本部门数据权限', '本部门及下级数据权限', '仅本人数据权限'], |
||||
|
departments: [], |
||||
|
showMode: 0, |
||||
|
showModes: ['合并所有', '展开所有', '全部勾选', '取消勾选'], |
||||
|
checkedIds: new Set() |
||||
|
} |
||||
|
}, |
||||
|
mounted() { |
||||
|
const that = this |
||||
|
this.common.$on('openDataPermission', function(data) { |
||||
|
that.open(data) |
||||
|
}) |
||||
|
}, |
||||
|
created() { |
||||
|
const that = this |
||||
|
this.common.$on('openDataPermission', function(data) { |
||||
|
that.open(data) |
||||
|
}) |
||||
|
this.getDepartmentList() |
||||
|
}, |
||||
|
methods: { |
||||
|
open(data) { |
||||
|
this.permission = data |
||||
|
this.getAllDataScopeDepartment() |
||||
|
this.show = true |
||||
|
}, |
||||
|
close() { |
||||
|
this.show = false |
||||
|
}, |
||||
|
getAllDataScopeDepartment() { |
||||
|
getAll({ |
||||
|
roleId: this.permission.id |
||||
|
}).then(data => { |
||||
|
data = data.map(row => row.departmentId) |
||||
|
this.departments.forEach(permission => { |
||||
|
if (permission.children.length > 0) { |
||||
|
this.echoChildren(permission.children, data) |
||||
|
} else { |
||||
|
this.settingChecked(permission, data) |
||||
|
} |
||||
|
}) |
||||
|
}) |
||||
|
}, |
||||
|
getDepartmentList() { |
||||
|
// 查询列表 |
||||
|
this.api({ |
||||
|
url: '/department/tree', |
||||
|
method: 'get' |
||||
|
}).then(data => { |
||||
|
this.departments = data |
||||
|
}) |
||||
|
}, |
||||
|
/** |
||||
|
* 改变展示方式 |
||||
|
*/ |
||||
|
changeShowMode(val) { |
||||
|
switch (val) { |
||||
|
case 0: |
||||
|
this.departments.forEach(row => this.$refs.departments.toggleRowExpansion(row, false)) |
||||
|
break |
||||
|
case 1: |
||||
|
this.departments.forEach(row => this.$refs.departments.toggleRowExpansion(row, true)) |
||||
|
break |
||||
|
case 2: |
||||
|
this.departments.forEach(row => { |
||||
|
row.checked = true |
||||
|
row.indeterminate = false |
||||
|
this.handleCheckAllChange(row, true) |
||||
|
}) |
||||
|
break |
||||
|
case 3: |
||||
|
this.departments.forEach(row => { |
||||
|
row.checked = false |
||||
|
row.indeterminate = false |
||||
|
this.handleCheckAllChange(row, false) |
||||
|
}) |
||||
|
break |
||||
|
default: |
||||
|
break |
||||
|
} |
||||
|
}, |
||||
|
update() { |
||||
|
console.log(this.checkedIds) |
||||
|
console.log(Array.from(this.checkedIds)) |
||||
|
this.permission.dataScopeDepartmentIds = Array.from(this.checkedIds) |
||||
|
console.log(this.permission) |
||||
|
CrudRole.edit(this.permission).then(() => this.$notify.success('操作成功')) |
||||
|
}, |
||||
|
handleCheckAllChange(val, checked) { |
||||
|
if (checked) { |
||||
|
this.checkedIds.add(val.id) |
||||
|
} else { |
||||
|
this.checkedIds.delete(val.id) |
||||
|
} |
||||
|
// 有下级去处理下级 |
||||
|
if (val.children.length > 0) { |
||||
|
this.findChildren(val.children, checked) |
||||
|
} |
||||
|
// 处理上级 |
||||
|
if (val.parentId !== 0) { |
||||
|
this.findParent(this.departments, val.parentId) |
||||
|
} |
||||
|
val.indeterminate = false |
||||
|
}, |
||||
|
findChildren(list, checked) { |
||||
|
list.forEach(children => { |
||||
|
children.checked = checked |
||||
|
children.indeterminate = false |
||||
|
if (children.children.length > 0) { |
||||
|
this.findChildren(children.children, checked) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
findParent(list, parentId) { |
||||
|
list.forEach(result => { |
||||
|
let parentCheckedLength = 0 |
||||
|
let parentIndeterminateLength = 0 |
||||
|
// 对当前层级的上级操作 |
||||
|
if (result.id === parentId) { |
||||
|
// 判断下级的状态,用来为父级的状态做判断 |
||||
|
result.children.forEach(children => { |
||||
|
if (children.indeterminate) { |
||||
|
parentIndeterminateLength++ |
||||
|
} else if (children.checked) { |
||||
|
parentCheckedLength++ |
||||
|
} |
||||
|
}) |
||||
|
result.checked = parentCheckedLength === result.children.length |
||||
|
result.indeterminate = (parentIndeterminateLength > 0 || parentCheckedLength > 0) && parentCheckedLength < result.children.length |
||||
|
|
||||
|
if (result.checked) { |
||||
|
this.checkedIds.add(result.id) |
||||
|
} else { |
||||
|
this.checkedIds.delete(result.id) |
||||
|
} |
||||
|
// 如果还有上级,继续操作 |
||||
|
if (result.parentId !== 0) { |
||||
|
this.findParent(this.departments, result.parentId) |
||||
|
} |
||||
|
} else if (result.children.length > 0) { |
||||
|
this.findParent(result.children, parentId) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
echoChildren(list, optionsIds) { |
||||
|
list.forEach(result => { |
||||
|
if (result.children.length === 0) { |
||||
|
this.settingChecked(result, optionsIds) |
||||
|
} else { |
||||
|
this.echoChildren(result.children, optionsIds) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
settingChecked(result, optionsIds) { |
||||
|
let matching = false |
||||
|
optionsIds.forEach(optionsId => { |
||||
|
if (result.id === optionsId) { |
||||
|
result.checked = true |
||||
|
matching = true |
||||
|
} |
||||
|
}) |
||||
|
if (matching) { |
||||
|
this.handleCheckChange(result) |
||||
|
} |
||||
|
}, |
||||
|
handleCheckChange(val) { |
||||
|
// 处理上级 |
||||
|
if (val.parentId !== 0) { |
||||
|
this.findParent(this.departments, val.parentId) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
|
||||
|
</style> |
Loading…
Reference in new issue