|
|
@@ -1,9 +1,12 @@
|
|
|
package cn.reghao.autodop.dmaster.auth.service;
|
|
|
|
|
|
+import cn.reghao.autodop.common.result.Result;
|
|
|
+import cn.reghao.autodop.common.result.ResultStatus;
|
|
|
+import cn.reghao.autodop.dmaster.auth.db.query.MenuQuery;
|
|
|
import cn.reghao.autodop.dmaster.auth.entity.MenuType;
|
|
|
+import cn.reghao.autodop.dmaster.auth.entity.dto.MenuDTO;
|
|
|
import cn.reghao.autodop.dmaster.auth.entity.po.Menu;
|
|
|
import cn.reghao.autodop.dmaster.auth.entity.po.Role;
|
|
|
-import cn.reghao.autodop.dmaster.auth.entity.vo.MenuVO;
|
|
|
import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
|
|
|
import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -19,64 +22,68 @@ import java.util.stream.Collectors;
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
-public class ResourceService {
|
|
|
+public class MenuServiceImpl implements MenuService {
|
|
|
private final MenuRepository menuRepository;
|
|
|
- private RoleRepository roleRepository;
|
|
|
+ private final RoleRepository roleRepository;
|
|
|
+ private final MenuQuery menuQuery;
|
|
|
|
|
|
- public ResourceService(MenuRepository menuRepository, RoleRepository roleRepository) {
|
|
|
+ public MenuServiceImpl(MenuRepository menuRepository, RoleRepository roleRepository, MenuQuery menuQuery) {
|
|
|
this.menuRepository = menuRepository;
|
|
|
this.roleRepository = roleRepository;
|
|
|
+ this.menuQuery = menuQuery;
|
|
|
}
|
|
|
|
|
|
- public synchronized void addResource(Menu menu) {
|
|
|
- // menu 最多只能有两个 parent,即最多只能有三级菜单
|
|
|
- if (!checkMenu(menu.getPid())) {
|
|
|
- return;
|
|
|
+ @Override
|
|
|
+ public synchronized Result addMenu(Menu menu) {
|
|
|
+ Result result = moreThanTwoParents(menu.getPid());
|
|
|
+ if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
|
|
|
+ return result;
|
|
|
}
|
|
|
+
|
|
|
// 调整 menu 组内元素的位置
|
|
|
- adjustPosition(menu);
|
|
|
+ insertNewMenu(menu);
|
|
|
menu.setIsEnabled(true);
|
|
|
Menu menuEntity = menuRepository.save(menu);
|
|
|
|
|
|
Set<Role> roles = menu.getRoles();
|
|
|
roles.forEach(role -> role.getMenus().add(menuEntity));
|
|
|
roleRepository.saveAll(roles);
|
|
|
+ return Result.result(ResultStatus.SUCCESS);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 检查菜单的层级
|
|
|
+ * 检查菜单的层级, Menu 最多只能有两个 parent, 即最多只能有三级菜单
|
|
|
*
|
|
|
* @param
|
|
|
* @return
|
|
|
* @date 2021-07-15 上午11:15
|
|
|
*/
|
|
|
- private boolean checkMenu(int pid) {
|
|
|
+ private Result moreThanTwoParents(int pid) {
|
|
|
if (pid != 0) {
|
|
|
- Menu menu1 = getResourceById(pid);
|
|
|
+ Menu menu1 = menuQuery.getResourceById(pid);
|
|
|
int pid1 = menu1.getPid();
|
|
|
if (pid1 != 0) {
|
|
|
- Menu menu2 = getResourceById(pid1);
|
|
|
+ Menu menu2 = menuQuery.getResourceById(pid1);
|
|
|
int pid2 = menu2.getPid();
|
|
|
if (pid2 != 0) {
|
|
|
- log.error("menu 最多只能有两个 parent,即最多只能有三级菜单...");
|
|
|
- return false;
|
|
|
+ return Result.result(ResultStatus.FAIL, "Menu 最多只能有两个 parent,即最多只能有三级菜单...");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return true;
|
|
|
+ return Result.result(ResultStatus.SUCCESS);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 调整同一 pid 组内 menu 的位置
|
|
|
+ * 向 menu 组插入元素时调整组内 menu 的位置
|
|
|
*
|
|
|
* @date 2021-05-18 上午9:54
|
|
|
*/
|
|
|
- private void adjustPosition(Menu menu) {
|
|
|
+ private void insertNewMenu(Menu menu) {
|
|
|
int pid = menu.getPid();
|
|
|
if (pid != 0) {
|
|
|
Menu pMenu = menuRepository.getOne(pid);
|
|
|
- if (pMenu.getType().equals(MenuType.PAGE.name())) {
|
|
|
+ if (pMenu.getType().equals(MenuType.page.name())) {
|
|
|
log.error("父级菜单的类型不能是 PAGE");
|
|
|
return;
|
|
|
}
|
|
|
@@ -108,7 +115,7 @@ public class ResourceService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 向后移动元素
|
|
|
+ * 向后移动元素(向 menu 组新增元素时调用)
|
|
|
*
|
|
|
* @return
|
|
|
* @date 2021-07-15 下午5:07
|
|
|
@@ -123,7 +130,7 @@ public class ResourceService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 向前移动元素
|
|
|
+ * 向前移动元素(从 menu 组删除元素时调用)
|
|
|
*
|
|
|
* @param
|
|
|
* @return
|
|
|
@@ -138,45 +145,77 @@ public class ResourceService {
|
|
|
menuRepository.saveAll(menus);
|
|
|
}
|
|
|
|
|
|
- public synchronized void updateResource(MenuVO vo, Set<Role> roles) {
|
|
|
- int menuId = vo.getMenuId();
|
|
|
+ @Override
|
|
|
+ public synchronized Result updateMenu(MenuDTO menuDTO) {
|
|
|
+ int menuId = menuDTO.getMenuId();
|
|
|
Menu menuEntity = menuRepository.findById(menuId).orElse(null);
|
|
|
if (menuEntity == null) {
|
|
|
- log.error("menu 不存在");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- int pid = vo.getPid();
|
|
|
- if (!checkMenu(pid)) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (pid != menuEntity.getPid()) {
|
|
|
- // TODO menu 更换到了新的 menu 组
|
|
|
- return;
|
|
|
+ return Result.result(ResultStatus.FAIL, String.format("ID 为 %s 的 Menu 不存在", menuId));
|
|
|
}
|
|
|
|
|
|
int oldPos = menuEntity.getPos();
|
|
|
// menu 的新位置
|
|
|
- int pos = vo.getPos()+1;
|
|
|
- if (oldPos != pos) {
|
|
|
- // TODO menu 在组内的位置发生变化
|
|
|
- List<Menu> menus = menuRepository.findByPid(pid);
|
|
|
- menus.sort(Comparator.comparingInt(Menu::getPos));
|
|
|
- System.out.println();
|
|
|
+ int newPos = menuDTO.getPos()+1;
|
|
|
+ int pid = menuDTO.getPid();
|
|
|
+ if (pid != menuEntity.getPid()) {
|
|
|
+ Result result = moreThanTwoParents(pid);
|
|
|
+ if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // menu 更换到了新的 menu 组
|
|
|
+ menuEntity.setPid(pid);
|
|
|
+ menuEntity.setPos(menuDTO.getPos());
|
|
|
+ insertNewMenu(menuEntity);
|
|
|
+ } else if (newPos != oldPos) {
|
|
|
+ reOrderMenus(pid, oldPos, newPos);
|
|
|
+ menuEntity.setPos(newPos);
|
|
|
}
|
|
|
|
|
|
- menuEntity.setName(vo.getName());
|
|
|
- menuEntity.setUrl(vo.getUrl());
|
|
|
- menuEntity.setIcon(vo.getIcon());
|
|
|
+ menuEntity.setName(menuDTO.getName());
|
|
|
+ menuEntity.setUrl(menuDTO.getUrl());
|
|
|
+ menuEntity.setIcon(menuDTO.getIcon());
|
|
|
menuEntity.setUpdateTime(LocalDateTime.now());
|
|
|
menuRepository.save(menuEntity);
|
|
|
|
|
|
+ Set<Role> roles = menuDTO.getRoles();
|
|
|
roles.forEach(role -> role.getMenus().add(menuEntity));
|
|
|
roleRepository.saveAll(roles);
|
|
|
+ return Result.result(ResultStatus.SUCCESS);
|
|
|
}
|
|
|
|
|
|
- public synchronized void deleteResource(Menu menu) {
|
|
|
+ /**
|
|
|
+ * 对组内的菜单进行重排序,只需调整 oldPos~newPos 之间的元素位置
|
|
|
+ *
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ * @date 2021-07-21 上午11:07
|
|
|
+ */
|
|
|
+ private void reOrderMenus(int pid, int oldPos, int newPos) {
|
|
|
+ Map<Integer, Menu> map = menuRepository.findByPid(pid).stream()
|
|
|
+ .collect(Collectors.toMap(Menu::getPos, menu -> menu));
|
|
|
+ map.remove(oldPos);
|
|
|
+ if (newPos < oldPos) {
|
|
|
+ // 向前移动
|
|
|
+ for (int i = newPos, j = 1; i < oldPos; i++, j++) {
|
|
|
+ map.get(i).setPos(newPos+j);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 向后移动
|
|
|
+ for (int i = newPos-1, j = 1; i > oldPos; i--, j++) {
|
|
|
+ map.get(i).setPos(newPos-j);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ menuRepository.saveAll(map.values());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public synchronized Result deleteMenu(Integer menuId) {
|
|
|
+ Menu menu = menuRepository.findById(menuId).orElse(null);
|
|
|
+ if (menu == null) {
|
|
|
+ return Result.result(ResultStatus.FAIL, String.format("ID 为 %s 的 Menu 不存在", menuId));
|
|
|
+ }
|
|
|
+
|
|
|
// 删除 Role 关联的 Menu
|
|
|
for (Role role : menu.getRoles()) {
|
|
|
role.getMenus().remove(menu);
|
|
|
@@ -190,33 +229,12 @@ public class ResourceService {
|
|
|
int pos = menu.getPos();
|
|
|
moveForward(menus, pos);
|
|
|
menuRepository.delete(menu);
|
|
|
+ return Result.result(ResultStatus.SUCCESS);
|
|
|
}
|
|
|
|
|
|
- public List<Menu> getResourceByStatus(Boolean isEnabled) {
|
|
|
- List<Menu> menuList = menuRepository.findByIsEnabled(isEnabled);
|
|
|
- Map<Integer, List<Menu>> map = menuList.stream().collect(Collectors.groupingBy(Menu::getPid));
|
|
|
- List<Menu> list = new ArrayList<>();
|
|
|
- map.forEach((pid, menus) -> {
|
|
|
- list.addAll(menus.stream()
|
|
|
- .sorted(Comparator.comparing(Menu::getPos))
|
|
|
- .peek(menu -> menu.setChildren(null))
|
|
|
- .collect(Collectors.toList()));
|
|
|
- });
|
|
|
-
|
|
|
- return list;
|
|
|
- }
|
|
|
-
|
|
|
- public Map<Integer, String> getMapByPid(int pid) {
|
|
|
- List<Menu> menus = menuRepository.findByPid(pid);
|
|
|
- menus.sort(Comparator.comparingInt(Menu::getPos));
|
|
|
- Map<Integer, String> map = new HashMap<>();
|
|
|
- menus.forEach(menu -> {
|
|
|
- map.put(menu.getPos(), menu.getName());
|
|
|
- });
|
|
|
- return map;
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ public Result setStatus(Integer menuId, boolean enable) {
|
|
|
|
|
|
- public Menu getResourceById(int id) {
|
|
|
- return menuRepository.findById(id).orElse(null);
|
|
|
+ return Result.result(ResultStatus.SUCCESS);
|
|
|
}
|
|
|
}
|