Commit bcd6ed4c4cca5477d9190e5b2855d15148886de4

Authored by 芋道源码
Committed by Gitee
2 parents f253c133 ce69fd8a

!1366 feat: system、infra 模块新增批量删除接口

Merge pull request !1366 from puhui999/master-jdk17
Showing 32 changed files with 414 additions and 10 deletions
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java
... ... @@ -122,6 +122,15 @@ public class CodegenController {
122 122 return success(true);
123 123 }
124 124  
  125 + @Operation(summary = "批量删除数据库的表和字段定义")
  126 + @DeleteMapping("/delete-list")
  127 + @Parameter(name = "tableIds", description = "表编号列表", required = true)
  128 + @PreAuthorize("@ss.hasPermission('infra:codegen:delete')")
  129 + public CommonResult<Boolean> deleteCodegenList(@RequestParam("tableIds") List<Long> tableIds) {
  130 + codegenService.deleteCodegenList(tableIds);
  131 + return success(true);
  132 + }
  133 +
125 134 @Operation(summary = "预览生成代码")
126 135 @GetMapping("/preview")
127 136 @Parameter(name = "tableId", description = "表编号", required = true, example = "1024")
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java
... ... @@ -62,6 +62,15 @@ public class ConfigController {
62 62 return success(true);
63 63 }
64 64  
  65 + @DeleteMapping("/delete-list")
  66 + @Operation(summary = "批量删除参数配置")
  67 + @Parameter(name = "ids", description = "编号列表", required = true)
  68 + @PreAuthorize("@ss.hasPermission('infra:config:delete')")
  69 + public CommonResult<Boolean> deleteConfigList(@RequestParam("ids") List<Long> ids) {
  70 + configService.deleteConfigList(ids);
  71 + return success(true);
  72 + }
  73 +
65 74 @GetMapping(value = "/get")
66 75 @Operation(summary = "获得参数配置")
67 76 @Parameter(name = "id", description = "编号", required = true, example = "1024")
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DataSourceConfigController.java
... ... @@ -52,6 +52,15 @@ public class DataSourceConfigController {
52 52 return success(true);
53 53 }
54 54  
  55 + @DeleteMapping("/delete-list")
  56 + @Operation(summary = "批量删除数据源配置")
  57 + @Parameter(name = "ids", description = "编号列表", required = true)
  58 + @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')")
  59 + public CommonResult<Boolean> deleteDataSourceConfigList(@RequestParam("ids") List<Long> ids) {
  60 + dataSourceConfigService.deleteDataSourceConfigList(ids);
  61 + return success(true);
  62 + }
  63 +
55 64 @GetMapping("/get")
56 65 @Operation(summary = "获得数据源配置")
57 66 @Parameter(name = "id", description = "编号", required = true, example = "1024")
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.java
... ... @@ -17,6 +17,8 @@ import org.springframework.security.access.prepost.PreAuthorize;
17 17 import org.springframework.validation.annotation.Validated;
18 18 import org.springframework.web.bind.annotation.*;
19 19  
  20 +import java.util.List;
  21 +
20 22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21 23  
22 24 @Tag(name = "管理后台 - 文件配置")
... ... @@ -60,6 +62,15 @@ public class FileConfigController {
60 62 return success(true);
61 63 }
62 64  
  65 + @DeleteMapping("/delete-list")
  66 + @Operation(summary = "批量删除文件配置")
  67 + @Parameter(name = "ids", description = "编号列表", required = true)
  68 + @PreAuthorize("@ss.hasPermission('infra:file-config:delete')")
  69 + public CommonResult<Boolean> deleteFileConfigList(@RequestParam("ids") List<Long> ids) {
  70 + fileConfigService.deleteFileConfigList(ids);
  71 + return success(true);
  72 + }
  73 +
63 74 @GetMapping("/get")
64 75 @Operation(summary = "获得文件配置")
65 76 @Parameter(name = "id", description = "编号", required = true, example = "1024")
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java
... ... @@ -26,6 +26,8 @@ import org.springframework.validation.annotation.Validated;
26 26 import org.springframework.web.bind.annotation.*;
27 27 import org.springframework.web.multipart.MultipartFile;
28 28  
  29 +import java.util.List;
  30 +
29 31 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
30 32 import static cn.iocoder.yudao.module.infra.framework.file.core.utils.FileTypeUtils.writeAttachment;
31 33  
... ... @@ -75,6 +77,15 @@ public class FileController {
75 77 return success(true);
76 78 }
77 79  
  80 + @DeleteMapping("/delete-list")
  81 + @Operation(summary = "批量删除文件")
  82 + @Parameter(name = "ids", description = "编号列表", required = true)
  83 + @PreAuthorize("@ss.hasPermission('infra:file:delete')")
  84 + public CommonResult<Boolean> deleteFileList(@RequestParam("ids") List<Long> ids) throws Exception {
  85 + fileService.deleteFileList(ids);
  86 + return success(true);
  87 + }
  88 +
78 89 @GetMapping("/{configId}/get/**")
79 90 @PermitAll
80 91 @TenantIgnore
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java
... ... @@ -81,6 +81,16 @@ public class JobController {
81 81 return success(true);
82 82 }
83 83  
  84 + @DeleteMapping("/delete-list")
  85 + @Operation(summary = "批量删除定时任务")
  86 + @Parameter(name = "ids", description = "编号列表", required = true)
  87 + @PreAuthorize("@ss.hasPermission('infra:job:delete')")
  88 + public CommonResult<Boolean> deleteJobList(@RequestParam("ids") List<Long> ids)
  89 + throws SchedulerException {
  90 + jobService.deleteJobList(ids);
  91 + return success(true);
  92 + }
  93 +
84 94 @PutMapping("/trigger")
85 95 @Operation(summary = "触发定时任务")
86 96 @Parameter(name = "id", description = "编号", required = true, example = "1024")
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java
... ... @@ -49,6 +49,13 @@ public interface CodegenService {
49 49 void deleteCodegen(Long tableId);
50 50  
51 51 /**
  52 + * 批量删除数据库的表和字段定义
  53 + *
  54 + * @param tableIds 数据编号列表
  55 + */
  56 + void deleteCodegenList(List<Long> tableIds);
  57 +
  58 + /**
52 59 * 获得表定义列表
53 60 *
54 61 * @param dataSourceConfigId 数据源配置的编号
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java
... ... @@ -223,6 +223,25 @@ public class CodegenServiceImpl implements CodegenService {
223 223 }
224 224  
225 225 @Override
  226 + @Transactional(rollbackFor = Exception.class)
  227 + public void deleteCodegenList(List<Long> tableIds) {
  228 + if (CollUtil.isEmpty(tableIds)) {
  229 + return;
  230 + }
  231 +
  232 + // 校验是否都存在
  233 + List<CodegenTableDO> tables = codegenTableMapper.selectByIds(tableIds);
  234 + if (tables.size() != tableIds.size()) {
  235 + throw exception(CODEGEN_TABLE_NOT_EXISTS);
  236 + }
  237 +
  238 + // 批量删除 table 表定义
  239 + codegenTableMapper.deleteByIds(tableIds);
  240 + // 批量删除 column 字段定义
  241 + tableIds.forEach(tableId -> codegenColumnMapper.deleteListByTableId(tableId));
  242 + }
  243 +
  244 + @Override
226 245 public List<CodegenTableDO> getCodegenTableList(Long dataSourceConfigId) {
227 246 return codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId);
228 247 }
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java
... ... @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigSaveReqVO;
6 6 import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO;
7 7 import jakarta.validation.Valid;
8 8  
  9 +import java.util.List;
  10 +
9 11 /**
10 12 * 参数配置 Service 接口
11 13 *
... ... @@ -36,6 +38,13 @@ public interface ConfigService {
36 38 void deleteConfig(Long id);
37 39  
38 40 /**
  41 + * 批量删除参数配置
  42 + *
  43 + * @param ids 配置编号列表
  44 + */
  45 + void deleteConfigList(List<Long> ids);
  46 +
  47 + /**
39 48 * 获得参数配置
40 49 *
41 50 * @param id 配置编号
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java
1 1 package cn.iocoder.yudao.module.infra.service.config;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO;
5 6 import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigSaveReqVO;
... ... @@ -13,6 +14,8 @@ import lombok.extern.slf4j.Slf4j;
13 14 import org.springframework.stereotype.Service;
14 15 import org.springframework.validation.annotation.Validated;
15 16  
  17 +import java.util.List;
  18 +
16 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
17 20 import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*;
18 21  
... ... @@ -64,6 +67,28 @@ public class ConfigServiceImpl implements ConfigService {
64 67 }
65 68  
66 69 @Override
  70 + public void deleteConfigList(List<Long> ids) {
  71 + if (CollUtil.isEmpty(ids)) {
  72 + return;
  73 + }
  74 + // 校验配置存在
  75 + List<ConfigDO> configs = configMapper.selectByIds(ids);
  76 + if (configs.size() != ids.size()) {
  77 + throw exception(CONFIG_NOT_EXISTS);
  78 + }
  79 +
  80 + // 校验是否有内置配置
  81 + for (ConfigDO config : configs) {
  82 + if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) {
  83 + throw exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE);
  84 + }
  85 + }
  86 +
  87 + // 批量删除
  88 + configMapper.deleteByIds(ids);
  89 + }
  90 +
  91 + @Override
67 92 public ConfigDO getConfig(Long id) {
68 93 return configMapper.selectById(id);
69 94 }
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java
... ... @@ -36,6 +36,13 @@ public interface DataSourceConfigService {
36 36 void deleteDataSourceConfig(Long id);
37 37  
38 38 /**
  39 + * 批量删除数据源配置
  40 + *
  41 + * @param ids 编号列表
  42 + */
  43 + void deleteDataSourceConfigList(List<Long> ids);
  44 +
  45 + /**
39 46 * 获得数据源配置
40 47 *
41 48 * @param id 编号
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java
1 1 package cn.iocoder.yudao.module.infra.service.db;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
4 5 import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
5 6 import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO;
... ... @@ -63,6 +64,17 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService {
63 64 dataSourceConfigMapper.deleteById(id);
64 65 }
65 66  
  67 + @Override
  68 + public void deleteDataSourceConfigList(List<Long> ids) {
  69 + if (CollUtil.isEmpty(ids)) {
  70 + return;
  71 + }
  72 + // 校验存在
  73 + ids.forEach(this::validateDataSourceConfigExists);
  74 + // 批量删除
  75 + dataSourceConfigMapper.deleteByIds(ids);
  76 + }
  77 +
66 78 private void validateDataSourceConfigExists(Long id) {
67 79 if (dataSourceConfigMapper.selectById(id) == null) {
68 80 throw exception(DATA_SOURCE_CONFIG_NOT_EXISTS);
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigService.java
... ... @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileConfigDO;
7 7 import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient;
8 8 import jakarta.validation.Valid;
9 9  
  10 +import java.util.List;
  11 +
10 12 /**
11 13 * 文件配置 Service 接口
12 14 *
... ... @@ -44,6 +46,13 @@ public interface FileConfigService {
44 46 void deleteFileConfig(Long id);
45 47  
46 48 /**
  49 + * 批量删除文件配置
  50 + *
  51 + * @param ids 编号列表
  52 + */
  53 + void deleteFileConfigList(List<Long> ids);
  54 +
  55 + /**
47 56 * 获得文件配置
48 57 *
49 58 * @param id 编号
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java
1 1 package cn.iocoder.yudao.module.infra.service.file;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.hutool.core.io.resource.ResourceUtil;
4 5 import cn.hutool.core.util.IdUtil;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
... ... @@ -25,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
25 26 import org.springframework.validation.annotation.Validated;
26 27  
27 28 import java.time.Duration;
  29 +import java.util.List;
28 30 import java.util.Map;
29 31 import java.util.Objects;
30 32  
... ... @@ -134,6 +136,34 @@ public class FileConfigServiceImpl implements FileConfigService {
134 136 clearCache(id, null);
135 137 }
136 138  
  139 + @Override
  140 + public void deleteFileConfigList(List<Long> ids) {
  141 + if (CollUtil.isEmpty(ids)) {
  142 + return;
  143 + }
  144 +
  145 + // 校验存在
  146 + List<FileConfigDO> configs = fileConfigMapper.selectByIds(ids);
  147 + if (configs.size() != ids.size()) {
  148 + throw exception(FILE_CONFIG_NOT_EXISTS);
  149 + }
  150 +
  151 + // 校验是否有主配置
  152 + for (FileConfigDO config : configs) {
  153 + if (Boolean.TRUE.equals(config.getMaster())) {
  154 + throw exception(FILE_CONFIG_DELETE_FAIL_MASTER);
  155 + }
  156 + }
  157 +
  158 + // 批量删除
  159 + fileConfigMapper.deleteByIds(ids);
  160 +
  161 + // 清空缓存
  162 + for (Long id : ids) {
  163 + clearCache(id, null);
  164 + }
  165 + }
  166 +
137 167 /**
138 168 * 清空指定文件配置
139 169 *
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java
... ... @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresigned
7 7 import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
8 8 import jakarta.validation.constraints.NotEmpty;
9 9  
  10 +import java.util.List;
  11 +
10 12 /**
11 13 * 文件 Service 接口
12 14 *
... ... @@ -60,6 +62,13 @@ public interface FileService {
60 62 void deleteFile(Long id) throws Exception;
61 63  
62 64 /**
  65 + * 批量删除文件
  66 + *
  67 + * @param ids 编号列表
  68 + */
  69 + void deleteFileList(List<Long> ids) throws Exception;
  70 +
  71 + /**
63 72 * 获得文件内容
64 73 *
65 74 * @param configId 配置编号
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java
1 1 package cn.iocoder.yudao.module.infra.service.file;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.hutool.core.date.LocalDateTimeUtil;
4 5 import cn.hutool.core.io.FileUtil;
5 6 import cn.hutool.core.lang.Assert;
... ... @@ -20,6 +21,10 @@ import jakarta.annotation.Resource;
20 21 import lombok.SneakyThrows;
21 22 import org.springframework.stereotype.Service;
22 23  
  24 +import java.util.List;
  25 +import java.util.Map;
  26 +import java.util.stream.Collectors;
  27 +
23 28 import static cn.hutool.core.date.DatePattern.PURE_DATE_PATTERN;
24 29 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
25 30 import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS;
... ... @@ -156,6 +161,36 @@ public class FileServiceImpl implements FileService {
156 161 fileMapper.deleteById(id);
157 162 }
158 163  
  164 + @Override
  165 + public void deleteFileList(List<Long> ids) throws Exception {
  166 + if (CollUtil.isEmpty(ids)) {
  167 + return;
  168 + }
  169 +
  170 + // 校验存在
  171 + List<FileDO> files = fileMapper.selectByIds(ids);
  172 + if (files.size() != ids.size()) {
  173 + throw exception(FILE_NOT_EXISTS);
  174 + }
  175 +
  176 + // 按照配置分组,批量删除
  177 + Map<Long, List<FileDO>> configFiles = files.stream()
  178 + .collect(Collectors.groupingBy(FileDO::getConfigId));
  179 + for (Map.Entry<Long, List<FileDO>> entry : configFiles.entrySet()) {
  180 + // 获取客户端
  181 + FileClient client = fileConfigService.getFileClient(entry.getKey());
  182 + Assert.notNull(client, "客户端({}) 不能为空", entry.getKey());
  183 +
  184 + // 批量删除文件
  185 + for (FileDO file : entry.getValue()) {
  186 + client.delete(file.getPath());
  187 + }
  188 + }
  189 +
  190 + // 删除记录
  191 + fileMapper.deleteByIds(ids);
  192 + }
  193 +
159 194 private FileDO validateFileExists(Long id) {
160 195 FileDO fileDO = fileMapper.selectById(id);
161 196 if (fileDO == null) {
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java
... ... @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO;
7 7 import jakarta.validation.Valid;
8 8 import org.quartz.SchedulerException;
9 9  
  10 +import java.util.List;
  11 +
10 12 /**
11 13 * 定时任务 Service 接口
12 14 *
... ... @@ -59,6 +61,13 @@ public interface JobService {
59 61 void deleteJob(Long id) throws SchedulerException;
60 62  
61 63 /**
  64 + * 批量删除定时任务
  65 + *
  66 + * @param ids 编号列表
  67 + */
  68 + void deleteJobList(List<Long> ids) throws SchedulerException;
  69 +
  70 + /**
62 71 * 获得定时任务
63 72 *
64 73 * @param id 编号
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java
... ... @@ -169,6 +169,28 @@ public class JobServiceImpl implements JobService {
169 169 schedulerManager.deleteJob(job.getHandlerName());
170 170 }
171 171  
  172 + @Override
  173 + @Transactional(rollbackFor = Exception.class)
  174 + public void deleteJobList(List<Long> ids) throws SchedulerException {
  175 + if (ids == null || ids.isEmpty()) {
  176 + return;
  177 + }
  178 +
  179 + // 校验存在
  180 + List<JobDO> jobs = jobMapper.selectByIds(ids);
  181 + if (jobs.size() != ids.size()) {
  182 + throw exception(JOB_NOT_EXISTS);
  183 + }
  184 +
  185 + // 批量删除
  186 + jobMapper.deleteByIds(ids);
  187 +
  188 + // 删除 Job 到 Quartz 中
  189 + for (JobDO job : jobs) {
  190 + schedulerManager.deleteJob(job.getHandlerName());
  191 + }
  192 + }
  193 +
172 194 private JobDO validateJobExists(Long id) {
173 195 JobDO job = jobMapper.selectById(id);
174 196 if (job == null) {
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java
... ... @@ -58,11 +58,20 @@ public class DictDataController {
58 58 @Operation(summary = "删除字典数据")
59 59 @Parameter(name = "id", description = "编号", required = true, example = "1024")
60 60 @PreAuthorize("@ss.hasPermission('system:dict:delete')")
61   - public CommonResult<Boolean> deleteDictData(Long id) {
  61 + public CommonResult<Boolean> deleteDictData(@RequestParam("id") Long id) {
62 62 dictDataService.deleteDictData(id);
63 63 return success(true);
64 64 }
65 65  
  66 + @DeleteMapping("/delete-list")
  67 + @Operation(summary = "批量删除字典数据")
  68 + @Parameter(name = "ids", description = "编号列表", required = true)
  69 + @PreAuthorize("@ss.hasPermission('system:dict:delete')")
  70 + public CommonResult<Boolean> deleteDictDataList(@RequestParam("ids") List<Long> ids) {
  71 + dictDataService.deleteDictDataList(ids);
  72 + return success(true);
  73 + }
  74 +
66 75 @GetMapping(value = {"/list-all-simple", "simple-list"})
67 76 @Operation(summary = "获得全部字典数据列表", description = "一般用于管理后台缓存字典数据在本地")
68 77 // 无需添加权限认证,因为前端全局都需要
... ... @@ -73,7 +82,7 @@ public class DictDataController {
73 82 }
74 83  
75 84 @GetMapping("/page")
76   - @Operation(summary = "/获得字典类型的分页列表")
  85 + @Operation(summary = "获得字典类型的分页")
77 86 @PreAuthorize("@ss.hasPermission('system:dict:query')")
78 87 public CommonResult<PageResult<DictDataRespVO>> getDictTypePage(@Valid DictDataPageReqVO pageReqVO) {
79 88 PageResult<DictDataDO> pageResult = dictDataService.getDictDataPage(pageReqVO);
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java
... ... @@ -62,6 +62,15 @@ public class DictTypeController {
62 62 return success(true);
63 63 }
64 64  
  65 + @DeleteMapping("/delete-list")
  66 + @Operation(summary = "批量删除字典类型")
  67 + @Parameter(name = "ids", description = "编号列表", required = true)
  68 + @PreAuthorize("@ss.hasPermission('system:dict:delete')")
  69 + public CommonResult<Boolean> deleteDictTypeList(@RequestParam("ids") List<Long> ids) {
  70 + dictTypeService.deleteDictTypeList(ids);
  71 + return success(true);
  72 + }
  73 +
65 74 @GetMapping("/page")
66 75 @Operation(summary = "获得字典类型的分页列表")
67 76 @PreAuthorize("@ss.hasPermission('system:dict:query')")
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java
... ... @@ -12,12 +12,12 @@ import cn.iocoder.yudao.module.system.service.permission.MenuService;
12 12 import io.swagger.v3.oas.annotations.Operation;
13 13 import io.swagger.v3.oas.annotations.Parameter;
14 14 import io.swagger.v3.oas.annotations.tags.Tag;
  15 +import jakarta.annotation.Resource;
  16 +import jakarta.validation.Valid;
15 17 import org.springframework.security.access.prepost.PreAuthorize;
16 18 import org.springframework.validation.annotation.Validated;
17 19 import org.springframework.web.bind.annotation.*;
18 20  
19   -import jakarta.annotation.Resource;
20   -import jakarta.validation.Valid;
21 21 import java.util.Comparator;
22 22 import java.util.List;
23 23  
... ... @@ -57,6 +57,15 @@ public class MenuController {
57 57 return success(true);
58 58 }
59 59  
  60 + @DeleteMapping("/delete-list")
  61 + @Operation(summary = "批量删除菜单")
  62 + @Parameter(name = "ids", description = "编号列表", required = true)
  63 + @PreAuthorize("@ss.hasPermission('system:menu:delete')")
  64 + public CommonResult<Boolean> deleteMenuList(@RequestParam("ids") List<Long> ids) {
  65 + menuService.deleteMenuList(ids);
  66 + return success(true);
  67 + }
  68 +
60 69 @GetMapping("/list")
61 70 @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面")
62 71 @PreAuthorize("@ss.hasPermission('system:menu:query')")
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java
... ... @@ -7,7 +7,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
7 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
9 9 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
10   -import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*;
  10 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO;
  11 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleRespVO;
  12 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
11 13 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
12 14 import cn.iocoder.yudao.module.system.service.permission.RoleService;
13 15 import io.swagger.v3.oas.annotations.Operation;
... ... @@ -61,6 +63,15 @@ public class RoleController {
61 63 return success(true);
62 64 }
63 65  
  66 + @DeleteMapping("/delete-list")
  67 + @Operation(summary = "批量删除角色")
  68 + @Parameter(name = "ids", description = "编号列表", required = true)
  69 + @PreAuthorize("@ss.hasPermission('system:role:delete')")
  70 + public CommonResult<Boolean> deleteRoleList(@RequestParam("ids") List<Long> ids) {
  71 + roleService.deleteRoleList(ids);
  72 + return success(true);
  73 + }
  74 +
64 75 @GetMapping("/get")
65 76 @Operation(summary = "获得角色信息")
66 77 @PreAuthorize("@ss.hasPermission('system:role:query')")
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java
... ... @@ -39,6 +39,13 @@ public interface PostService {
39 39 void deletePost(Long id);
40 40  
41 41 /**
  42 + * 批量删除岗位信息
  43 + *
  44 + * @param ids 岗位编号数组
  45 + */
  46 + void deletePostList(List<Long> ids);
  47 +
  48 + /**
42 49 * 获得岗位列表
43 50 *
44 51 * @param ids 岗位编号数组
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java
... ... @@ -8,10 +8,10 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqV
8 8 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSaveReqVO;
9 9 import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO;
10 10 import cn.iocoder.yudao.module.system.dal.mysql.dept.PostMapper;
  11 +import jakarta.annotation.Resource;
11 12 import org.springframework.stereotype.Service;
12 13 import org.springframework.validation.annotation.Validated;
13 14  
14   -import jakarta.annotation.Resource;
15 15 import java.util.Collection;
16 16 import java.util.Collections;
17 17 import java.util.List;
... ... @@ -58,10 +58,16 @@ public class PostServiceImpl implements PostService {
58 58 public void deletePost(Long id) {
59 59 // 校验是否存在
60 60 validatePostExists(id);
61   - // 删除部门
  61 + // 删除岗位
62 62 postMapper.deleteById(id);
63 63 }
64 64  
  65 + @Override
  66 + public void deletePostList(List<Long> ids) {
  67 + // 删除岗位
  68 + postMapper.deleteByIds(ids);
  69 + }
  70 +
65 71 private void validatePostForCreateOrUpdate(Long id, String name, String code) {
66 72 // 校验自己存在
67 73 validatePostExists(id);
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java
... ... @@ -39,6 +39,13 @@ public interface DictDataService {
39 39 void deleteDictData(Long id);
40 40  
41 41 /**
  42 + * 批量删除字典数据
  43 + *
  44 + * @param ids 字典数据编号列表
  45 + */
  46 + void deleteDictDataList(List<Long> ids);
  47 +
  48 + /**
42 49 * 获得字典数据列表
43 50 *
44 51 * @param status 状态
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java
... ... @@ -99,6 +99,18 @@ public class DictDataServiceImpl implements DictDataService {
99 99 }
100 100  
101 101 @Override
  102 + public void deleteDictDataList(List<Long> ids) {
  103 + if (CollUtil.isEmpty(ids)) {
  104 + return;
  105 + }
  106 + // 校验是否存在
  107 + ids.forEach(this::validateDictDataExists);
  108 +
  109 + // 批量删除字典数据
  110 + dictDataMapper.deleteByIds(ids);
  111 + }
  112 +
  113 + @Override
102 114 public long getDictDataCountByDictType(String dictType) {
103 115 return dictDataMapper.selectCountByDictType(dictType);
104 116 }
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java
... ... @@ -37,6 +37,13 @@ public interface DictTypeService {
37 37 void deleteDictType(Long id);
38 38  
39 39 /**
  40 + * 批量删除字典类型
  41 + *
  42 + * @param ids 字典类型编号列表
  43 + */
  44 + void deleteDictTypeList(List<Long> ids);
  45 +
  46 + /**
40 47 * 获得字典类型分页列表
41 48 *
42 49 * @param pageReqVO 分页请求
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java
... ... @@ -9,9 +9,9 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeSave
9 9 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
10 10 import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper;
11 11 import com.google.common.annotations.VisibleForTesting;
  12 +import jakarta.annotation.Resource;
12 13 import org.springframework.stereotype.Service;
13 14  
14   -import jakarta.annotation.Resource;
15 15 import java.time.LocalDateTime;
16 16 import java.util.List;
17 17  
... ... @@ -88,6 +88,27 @@ public class DictTypeServiceImpl implements DictTypeService {
88 88 }
89 89  
90 90 @Override
  91 + public void deleteDictTypeList(List<Long> ids) {
  92 + if (ids == null || ids.isEmpty()) {
  93 + return;
  94 + }
  95 + // 校验是否存在
  96 + ids.forEach(this::validateDictTypeExists);
  97 +
  98 + // 校验是否有字典数据
  99 + List<DictTypeDO> dictTypes = dictTypeMapper.selectByIds(ids);
  100 + for (DictTypeDO dictType : dictTypes) {
  101 + if (dictDataService.getDictDataCountByDictType(dictType.getType()) > 0) {
  102 + throw exception(DICT_TYPE_HAS_CHILDREN);
  103 + }
  104 + }
  105 +
  106 + // 批量删除字典类型
  107 + LocalDateTime now = LocalDateTime.now();
  108 + ids.forEach(id -> dictTypeMapper.updateToDelete(id, now));
  109 + }
  110 +
  111 + @Override
91 112 public List<DictTypeDO> getDictTypeList() {
92 113 return dictTypeMapper.selectList();
93 114 }
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java
1 1 package cn.iocoder.yudao.module.system.service.permission;
2 2  
3   -import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuSaveVO;
4 3 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
  4 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuSaveVO;
5 5 import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
6 6  
7 7 import java.util.Collection;
... ... @@ -37,6 +37,13 @@ public interface MenuService {
37 37 void deleteMenu(Long id);
38 38  
39 39 /**
  40 + * 批量删除菜单
  41 + *
  42 + * @param ids 菜单编号数组
  43 + */
  44 + void deleteMenuList(List<Long> ids);
  45 +
  46 + /**
40 47 * 获得所有菜单列表
41 48 *
42 49 * @return 菜单列表
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java
... ... @@ -105,6 +105,31 @@ public class MenuServiceImpl implements MenuService {
105 105 }
106 106  
107 107 @Override
  108 + @Transactional(rollbackFor = Exception.class)
  109 + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, allEntries = true)
  110 + public void deleteMenuList(List<Long> ids) {
  111 + if (CollUtil.isEmpty(ids)) {
  112 + return;
  113 + }
  114 + // 校验是否还有子菜单
  115 + for (Long id : ids) {
  116 + if (menuMapper.selectCountByParentId(id) > 0) {
  117 + throw exception(MENU_EXISTS_CHILDREN);
  118 + }
  119 + }
  120 + // 校验删除的菜单是否存在
  121 + List<MenuDO> menus = menuMapper.selectByIds(ids);
  122 + if (menus.size() != ids.size()) {
  123 + throw exception(MENU_NOT_EXISTS);
  124 + }
  125 +
  126 + // 标记删除
  127 + menuMapper.deleteByIds(ids);
  128 + // 删除授予给角色的权限
  129 + ids.forEach(id -> permissionService.processMenuDeleted(id));
  130 + }
  131 +
  132 + @Override
108 133 public List<MenuDO> getMenuList() {
109 134 return menuMapper.selectList();
110 135 }
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java
... ... @@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO;
5 5 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
6 6 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
7   -
8 7 import jakarta.validation.Valid;
  8 +
9 9 import java.util.Collection;
10 10 import java.util.List;
11 11 import java.util.Set;
... ... @@ -41,6 +41,13 @@ public interface RoleService {
41 41 void deleteRole(Long id);
42 42  
43 43 /**
  44 + * 批量删除角色
  45 + *
  46 + * @param ids 角色编号数组
  47 + */
  48 + void deleteRoleList(List<Long> ids);
  49 +
  50 + /**
44 51 * 设置角色的数据权限
45 52 *
46 53 * @param id 角色编号
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java
... ... @@ -122,6 +122,21 @@ public class RoleServiceImpl implements RoleService {
122 122 LogRecordContext.putVariable("role", role);
123 123 }
124 124  
  125 + @Override
  126 + @Transactional(rollbackFor = Exception.class)
  127 + public void deleteRoleList(List<Long> ids) {
  128 + if (CollUtil.isEmpty(ids)) {
  129 + return;
  130 + }
  131 + // 1. 校验是否可以更新
  132 + ids.forEach(this::validateRoleForUpdate);
  133 +
  134 + // 2.1 标记删除
  135 + roleMapper.deleteByIds(ids);
  136 + // 2.2 删除相关数据
  137 + ids.forEach(id -> permissionService.processRoleDeleted(id));
  138 + }
  139 +
125 140 /**
126 141 * 校验角色的唯一字段是否重复
127 142 *
... ...