Commit 7a2fbae8 authored by ZhengJie's avatar ZhengJie
Browse files

[代码完善](v2.5): v2.5 beta 角色、部门、岗位删除优化

更新详情:https://www.ydyno.com/archives/1225.html
parent 9de236d6
...@@ -15,8 +15,6 @@ ...@@ -15,8 +15,6 @@
*/ */
package me.zhengjie.utils; package me.zhengjie.utils;
import me.zhengjie.exception.BadRequestException;
import org.hibernate.exception.ConstraintViolationException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
...@@ -36,16 +34,4 @@ public class ThrowableUtil { ...@@ -36,16 +34,4 @@ public class ThrowableUtil {
return sw.toString(); return sw.toString();
} }
} }
public static void throwForeignKeyException(Throwable e, String msg){
Throwable t = e.getCause();
while ((t != null) && !(t instanceof ConstraintViolationException)) {
t = t.getCause();
}
if (t != null) {
throw new BadRequestException(msg);
}
assert false;
throw new BadRequestException("删除失败");
}
} }
...@@ -57,4 +57,13 @@ public interface RoleRepository extends JpaRepository<Role, Long>, JpaSpecificat ...@@ -57,4 +57,13 @@ public interface RoleRepository extends JpaRepository<Role, Long>, JpaSpecificat
@Modifying @Modifying
@Query(value = "delete from sys_roles_menus where menu_id = ?1",nativeQuery = true) @Query(value = "delete from sys_roles_menus where menu_id = ?1",nativeQuery = true)
void untiedMenu(Long id); void untiedMenu(Long id);
/**
* 根据部门查询
* @param deptIds /
* @return /
*/
@Query(value = "select count(1) from sys_role r, sys_roles_depts d where " +
"r.role_id = d.role_id and d.dept_id in ?1",nativeQuery = true)
int countByDepts(Set<Long> deptIds);
} }
...@@ -95,4 +95,28 @@ public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificat ...@@ -95,4 +95,28 @@ public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificat
* @param ids / * @param ids /
*/ */
void deleteAllByIdIn(Set<Long> ids); void deleteAllByIdIn(Set<Long> ids);
/**
* 根据岗位查询
* @param ids /
* @return /
*/
@Query(value = "SELECT count(1) FROM sys_user u, sys_users_jobs j WHERE u.user_id = j.user_id AND j.job_id IN ?1", nativeQuery = true)
int countByJobs(Set<Long> ids);
/**
* 根据部门查询
* @param deptIds /
* @return /
*/
@Query(value = "SELECT count(1) FROM sys_user u WHERE u.dept_id IN ?1", nativeQuery = true)
int countByDepts(Set<Long> deptIds);
/**
* 根据角色查询
* @return /
*/
@Query(value = "SELECT count(1) FROM sys_user u, sys_users_roles r WHERE " +
"u.user_id = r.user_id AND r.role_id in ?1", nativeQuery = true)
int countByRoles(Set<Long> ids);
} }
...@@ -113,11 +113,9 @@ public class DeptController { ...@@ -113,11 +113,9 @@ public class DeptController {
deptDtos = deptService.getDeleteDepts(deptList, deptDtos); deptDtos = deptService.getDeleteDepts(deptList, deptDtos);
} }
} }
try { // 验证是否被角色或用户关联
deptService.delete(deptDtos); deptService.verification(deptDtos);
}catch (Throwable e){ deptService.delete(deptDtos);
ThrowableUtil.throwForeignKeyException(e, "所选部门中存在岗位或者角色关联,请取消关联后再试");
}
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
} }
\ No newline at end of file
...@@ -89,11 +89,9 @@ public class JobController { ...@@ -89,11 +89,9 @@ public class JobController {
@DeleteMapping @DeleteMapping
@PreAuthorize("@el.check('job:del')") @PreAuthorize("@el.check('job:del')")
public ResponseEntity<Object> delete(@RequestBody Set<Long> ids){ public ResponseEntity<Object> delete(@RequestBody Set<Long> ids){
try { // 验证是否被用户关联
jobService.delete(ids); jobService.verification(ids);
}catch (Throwable e){ jobService.delete(ids);
ThrowableUtil.throwForeignKeyException(e, "所选岗位存在用户关联,请取消关联后再试");
}
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
} }
\ No newline at end of file
...@@ -136,11 +136,9 @@ public class RoleController { ...@@ -136,11 +136,9 @@ public class RoleController {
RoleDto role = roleService.findById(id); RoleDto role = roleService.findById(id);
getLevels(role.getLevel()); getLevels(role.getLevel());
} }
try { // 验证是否被用户关联
roleService.delete(ids); roleService.verification(ids);
} catch (Throwable e){ roleService.delete(ids);
ThrowableUtil.throwForeignKeyException(e, "所选角色存在用户关联,请取消关联后再试");
}
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
......
...@@ -116,4 +116,10 @@ public interface DeptService { ...@@ -116,4 +116,10 @@ public interface DeptService {
* @return * @return
*/ */
List<Long> getDeptChildren(Long deptId, List<Dept> deptList); List<Long> getDeptChildren(Long deptId, List<Dept> deptList);
/**
* 验证是否被角色或用户关联
* @param deptDtos /
*/
void verification(Set<DeptDto> deptDtos);
} }
\ No newline at end of file
...@@ -79,4 +79,10 @@ public interface JobService { ...@@ -79,4 +79,10 @@ public interface JobService {
* @throws IOException / * @throws IOException /
*/ */
void download(List<JobDto> queryAll, HttpServletResponse response) throws IOException; void download(List<JobDto> queryAll, HttpServletResponse response) throws IOException;
/**
* 验证是否被用户关联
* @param ids /
*/
void verification(Set<Long> ids);
} }
\ No newline at end of file
...@@ -120,4 +120,10 @@ public interface RoleService { ...@@ -120,4 +120,10 @@ public interface RoleService {
* @return 权限信息 * @return 权限信息
*/ */
List<GrantedAuthority> mapToGrantedAuthorities(UserDto user); List<GrantedAuthority> mapToGrantedAuthorities(UserDto user);
/**
* 验证是否被用户关联
* @param ids /
*/
void verification(Set<Long> ids);
} }
...@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor; ...@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.system.domain.Dept; import me.zhengjie.modules.system.domain.Dept;
import me.zhengjie.modules.system.domain.User; import me.zhengjie.modules.system.domain.User;
import me.zhengjie.modules.system.repository.RoleRepository;
import me.zhengjie.modules.system.repository.UserRepository; import me.zhengjie.modules.system.repository.UserRepository;
import me.zhengjie.modules.system.service.dto.DeptDto; import me.zhengjie.modules.system.service.dto.DeptDto;
import me.zhengjie.modules.system.service.dto.DeptQueryCriteria; import me.zhengjie.modules.system.service.dto.DeptQueryCriteria;
...@@ -57,6 +58,7 @@ public class DeptServiceImpl implements DeptService { ...@@ -57,6 +58,7 @@ public class DeptServiceImpl implements DeptService {
private final DeptMapper deptMapper; private final DeptMapper deptMapper;
private final UserRepository userRepository; private final UserRepository userRepository;
private final RedisUtils redisUtils; private final RedisUtils redisUtils;
private final RoleRepository roleRepository;
@Override @Override
public List<DeptDto> queryAll(DeptQueryCriteria criteria, Boolean isQuery) throws Exception { public List<DeptDto> queryAll(DeptQueryCriteria criteria, Boolean isQuery) throws Exception {
...@@ -240,6 +242,17 @@ public class DeptServiceImpl implements DeptService { ...@@ -240,6 +242,17 @@ public class DeptServiceImpl implements DeptService {
deptRepository.updateSubCntById(count, deptId); deptRepository.updateSubCntById(count, deptId);
} }
@Override
public void verification(Set<DeptDto> deptDtos) {
Set<Long> deptIds = deptDtos.stream().map(DeptDto::getId).collect(Collectors.toSet());
if(userRepository.countByDepts(deptIds) > 0){
throw new BadRequestException("所选部门存在用户关联,请解除后再试!");
}
if(roleRepository.countByDepts(deptIds) > 0){
throw new BadRequestException("所选部门存在角色关联,请解除后再试!");
}
}
/** /**
* 清理缓存 * 清理缓存
* @param id / * @param id /
......
...@@ -16,8 +16,10 @@ ...@@ -16,8 +16,10 @@
package me.zhengjie.modules.system.service.impl; package me.zhengjie.modules.system.service.impl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.exception.EntityExistException; import me.zhengjie.exception.EntityExistException;
import me.zhengjie.modules.system.domain.Job; import me.zhengjie.modules.system.domain.Job;
import me.zhengjie.modules.system.repository.UserRepository;
import me.zhengjie.modules.system.service.dto.JobQueryCriteria; import me.zhengjie.modules.system.service.dto.JobQueryCriteria;
import me.zhengjie.utils.*; import me.zhengjie.utils.*;
import me.zhengjie.modules.system.repository.JobRepository; import me.zhengjie.modules.system.repository.JobRepository;
...@@ -49,6 +51,7 @@ public class JobServiceImpl implements JobService { ...@@ -49,6 +51,7 @@ public class JobServiceImpl implements JobService {
private final JobRepository jobRepository; private final JobRepository jobRepository;
private final JobMapper jobMapper; private final JobMapper jobMapper;
private final RedisUtils redisUtils; private final RedisUtils redisUtils;
private final UserRepository userRepository;
@Override @Override
public Map<String,Object> queryAll(JobQueryCriteria criteria, Pageable pageable) { public Map<String,Object> queryAll(JobQueryCriteria criteria, Pageable pageable) {
...@@ -114,4 +117,11 @@ public class JobServiceImpl implements JobService { ...@@ -114,4 +117,11 @@ public class JobServiceImpl implements JobService {
} }
FileUtil.downloadExcel(list, response); FileUtil.downloadExcel(list, response);
} }
@Override
public void verification(Set<Long> ids) {
if(userRepository.countByJobs(ids) > 0){
throw new BadRequestException("所选的岗位中存在用户关联,请解除关联再试!");
}
}
} }
\ No newline at end of file
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package me.zhengjie.modules.system.service.impl; package me.zhengjie.modules.system.service.impl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.system.domain.Menu; import me.zhengjie.modules.system.domain.Menu;
import me.zhengjie.modules.system.domain.Role; import me.zhengjie.modules.system.domain.Role;
import me.zhengjie.exception.EntityExistException; import me.zhengjie.exception.EntityExistException;
...@@ -202,4 +203,11 @@ public class RoleServiceImpl implements RoleService { ...@@ -202,4 +203,11 @@ public class RoleServiceImpl implements RoleService {
redisUtils.delByKeys("menu::user:",userIds); redisUtils.delByKeys("menu::user:",userIds);
redisUtils.delByKeys("role::auth:",userIds); redisUtils.delByKeys("role::auth:",userIds);
} }
@Override
public void verification(Set<Long> ids) {
if(userRepository.countByRoles(ids) > 0){
throw new BadRequestException("所选角色存在用户关联,请解除关联再试!");
}
}
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment