feat: 使用json或excel导入导出权限

This commit is contained in:
bunny 2025-04-28 10:40:38 +08:00
parent cc3d9243d2
commit ef5accd5e0
8 changed files with 172 additions and 31 deletions

View File

@ -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<String> uploadI18nFile(@Valid I18nUpdateByFileDto dto) {
i18nService.uploadI18nFile(dto);

View File

@ -74,14 +74,14 @@ public class PermissionController {
@Operation(summary = "导出权限", description = "导出权限为Excel")
@GetMapping("file/export")
public ResponseEntity<byte[]> exportPermission() {
return permissionService.exportPermission();
public ResponseEntity<byte[]> exportPermission(String type) {
return permissionService.exportPermission(type);
}
@Operation(summary = "导入权限", description = "导入权限")
@PutMapping("file/import")
public Result<String> importPermission(@RequestParam(value = "file") MultipartFile file) {
permissionService.importPermission(file);
public Result<String> importPermission(@RequestParam(value = "file") MultipartFile file, String type) {
permissionService.importPermission(file, type);
return Result.success(ResultCodeEnum.SUCCESS);
}

View File

@ -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<PermissionExcel> children = new ArrayList<>();
}

View File

@ -70,14 +70,16 @@ public interface PermissionService extends IService<Permission> {
/**
* 导出权限为Excel
*
* @param type 导出类型
* @return Excel 文件
*/
ResponseEntity<byte[]> exportPermission();
ResponseEntity<byte[]> exportPermission(String type);
/**
* 导入权限
*
* @param file 导入的Excel
* @param type 导出类型
*/
void importPermission(MultipartFile file);
void importPermission(MultipartFile file, String type);
}

View File

@ -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<PermissionMapper, Permiss
/**
* 导出权限为Excel
*
* @param type 导出类型
* @return Excel 文件
*/
@Override
public ResponseEntity<byte[]> exportPermission() {
public ResponseEntity<byte[]> 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<Permission> permissionList = list();
List<PermissionExcel> permissionExcelList = permissionList.stream().map(permission -> {
List<PermissionExcel> permissionExcelList = list().stream().map(permission -> {
PermissionExcel permissionExcel = new PermissionExcel();
BeanUtils.copyProperties(permission, permissionExcel);
return permissionExcel;
}).toList();
// 构建树型结构
List<PermissionExcel> 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<PermissionExcel> list = JSON.parseObject(json, new TypeReference<>() {
});
// 格式化数据保存到数据库
List<PermissionExcel> flattenedTree = PermissionUtil.flattenTree(list);
List<Permission> 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);
}

View File

@ -81,7 +81,7 @@ public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> 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);
}
});

View File

@ -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<PermissionExcel> buildTree(List<PermissionExcel> list) {
List<PermissionExcel> 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<PermissionExcel> list) {
List<PermissionExcel> 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<PermissionExcel> 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<PermissionExcel> 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<PermissionExcel> flattenTree(List<PermissionExcel> list) {
List<PermissionExcel> result = new ArrayList<>();
for (PermissionExcel node : list) {
result.add(node);
if (node.getChildren() != null && !node.getChildren().isEmpty()) {
result.addAll(flattenTree(node.getChildren()));
}
}
return result;
}
}

View File

@ -31,11 +31,11 @@ public class RouterUtil {
* @param webUserRouterVoList 返回VO列表
* @return 返回路由列表
*/
public List<WebUserRouterVo> handleGetChildrenWIthRouter(Long id, @NotNull List<WebUserRouterVo> webUserRouterVoList) {
public List<WebUserRouterVo> buildTreeSetChildren(Long id, @NotNull List<WebUserRouterVo> webUserRouterVoList) {
List<WebUserRouterVo> 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);
}
}