feat: system 模块新增批量删除接口

This commit is contained in:
puhui999 2025-06-15 12:25:24 +08:00
parent a8a3720ecd
commit 39d1954ec9
13 changed files with 154 additions and 8 deletions

View File

@ -58,11 +58,20 @@ public class DictDataController {
@Operation(summary = "删除字典数据") @Operation(summary = "删除字典数据")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:dict:delete')") @PreAuthorize("@ss.hasPermission('system:dict:delete')")
public CommonResult<Boolean> deleteDictData(Long id) { public CommonResult<Boolean> deleteDictData(@RequestParam("id") Long id) {
dictDataService.deleteDictData(id); dictDataService.deleteDictData(id);
return success(true); return success(true);
} }
@DeleteMapping("/delete-list")
@Operation(summary = "批量删除字典数据")
@Parameter(name = "ids", description = "编号列表", required = true)
@PreAuthorize("@ss.hasPermission('system:dict:delete')")
public CommonResult<Boolean> deleteDictDataList(@RequestParam("ids") List<Long> ids) {
dictDataService.deleteDictDataList(ids);
return success(true);
}
@GetMapping(value = {"/list-all-simple", "simple-list"}) @GetMapping(value = {"/list-all-simple", "simple-list"})
@Operation(summary = "获得全部字典数据列表", description = "一般用于管理后台缓存字典数据在本地") @Operation(summary = "获得全部字典数据列表", description = "一般用于管理后台缓存字典数据在本地")
// 无需添加权限认证因为前端全局都需要 // 无需添加权限认证因为前端全局都需要
@ -73,7 +82,7 @@ public class DictDataController {
} }
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "/获得字典类型的分页列表") @Operation(summary = "获得字典类型的分页")
@PreAuthorize("@ss.hasPermission('system:dict:query')") @PreAuthorize("@ss.hasPermission('system:dict:query')")
public CommonResult<PageResult<DictDataRespVO>> getDictTypePage(@Valid DictDataPageReqVO pageReqVO) { public CommonResult<PageResult<DictDataRespVO>> getDictTypePage(@Valid DictDataPageReqVO pageReqVO) {
PageResult<DictDataDO> pageResult = dictDataService.getDictDataPage(pageReqVO); PageResult<DictDataDO> pageResult = dictDataService.getDictDataPage(pageReqVO);

View File

@ -62,6 +62,15 @@ public class DictTypeController {
return success(true); return success(true);
} }
@DeleteMapping("/delete-list")
@Operation(summary = "批量删除字典类型")
@Parameter(name = "ids", description = "编号列表", required = true)
@PreAuthorize("@ss.hasPermission('system:dict:delete')")
public CommonResult<Boolean> deleteDictTypeList(@RequestParam("ids") List<Long> ids) {
dictTypeService.deleteDictTypeList(ids);
return success(true);
}
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得字典类型的分页列表") @Operation(summary = "获得字典类型的分页列表")
@PreAuthorize("@ss.hasPermission('system:dict:query')") @PreAuthorize("@ss.hasPermission('system:dict:query')")

View File

@ -12,12 +12,12 @@ import cn.iocoder.yudao.module.system.service.permission.MenuService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
@ -57,6 +57,15 @@ public class MenuController {
return success(true); return success(true);
} }
@DeleteMapping("/delete-list")
@Operation(summary = "批量删除菜单")
@Parameter(name = "ids", description = "编号列表", required = true)
@PreAuthorize("@ss.hasPermission('system:menu:delete')")
public CommonResult<Boolean> deleteMenuList(@RequestParam("ids") List<Long> ids) {
menuService.deleteMenuList(ids);
return success(true);
}
@GetMapping("/list") @GetMapping("/list")
@Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面") @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面")
@PreAuthorize("@ss.hasPermission('system:menu:query')") @PreAuthorize("@ss.hasPermission('system:menu:query')")

View File

@ -7,7 +7,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleRespVO;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
import cn.iocoder.yudao.module.system.service.permission.RoleService; import cn.iocoder.yudao.module.system.service.permission.RoleService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -61,6 +63,15 @@ public class RoleController {
return success(true); return success(true);
} }
@DeleteMapping("/delete-list")
@Operation(summary = "批量删除角色")
@Parameter(name = "ids", description = "编号列表", required = true)
@PreAuthorize("@ss.hasPermission('system:role:delete')")
public CommonResult<Boolean> deleteRoleList(@RequestParam("ids") List<Long> ids) {
roleService.deleteRoleList(ids);
return success(true);
}
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获得角色信息") @Operation(summary = "获得角色信息")
@PreAuthorize("@ss.hasPermission('system:role:query')") @PreAuthorize("@ss.hasPermission('system:role:query')")

View File

@ -38,6 +38,13 @@ public interface PostService {
*/ */
void deletePost(Long id); void deletePost(Long id);
/**
* 批量删除岗位信息
*
* @param ids 岗位编号数组
*/
void deletePostList(List<Long> ids);
/** /**
* 获得岗位列表 * 获得岗位列表
* *

View File

@ -38,6 +38,13 @@ public interface DictDataService {
*/ */
void deleteDictData(Long id); void deleteDictData(Long id);
/**
* 批量删除字典数据
*
* @param ids 字典数据编号列表
*/
void deleteDictDataList(List<Long> ids);
/** /**
* 获得字典数据列表 * 获得字典数据列表
* *

View File

@ -98,6 +98,18 @@ public class DictDataServiceImpl implements DictDataService {
dictDataMapper.deleteById(id); dictDataMapper.deleteById(id);
} }
@Override
public void deleteDictDataList(List<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return;
}
// 校验是否存在
ids.forEach(this::validateDictDataExists);
// 批量删除字典数据
dictDataMapper.deleteByIds(ids);
}
@Override @Override
public long getDictDataCountByDictType(String dictType) { public long getDictDataCountByDictType(String dictType) {
return dictDataMapper.selectCountByDictType(dictType); return dictDataMapper.selectCountByDictType(dictType);

View File

@ -36,6 +36,13 @@ public interface DictTypeService {
*/ */
void deleteDictType(Long id); void deleteDictType(Long id);
/**
* 批量删除字典类型
*
* @param ids 字典类型编号列表
*/
void deleteDictTypeList(List<Long> ids);
/** /**
* 获得字典类型分页列表 * 获得字典类型分页列表
* *

View File

@ -9,9 +9,9 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeSave
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper; import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@ -87,6 +87,27 @@ public class DictTypeServiceImpl implements DictTypeService {
dictTypeMapper.updateToDelete(id, LocalDateTime.now()); dictTypeMapper.updateToDelete(id, LocalDateTime.now());
} }
@Override
public void deleteDictTypeList(List<Long> ids) {
if (ids == null || ids.isEmpty()) {
return;
}
// 校验是否存在
ids.forEach(this::validateDictTypeExists);
// 校验是否有字典数据
List<DictTypeDO> dictTypes = dictTypeMapper.selectByIds(ids);
for (DictTypeDO dictType : dictTypes) {
if (dictDataService.getDictDataCountByDictType(dictType.getType()) > 0) {
throw exception(DICT_TYPE_HAS_CHILDREN);
}
}
// 批量删除字典类型
LocalDateTime now = LocalDateTime.now();
ids.forEach(id -> dictTypeMapper.updateToDelete(id, now));
}
@Override @Override
public List<DictTypeDO> getDictTypeList() { public List<DictTypeDO> getDictTypeList() {
return dictTypeMapper.selectList(); return dictTypeMapper.selectList();

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.system.service.permission; package cn.iocoder.yudao.module.system.service.permission;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuSaveVO;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuSaveVO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
import java.util.Collection; import java.util.Collection;
@ -36,6 +36,13 @@ public interface MenuService {
*/ */
void deleteMenu(Long id); void deleteMenu(Long id);
/**
* 批量删除菜单
*
* @param ids 菜单编号数组
*/
void deleteMenuList(List<Long> ids);
/** /**
* 获得所有菜单列表 * 获得所有菜单列表
* *

View File

@ -104,6 +104,31 @@ public class MenuServiceImpl implements MenuService {
permissionService.processMenuDeleted(id); permissionService.processMenuDeleted(id);
} }
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, allEntries = true)
public void deleteMenuList(List<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return;
}
// 校验是否还有子菜单
for (Long id : ids) {
if (menuMapper.selectCountByParentId(id) > 0) {
throw exception(MENU_EXISTS_CHILDREN);
}
}
// 校验删除的菜单是否存在
List<MenuDO> menus = menuMapper.selectByIds(ids);
if (menus.size() != ids.size()) {
throw exception(MENU_NOT_EXISTS);
}
// 标记删除
menuMapper.deleteByIds(ids);
// 删除授予给角色的权限
ids.forEach(id -> permissionService.processMenuDeleted(id));
}
@Override @Override
public List<MenuDO> getMenuList() { public List<MenuDO> getMenuList() {
return menuMapper.selectList(); return menuMapper.selectList();

View File

@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -40,6 +40,13 @@ public interface RoleService {
*/ */
void deleteRole(Long id); void deleteRole(Long id);
/**
* 批量删除角色
*
* @param ids 角色编号数组
*/
void deleteRoleList(List<Long> ids);
/** /**
* 设置角色的数据权限 * 设置角色的数据权限
* *

View File

@ -122,6 +122,21 @@ public class RoleServiceImpl implements RoleService {
LogRecordContext.putVariable("role", role); LogRecordContext.putVariable("role", role);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteRoleList(List<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return;
}
// 1. 校验是否可以更新
ids.forEach(this::validateRoleForUpdate);
// 2.1 标记删除
roleMapper.deleteByIds(ids);
// 2.2 删除相关数据
ids.forEach(id -> permissionService.processRoleDeleted(id));
}
/** /**
* 校验角色的唯一字段是否重复 * 校验角色的唯一字段是否重复
* *