Skip to content

Commit 15cd05b

Browse files
committed
fix(system/menu): 修复菜单删除功能不支持级联删除子菜单的问题
1 parent 2daa6a7 commit 15cd05b

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

continew-system/src/main/java/top/continew/admin/system/service/impl/MenuServiceImpl.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import top.continew.starter.core.util.validation.CheckUtils;
4646
import top.continew.starter.extension.crud.model.query.SortQuery;
4747

48+
import java.util.ArrayList;
4849
import java.util.List;
4950
import java.util.Set;
5051

@@ -98,8 +99,9 @@ public void update(MenuReq req, Long id) {
9899
@Override
99100
@Transactional(rollbackFor = Exception.class)
100101
public void delete(List<Long> ids) {
101-
baseMapper.lambdaUpdate().in(MenuDO::getParentId, ids).remove();
102-
super.delete(ids);
102+
// 级联删除菜单(包含子菜单)
103+
List<Long> allDeleteIdList = this.listCascadingDeleteMenuIds(ids);
104+
baseMapper.deleteByIds(allDeleteIdList);
103105
RedisUtils.deleteByPattern(CacheConstants.ROLE_MENU_KEY_PREFIX + StringConstants.ASTERISK);
104106
}
105107

@@ -156,4 +158,26 @@ private void checkNameRepeat(String name, Long id) {
156158
.ne(id != null, MenuDO::getId, id)
157159
.exists(), "组件名称为 [{}] 的菜单已存在", name);
158160
}
161+
162+
/**
163+
* 级联获取所有待删除菜单 ID 列表(包含自身及所有子菜单)
164+
*
165+
* @param ids ID 列表
166+
* @return 待删除菜单 ID 列表(包含自身及所有子菜单)
167+
*/
168+
private List<Long> listCascadingDeleteMenuIds(List<Long> ids) {
169+
List<Long> menuIds = new ArrayList<>(ids);
170+
List<Long> childIdList = baseMapper.lambdaQuery()
171+
.select(MenuDO::getId)
172+
.in(MenuDO::getParentId, menuIds)
173+
.list()
174+
.stream()
175+
.map(MenuDO::getId)
176+
.toList();
177+
if (childIdList.isEmpty()) {
178+
return menuIds;
179+
}
180+
menuIds.addAll(this.listCascadingDeleteMenuIds(childIdList));
181+
return menuIds;
182+
}
159183
}

0 commit comments

Comments
 (0)