diff --git a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/dto/MenuDto.java b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/dto/MenuDto.java index 54e2544..1a8585b 100644 --- a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/dto/MenuDto.java +++ b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/dto/MenuDto.java @@ -13,6 +13,9 @@ public class MenuDto { @ApiModelProperty(value = "菜单ID") private Integer menuId; + @ApiModelProperty(value = "父ID") + private Integer parentId; + @ApiModelProperty(value = "菜单名称") private String menuName; } diff --git a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/vo/MenuVo.java b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/vo/MenuVo.java index 248a75f..53d9eff 100644 --- a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/vo/MenuVo.java +++ b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/vo/MenuVo.java @@ -29,7 +29,7 @@ public class MenuVo { private Integer menuType; @ApiModelProperty(value = "权限") - private Integer menuAuth; + private String menuAuth; @ApiModelProperty(value = "父ID") private Integer parentId; @@ -38,7 +38,16 @@ public class MenuVo { private Integer menuSort; @ApiModelProperty(value = "图标") - private Integer menuLogo; + private String menuLogo; + + @ApiModelProperty(value = "创建时间") + private String createTime; + + @ApiModelProperty(value = "flag") + private boolean flag; + + @ApiModelProperty(value = "类型") + private int type; @ApiModelProperty(value = "子节点") @JsonInclude(JsonInclude.Include.NON_EMPTY) diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/controller/MenuController.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/controller/MenuController.java index 84c5ad8..e02c1f6 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/controller/MenuController.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/controller/MenuController.java @@ -1,11 +1,21 @@ package com.securitycontrol.system.controller; +import com.securitycontrol.common.core.domain.Result; import com.securitycontrol.common.core.web.controller.BaseController; +import com.securitycontrol.common.core.web.domain.AjaxResult; +import com.securitycontrol.entity.system.dto.MenuDto; +import com.securitycontrol.entity.system.dto.OrgDto; +import com.securitycontrol.entity.system.dto.RoleDto; +import com.securitycontrol.entity.system.vo.MenuVo; +import com.securitycontrol.entity.system.vo.OrgVo; +import com.securitycontrol.entity.system.vo.RoleVo; import com.securitycontrol.system.service.MenuService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; /** * 菜单管理层 @@ -18,4 +28,33 @@ public class MenuController extends BaseController { @Resource(name = "MenuService") private MenuService service; + @ApiOperation(value = "获取菜单列表") + @GetMapping("getMenuList") + public AjaxResult getMenuList(MenuDto dto) { + return service.getMenuList(dto); + } + + @ApiOperation(value = "新增菜单") + @PostMapping("addMenu") + public AjaxResult addMenu(@Valid @RequestBody MenuVo vo){ + return service.addOrUpdateMenu(vo); + } + + @ApiOperation(value = "修改菜单") + @PostMapping("editMenu") + public AjaxResult editMenu(@Valid @RequestBody MenuVo vo){ + return service.addOrUpdateMenu(vo); + } + + @ApiOperation(value = "菜单详情") + @GetMapping("getMenuById") + public AjaxResult getMenuById(MenuDto dto){ + return service.getMenuById(dto); + } + + @ApiOperation(value = "删除菜单") + @PostMapping("delMenu") + public AjaxResult delMenu(MenuDto dto){ + return service.delMenu(dto); + } } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/mapper/IMenuMapper.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/mapper/IMenuMapper.java index 6877716..0a8eb89 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/mapper/IMenuMapper.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/mapper/IMenuMapper.java @@ -1,7 +1,11 @@ package com.securitycontrol.system.mapper; +import com.securitycontrol.entity.system.dto.MenuDto; +import com.securitycontrol.entity.system.vo.MenuVo; import org.springframework.stereotype.Repository; +import java.util.List; + /** * @author:cwchen * @date:2024-02-26-18:07 @@ -10,4 +14,66 @@ import org.springframework.stereotype.Repository; */ @Repository(value = "IMenuMapper") public interface IMenuMapper { + /** + * 菜单列表 + * + * @param dto + * @return List + * @description + * @author cwchen + * @date 2024/2/27 9:35 + */ + List getMenuList(MenuDto dto); + + /** + * 菜单名称是否存在 + * + * @param vo + * @return int + * @description 菜单名称是否存在 + * @author cwchen + * @date 2024/2/27 11:29 + */ + int isMenuName(MenuVo vo); + + /** + * 新增/修改菜单 + * + * @param vo + * @description 新增/修改菜单 + * @author cwchen + * @date 2024/2/27 11:29 + */ + void addOrUpdateMenu(MenuVo vo); + + /** + * 当前节点是否存在子节点 + * + * @param dto + * @return int + * @description 当前节点是否存在子节点 + * @author cwchen + * @date 2024/2/27 13:21 + */ + int isExistChild(MenuDto dto); + + /** + * 删除菜单 + * + * @param dto + * @description 删除菜单 + * @author cwchen + * @date 2024/2/27 13:21 + */ + void delMenu(MenuDto dto); + + /** + * 菜单详情 + * @param dto + * @return MenuVo + * @description 菜单详情 + * @author cwchen + * @date 2024/2/27 13:22 + */ + MenuVo getMenuById(MenuDto dto); } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/service/MenuService.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/service/MenuService.java index 4ca7ab2..d6a45c5 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/service/MenuService.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/service/MenuService.java @@ -1,7 +1,53 @@ package com.securitycontrol.system.service; +import com.securitycontrol.common.core.web.domain.AjaxResult; +import com.securitycontrol.entity.system.dto.MenuDto; +import com.securitycontrol.entity.system.vo.MenuVo; + /** * @author 10488 */ public interface MenuService { + /** + * 菜单列表 + * + * @param dto + * @return AjaxResult + * @description 菜单列表 + * @author cwchen + * @date 2024/2/27 9:33 + */ + AjaxResult getMenuList(MenuDto dto); + + /** + * 新增/修改菜单 + * + * @param vo + * @return AjaxResult + * @description + * @author cwchen + * @date 2024/2/27 11:23 + */ + AjaxResult addOrUpdateMenu(MenuVo vo); + + /** + * 菜单详情 + * + * @param dto + * @return AjaxResult + * @description 菜单详情 + * @author cwchen + * @date 2024/2/27 13:13 + */ + AjaxResult getMenuById(MenuDto dto); + + /** + * 删除菜单 + * @param dto + * @return AjaxResult + * @description 删除菜单 + * @author cwchen + * @date 2024/2/27 13:13 + */ + AjaxResult delMenu(MenuDto dto); } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/service/MenuServiceImpl.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/service/MenuServiceImpl.java index c9d721c..a2005a2 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/service/MenuServiceImpl.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/service/MenuServiceImpl.java @@ -1,18 +1,169 @@ package com.securitycontrol.system.service; +import com.securitycontrol.common.core.utils.aes.DateTimeHelper; +import com.securitycontrol.common.core.utils.aes.StringHelper; +import com.securitycontrol.common.core.web.domain.AjaxResult; +import com.securitycontrol.entity.system.dto.MenuDto; +import com.securitycontrol.entity.system.vo.MenuVo; import com.securitycontrol.system.mapper.IMenuMapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; /** * @author 10488 */ @Service(value = "MenuService") @Slf4j -public class MenuServiceImpl implements MenuService{ +public class MenuServiceImpl implements MenuService { @Resource(name = "IMenuMapper") private IMenuMapper mapper; + + private final static Integer PARENT_ID = 0; + + @Override + public AjaxResult getMenuList(MenuDto dto) { + List list = new ArrayList<>(); + list = mapper.getMenuList(dto); + if (CollectionUtils.isEmpty(list)) { + return AjaxResult.success(list); + } + if (StringHelper.isNotEmpty(dto.getMenuName())) { + List allList = new ArrayList<>(list); + List list2 = mapper.getMenuList(null); + for (MenuVo vo : list) { + if (!Objects.equals(PARENT_ID, vo.getParentId())) { + getParentMenu(vo.getParentId(), list2, allList); + } + } + allList = allList.stream().filter(distinctByKey(MenuVo::getMenuId)).collect(Collectors.toList()); + return AjaxResult.success(getChildList(allList)); + } + return AjaxResult.success(getChildList(list)); + } + + static Predicate distinctByKey(Function keyExtractor) { + Map seen = new ConcurrentHashMap<>(16); + return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; + } + + /** + * 依据下级节点查询上级数据 + * + * @param menuId + * @return + */ + public void getParentMenu(Integer menuId, List list, List list2) { + MenuVo vo = list.stream().filter(org -> Objects.equals(menuId, org.getMenuId())).findFirst().orElse(null); + assert vo != null; + list2.add(vo); + if (!Objects.equals(PARENT_ID, vo.getParentId())) { + getParentMenu(vo.getParentId(), list, list2); + } + } + + /** + * 遍历获取 + * + * @param list + * @return + */ + public List getChildList(List list) { + list.stream().map(vo -> { + vo.setChildren(this.fromTree(vo, list)); + return vo; + }).collect(Collectors.toList()); + //过滤出最上级的菜单 + return list.stream() + .filter(ele -> Objects.equals(PARENT_ID, ele.getParentId())) + .collect(Collectors.toList()); + + } + + /** + * 找寻指定菜单的下级菜单 + * + * @param vo 当前菜单 + * @param list 所有的菜单list + * @return 下级菜单 + */ + private List fromTree(MenuVo vo, List list) { + return list.stream() + .filter(ele -> Objects.equals(vo.getMenuId(), ele.getParentId())) + .collect(Collectors.toList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult addOrUpdateMenu(MenuVo vo) { + try { + if(vo.getParentId() == null){ + vo.setParentId(0); + } + int result = mapper.isMenuName(vo); + if (vo.getMenuId() == null) { + vo.setType(1); + vo.setCreateTime(DateTimeHelper.getNowTime()); + if (result > 0) { + return AjaxResult.error("菜单名称已存在"); + } + } else { + vo.setType(2); + if (vo.isFlag()) { + if (result > 0) { + return AjaxResult.error("菜单名称已存在"); + } + } + } + mapper.addOrUpdateMenu(vo); + } catch (Exception e) { + log.error("菜单", e); + //手动回滚异常 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error(); + } + return AjaxResult.success(); + } + + @Override + public AjaxResult getMenuById(MenuDto dto) { + MenuVo vo = new MenuVo(); + vo = mapper.getMenuById(dto); + if(vo.getParentId() == 0){ + vo.setParentId(null); + } + + return AjaxResult.success(vo); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult delMenu(MenuDto dto) { + try { + int result = mapper.isExistChild(dto); + if(result > 0){ + return AjaxResult.error("请先删除子节点"); + } + mapper.delMenu(dto); + } catch (Exception e) { + log.error("删除菜单", e); + //手动回滚异常 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + AjaxResult.error(); + } + return AjaxResult.success(); + } } diff --git a/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/MenuMapper.xml b/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/MenuMapper.xml index f59c6c1..2c739e9 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/MenuMapper.xml +++ b/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/MenuMapper.xml @@ -1,6 +1,81 @@ - - + + + + INSERT INTO sys_menu + + menu_name, + menu_url, + menu_type, + menu_auth, + p_id, + menu_sort, + menu_logo, + create_time, + + + #{menuName}, + #{menuUrl}, + #{menuType}, + #{menuAuth}, + #{parentId}, + #{menuSort}, + #{menuLogo}, + #{createTime}, + + + + UPDATE sys_menu SET menu_name = #{menuName},menu_url = #{menuUrl},menu_type = #{menuType}, + menu_auth = #{menuAuth},p_id = #{parentId},menu_sort = #{menuSort},menu_logo = #{menuLogo} + WHERE menu_id = #{menuId} + + + + + DELETE FROM sys_menu WHERE menu_id = #{menuId} + + + + + + + + + \ No newline at end of file