kaiyu
2021-04-27 19792073aeb0462088208334b4bd4241571630d4
screen-manage
菜单删除和添加功能
1 files renamed
4 files added
6 files modified
543 ■■■■■ changed files
screen-manage/src/main/java/com/moral/api/controller/MenuController.java 134 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/entity/Menu.java 6 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/pojo/dto/menu/MenuQueryDTO.java 2 ●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/pojo/form/menu/MenuDeleteForm.java 24 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/pojo/form/menu/MenuInsertForm.java 42 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/pojo/vo/menu/MenuDeleteVO.java 24 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/pojo/vo/menu/MenuInsertVO.java 26 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/pojo/vo/menu/MenuQueryVO.java 67 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/pojo/vo/menu/MenuVO.java 7 ●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/MenuService.java 29 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/impl/MenuServiceImpl.java 182 ●●●●● patch | view | raw | blame | history
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);
            }
        }
    }
}