feat: 使用json或excel导入导出权限
This commit is contained in:
parent
cc3d9243d2
commit
ef5accd5e0
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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<>();
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue