From 39d1954ec9422156382e28cf77959e4065463ccc Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sun, 15 Jun 2025 12:25:24 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20system=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/dict/DictDataController.java | 13 ++++++++-- .../admin/dict/DictTypeController.java | 9 +++++++ .../admin/permission/MenuController.java | 13 ++++++++-- .../admin/permission/RoleController.java | 13 +++++++++- .../system/service/dept/PostService.java | 7 ++++++ .../system/service/dict/DictDataService.java | 7 ++++++ .../service/dict/DictDataServiceImpl.java | 12 +++++++++ .../system/service/dict/DictTypeService.java | 7 ++++++ .../service/dict/DictTypeServiceImpl.java | 23 ++++++++++++++++- .../service/permission/MenuService.java | 9 ++++++- .../service/permission/MenuServiceImpl.java | 25 +++++++++++++++++++ .../service/permission/RoleService.java | 9 ++++++- .../service/permission/RoleServiceImpl.java | 15 +++++++++++ 13 files changed, 154 insertions(+), 8 deletions(-) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java index c05de995e..ac44bc1e5 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java @@ -58,11 +58,20 @@ public class DictDataController { @Operation(summary = "删除字典数据") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('system:dict:delete')") - public CommonResult deleteDictData(Long id) { + public CommonResult deleteDictData(@RequestParam("id") Long id) { dictDataService.deleteDictData(id); return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除字典数据") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictDataList(@RequestParam("ids") List ids) { + dictDataService.deleteDictDataList(ids); + return success(true); + } + @GetMapping(value = {"/list-all-simple", "simple-list"}) @Operation(summary = "获得全部字典数据列表", description = "一般用于管理后台缓存字典数据在本地") // 无需添加权限认证,因为前端全局都需要 @@ -73,7 +82,7 @@ public class DictDataController { } @GetMapping("/page") - @Operation(summary = "/获得字典类型的分页列表") + @Operation(summary = "获得字典类型的分页") @PreAuthorize("@ss.hasPermission('system:dict:query')") public CommonResult> getDictTypePage(@Valid DictDataPageReqVO pageReqVO) { PageResult pageResult = dictDataService.getDictDataPage(pageReqVO); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java index c40980cfc..8247f1325 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java @@ -62,6 +62,15 @@ public class DictTypeController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除字典类型") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictTypeList(@RequestParam("ids") List ids) { + dictTypeService.deleteDictTypeList(ids); + return success(true); + } + @GetMapping("/page") @Operation(summary = "获得字典类型的分页列表") @PreAuthorize("@ss.hasPermission('system:dict:query')") diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java index 824fe4104..e19e28500 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java +++ b/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; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; 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.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; import java.util.Comparator; import java.util.List; @@ -57,6 +57,15 @@ public class MenuController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除菜单") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('system:menu:delete')") + public CommonResult deleteMenuList(@RequestParam("ids") List ids) { + menuService.deleteMenuList(ids); + return success(true); + } + @GetMapping("/list") @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面") @PreAuthorize("@ss.hasPermission('system:menu:query')") diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java index cf2268752..5109d9e7d 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java +++ b/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; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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.service.permission.RoleService; import io.swagger.v3.oas.annotations.Operation; @@ -61,6 +63,15 @@ public class RoleController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除角色") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('system:role:delete')") + public CommonResult deleteRoleList(@RequestParam("ids") List ids) { + roleService.deleteRoleList(ids); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得角色信息") @PreAuthorize("@ss.hasPermission('system:role:query')") diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java index 25604ceb3..7fd6699b3 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java @@ -38,6 +38,13 @@ public interface PostService { */ void deletePost(Long id); + /** + * 批量删除岗位信息 + * + * @param ids 岗位编号数组 + */ + void deletePostList(List ids); + /** * 获得岗位列表 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java index fc2498f1b..3f4a3b9d0 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java @@ -38,6 +38,13 @@ public interface DictDataService { */ void deleteDictData(Long id); + /** + * 批量删除字典数据 + * + * @param ids 字典数据编号列表 + */ + void deleteDictDataList(List ids); + /** * 获得字典数据列表 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java index b15fd506a..9248d2043 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java @@ -98,6 +98,18 @@ public class DictDataServiceImpl implements DictDataService { dictDataMapper.deleteById(id); } + @Override + public void deleteDictDataList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 校验是否存在 + ids.forEach(this::validateDictDataExists); + + // 批量删除字典数据 + dictDataMapper.deleteByIds(ids); + } + @Override public long getDictDataCountByDictType(String dictType) { return dictDataMapper.selectCountByDictType(dictType); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java index 40911891c..5f617e754 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java @@ -36,6 +36,13 @@ public interface DictTypeService { */ void deleteDictType(Long id); + /** + * 批量删除字典类型 + * + * @param ids 字典类型编号列表 + */ + void deleteDictTypeList(List ids); + /** * 获得字典类型分页列表 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java index 21d2b4f74..953ed5abf 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java +++ b/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 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper; import com.google.common.annotations.VisibleForTesting; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; -import jakarta.annotation.Resource; import java.time.LocalDateTime; import java.util.List; @@ -87,6 +87,27 @@ public class DictTypeServiceImpl implements DictTypeService { dictTypeMapper.updateToDelete(id, LocalDateTime.now()); } + @Override + public void deleteDictTypeList(List ids) { + if (ids == null || ids.isEmpty()) { + return; + } + // 校验是否存在 + ids.forEach(this::validateDictTypeExists); + + // 校验是否有字典数据 + List 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 public List getDictTypeList() { return dictTypeMapper.selectList(); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java index d74dc6134..0d5f0fd84 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java @@ -1,7 +1,7 @@ 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.MenuSaveVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import java.util.Collection; @@ -36,6 +36,13 @@ public interface MenuService { */ void deleteMenu(Long id); + /** + * 批量删除菜单 + * + * @param ids 菜单编号数组 + */ + void deleteMenuList(List ids); + /** * 获得所有菜单列表 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java index 51de2daba..e79c3afa1 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java @@ -104,6 +104,31 @@ public class MenuServiceImpl implements MenuService { permissionService.processMenuDeleted(id); } + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, allEntries = true) + public void deleteMenuList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 校验是否还有子菜单 + for (Long id : ids) { + if (menuMapper.selectCountByParentId(id) > 0) { + throw exception(MENU_EXISTS_CHILDREN); + } + } + // 校验删除的菜单是否存在 + List menus = menuMapper.selectByIds(ids); + if (menus.size() != ids.size()) { + throw exception(MENU_NOT_EXISTS); + } + + // 标记删除 + menuMapper.deleteByIds(ids); + // 删除授予给角色的权限 + ids.forEach(id -> permissionService.processMenuDeleted(id)); + } + @Override public List getMenuList() { return menuMapper.selectList(); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java index 6de8b515b..7426d981a 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java +++ b/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; 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.dal.dataobject.permission.RoleDO; - import jakarta.validation.Valid; + import java.util.Collection; import java.util.List; import java.util.Set; @@ -40,6 +40,13 @@ public interface RoleService { */ void deleteRole(Long id); + /** + * 批量删除角色 + * + * @param ids 角色编号数组 + */ + void deleteRoleList(List ids); + /** * 设置角色的数据权限 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java index c7cf847dc..7a60d7819 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java @@ -122,6 +122,21 @@ public class RoleServiceImpl implements RoleService { LogRecordContext.putVariable("role", role); } + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteRoleList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 1. 校验是否可以更新 + ids.forEach(this::validateRoleForUpdate); + + // 2.1 标记删除 + roleMapper.deleteByIds(ids); + // 2.2 删除相关数据 + ids.forEach(id -> permissionService.processRoleDeleted(id)); + } + /** * 校验角色的唯一字段是否重复 * From 777d64f065b0501c76e447fa3660d48c7a536ce3 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sun, 15 Jun 2025 13:55:24 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20infra=20=E6=A8=A1=E5=9D=97=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/codegen/CodegenController.java | 9 +++++ .../admin/config/ConfigController.java | 9 +++++ .../admin/db/DataSourceConfigController.java | 9 +++++ .../admin/file/FileConfigController.java | 11 ++++++ .../controller/admin/file/FileController.java | 11 ++++++ .../controller/admin/job/JobController.java | 10 ++++++ .../infra/service/codegen/CodegenService.java | 7 ++++ .../service/codegen/CodegenServiceImpl.java | 19 ++++++++++ .../infra/service/config/ConfigService.java | 9 +++++ .../service/config/ConfigServiceImpl.java | 25 +++++++++++++ .../service/db/DataSourceConfigService.java | 7 ++++ .../db/DataSourceConfigServiceImpl.java | 12 +++++++ .../infra/service/file/FileConfigService.java | 9 +++++ .../service/file/FileConfigServiceImpl.java | 30 ++++++++++++++++ .../infra/service/file/FileService.java | 9 +++++ .../infra/service/file/FileServiceImpl.java | 35 +++++++++++++++++++ .../module/infra/service/job/JobService.java | 9 +++++ .../infra/service/job/JobServiceImpl.java | 22 ++++++++++++ 18 files changed, 252 insertions(+) diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java index 93d47f517..26dda8943 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java @@ -122,6 +122,15 @@ public class CodegenController { return success(true); } + @Operation(summary = "批量删除数据库的表和字段定义") + @DeleteMapping("/delete-list") + @Parameter(name = "tableIds", description = "表编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:codegen:delete')") + public CommonResult deleteCodegenList(@RequestParam("tableIds") List tableIds) { + codegenService.deleteCodegenList(tableIds); + return success(true); + } + @Operation(summary = "预览生成代码") @GetMapping("/preview") @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java index 43e64c02a..d4b8efd78 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java @@ -62,6 +62,15 @@ public class ConfigController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除参数配置") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:config:delete')") + public CommonResult deleteConfigList(@RequestParam("ids") List ids) { + configService.deleteConfigList(ids); + return success(true); + } + @GetMapping(value = "/get") @Operation(summary = "获得参数配置") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DataSourceConfigController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DataSourceConfigController.java index ba952c9e9..a5e973703 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DataSourceConfigController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DataSourceConfigController.java @@ -52,6 +52,15 @@ public class DataSourceConfigController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除数据源配置") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')") + public CommonResult deleteDataSourceConfigList(@RequestParam("ids") List ids) { + dataSourceConfigService.deleteDataSourceConfigList(ids); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得数据源配置") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.java index a2e12c4e1..c593f4bb6 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.java +++ b/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; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 文件配置") @@ -60,6 +62,15 @@ public class FileConfigController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除文件配置") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:file-config:delete')") + public CommonResult deleteFileConfigList(@RequestParam("ids") List ids) { + fileConfigService.deleteFileConfigList(ids); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得文件配置") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java index 119774b71..d5611b7a0 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java +++ b/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; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.util.List; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.module.infra.framework.file.core.utils.FileTypeUtils.writeAttachment; @@ -75,6 +77,15 @@ public class FileController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除文件") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:file:delete')") + public CommonResult deleteFileList(@RequestParam("ids") List ids) throws Exception { + fileService.deleteFileList(ids); + return success(true); + } + @GetMapping("/{configId}/get/**") @PermitAll @TenantIgnore diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java index bf4506d34..1ae53e3c9 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java @@ -81,6 +81,16 @@ public class JobController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除定时任务") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:job:delete')") + public CommonResult deleteJobList(@RequestParam("ids") List ids) + throws SchedulerException { + jobService.deleteJobList(ids); + return success(true); + } + @PutMapping("/trigger") @Operation(summary = "触发定时任务") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java index 7adc9f7f1..ca22021a8 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java @@ -48,6 +48,13 @@ public interface CodegenService { */ void deleteCodegen(Long tableId); + /** + * 批量删除数据库的表和字段定义 + * + * @param tableIds 数据编号列表 + */ + void deleteCodegenList(List tableIds); + /** * 获得表定义列表 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java index be3ce5b0f..adeb41734 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java @@ -222,6 +222,25 @@ public class CodegenServiceImpl implements CodegenService { codegenColumnMapper.deleteListByTableId(tableId); } + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCodegenList(List tableIds) { + if (CollUtil.isEmpty(tableIds)) { + return; + } + + // 校验是否都存在 + List tables = codegenTableMapper.selectByIds(tableIds); + if (tables.size() != tableIds.size()) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + + // 批量删除 table 表定义 + codegenTableMapper.deleteByIds(tableIds); + // 批量删除 column 字段定义 + tableIds.forEach(tableId -> codegenColumnMapper.deleteListByTableId(tableId)); + } + @Override public List getCodegenTableList(Long dataSourceConfigId) { return codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId); diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java index 0087b83b9..854d13a99 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java +++ b/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; import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; import jakarta.validation.Valid; +import java.util.List; + /** * 参数配置 Service 接口 * @@ -35,6 +37,13 @@ public interface ConfigService { */ void deleteConfig(Long id); + /** + * 批量删除参数配置 + * + * @param ids 配置编号列表 + */ + void deleteConfigList(List ids); + /** * 获得参数配置 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java index b0e5c53be..14b93654c 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.infra.service.config; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigSaveReqVO; @@ -13,6 +14,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.util.List; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; @@ -63,6 +66,28 @@ public class ConfigServiceImpl implements ConfigService { configMapper.deleteById(id); } + @Override + public void deleteConfigList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 校验配置存在 + List configs = configMapper.selectByIds(ids); + if (configs.size() != ids.size()) { + throw exception(CONFIG_NOT_EXISTS); + } + + // 校验是否有内置配置 + for (ConfigDO config : configs) { + if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { + throw exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + } + } + + // 批量删除 + configMapper.deleteByIds(ids); + } + @Override public ConfigDO getConfig(Long id) { return configMapper.selectById(id); diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java index bb741660e..8382b48ce 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java @@ -35,6 +35,13 @@ public interface DataSourceConfigService { */ void deleteDataSourceConfig(Long id); + /** + * 批量删除数据源配置 + * + * @param ids 编号列表 + */ + void deleteDataSourceConfigList(List ids); + /** * 获得数据源配置 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java index 3e9ed4ff3..254176079 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.infra.service.db; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils; import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO; @@ -63,6 +64,17 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService { dataSourceConfigMapper.deleteById(id); } + @Override + public void deleteDataSourceConfigList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 校验存在 + ids.forEach(this::validateDataSourceConfigExists); + // 批量删除 + dataSourceConfigMapper.deleteByIds(ids); + } + private void validateDataSourceConfigExists(Long id) { if (dataSourceConfigMapper.selectById(id) == null) { throw exception(DATA_SOURCE_CONFIG_NOT_EXISTS); diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigService.java index b2bf49144..6c69c6ed9 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigService.java +++ b/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; import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient; import jakarta.validation.Valid; +import java.util.List; + /** * 文件配置 Service 接口 * @@ -43,6 +45,13 @@ public interface FileConfigService { */ void deleteFileConfig(Long id); + /** + * 批量删除文件配置 + * + * @param ids 编号列表 + */ + void deleteFileConfigList(List ids); + /** * 获得文件配置 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java index 4e7bf47cc..f3347d362 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.infra.service.file; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.util.IdUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -25,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.Duration; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -134,6 +136,34 @@ public class FileConfigServiceImpl implements FileConfigService { clearCache(id, null); } + @Override + public void deleteFileConfigList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + + // 校验存在 + List configs = fileConfigMapper.selectByIds(ids); + if (configs.size() != ids.size()) { + throw exception(FILE_CONFIG_NOT_EXISTS); + } + + // 校验是否有主配置 + for (FileConfigDO config : configs) { + if (Boolean.TRUE.equals(config.getMaster())) { + throw exception(FILE_CONFIG_DELETE_FAIL_MASTER); + } + } + + // 批量删除 + fileConfigMapper.deleteByIds(ids); + + // 清空缓存 + for (Long id : ids) { + clearCache(id, null); + } + } + /** * 清空指定文件配置 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java index 01c2bba72..5b15ad873 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java +++ b/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 import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; import jakarta.validation.constraints.NotEmpty; +import java.util.List; + /** * 文件 Service 接口 * @@ -59,6 +61,13 @@ public interface FileService { */ void deleteFile(Long id) throws Exception; + /** + * 批量删除文件 + * + * @param ids 编号列表 + */ + void deleteFileList(List ids) throws Exception; + /** * 获得文件内容 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java index 4a0faadaa..822be3fe9 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.infra.service.file; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; @@ -20,6 +21,10 @@ import jakarta.annotation.Resource; import lombok.SneakyThrows; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import static cn.hutool.core.date.DatePattern.PURE_DATE_PATTERN; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; @@ -156,6 +161,36 @@ public class FileServiceImpl implements FileService { fileMapper.deleteById(id); } + @Override + public void deleteFileList(List ids) throws Exception { + if (CollUtil.isEmpty(ids)) { + return; + } + + // 校验存在 + List files = fileMapper.selectByIds(ids); + if (files.size() != ids.size()) { + throw exception(FILE_NOT_EXISTS); + } + + // 按照配置分组,批量删除 + Map> configFiles = files.stream() + .collect(Collectors.groupingBy(FileDO::getConfigId)); + for (Map.Entry> entry : configFiles.entrySet()) { + // 获取客户端 + FileClient client = fileConfigService.getFileClient(entry.getKey()); + Assert.notNull(client, "客户端({}) 不能为空", entry.getKey()); + + // 批量删除文件 + for (FileDO file : entry.getValue()) { + client.delete(file.getPath()); + } + } + + // 删除记录 + fileMapper.deleteByIds(ids); + } + private FileDO validateFileExists(Long id) { FileDO fileDO = fileMapper.selectById(id); if (fileDO == null) { diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java index bce2a9557..b830b08c4 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java +++ b/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; import jakarta.validation.Valid; import org.quartz.SchedulerException; +import java.util.List; + /** * 定时任务 Service 接口 * @@ -58,6 +60,13 @@ public interface JobService { */ void deleteJob(Long id) throws SchedulerException; + /** + * 批量删除定时任务 + * + * @param ids 编号列表 + */ + void deleteJobList(List ids) throws SchedulerException; + /** * 获得定时任务 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java index 982e39ba4..85ea76a8c 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java @@ -169,6 +169,28 @@ public class JobServiceImpl implements JobService { schedulerManager.deleteJob(job.getHandlerName()); } + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobList(List ids) throws SchedulerException { + if (ids == null || ids.isEmpty()) { + return; + } + + // 校验存在 + List jobs = jobMapper.selectByIds(ids); + if (jobs.size() != ids.size()) { + throw exception(JOB_NOT_EXISTS); + } + + // 批量删除 + jobMapper.deleteByIds(ids); + + // 删除 Job 到 Quartz 中 + for (JobDO job : jobs) { + schedulerManager.deleteJob(job.getHandlerName()); + } + } + private JobDO validateJobExists(Long id) { JobDO job = jobMapper.selectById(id); if (job == null) { From ce69fd8ab257d89751ac91a496855dcb1faece46 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sun, 15 Jun 2025 13:57:08 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20system=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/service/dept/PostServiceImpl.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java index f6901c45e..aa5619080 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java +++ b/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 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.module.system.dal.mysql.dept.PostMapper; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import jakarta.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -58,10 +58,16 @@ public class PostServiceImpl implements PostService { public void deletePost(Long id) { // 校验是否存在 validatePostExists(id); - // 删除部门 + // 删除岗位 postMapper.deleteById(id); } + @Override + public void deletePostList(List ids) { + // 删除岗位 + postMapper.deleteByIds(ids); + } + private void validatePostForCreateOrUpdate(Long id, String name, String code) { // 校验自己存在 validatePostExists(id);