screen-manage/src/main/java/com/moral/api/controller/MenuController.java
@@ -1,14 +1,24 @@ package com.moral.api.controller; import com.moral.api.entity.Menu; import com.moral.api.pojo.dto.menu.MenuDTO; import com.moral.api.pojo.dto.menu.MenuQueryDTO; import com.moral.api.pojo.form.menu.MenuDeleteForm; import com.moral.api.pojo.form.menu.MenuInsertForm; import com.moral.api.pojo.vo.menu.MenuDeleteVO; import com.moral.api.pojo.vo.menu.MenuInsertVO; import com.moral.api.pojo.vo.menu.MenuQueryVO; import com.moral.api.pojo.vo.menu.MenuVO; import com.moral.api.service.MenuService; import com.moral.constant.ResponseCodeEnum; import com.moral.constant.ResultMessage; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @ClassName MenuController @@ -23,9 +33,117 @@ @RestController @RequestMapping("/menu") public class MenuController { @GetMapping("queryMock") public ResultMessage queryMock(){ @Autowired MenuService menuService; return null; @GetMapping("queryMock") public ResultMessage queryMock() { MenuQueryDTO dto = new MenuQueryDTO(); Menu menu1 = new Menu(); Menu menu11 = new Menu(); Menu menu111 = new Menu(); Menu menu12 = new Menu(); Menu menu121 = new Menu(); Menu menu13 = new Menu(); Menu menu2 = new Menu(); Menu menu21 = new Menu(); Menu menu211 = new Menu(); Menu menu22 = new Menu(); Menu menu23 = new Menu(); Menu menu24 = new Menu(); Menu menu241 = new Menu(); Menu menu2411 = new Menu(); menu1.setName("menu 1"); menu1.setId(1); menu11.setName("menu 1-1"); menu11.setId(2); menu111.setName("menu 1-1-1"); menu111.setId(3); menu12.setName("menu 1-2"); menu12.setId(4); menu121.setName("menu 1-2-1"); menu121.setId(5); menu13.setName("menu 1-3"); menu13.setId(6); menu2.setName("menu 2"); menu2.setId(7); menu21.setName("menu 2-1"); menu21.setId(8); menu211.setName("menu 2-1-1"); menu211.setId(9); menu22.setName("menu 2-2"); menu22.setId(10); menu23.setName("menu 2-3"); menu23.setId(11); menu24.setName("menu 2-4"); menu24.setId(12); menu241.setName("menu 2-4-1"); menu241.setId(13); menu2411.setName("menu 2-4-1-1"); menu2411.setId(14); menu12.setChildren(Arrays.asList(menu121)); menu11.setChildren(Arrays.asList(menu111)); menu1.setChildren(Arrays.asList(menu11, menu12, menu13)); menu241.setChildren(Arrays.asList(menu2411)); menu24.setChildren(Arrays.asList(menu241)); menu21.setChildren(Arrays.asList(menu211)); menu2.setChildren(Arrays.asList(menu21, menu22, menu23, menu24)); MenuDTO dto1 = new MenuDTO(); MenuDTO dto2 = new MenuDTO(); dto1.setMenu(menu1); dto2.setMenu(menu2); dto.setDtos(Arrays.asList(dto1, dto2)); dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); MenuQueryVO vo = MenuQueryVO.convert(dto); return new ResultMessage(dto.getCode(), dto.getMsg(), vo); } @GetMapping("query") public ResultMessage query() { //执行查询业务 MenuQueryDTO dto = menuService.queryAllMenu(); //转换为前端所需参数 MenuQueryVO vo = MenuQueryVO.convert(dto); return new ResultMessage(dto.getCode(), dto.getMsg(), vo); } @PostMapping("insert") public ResultMessage insert(@RequestBody MenuInsertForm form) { //判断是否缺少参数 if (!form.valid()) return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //处理插入业务 MenuDTO dto = menuService.insertMenu(form); //转换前端所需参数 MenuInsertVO vo = MenuInsertVO.convert(dto); return new ResultMessage(dto.getCode(), dto.getMsg(), vo); } @PostMapping("delete") public ResultMessage delete(@RequestBody MenuDeleteForm form){ //判断是否缺少参数 if (!form.valid()) return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //处理删除业务 MenuDTO dto = menuService.deleteMenu(form); //转换前端所需参数 MenuInsertVO vo = MenuDeleteVO.convert(dto); return new ResultMessage(dto.getCode(), dto.getMsg(), vo); } } screen-manage/src/main/java/com/moral/api/entity/Menu.java
@@ -1,11 +1,13 @@ package com.moral.api.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.baomidou.mybatisplus.annotation.TableId; import java.time.LocalDateTime; import java.io.Serializable; import java.util.Date; import java.util.List; import lombok.Data; import lombok.EqualsAndHashCode; @@ -53,6 +55,7 @@ /** * 同一级别菜单的顺序 */ @TableField(value="`order`") private Integer order; /** @@ -70,6 +73,9 @@ */ private String isDelete; @TableField(exist = false) private List<Menu> children; @Override protected Serializable pkVal() { screen-manage/src/main/java/com/moral/api/pojo/dto/menu/MenuQueryDTO.java
File was renamed from screen-manage/src/main/java/com/moral/api/pojo/dto/menu/MenuQueryDto.java @@ -12,7 +12,7 @@ * @Version TODO **/ @Data public class MenuQueryDto { public class MenuQueryDTO { private Integer code; screen-manage/src/main/java/com/moral/api/pojo/form/menu/MenuDeleteForm.java
New file @@ -0,0 +1,24 @@ package com.moral.api.pojo.form.menu; import lombok.Data; import org.aspectj.lang.annotation.DeclareAnnotation; /** * @ClassName MenuDeleteForm * @Description TODO * @Author 陈凯裕 * @Date 2021/4/26 14:36 * @Version TODO **/ @Data public class MenuDeleteForm { private Integer id; public boolean valid(){ if(id==null||id==0){ return false; } return true; } } screen-manage/src/main/java/com/moral/api/pojo/form/menu/MenuInsertForm.java
New file @@ -0,0 +1,42 @@ package com.moral.api.pojo.form.menu; import com.moral.api.entity.Menu; import lombok.Data; import org.springframework.util.ObjectUtils; /** * @ClassName MenuInsertForm * @Description TODO * @Author 陈凯裕 * @Date 2021/4/26 11:02 * @Version TODO **/ @Data public class MenuInsertForm { private String name; private String url; private Integer parentId; private Integer order; public boolean valid(){ if( ObjectUtils.isEmpty(name)|| ObjectUtils.isEmpty(order) ) return false; return true; } public Menu formConvertEntity(){ Menu menu = new Menu(); menu.setName(name); menu.setParentId(parentId); menu.setUrl(url); menu.setOrder(order); return menu; } } screen-manage/src/main/java/com/moral/api/pojo/vo/menu/MenuDeleteVO.java
New file @@ -0,0 +1,24 @@ package com.moral.api.pojo.vo.menu; import com.moral.api.entity.Menu; import com.moral.api.pojo.dto.menu.MenuDTO; import com.moral.constant.ResponseCodeEnum; /** * @ClassName MenuDeleteVO * @Description TODO * @Author 陈凯裕 * @Date 2021/4/26 15:09 * @Version TODO **/ public class MenuDeleteVO extends MenuVO { public static MenuInsertVO convert(MenuDTO dto) { if (dto.getCode() != ResponseCodeEnum.SUCCESS.getCode()) return null; MenuInsertVO vo = new MenuInsertVO(); Menu menu = dto.getMenu(); vo.setId(menu.getId()); vo.setName(menu.getName()); return vo; } } screen-manage/src/main/java/com/moral/api/pojo/vo/menu/MenuInsertVO.java
New file @@ -0,0 +1,26 @@ package com.moral.api.pojo.vo.menu; import com.moral.api.entity.Menu; import com.moral.api.pojo.dto.menu.MenuDTO; import com.moral.constant.ResponseCodeEnum; /** * @ClassName MenuInsertVO * @Description TODO * @Author 陈凯裕 * @Date 2021/4/26 11:40 * @Version TODO **/ public class MenuInsertVO extends MenuVO { public static MenuInsertVO convert(MenuDTO dto) { if (dto.getCode() != ResponseCodeEnum.SUCCESS.getCode()) return null; MenuInsertVO vo = new MenuInsertVO(); Menu menu = dto.getMenu(); vo.setId(menu.getId()); vo.setParentId(menu.getParentId()); vo.setName(menu.getName()); return vo; } } screen-manage/src/main/java/com/moral/api/pojo/vo/menu/MenuQueryVO.java
@@ -1,8 +1,16 @@ package com.moral.api.pojo.vo.menu; import com.moral.api.pojo.dto.menu.MenuQueryDto; import com.fasterxml.jackson.annotation.JsonInclude; import com.moral.api.entity.Menu; import com.moral.api.pojo.dto.menu.MenuDTO; import com.moral.api.pojo.dto.menu.MenuQueryDTO; import com.moral.constant.ResponseCodeEnum; import lombok.Data; import org.springframework.util.ObjectUtils; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** @@ -13,11 +21,64 @@ * @Version TODO **/ @Data @JsonInclude(JsonInclude.Include.NON_EMPTY) public class MenuQueryVO { List<MenuVO> vos; public static MenuQueryVO convert(MenuQueryDto dto){ return null; public static MenuQueryVO convert(MenuQueryDTO dto) { if (dto.getCode() != ResponseCodeEnum.SUCCESS.getCode()) return null; MenuQueryVO vo = new MenuQueryVO(); List<MenuDTO> dtos = dto.getDtos(); List<MenuVO> vos = new ArrayList<>(); for (MenuDTO menuDTO : dtos) { MenuVO menuVO = convertToQueryPage(menuDTO); vos.add(menuVO); } //对根目录进行排序 Collections.sort(vos, new Comparator<MenuVO>() { @Override public int compare(MenuVO o1, MenuVO o2) { return o1.getOrder() - o2.getOrder(); } }); vo.setVos(vos); return vo; } private static MenuVO convertToQueryPage(MenuDTO dto) { Menu menu = dto.getMenu(); MenuVO menuVO = convertToQueryPage(menu); return menuVO; } private static MenuVO convertToQueryPage(Menu menu) { MenuVO vo = new MenuVO(); vo.setId(menu.getId()); vo.setParentId(menu.getParentId()); vo.setUrl(menu.getUrl()); vo.setIcon(menu.getIcon()); vo.setName(menu.getName()); vo.setOrder(menu.getOrder()); List<MenuVO> vos = new ArrayList<>(); List<Menu> children = menu.getChildren(); if (!ObjectUtils.isEmpty(children)) { //对children进行排序,按照order字段 Collections.sort(children, new Comparator<Menu>() { @Override public int compare(Menu o1, Menu o2) { return o1.getOrder() - o2.getOrder(); } }); for (Menu child : children) { MenuVO menuVO = convertToQueryPage(child); vos.add(menuVO); } vo.setChildren(vos); } return vo; } } screen-manage/src/main/java/com/moral/api/pojo/vo/menu/MenuVO.java
@@ -1,5 +1,8 @@ package com.moral.api.pojo.vo.menu; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.util.List; /** @@ -9,6 +12,8 @@ * @Date 2021/4/25 10:04 * @Version TODO **/ @Data @JsonInclude(JsonInclude.Include.NON_EMPTY) public class MenuVO { private Integer id; @@ -22,8 +27,6 @@ private String icon; private Integer order; private Integer level; private List<MenuVO> children; } screen-manage/src/main/java/com/moral/api/service/MenuService.java
@@ -2,6 +2,10 @@ import com.moral.api.entity.Menu; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.pojo.dto.menu.MenuDTO; import com.moral.api.pojo.dto.menu.MenuQueryDTO; import com.moral.api.pojo.form.menu.MenuDeleteForm; import com.moral.api.pojo.form.menu.MenuInsertForm; /** * <p> @@ -12,5 +16,30 @@ * @since 2021-03-09 */ public interface MenuService extends IService<Menu> { /** * @Description: 查询所有菜单 * @Param: [] * @return: com.moral.api.pojo.dto.menu.MenuQueryDTO * @Author: 陈凯裕 * @Date: 2021/4/25 */ MenuQueryDTO queryAllMenu(); /** * @Description: 插入菜单 * @Param: [form] * @return: com.moral.api.pojo.dto.menu.MenuDTO * @Author: 陈凯裕 * @Date: 2021/4/26 */ MenuDTO insertMenu(MenuInsertForm form); /** * @Description: 删除菜单 * @Param: [form] * @return: com.moral.api.pojo.dto.menu.MenuDTO * @Author: 陈凯裕 * @Date: 2021/4/26 */ MenuDTO deleteMenu(MenuDeleteForm form); } screen-manage/src/main/java/com/moral/api/service/impl/MenuServiceImpl.java
@@ -1,10 +1,28 @@ package com.moral.api.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.moral.api.entity.ManageMenu; import com.moral.api.entity.Menu; import com.moral.api.mapper.MenuMapper; import com.moral.api.pojo.dto.menu.MenuDTO; import com.moral.api.pojo.dto.menu.MenuQueryDTO; import com.moral.api.pojo.form.menu.MenuDeleteForm; import com.moral.api.pojo.form.menu.MenuInsertForm; import com.moral.api.service.MenuService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.Constants; import com.moral.constant.ResponseCodeEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; /** * <p> @@ -17,4 +35,168 @@ @Service public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService { @Autowired MenuMapper menuMapper; @Override public MenuQueryDTO queryAllMenu() { //创建返回对象 MenuQueryDTO dto = new MenuQueryDTO(); //获取所有菜单 List<Menu> menus = menuMapper.selectList(null); //组合menu父子结构 Map<Integer, Menu> menuMap = new HashMap<>(); for (Menu menu : menus) { menuMap.put(menu.getId(), menu); menu.setChildren(new ArrayList<>());//初始化集合 } for (Menu menu : menus) { combinationParentChildrenMenus(menuMap, menu); } //删除非跟菜单 menus.removeIf(new Predicate<Menu>() { @Override public boolean test(Menu menu) { if (menu.getParentId().equals(0)) return false; return true; } }); //转换菜单为DTO List<MenuDTO> dtos = new ArrayList<>(); for (Menu menu : menus) { MenuDTO menuDTO = new MenuDTO(); menuDTO.setMenu(menu); dtos.add(menuDTO); } dto.setDtos(dtos); dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); return dto; } @Override @Transactional public MenuDTO insertMenu(MenuInsertForm form) { //创建返回对象 MenuDTO dto = new MenuDTO(); //取参 Menu menu = form.formConvertEntity(); //检查名字是否重复 Menu existMenu = new Menu(); existMenu.setName(menu.getName()); existMenu.setIsDelete(Constants.NOT_DELETE); QueryWrapper existWrapper = new QueryWrapper(); existWrapper.setEntity(existMenu); Menu existMenuResult = menuMapper.selectOne(existWrapper); if (!ObjectUtils.isEmpty(existMenuResult)) { dto.setCode(ResponseCodeEnum.MENU_IS_EXIST.getCode()); dto.setMsg(ResponseCodeEnum.MENU_IS_EXIST.getMsg()); return dto; } //执行插入逻辑 menuMapper.insert(menu); //封装返回对象 dto.setMenu(menu); dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); return dto; } @Override public MenuDTO deleteMenu(MenuDeleteForm form) { //创建返回对象 MenuDTO dto = new MenuDTO(); //取参 Integer id = form.getId(); //查询要删除的菜单 Menu existMenu = menuMapper.selectById(id); if (ObjectUtils.isEmpty(existMenu)) { dto.setCode(ResponseCodeEnum.MENU_IS_NULL.getCode()); dto.setMsg(ResponseCodeEnum.MENU_IS_NULL.getMsg()); return dto; } //执行逻辑删除 existMenu.setIsDelete(Constants.DELETE); menuMapper.updateById(existMenu); //删除所有子菜单 List<Integer> childrenIds = getChildrenIdsByParentId(id); UpdateWrapper wrapper = new UpdateWrapper(); wrapper.in("id",childrenIds); wrapper.set("is_delete",Constants.DELETE); menuMapper.update(null,wrapper); //封装返回对象 dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); dto.setMenu(existMenu); return dto; } private void combinationParentChildrenMenus(Map<Integer, Menu> menuMap, Menu menu) { Integer parentId = menu.getParentId(); Menu parentMenu = menuMap.get(parentId); if (!ObjectUtils.isEmpty(parentMenu)) { parentMenu.getChildren().add(menu); } } /** * @Description: 根据菜单的id获取封装好children的menu对象 * @Param: [id] * @return: com.moral.api.entity.Menu * @Author: 陈凯裕 * @Date: 2021/4/26 */ private Menu getMenuAndChildrenById(Integer id){ //获取所有菜单 List<Menu> menus = menuMapper.selectList(null); //组合menu父子结构 Map<Integer, Menu> menuMap = new HashMap<>(); for (Menu menu : menus) { menuMap.put(menu.getId(), menu); menu.setChildren(new ArrayList<>());//初始化集合 } for (Menu menu : menus) { combinationParentChildrenMenus(menuMap, menu); } Menu menu = menuMap.get(id); return menu; } /** * @Description: 获取该菜单下的所有子菜单id集合 * @Param: [id] * @return: java.util.List<java.lang.Integer> * @Author: 陈凯裕 * @Date: 2021/4/26 */ private List<Integer> getChildrenIdsByParentId(Integer id){ Menu parentMenu = getMenuAndChildrenById(id); List<Menu> children = parentMenu.getChildren(); List<Integer> childrenIds = new ArrayList<>(); for (Menu child : children) { recursiveAccess(child,childrenIds); } return childrenIds; } /** * @Description: 递归获取菜单的id放入集合中 * @Param: [menu, ids] * @return: void * @Author: 陈凯裕 * @Date: 2021/4/26 */ private void recursiveAccess(Menu menu,List<Integer> ids){ ids.add(menu.getId()); List<Menu> children = menu.getChildren(); if(!ObjectUtils.isEmpty(children)){ for (Menu child : children) { recursiveAccess(child,ids); } } } }