From 419a883020bfeacbe18ea2d34791ce25ae6c6e45 Mon Sep 17 00:00:00 2001 From: FatttSnake Date: Wed, 15 Nov 2023 14:53:49 +0800 Subject: [PATCH] Optimize permission structure --- .../permission/impl/RoleServiceImpl.kt | 54 +++++++++++++------ .../resources/db/migration/R__Basic_data.sql | 16 +++--- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/main/kotlin/top/fatweb/api/service/permission/impl/RoleServiceImpl.kt b/src/main/kotlin/top/fatweb/api/service/permission/impl/RoleServiceImpl.kt index 81c40af..697433c 100644 --- a/src/main/kotlin/top/fatweb/api/service/permission/impl/RoleServiceImpl.kt +++ b/src/main/kotlin/top/fatweb/api/service/permission/impl/RoleServiceImpl.kt @@ -10,6 +10,8 @@ import top.fatweb.api.entity.permission.PowerRole import top.fatweb.api.entity.permission.Role import top.fatweb.api.mapper.permission.RoleMapper import top.fatweb.api.param.authentication.* +import top.fatweb.api.service.permission.IElementService +import top.fatweb.api.service.permission.IMenuService import top.fatweb.api.service.permission.IPowerRoleService import top.fatweb.api.service.permission.IRoleService import top.fatweb.api.util.PageUtil @@ -27,7 +29,9 @@ import top.fatweb.api.vo.permission.RoleWithPowerVo */ @Service class RoleServiceImpl( - private val powerRoleService: IPowerRoleService + private val powerRoleService: IPowerRoleService, + private val elementService: IElementService, + private val menuService: IMenuService ) : ServiceImpl(), IRoleService { override fun getPage(roleGetParam: RoleGetParam?): PageVo { val roleIdsPage = Page(roleGetParam?.currentPage ?: 1, roleGetParam?.pageSize ?: 20) @@ -53,16 +57,11 @@ class RoleServiceImpl( @Transactional override fun add(roleAddParam: RoleAddParam): RoleVo? { - val fullPowerIds: HashSet = hashSetOf() - roleAddParam.powerIds?.forEach { - fullPowerIds.add(it) - fullPowerIds.add(it / 100 * 100) - fullPowerIds.add(it / 10000 * 10000) - fullPowerIds.add(it / 1000000 * 1000000) - } + val fullPowerIds = roleAddParam.powerIds?.let { getFullPowerIds(it) } + val role = RoleConverter.roleAddParamToRole(roleAddParam) if (baseMapper.insert(role) == 1) { - if (fullPowerIds.isEmpty()) { + if (fullPowerIds.isNullOrEmpty()) { return RoleConverter.roleToRoleVo(role) } @@ -81,18 +80,13 @@ class RoleServiceImpl( @Transactional override fun update(roleUpdateParam: RoleUpdateParam): RoleVo? { - val fullPowerIds: HashSet = hashSetOf() - roleUpdateParam.powerIds?.forEach { - fullPowerIds.add(it) - fullPowerIds.add(it / 100 * 100) - fullPowerIds.add(it / 10000 * 10000) - fullPowerIds.add(it / 1000000 * 1000000) - } + val fullPowerIds = roleUpdateParam.powerIds?.let { getFullPowerIds(it) } + val role = RoleConverter.roleUpdateParamToRole(roleUpdateParam) val oldPowerList = baseMapper.getPowerList(roleUpdateParam.id) val addPowerIds = HashSet() val removePowerIds = HashSet() - fullPowerIds.forEach { addPowerIds.add(it) } + fullPowerIds?.forEach { addPowerIds.add(it) } oldPowerList.forEach { if (it != null) { removePowerIds.add(it) @@ -135,4 +129,30 @@ class RoleServiceImpl( baseMapper.deleteBatchIds(roleDeleteParam.ids) powerRoleService.remove(KtQueryWrapper(PowerRole()).`in`(PowerRole::roleId, roleDeleteParam.ids)) } + + private fun getFullPowerIds(powerIds: List): Set { + val fullPowerIds: HashSet = hashSetOf() + powerIds.forEach { + fullPowerIds.add(it) + getElementParent(it / 100 * 100, fullPowerIds) + getMenuParent(it / 10000 * 10000, fullPowerIds) + fullPowerIds.add(it / 1000000 * 1000000) + } + + return fullPowerIds + } + + private fun getElementParent(id: Long, parentIds: HashSet) { + parentIds.add(id) + elementService.getById(id)?.parentId?.let { + getElementParent(it, parentIds) + } + } + + private fun getMenuParent(id: Long, parentIds: HashSet) { + parentIds.add(id) + menuService.getById(id)?.parentId?.let { + getMenuParent(it, parentIds) + } + } } diff --git a/src/main/resources/db/migration/R__Basic_data.sql b/src/main/resources/db/migration/R__Basic_data.sql index a7e5fe9..f6acb51 100644 --- a/src/main/resources/db/migration/R__Basic_data.sql +++ b/src/main/resources/db/migration/R__Basic_data.sql @@ -52,16 +52,16 @@ on duplicate key update name =new_value.name, insert into t_element(id, name, menu_id, parent_id) values (1010100, '查询', 1010000, null), - (1010200, '增加', 1010000, 1010100), - (1010300, '修改', 1010000, 1010100), + (1010200, '增加', 1010000, null), + (1010300, '修改', 1010000, null), (1020100, '查询', 1020000, null), - (1020200, '增加', 1020000, 1020100), - (1020300, '修改', 1020000, 1020100), - (1020400, '删除', 1020000, 1020100), + (1020200, '增加', 1020000, null), + (1020300, '修改', 1020000, null), + (1020400, '删除', 1020000, null), (1030100, '查询', 1030000, null), - (1030200, '增加', 1030000, 1030100), - (1030300, '修改', 1030000, 1030100), - (1030400, '删除', 1030000, 1030100) as new_value + (1030200, '增加', 1030000, null), + (1030300, '修改', 1030000, null), + (1030400, '删除', 1030000, null) as new_value on duplicate key update name = new_value.name, menu_id = new_value.menu_id, parent_id = new_value.parent_id;