<template>
<div class="container" v-loading="loading">
<div class="group">
<div class="label">
<label>{{ title }}</label>
</div>
<div class="details">
<div class="permissions-box" v-for="(permission, moduleName) in allPermissions" :key="moduleName">
<el-checkbox-group v-model="permissionModuleNames">
<div class="module-box">
<el-checkbox
@change="moduleCheck($event, permission, moduleName)"
class="module"
:label="moduleName"
:indeterminate="halfPermissions.includes(moduleName)"
></el-checkbox>
</div>
</el-checkbox-group>
<el-checkbox-group v-model="checkedPermissionNames">
<ul class="permissions-ul">
<li class="permissions-li" v-for="(item, key) in permission" :key="key">
<el-checkbox
:label="item.name"
:value="permissionModuleIds.indexOf(item.id) > -1"
@change="singleCheck(item.id, permission, moduleName)"
></el-checkbox>
</li>
</ul>
</el-checkbox-group>
</div>
</div>
</div>
</div>
</template>
<script>
import { onMounted, ref } from 'vue'
import AdminModel from '@/lin/model/admin'
export default {
props: ['id', 'title'],
setup(props, ctx) {
const loading = ref(false)
const allPermissions = ref({})
const halfPermissions = ref([]) // 该分类下的权限没有全选中
const permissionModuleIds = ref([]) // 权限组 集合 id
const permissionModuleNames = ref([]) // 权限组 module name
const checkedPermissionNames = ref([])
/**
* 初始化权限
* 通过判断有没有传入id,来判断当前页面是添加分组还是编辑分组
*/
const getGroupPermissions = async () => {
allPermissions.value = await AdminModel.getAllPermissions()
// 编辑分组权限
if (props.id) {
const res = await AdminModel.getOneGroup(props.id)
let temp = []
const cache = {}
res.permissions.forEach(v => {
permissionModuleIds.value.push(v.id)
checkedPermissionNames.value.push(v.name)
temp.push(v.module)
// 每个module拥有权限个数
if (!cache[v.module]) {
cache[v.module] = 1
} else {
cache[v.module]++
}
})
// 去重
temp = Array.from(new Set(temp))
// 半选
temp.forEach(item => {
if (allPermissions.value[item].length !== cache[item]) {
halfPermissions.value.push(item)
}
})
permissionModuleNames.value = Array.from(new Set(temp))
}
ctx.emit('getCacheAuthIds', permissionModuleIds.value.slice())
ctx.emit('updatePermissions', permissionModuleIds.value)
ctx.emit('updateAllPermissions', allPermissions.value)
}
onMounted(async () => {
try {
loading.value = true
await getGroupPermissions()
loading.value = false
} catch (e) {
loading.value = false
console.error(e)
}
})
/**
* 权限批量选中(一个module)
*/
const moduleCheck = (checked, ids, moduleName) => {
const _ids = ids.map(item => item.id)
const checkedNames = ids.map(item => item.name)
if (checked) {
permissionModuleIds.value = Array.from(new Set(permissionModuleIds.value.concat(_ids)))
checkedPermissionNames.value = Array.from(new Set(checkedPermissionNames.value.concat(checkedNames)))
if (!permissionModuleNames.value.includes(moduleName)) {
permissionModuleNames.value.push(moduleName)
}
} else {
permissionModuleIds.value = permissionModuleIds.value.filter(v => !_ids.includes(v))
checkedPermissionNames.value = checkedPermissionNames.value.filter(v => !checkedNames.includes(v))
permissionModuleNames.value = permissionModuleNames.value.filter(v => v !== moduleName)
}
halfPermissions.value = halfPermissions.value.filter(v => v !== moduleName)
ctx.emit('updatePermissions', permissionModuleIds.value)
}
/**
* 单选某一权限
*/
const singleCheck = (id, permission, moduleName) => {
const _ids = permission.map(item => item.id)
let count = 0
const index = permissionModuleIds.value.indexOf(id)
if (index === -1) {
permissionModuleIds.value.push(id)
} else {
permissionModuleIds.value.splice(index, 1)
}
_ids.forEach(item => {
if (permissionModuleIds.value.indexOf(item) > -1) {
count++
}
// 全选状态
if (_ids.length === count) {
permissionModuleNames.value.push(moduleName)
halfPermissions.value = halfPermissions.value.filter(v => v !== moduleName)
} else if (count === 0) {
// 未选中状态
permissionModuleNames.value = permissionModuleNames.value.filter(v => v !== moduleName)
halfPermissions.value = halfPermissions.value.filter(v => v !== moduleName)
} else {
// 半选状态
permissionModuleNames.value = permissionModuleNames.value.filter(v => v !== moduleName)
if (!halfPermissions.value.includes(moduleName)) {
halfPermissions.value.push(moduleName)
}
}
})
ctx.emit('updatePermissions', permissionModuleIds.value)
}
return {
loading,
moduleCheck,
singleCheck,
allPermissions,
halfPermissions,
getGroupPermissions,
permissionModuleIds,
permissionModuleNames,
checkedPermissionNames,
}
},
}
</script>
<style lang="scss" scoped>
.group {
margin-left: -95px;
.label {
margin-bottom: 10px;
width: 70px;
margin-left: 20px;
float: left;
font-weight: 500;
label {
color: #333333;
font-size: 14px;
font-weight: 500;
height: 20px;
line-height: 20px;
}
.necessary {
color: #e46a76;
font-size: 14px;
font-weight: 500px;
margin-right: 5px;
font-size: 16px;
}
}
.details {
display: inline-block;
width: calc(100% - 95px);
margin-top: 5px;
margin-left: 5px;
.text-input {
height: 40px;
width: 780px;
background: rgba(255, 255, 255, 1);
border-radius: 2px;
border: 1px solid #dee2e6;
text-indent: 20px;
&::placeholder {
font-size: 14px;
font-weight: 400;
color: #c4c9d2;
text-indent: 20px;
}
}
.permissions-box {
.module {
height: 20px;
font-size: 13px;
color: #45526b;
line-height: 20px;
margin-bottom: 10px;
}
.permissions-ul {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
padding: 20px 20px 0;
background: #f5f5f6;
margin-bottom: 20px;
.permissions-li {
width: 150px;
height: 20px;
line-height: 20px;
margin-bottom: 20px;
display: flex;
flex-direction: row;
justify-content: flex-start;
vertical-align: text-top;
margin-right: 10px;
.check {
transform: translateY(2px);
margin-right: 5px;
}
.permissions-name {
height: 20px;
font-size: 14px;
font-weight: 400;
color: #596c8e;
line-height: 20px;
margin-right: 20px;
}
}
}
}
}
}
</style>