diff --git a/auth-admin/src/main/java/cn/bunny/services/controller/configuration/I18nController.java b/auth-admin/src/main/java/cn/bunny/services/controller/configuration/I18nController.java index a13dbd0..54808a4 100644 --- a/auth-admin/src/main/java/cn/bunny/services/controller/configuration/I18nController.java +++ b/auth-admin/src/main/java/cn/bunny/services/controller/configuration/I18nController.java @@ -85,7 +85,7 @@ public class I18nController { return i18nService.downloadI18n(type); } - @Operation(summary = "文件更新多语言", description = "文件更新多语言可以是JSON、Excel") + @Operation(summary = "文件导入多语言", description = "文件更新多语言可以是JSON、Excel") @PutMapping("file") public Result uploadI18nFile(@Valid I18nUpdateByFileDto dto) { i18nService.uploadI18nFile(dto); diff --git a/auth-admin/src/main/java/cn/bunny/services/controller/system/PermissionController.java b/auth-admin/src/main/java/cn/bunny/services/controller/system/PermissionController.java index 8ea2d9f..be7a73f 100644 --- a/auth-admin/src/main/java/cn/bunny/services/controller/system/PermissionController.java +++ b/auth-admin/src/main/java/cn/bunny/services/controller/system/PermissionController.java @@ -74,14 +74,14 @@ public class PermissionController { @Operation(summary = "导出权限", description = "导出权限为Excel") @GetMapping("file/export") - public ResponseEntity exportPermission() { - return permissionService.exportPermission(); + public ResponseEntity exportPermission(String type) { + return permissionService.exportPermission(type); } @Operation(summary = "导入权限", description = "导入权限") @PutMapping("file/import") - public Result importPermission(@RequestParam(value = "file") MultipartFile file) { - permissionService.importPermission(file); + public Result importPermission(@RequestParam(value = "file") MultipartFile file, String type) { + permissionService.importPermission(file, type); return Result.success(ResultCodeEnum.SUCCESS); } diff --git a/auth-admin/src/main/java/cn/bunny/services/excel/entity/PermissionExcel.java b/auth-admin/src/main/java/cn/bunny/services/excel/entity/PermissionExcel.java index 0ba8563..024520e 100644 --- a/auth-admin/src/main/java/cn/bunny/services/excel/entity/PermissionExcel.java +++ b/auth-admin/src/main/java/cn/bunny/services/excel/entity/PermissionExcel.java @@ -1,5 +1,6 @@ package cn.bunny.services.excel.entity; +import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.*; import com.alibaba.excel.enums.BooleanEnum; @@ -10,6 +11,9 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.ArrayList; +import java.util.List; + @Data @Builder @AllArgsConstructor @@ -55,4 +59,7 @@ public class PermissionExcel { @ContentFontStyle(fontHeightInPoints = 14, color = 17, bold = BooleanEnum.TRUE) private String requestMethod; + // 忽略子集 + @ExcelIgnore + private List children = new ArrayList<>(); } \ No newline at end of file diff --git a/auth-admin/src/main/java/cn/bunny/services/service/system/PermissionService.java b/auth-admin/src/main/java/cn/bunny/services/service/system/PermissionService.java index 27b058c..83a8f53 100644 --- a/auth-admin/src/main/java/cn/bunny/services/service/system/PermissionService.java +++ b/auth-admin/src/main/java/cn/bunny/services/service/system/PermissionService.java @@ -70,14 +70,16 @@ public interface PermissionService extends IService { /** * 导出权限为Excel * + * @param type 导出类型 * @return Excel 文件 */ - ResponseEntity exportPermission(); + ResponseEntity exportPermission(String type); /** * 导入权限 * * @param file 导入的Excel + * @param type 导出类型 */ - void importPermission(MultipartFile file); + void importPermission(MultipartFile file, String type); } diff --git a/auth-admin/src/main/java/cn/bunny/services/service/system/impl/PermissionServiceImpl.java b/auth-admin/src/main/java/cn/bunny/services/service/system/impl/PermissionServiceImpl.java index 492d5ab..a80234e 100644 --- a/auth-admin/src/main/java/cn/bunny/services/service/system/impl/PermissionServiceImpl.java +++ b/auth-admin/src/main/java/cn/bunny/services/service/system/impl/PermissionServiceImpl.java @@ -15,7 +15,10 @@ import cn.bunny.services.mapper.system.PermissionMapper; import cn.bunny.services.mapper.system.RolePermissionMapper; import cn.bunny.services.service.system.PermissionService; import cn.bunny.services.utils.FileUtil; +import cn.bunny.services.utils.system.PermissionUtil; import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -39,7 +42,6 @@ import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; -import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** @@ -163,64 +165,82 @@ public class PermissionServiceImpl extends ServiceImpl exportPermission() { + public ResponseEntity exportPermission(String type) { String timeFormat = new SimpleDateFormat("yyyy-MM-dd HH_mm_ss").format(new Date()); String zipFilename = "permission-" + timeFormat + ".zip"; String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); - String filename = "permission-" + dateFormat + ".xlsx"; - - // 创建btye输出流 - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + String filename = "permission-" + dateFormat; // 权限列表 - List permissionList = list(); - List permissionExcelList = permissionList.stream().map(permission -> { + List permissionExcelList = list().stream().map(permission -> { PermissionExcel permissionExcel = new PermissionExcel(); BeanUtils.copyProperties(permission, permissionExcel); return permissionExcel; }).toList(); + // 构建树型结构 + List buildTree = PermissionUtil.buildTree(permissionExcelList); + + // 创建btye输出流 + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + // Zip写入流 try (ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream)) { - ByteArrayOutputStream excelOutputStream = new ByteArrayOutputStream(); - EasyExcel.write(excelOutputStream, PermissionExcel.class).sheet(dateFormat).doWrite(permissionExcelList); - - // 将Excel写入到Zip中 - ZipEntry zipEntry = new ZipEntry(filename); - zipOutputStream.putNextEntry(zipEntry); - zipOutputStream.write(excelOutputStream.toByteArray()); - zipOutputStream.closeEntry(); + // 判断导出类型是什么 + if (type.equals("xlsx")) { + PermissionUtil.writExcel(permissionExcelList, zipOutputStream, filename + ".xlsx"); + } else { + PermissionUtil.writeJson(buildTree, zipOutputStream, filename + ".json"); + } } catch (Exception e) { throw new RuntimeException(e); } // 设置响应头 HttpHeaders headers = FileUtil.buildHttpHeadersByBinary(zipFilename); - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); return new ResponseEntity<>(byteArrayInputStream.readAllBytes(), headers, HttpStatus.OK); } + /** * 导入权限 * * @param file 导入的Excel + * @param type 导出类型 */ @Override - public void importPermission(MultipartFile file) { + public void importPermission(MultipartFile file, String type) { if (file == null) { throw new AuthCustomerException(ResultCodeEnum.REQUEST_IS_EMPTY); } - InputStream fileInputStream; try { - fileInputStream = file.getInputStream(); - EasyExcel.read(fileInputStream, PermissionExcel.class, new PermissionExcelListener(this)).sheet().doRead(); + if (type.equals("xlsx")) { + InputStream fileInputStream = file.getInputStream(); + EasyExcel.read(fileInputStream, PermissionExcel.class, new PermissionExcelListener(this)).sheet().doRead(); + } else { + // 将文件转成字符串 + String json = new String(file.getBytes()); + // 解析文件字符串并转成JSON + List list = JSON.parseObject(json, new TypeReference<>() { + }); + // 格式化数据,保存到数据库 + List flattenedTree = PermissionUtil.flattenTree(list); + List permissionList = flattenedTree.stream().map(permissionExcel -> { + Permission permission = new Permission(); + BeanUtils.copyProperties(permissionExcel, permission); + return permission; + }).toList(); + + saveOrUpdateBatch(permissionList); + } } catch (IOException e) { throw new RuntimeException(e); } diff --git a/auth-admin/src/main/java/cn/bunny/services/service/system/impl/RouterServiceImpl.java b/auth-admin/src/main/java/cn/bunny/services/service/system/impl/RouterServiceImpl.java index f909894..65fa5e4 100644 --- a/auth-admin/src/main/java/cn/bunny/services/service/system/impl/RouterServiceImpl.java +++ b/auth-admin/src/main/java/cn/bunny/services/service/system/impl/RouterServiceImpl.java @@ -81,7 +81,7 @@ public class RouterServiceImpl extends ServiceImpl impleme webUserRouterVoList.forEach(routerVo -> { // 递归添加路由节点 if (routerVo.getParentId() == 0) { - routerVo.setChildren(routerUtil.handleGetChildrenWIthRouter(routerVo.getId(), webUserRouterVoList)); + routerVo.setChildren(routerUtil.buildTreeSetChildren(routerVo.getId(), webUserRouterVoList)); voList.add(routerVo); } }); diff --git a/auth-admin/src/main/java/cn/bunny/services/utils/system/PermissionUtil.java b/auth-admin/src/main/java/cn/bunny/services/utils/system/PermissionUtil.java new file mode 100644 index 0000000..5b54c0a --- /dev/null +++ b/auth-admin/src/main/java/cn/bunny/services/utils/system/PermissionUtil.java @@ -0,0 +1,112 @@ +package cn.bunny.services.utils.system; + +import cn.bunny.services.excel.entity.PermissionExcel; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson2.JSON; + +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class PermissionUtil { + + /** + * 构建属性结构 + * + * @param list 要构建的列表 + * @return 构建完成的列表 + */ + public static List buildTree(List list) { + List permissionExcels = list.stream() + .filter(permissionExcel -> permissionExcel.getParentId() == null || permissionExcel.getParentId() == 0) + .toList(); + + for (PermissionExcel permission : permissionExcels) { + setChildren(permission, list); + } + return permissionExcels; + } + + /** + * 设置子集 + * + * @param parent 父级节点 + * @param list 要构建的列表 + */ + private static void setChildren(PermissionExcel parent, List list) { + List children = list.stream() + .filter(p -> parent.getId().equals(p.getParentId())) + .toList(); + + if (!children.isEmpty()) { + parent.setChildren(children); + + for (PermissionExcel child : children) { + setChildren(child, list); + } + } + } + + /** + * 写入JSON + * + * @param list 写入的列表 + * @param zipOutputStream zip输出流 + * @param zipName zip文件名 + */ + public static void writeJson(List list, ZipOutputStream zipOutputStream, String zipName) { + try { + ZipEntry zipEntry = new ZipEntry(zipName); + zipOutputStream.putNextEntry(zipEntry); + zipOutputStream.write(JSON.toJSONString(list).getBytes(StandardCharsets.UTF_8)); + zipOutputStream.closeEntry(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 写入JSON + * + * @param list 写入的列表 + * @param zipOutputStream zip输出流 + * @param zipName zip文件名 + */ + public static void writExcel(List list, ZipOutputStream zipOutputStream, String zipName) { + try { + ByteArrayOutputStream excelOutputStream = new ByteArrayOutputStream(); + + EasyExcel.write(excelOutputStream, PermissionExcel.class).sheet("permission").doWrite(list); + + // 将Excel写入到Zip中 + ZipEntry zipEntry = new ZipEntry(zipName); + zipOutputStream.putNextEntry(zipEntry); + zipOutputStream.write(excelOutputStream.toByteArray()); + zipOutputStream.closeEntry(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 将属性结构扁平化 + * + * @param list 属性结构 + * @return 扁平化数组 + */ + public static List flattenTree(List list) { + List result = new ArrayList<>(); + + for (PermissionExcel node : list) { + result.add(node); + if (node.getChildren() != null && !node.getChildren().isEmpty()) { + result.addAll(flattenTree(node.getChildren())); + } + } + + return result; + } +} diff --git a/auth-admin/src/main/java/cn/bunny/services/utils/system/RouterUtil.java b/auth-admin/src/main/java/cn/bunny/services/utils/system/RouterUtil.java index 7b29396..3c1753a 100644 --- a/auth-admin/src/main/java/cn/bunny/services/utils/system/RouterUtil.java +++ b/auth-admin/src/main/java/cn/bunny/services/utils/system/RouterUtil.java @@ -31,11 +31,11 @@ public class RouterUtil { * @param webUserRouterVoList 返回VO列表 * @return 返回路由列表 */ - public List handleGetChildrenWIthRouter(Long id, @NotNull List webUserRouterVoList) { + public List buildTreeSetChildren(Long id, @NotNull List webUserRouterVoList) { List list = new ArrayList<>(); for (WebUserRouterVo webUserRouterVo : webUserRouterVoList) { if (webUserRouterVo.getParentId().equals(id)) { - webUserRouterVo.setChildren(handleGetChildrenWIthRouter(webUserRouterVo.getId(), webUserRouterVoList)); + webUserRouterVo.setChildren(buildTreeSetChildren(webUserRouterVo.getId(), webUserRouterVoList)); list.add(webUserRouterVo); } }