diff --git a/src/main/java/cn/bunny/controller/GeneratorController.java b/src/main/java/cn/bunny/controller/GeneratorController.java index 273605a..9db9683 100644 --- a/src/main/java/cn/bunny/controller/GeneratorController.java +++ b/src/main/java/cn/bunny/controller/GeneratorController.java @@ -39,7 +39,10 @@ public class GeneratorController { @Operation(summary = "生成代码", description = "根据SQL或数据库表生成代码") @PostMapping public Result>> generator(@Valid @RequestBody VmsArgumentDto dto) { - Map> result = Strings.isEmpty(dto.getSql()) + // 判断当前是使用 SQL语句 生成还是 数据库生成 + String sql = dto.getSql(); + + Map> result = Strings.isEmpty(sql) ? generatorService.generateCodeByDatabase(dto) : generatorService.generateCodeBySql(dto); return Result.success(result); @@ -54,7 +57,10 @@ public class GeneratorController { @Operation(summary = "打包下载", description = "将生成的代码打包为ZIP文件下载") @PostMapping("downloadByZip") public ResponseEntity downloadByZip(@Valid @RequestBody VmsArgumentDto dto) { - return Strings.isEmpty(dto.getSql()) + // 判断当前是使用 SQL语句 生成还是 数据库生成 + String sql = dto.getSql(); + + return Strings.isEmpty(sql) ? generatorService.downloadByZipByDatabase(dto) : generatorService.downloadByZipBySqL(dto); } diff --git a/src/main/java/cn/bunny/domain/dto/VmsArgumentDto.java b/src/main/java/cn/bunny/domain/dto/VmsArgumentDto.java index c47f9e8..f122639 100644 --- a/src/main/java/cn/bunny/domain/dto/VmsArgumentDto.java +++ b/src/main/java/cn/bunny/domain/dto/VmsArgumentDto.java @@ -18,23 +18,23 @@ import java.util.List; public class VmsArgumentDto { @Schema(name = "author", description = "作者名称") - String author; + String author = ""; @Schema(name = "packageName", description = "包名称") @NotBlank(message = "包名不能为空") String packageName; @Schema(name = "requestMapping", description = "requestMapping 名称") - String requestMapping; + String requestMapping = ""; @Schema(name = "tableNames", description = "表名列表") private List tableNames; @Schema(name = "simpleDateFormat", description = "时间格式") - private String simpleDateFormat; + private String simpleDateFormat = "yyyy-MM-dd HH:mm:ss"; @Schema(name = "tablePrefixes", description = "去除表前缀") - private String tablePrefixes; + private String tablePrefixes = ""; @Schema(name = "path", description = "路径") @NotEmpty(message = "表名称不能为空") diff --git a/src/main/java/cn/bunny/service/helper/GeneratorServiceImplHelper.java b/src/main/java/cn/bunny/service/helper/GeneratorServiceImplHelper.java deleted file mode 100644 index 68bfaaa..0000000 --- a/src/main/java/cn/bunny/service/helper/GeneratorServiceImplHelper.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.bunny.service.helper; - -import cn.bunny.core.template.VmsTBaseTemplateGenerator; -import cn.bunny.domain.dto.VmsArgumentDto; -import cn.bunny.domain.entity.ColumnMetaData; -import cn.bunny.domain.entity.TableMetaData; -import cn.bunny.domain.vo.GeneratorVo; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -import java.util.List; -import java.util.UUID; -import java.util.stream.Stream; - -/** - * 代码生成服务辅助类 - * 提供生成器和响应实体的构建方法 - */ -public class GeneratorServiceImplHelper { - - private static final String ZIP_FILE_PREFIX = "code-"; - private static final String ZIP_FILE_SUFFIX = ".zip"; - - /** - * 获取生成器流 - * - * @param dto 生成参数 - * @param tableMeta 表元数据 - * @param columns 列信息 - * @return 生成器流 - */ - public static Stream getGeneratorStream(VmsArgumentDto dto, TableMetaData tableMeta, List columns) { - return dto.getPath().parallelStream().map(path -> { - VmsTBaseTemplateGenerator generator = new VmsTBaseTemplateGenerator(dto, path, tableMeta); - String code = generator.generateCode(tableMeta, columns).toString(); - - return GeneratorVo.builder() - .id(UUID.randomUUID().toString()) - .code(code) - .comment(tableMeta.getComment()) - .tableName(tableMeta.getTableName()) - .path(VmsGeneratorPathHelper.processVmPath(dto, path, tableMeta.getTableName())) - .build(); - }); - } - - /** - * 构建ZIP下载响应实体 - * - * @param zipBytes ZIP文件字节数组 - * @return 响应实体 - */ - public static ResponseEntity getResponseEntity(byte[] zipBytes) { - HttpHeaders headers = new HttpHeaders(); - headers.add("Content-Disposition", "attachment; filename=" + generateZipFilename()); - headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); - headers.add("Pragma", "no-cache"); - headers.add("Expires", "0"); - - return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK); - } - - /** - * 生成ZIP文件名 - */ - private static String generateZipFilename() { - return ZIP_FILE_PREFIX + UUID.randomUUID().toString().split("-")[0] + ZIP_FILE_SUFFIX; - } -} \ No newline at end of file diff --git a/src/main/java/cn/bunny/service/impl/GeneratorServiceImpl.java b/src/main/java/cn/bunny/service/impl/GeneratorServiceImpl.java index 9e48b51..2329598 100644 --- a/src/main/java/cn/bunny/service/impl/GeneratorServiceImpl.java +++ b/src/main/java/cn/bunny/service/impl/GeneratorServiceImpl.java @@ -1,23 +1,24 @@ package cn.bunny.service.impl; -import cn.bunny.core.ZipFileService; import cn.bunny.core.provider.IMetadataProvider; +import cn.bunny.core.template.VmsTBaseTemplateGenerator; import cn.bunny.domain.dto.VmsArgumentDto; import cn.bunny.domain.entity.ColumnMetaData; import cn.bunny.domain.entity.TableMetaData; import cn.bunny.domain.vo.GeneratorVo; import cn.bunny.service.GeneratorService; -import cn.bunny.service.helper.GeneratorServiceImplHelper; +import cn.bunny.service.helper.VmsGeneratorPathHelper; +import cn.bunny.utils.ZipFileUtil; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 代码生成服务实现类 @@ -29,7 +30,6 @@ public class GeneratorServiceImpl implements GeneratorService { private final IMetadataProvider databaseMetadataProvider; private final IMetadataProvider sqlMetadataProvider; - private final ZipFileService zipFileService; /** * 代码生成方法---数据库生成 @@ -43,7 +43,7 @@ public class GeneratorServiceImpl implements GeneratorService { .flatMap(tableName -> { TableMetaData tableMeta = databaseMetadataProvider.getTableMetadata(tableName); List columns = databaseMetadataProvider.getColumnInfoList(tableName); - return GeneratorServiceImplHelper.getGeneratorStream(dto, tableMeta, columns); + return getGeneratorStream(dto, tableMeta, columns); }) .collect(Collectors.groupingBy(GeneratorVo::getTableName)); } @@ -60,7 +60,7 @@ public class GeneratorServiceImpl implements GeneratorService { TableMetaData tableMeta = sqlMetadataProvider.getTableMetadata(sql); List columns = sqlMetadataProvider.getColumnInfoList(sql); - List generatorVoList = GeneratorServiceImplHelper.getGeneratorStream(dto, tableMeta, columns).toList(); + List generatorVoList = getGeneratorStream(dto, tableMeta, columns).toList(); Map> map = new HashMap<>(); map.put(tableMeta.getTableName(), generatorVoList); @@ -87,12 +87,47 @@ public class GeneratorServiceImpl implements GeneratorService { */ private ResponseEntity downloadByZip(VmsArgumentDto dto, Function>> generator) { + // 调用生成函数 List generatorVoList = generator.apply(dto) .values().stream() .flatMap(Collection::stream) .toList(); - byte[] zipBytes = zipFileService.createZipFile(generatorVoList); - return GeneratorServiceImplHelper.getResponseEntity(zipBytes); + // 创建Zip文件 + byte[] zipBytes = ZipFileUtil.createZipFile(generatorVoList); + + // 设置返回给前端的文件名 + String zipFilename = "code-" + UUID.randomUUID().toString().split("-")[0] + ".zip"; + + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attachment; filename=" + zipFilename); + headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); + headers.add("Pragma", "no-cache"); + headers.add("Expires", "0"); + + return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK); + } + + /** + * 获取生成器流 + * + * @param dto 生成参数 + * @param tableMeta 表元数据 + * @param columns 列信息 + * @return 生成器流 + */ + public Stream getGeneratorStream(VmsArgumentDto dto, TableMetaData tableMeta, List columns) { + return dto.getPath().parallelStream().map(path -> { + VmsTBaseTemplateGenerator generator = new VmsTBaseTemplateGenerator(dto, path, tableMeta); + String code = generator.generateCode(tableMeta, columns).toString(); + + return GeneratorVo.builder() + .id(UUID.randomUUID().toString()) + .code(code) + .comment(tableMeta.getComment()) + .tableName(tableMeta.getTableName()) + .path(VmsGeneratorPathHelper.processVmPath(dto, path, tableMeta.getTableName())) + .build(); + }); } } diff --git a/src/main/java/cn/bunny/core/ZipFileService.java b/src/main/java/cn/bunny/utils/ZipFileUtil.java similarity index 85% rename from src/main/java/cn/bunny/core/ZipFileService.java rename to src/main/java/cn/bunny/utils/ZipFileUtil.java index 26856b3..dd622ca 100644 --- a/src/main/java/cn/bunny/core/ZipFileService.java +++ b/src/main/java/cn/bunny/utils/ZipFileUtil.java @@ -1,8 +1,6 @@ -package cn.bunny.core; +package cn.bunny.utils; import cn.bunny.domain.vo.GeneratorVo; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -16,9 +14,7 @@ import java.util.zip.ZipOutputStream; *

* 提供将生成的代码模板打包为ZIP文件并支持下载的功能 */ -@Service -@RequiredArgsConstructor -public class ZipFileService { +public class ZipFileUtil { private static final String FILE_EXTENSION = ".vm"; private static final String UTF_8 = StandardCharsets.UTF_8.name(); @@ -30,7 +26,7 @@ public class ZipFileService { * @return ZIP文件字节数组 * @throws RuntimeException 打包失败时抛出 */ - public byte[] createZipFile(List generatorVoList) { + public static byte[] createZipFile(List generatorVoList) { try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream, StandardCharsets.UTF_8)) { @@ -48,7 +44,7 @@ public class ZipFileService { * @param generatorVo 代码生成结果对象,包含文件路径和内容 * @throws RuntimeException 当文件添加失败时抛出,包含失败文件路径信息 */ - private void addToZip(ZipOutputStream zipOutputStream, GeneratorVo generatorVo) { + private static void addToZip(ZipOutputStream zipOutputStream, GeneratorVo generatorVo) { try { String entryPath = generatorVo.getPath().replace(FILE_EXTENSION, ""); zipOutputStream.putNextEntry(new ZipEntry(entryPath)); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6c73de8..49c1f3f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -14,4 +14,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://${bunny.master.host}:${bunny.master.port}/${bunny.master.database}?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true username: ${bunny.master.username} - password: ${bunny.master.password} \ No newline at end of file + password: ${bunny.master.password} + hikari: + maximum-pool-size: 20 + connection-timeout: 30000 \ No newline at end of file