diff --git a/generator-code/src/main/java/cn/bunny/controller/VmsController.java b/generator-code/src/main/java/cn/bunny/controller/VmsController.java index 4c62f05..ebb68b6 100644 --- a/generator-code/src/main/java/cn/bunny/controller/VmsController.java +++ b/generator-code/src/main/java/cn/bunny/controller/VmsController.java @@ -8,6 +8,7 @@ import cn.bunny.service.VmsService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -31,10 +32,16 @@ public class VmsController { return Result.success(list); } - @Operation(summary = "生成控制器", description = "生成控制器代码") + @Operation(summary = "生成代码", description = "生成代码") @PostMapping("generator") public Result> generator(@Valid @RequestBody VmsArgumentDto dto) { List list = vmsService.generator(dto); return Result.success(list); } + + @Operation(summary = "打包成zip下载", description = "打包成zip下载") + @PostMapping("downloadByZip") + public ResponseEntity downloadByZip(@Valid @RequestBody VmsArgumentDto dto) { + return vmsService.downloadByZip(dto); + } } diff --git a/generator-code/src/main/java/cn/bunny/service/VmsService.java b/generator-code/src/main/java/cn/bunny/service/VmsService.java index 1dff1c6..8f14113 100644 --- a/generator-code/src/main/java/cn/bunny/service/VmsService.java +++ b/generator-code/src/main/java/cn/bunny/service/VmsService.java @@ -3,6 +3,8 @@ package cn.bunny.service; import cn.bunny.dao.dto.VmsArgumentDto; import cn.bunny.dao.vo.GeneratorVo; import cn.bunny.dao.vo.VmsPathVo; +import jakarta.validation.Valid; +import org.springframework.http.ResponseEntity; import java.util.List; import java.util.Map; @@ -22,4 +24,12 @@ public interface VmsService { * @return vms下的文件路径 */ Map> getVmsPathList(); + + /** + * 打包成zip下载 + * + * @param dto VmsArgumentDto + * @return zip 文件 + */ + ResponseEntity downloadByZip(@Valid VmsArgumentDto dto); } diff --git a/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java b/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java index 5725339..e675ab7 100644 --- a/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java +++ b/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java @@ -9,14 +9,24 @@ import cn.bunny.service.TableService; import cn.bunny.service.VmsService; import cn.bunny.utils.ResourceFileUtil; import cn.bunny.utils.VmsUtil; +import cn.hutool.crypto.digest.MD5; import lombok.SneakyThrows; import org.apache.velocity.VelocityContext; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.StringWriter; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; @Service @@ -87,10 +97,64 @@ public class VmsServiceImpl implements VmsService { List vmsRelativeFiles = ResourceFileUtil.getRelativeFiles("vms"); return vmsRelativeFiles.stream().map(vmFile -> { - String[] filepathList = vmFile.split("/"); - String filename = filepathList[filepathList.length - 1].replace(".vm", ""); + String[] filepathList = vmFile.split("/"); + String filename = filepathList[filepathList.length - 1].replace(".vm", ""); - return VmsPathVo.builder().name(vmFile).label(filename).type(filepathList[0]).build(); - }).collect(Collectors.groupingBy(VmsPathVo::getType)); + return VmsPathVo.builder().name(vmFile).label(filename).type(filepathList[0]).build(); + }) + .collect(Collectors.groupingBy(VmsPathVo::getType)); + } + + /** + * 打包成zip下载 + * + * @param dto VmsArgumentDto + * @return zip 文件 + */ + @Override + public ResponseEntity downloadByZip(VmsArgumentDto dto) { + // 需要下载的数据 + List generatorVoList = generator(dto); + + // 1. 创建临时ZIP文件 + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + try (ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream)) { + // 2. 遍历并创建 + generatorVoList.forEach(generatorVo -> { + // zip中的路径 + String path = generatorVo.getPath().replace(".vm", ""); + + // zip中的文件 + String code = generatorVo.getCode(); + + ZipEntry zipEntry = new ZipEntry(path); + try { + // 如果有 / 会转成文件夹 + zipOutputStream.putNextEntry(zipEntry); + + // 写入文件 + zipOutputStream.write(code.getBytes(StandardCharsets.UTF_8)); + zipOutputStream.closeEntry(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // 2.1 文件不重名 + long currentTimeMillis = System.currentTimeMillis(); + String digestHex = MD5.create().digestHex(currentTimeMillis + ""); + + // 3. 准备响应 + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attachment; filename=" + "vms-" + digestHex + ".zip"); + headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); + headers.add("Pragma", "no-cache"); + headers.add("Expires", "0"); + + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); + return new ResponseEntity<>(byteArrayInputStream.readAllBytes(), headers, HttpStatus.OK); } } diff --git a/generator-code/src/test/java/cn/bunny/TimeTest.java b/generator-code/src/test/java/cn/bunny/TimeTest.java new file mode 100644 index 0000000..a765a7a --- /dev/null +++ b/generator-code/src/test/java/cn/bunny/TimeTest.java @@ -0,0 +1,14 @@ +package cn.bunny; + +import cn.hutool.crypto.digest.MD5; +import org.junit.jupiter.api.Test; + +public class TimeTest { + @Test + void timeTest() { + long currentTimeMillis = System.currentTimeMillis(); + String digestHex = MD5.create().digestHex(currentTimeMillis + ""); + System.out.println(currentTimeMillis); + System.out.println(digestHex); + } +}