From 2b1af497f5457a9eebdc97b85401f30d092c5812 Mon Sep 17 00:00:00 2001 From: dqjdda <201507802@qq.com> Date: Wed, 28 Aug 2019 21:29:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B8=A6=E5=85=B3=E8=81=94?= =?UTF-8?q?=E9=A1=B9=E7=9A=84=E5=88=A0=E9=99=A4=EF=BC=9A=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E3=80=81=E6=9D=83=E9=99=90=E3=80=81=E8=8F=9C=E5=8D=95=E3=80=81?= =?UTF-8?q?=E9=83=A8=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/zhengjie/utils/ThrowableUtil.java | 14 +++++++++++ .../repository/PermissionRepository.java | 4 ---- .../system/repository/RoleRepository.java | 10 +++++++- .../modules/system/rest/DeptController.java | 7 +++++- .../system/rest/PermissionController.java | 12 +++++++++- .../modules/system/rest/RoleController.java | 9 ++++++- .../system/service/PermissionService.java | 7 ++++-- .../modules/system/service/RoleService.java | 7 +++--- .../system/service/impl/MenuServiceImpl.java | 2 +- .../service/impl/PermissionServiceImpl.java | 24 +++++++++++++++---- .../system/service/impl/RoleServiceImpl.java | 20 +++++++--------- 11 files changed, 87 insertions(+), 29 deletions(-) diff --git a/eladmin-common/src/main/java/me/zhengjie/utils/ThrowableUtil.java b/eladmin-common/src/main/java/me/zhengjie/utils/ThrowableUtil.java index 3725a1a1..6faa8c61 100644 --- a/eladmin-common/src/main/java/me/zhengjie/utils/ThrowableUtil.java +++ b/eladmin-common/src/main/java/me/zhengjie/utils/ThrowableUtil.java @@ -1,5 +1,8 @@ package me.zhengjie.utils; +import me.zhengjie.exception.BadRequestException; +import org.hibernate.exception.ConstraintViolationException; + import java.io.PrintWriter; import java.io.StringWriter; @@ -25,4 +28,15 @@ public class ThrowableUtil { pw.close(); } } + + public static void throwForeignKeyException(Throwable e, String msg){ + Throwable t = e.getCause(); + while ((t != null) && !(t instanceof ConstraintViolationException)) { + t = t.getCause(); + } + if (t instanceof ConstraintViolationException) { + throw new BadRequestException(msg); + } + throw new BadRequestException("删除失败:" + t.getMessage()); + } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/PermissionRepository.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/PermissionRepository.java index 3d586fcd..f27e8653 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/PermissionRepository.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/PermissionRepository.java @@ -1,13 +1,9 @@ package me.zhengjie.modules.system.repository; import me.zhengjie.modules.system.domain.Permission; -import me.zhengjie.modules.system.domain.Role; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; - -import java.util.Collection; import java.util.List; -import java.util.Set; /** * @author Zheng Jie diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/RoleRepository.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/RoleRepository.java index 1cd840b7..1e2b15ae 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/RoleRepository.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/repository/RoleRepository.java @@ -3,6 +3,8 @@ package me.zhengjie.modules.system.repository; import me.zhengjie.modules.system.domain.Role; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import java.util.Set; @@ -21,5 +23,11 @@ public interface RoleRepository extends JpaRepository, JpaSpecificat Set findByUsers_Id(Long id); - Set findByMenus_Id(Long id); + @Modifying + @Query(value = "delete from roles_permissions where permission_id = ?1",nativeQuery = true) + void untiedPermission(Long id); + + @Modifying + @Query(value = "delete from roles_menus where menu_id = ?1",nativeQuery = true) + void untiedMenu(Long id); } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/DeptController.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/DeptController.java index 39d90436..b57946bf 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/DeptController.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/DeptController.java @@ -7,6 +7,7 @@ import me.zhengjie.modules.system.domain.Dept; import me.zhengjie.modules.system.service.DeptService; import me.zhengjie.modules.system.service.dto.DeptDTO; import me.zhengjie.modules.system.service.dto.DeptQueryCriteria; +import me.zhengjie.utils.ThrowableUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -63,7 +64,11 @@ public class DeptController { @DeleteMapping(value = "/dept/{id}") @PreAuthorize("hasAnyRole('ADMIN','DEPT_ALL','DEPT_DELETE')") public ResponseEntity delete(@PathVariable Long id){ - deptService.delete(id); + try { + deptService.delete(id); + }catch (Throwable e){ + ThrowableUtil.throwForeignKeyException(e, "该部门存在岗位或者角色关联,请取消关联后再试"); + } return new ResponseEntity(HttpStatus.OK); } } \ No newline at end of file diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/PermissionController.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/PermissionController.java index b27ea7c3..216c838a 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/PermissionController.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/PermissionController.java @@ -6,6 +6,7 @@ import me.zhengjie.exception.BadRequestException; import me.zhengjie.modules.system.service.PermissionService; import me.zhengjie.modules.system.service.dto.PermissionDTO; import me.zhengjie.modules.system.service.dto.PermissionQueryCriteria; +import me.zhengjie.modules.system.service.mapper.PermissionMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -13,7 +14,9 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * @author Zheng Jie @@ -26,6 +29,9 @@ public class PermissionController { @Autowired private PermissionService permissionService; + @Autowired + private PermissionMapper permissionMapper; + private static final String ENTITY_NAME = "permission"; /** @@ -68,7 +74,11 @@ public class PermissionController { @DeleteMapping(value = "/permissions/{id}") @PreAuthorize("hasAnyRole('ADMIN','PERMISSION_ALL','PERMISSION_DELETE')") public ResponseEntity delete(@PathVariable Long id){ - permissionService.delete(id); + List permissions = permissionService.findByPid(id); + Set permissionSet = new HashSet<>(); + permissionSet.add(permissionMapper.toEntity(permissionService.findById(id))); + permissionSet = permissionService.getDeletePermission(permissions, permissionSet); + permissionService.delete(permissionSet); return new ResponseEntity(HttpStatus.OK); } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/RoleController.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/RoleController.java index 66ef07db..340aa63c 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/RoleController.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/rest/RoleController.java @@ -8,6 +8,8 @@ import me.zhengjie.modules.system.service.RoleService; import me.zhengjie.modules.system.service.dto.RoleQueryCriteria; import me.zhengjie.modules.system.service.dto.RoleSmallDTO; import me.zhengjie.utils.SecurityUtils; +import me.zhengjie.utils.ThrowableUtil; +import org.hibernate.exception.ConstraintViolationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -15,6 +17,7 @@ import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.TransactionSystemException; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.Collections; @@ -106,7 +109,11 @@ public class RoleController { @DeleteMapping(value = "/roles/{id}") @PreAuthorize("hasAnyRole('ADMIN','ROLES_ALL','ROLES_DELETE')") public ResponseEntity delete(@PathVariable Long id){ - roleService.delete(id); + try { + roleService.delete(id); + }catch (Throwable e){ + ThrowableUtil.throwForeignKeyException(e, "该角色存在用户关联,请取消关联后再试"); + } return new ResponseEntity(HttpStatus.OK); } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/PermissionService.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/PermissionService.java index eb424e5c..7873c11a 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/PermissionService.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/PermissionService.java @@ -8,6 +8,7 @@ import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import java.util.List; +import java.util.Set; /** * @author Zheng Jie @@ -41,10 +42,10 @@ public interface PermissionService { /** * delete - * @param id + * @param permissions */ @CacheEvict(allEntries = true) - void delete(Long id); + void delete(Set permissions); /** * permission tree @@ -76,4 +77,6 @@ public interface PermissionService { */ @Cacheable(keyGenerator = "keyGenerator") List queryAll(PermissionQueryCriteria criteria); + + Set getDeletePermission(List permissions, Set permissionSet); } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/RoleService.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/RoleService.java index d49870ef..d147417d 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/RoleService.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/RoleService.java @@ -1,6 +1,5 @@ package me.zhengjie.modules.system.service; -import me.zhengjie.modules.system.domain.Menu; import me.zhengjie.modules.system.domain.Role; import me.zhengjie.modules.system.service.dto.RoleDTO; import me.zhengjie.modules.system.service.dto.RoleQueryCriteria; @@ -10,7 +9,6 @@ import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Pageable; -import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Set; @@ -80,7 +78,7 @@ public interface RoleService { void updateMenu(Role resources, RoleDTO roleDTO); @CacheEvict(allEntries = true) - void untiedMenu(Menu menu); + void untiedMenu(Long id); /** * queryAll @@ -106,4 +104,7 @@ public interface RoleService { */ @Cacheable(keyGenerator = "keyGenerator") List queryAll(RoleQueryCriteria criteria); + + @CacheEvict(allEntries = true) + void untiedPermission(Long id); } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java index 01f28eac..8c2dce67 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/MenuServiceImpl.java @@ -134,7 +134,7 @@ public class MenuServiceImpl implements MenuService { @Transactional(rollbackFor = Exception.class) public void delete(Set menuSet) { for (Menu menu : menuSet) { - roleService.untiedMenu(menu); + roleService.untiedMenu(menu.getId()); menuRepository.deleteById(menu.getId()); } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/PermissionServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/PermissionServiceImpl.java index ea521a79..e8c48c76 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/PermissionServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/PermissionServiceImpl.java @@ -5,6 +5,7 @@ import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.EntityExistException; import me.zhengjie.modules.system.repository.PermissionRepository; import me.zhengjie.modules.system.service.PermissionService; +import me.zhengjie.modules.system.service.RoleService; import me.zhengjie.modules.system.service.dto.PermissionDTO; import me.zhengjie.modules.system.service.dto.PermissionQueryCriteria; import me.zhengjie.modules.system.service.mapper.PermissionMapper; @@ -30,6 +31,9 @@ public class PermissionServiceImpl implements PermissionService { @Autowired private PermissionMapper permissionMapper; + @Autowired + private RoleService roleService; + @Override public List queryAll(PermissionQueryCriteria criteria) { return permissionMapper.toDto(permissionRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder))); @@ -74,14 +78,26 @@ public class PermissionServiceImpl implements PermissionService { permissionRepository.save(permission); } + @Override + public Set getDeletePermission(List permissions, Set permissionSet) { + // 递归找出待删除的菜单 + for (Permission permission : permissions) { + permissionSet.add(permission); + List permissionList = permissionRepository.findByPid(permission.getId()); + if(permissionList!=null && permissionList.size()!=0){ + getDeletePermission(permissionList, permissionSet); + } + } + return permissionSet; + } + @Override @Transactional(rollbackFor = Exception.class) - public void delete(Long id) { - List permissionList = permissionRepository.findByPid(id); - for (Permission permission : permissionList) { + public void delete(Set permissions) { + for (Permission permission : permissions) { + roleService.untiedPermission(permission.getId()); permissionRepository.delete(permission); } - permissionRepository.deleteById(id); } @Override diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java index fdae7833..bc33f266 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java @@ -1,6 +1,5 @@ package me.zhengjie.modules.system.service.impl; -import me.zhengjie.modules.system.domain.Menu; import me.zhengjie.modules.system.domain.Role; import me.zhengjie.exception.EntityExistException; import me.zhengjie.modules.system.repository.RoleRepository; @@ -10,7 +9,6 @@ import me.zhengjie.modules.system.service.dto.RoleQueryCriteria; import me.zhengjie.modules.system.service.dto.RoleSmallDTO; import me.zhengjie.modules.system.service.mapper.RoleMapper; import me.zhengjie.modules.system.service.mapper.RoleSmallMapper; -import me.zhengjie.utils.FileUtil; import me.zhengjie.utils.PageUtil; import me.zhengjie.utils.QueryHelp; import me.zhengjie.utils.ValidationUtil; @@ -20,8 +18,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; - -import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.stream.Collectors; @@ -112,13 +108,15 @@ public class RoleServiceImpl implements RoleService { } @Override - public void untiedMenu(Menu menu) { - Set roles = roleRepository.findByMenus_Id(menu.getId()); - for (Role role : roles) { - menu.getRoles().remove(role); - role.getMenus().remove(menu); - roleRepository.save(role); - } + @Transactional(rollbackFor = Exception.class) + public void untiedMenu(Long id) { + roleRepository.untiedMenu(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void untiedPermission(Long id) { + roleRepository.untiedPermission(id); } @Override