菜单管理

This commit is contained in:
cwchen 2024-02-27 16:03:43 +08:00
parent 6b11dab30e
commit bf2515f4c7
7 changed files with 396 additions and 7 deletions

View File

@ -13,6 +13,9 @@ public class MenuDto {
@ApiModelProperty(value = "菜单ID")
private Integer menuId;
@ApiModelProperty(value = "父ID")
private Integer parentId;
@ApiModelProperty(value = "菜单名称")
private String menuName;
}

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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;
/**
* @authorcwchen
* @date2024-02-26-18:07
@ -10,4 +14,66 @@ import org.springframework.stereotype.Repository;
*/
@Repository(value = "IMenuMapper")
public interface IMenuMapper {
/**
* 菜单列表
*
* @param dto
* @return List<MenuVo>
* @description
* @author cwchen
* @date 2024/2/27 9:35
*/
List<MenuVo> 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);
}

View File

@ -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);
}

View File

@ -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<MenuVo> list = new ArrayList<>();
list = mapper.getMenuList(dto);
if (CollectionUtils.isEmpty(list)) {
return AjaxResult.success(list);
}
if (StringHelper.isNotEmpty(dto.getMenuName())) {
List<MenuVo> allList = new ArrayList<>(list);
List<MenuVo> 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 <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>(16);
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
/**
* 依据下级节点查询上级数据
*
* @param menuId
* @return
*/
public void getParentMenu(Integer menuId, List<MenuVo> list, List<MenuVo> 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<MenuVo> getChildList(List<MenuVo> 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<MenuVo> fromTree(MenuVo vo, List<MenuVo> 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();
}
}

View File

@ -1,6 +1,81 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.securitycontrol.system.mapper.IMenuMapper">
<!--新增/修改菜单-->
<insert id="addOrUpdateMenu">
<if test="type == 1">
INSERT INTO sys_menu
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="menuName != null and menuName != ''">menu_name,</if>
<if test="menuUrl != null and menuUrl!=''">menu_url,</if>
<if test="menuType != null">menu_type,</if>
<if test="menuAuth != null and menuAuth!=''">menu_auth,</if>
<if test="parentId != null">p_id,</if>
<if test="menuSort != null">menu_sort,</if>
<if test="menuLogo != null and menuLogo!=''">menu_logo,</if>
<if test="createTime != null and createTime!=''">create_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="menuName != null and menuName != ''">#{menuName},</if>
<if test="menuUrl != null and menuUrl!=''">#{menuUrl},</if>
<if test="menuType != null">#{menuType},</if>
<if test="menuAuth != null and menuAuth!=''">#{menuAuth},</if>
<if test="parentId != null">#{parentId},</if>
<if test="menuSort != null">#{menuSort},</if>
<if test="menuLogo != null and menuLogo!=''">#{menuLogo},</if>
<if test="createTime != null and createTime!=''">#{createTime},</if>
</trim>
</if>
<if test="type == 2">
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}
</if>
</insert>
<!--删除菜单-->
<delete id="delMenu">
DELETE FROM sys_menu WHERE menu_id = #{menuId}
</delete>
<!--菜单列表-->
<select id="getMenuList" resultType="com.securitycontrol.entity.system.vo.MenuVo">
SELECT menu_id AS menuId,
menu_name AS menuName,
menu_url AS menuUrl,
menu_type AS menuType,
menu_auth AS menuAuth,
menu_sort AS menuSort,
menu_logo AS menuLogo,
create_time AS createTime,
p_id AS parentId
FROM sys_menu
<where>
<if test="menuName!=null and menuName!=''">
INSTR(menu_name,#{menuName}) > 0
</if>
AND del_flag = 0
</where>
ORDER BY menu_sort,create_time
</select>
<!--菜单名称是否存在-->
<select id="isMenuName" resultType="java.lang.Integer">
SELECT COUNT(*) FROM sys_menu WHERE menu_name = #{menuName} AND p_id = #{parentId} AND del_flag = 0
</select>
<!--当前节点是否存在子节点-->
<select id="isExistChild" resultType="java.lang.Integer">
SELECT COUNT(*) FROM sys_menu WHERE p_id = #{menuId} AND del_flag = 0
</select>
<!--菜单详情-->
<select id="getMenuById" resultType="com.securitycontrol.entity.system.vo.MenuVo">
SELECT menu_id AS menuId,
menu_name AS menuName,
menu_url AS menuUrl,
menu_type AS menuType,
menu_auth AS menuAuth,
menu_sort AS menuSort,
menu_logo AS menuLogo,
create_time AS createTime,
p_id AS parentId
FROM sys_menu
WHERE menu_id = #{menuId}
</select>
</mapper>