feat(generator): 新增代码批量生成功能

This commit is contained in:
Yoofff 2024-03-23 13:52:17 +00:00 committed by Charles7c
parent c05584ba66
commit 040f137934
4 changed files with 63 additions and 44 deletions

View File

@ -72,4 +72,14 @@ public class TableResp implements Serializable {
*/ */
@Schema(description = "是否已配置", example = "true") @Schema(description = "是否已配置", example = "true")
private Boolean isConfiged; private Boolean isConfiged;
/**
* 是否禁用
*/
@Schema(description = "是否禁用", example = "true")
private Boolean disabled;
public Boolean getDisabled() {
return !isConfiged;
}
} }

View File

@ -85,9 +85,9 @@ public interface GeneratorService {
/** /**
* 生成代码 * 生成代码
* *
* @param tableName 表名称 * @param tableNames 表明层
* @param request 请求对象 * @param request 请求对象
* @param response 响应对象 * @param response 响应对象
*/ */
void generate(String tableName, HttpServletRequest request, HttpServletResponse response); void generate(List<String> tableNames, HttpServletRequest request, HttpServletResponse response);
} }

View File

@ -260,50 +260,57 @@ public class GeneratorServiceImpl implements GeneratorService {
} }
@Override @Override
public void generate(String tableName, HttpServletRequest request, HttpServletResponse response) { public void generate(List<String> tableNames, HttpServletRequest request, HttpServletResponse response) {
try { try {
// 初始化配置及数据
List<GeneratePreviewResp> generatePreviewList = this.preview(tableName);
GenConfigDO genConfig = genConfigMapper.selectById(tableName);
// 生成后端代码
Map<Boolean, List<GeneratePreviewResp>> generatePreviewListMap = generatePreviewList.stream()
.collect(Collectors.groupingBy(GeneratePreviewResp::isBackend));
this.generateBackendCode(generatePreviewListMap.get(true), genConfig);
// 生成前端代码
List<GeneratePreviewResp> frontendGeneratePreviewList = generatePreviewListMap.get(false);
String packageName = genConfig.getPackageName();
String moduleName = StrUtil.subSuf(packageName, StrUtil
.lastIndexOfIgnoreCase(packageName, StringConstants.DOT) + 1);
String tempDir = SystemUtil.getUserInfo().getTempDir(); String tempDir = SystemUtil.getUserInfo().getTempDir();
// 例如continew-admin-ui/src // 删除旧代码
String frontendBasicPackagePath = tempDir + String.join(File.separator, projectProperties FileUtil.del(tempDir + projectProperties.getAppName());
.getAppName(), projectProperties.getAppName() + "-ui", "src");
// 1生成 api 代码 tableNames.forEach(tableName -> {
GeneratePreviewResp apiGeneratePreview = frontendGeneratePreviewList.get(0); // 初始化配置及数据
// 例如continew-admin-ui/src/src/api/system List<GeneratePreviewResp> generatePreviewList = this.preview(tableName);
String apiPath = String.join(File.separator, frontendBasicPackagePath, "api", moduleName); GenConfigDO genConfig = genConfigMapper.selectById(tableName);
// 例如continew-admin-ui/src/api/system/user.ts // 生成后端代码
File apiFile = new File(apiPath, apiGeneratePreview.getFileName()); Map<Boolean, List<GeneratePreviewResp>> generatePreviewListMap = generatePreviewList.stream()
if (!apiFile.exists() || Boolean.TRUE.equals(genConfig.getIsOverride())) { .collect(Collectors.groupingBy(GeneratePreviewResp::isBackend));
FileUtil.writeUtf8String(apiGeneratePreview.getContent(), apiFile); this.generateBackendCode(generatePreviewListMap.get(true), genConfig);
} // 生成前端代码
// 2生成 view 代码 List<GeneratePreviewResp> frontendGeneratePreviewList = generatePreviewListMap.get(false);
GeneratePreviewResp viewGeneratePreview = frontendGeneratePreviewList.get(1); String packageName = genConfig.getPackageName();
// 例如continew-admin-ui/src/views/system String moduleName = StrUtil.subSuf(packageName, StrUtil
String vuePath = String.join(File.separator, frontendBasicPackagePath, "views", moduleName, StrUtil .lastIndexOfIgnoreCase(packageName, StringConstants.DOT) + 1);
.lowerFirst(genConfig.getClassNamePrefix()));
// 例如continew-admin-ui/src/views/system/user/index.vue // 例如continew-admin-ui/src
File vueFile = new File(vuePath, viewGeneratePreview.getFileName()); String frontendBasicPackagePath = tempDir + String.join(File.separator, projectProperties
if (!vueFile.exists() || Boolean.TRUE.equals(genConfig.getIsOverride())) { .getAppName(), projectProperties.getAppName() + "-ui", "src");
FileUtil.writeUtf8String(viewGeneratePreview.getContent(), vueFile); // 1生成 api 代码
} GeneratePreviewResp apiGeneratePreview = frontendGeneratePreviewList.get(0);
// 例如continew-admin-ui/src/src/api/system
String apiPath = String.join(File.separator, frontendBasicPackagePath, "api", moduleName);
// 例如continew-admin-ui/src/api/system/user.ts
File apiFile = new File(apiPath, apiGeneratePreview.getFileName());
if (!apiFile.exists() || Boolean.TRUE.equals(genConfig.getIsOverride())) {
FileUtil.writeUtf8String(apiGeneratePreview.getContent(), apiFile);
}
// 2生成 view 代码
GeneratePreviewResp viewGeneratePreview = frontendGeneratePreviewList.get(1);
// 例如continew-admin-ui/src/views/system
String vuePath = String.join(File.separator, frontendBasicPackagePath, "views", moduleName, StrUtil
.lowerFirst(genConfig.getClassNamePrefix()));
// 例如continew-admin-ui/src/views/system/user/index.vue
File vueFile = new File(vuePath, viewGeneratePreview.getFileName());
if (!vueFile.exists() || Boolean.TRUE.equals(genConfig.getIsOverride())) {
FileUtil.writeUtf8String(viewGeneratePreview.getContent(), vueFile);
}
});
// 打包下载 // 打包下载
File tempDirFile = new File(tempDir, projectProperties.getAppName()); File tempDirFile = new File(tempDir, projectProperties.getAppName());
String zipFilePath = tempDirFile.getPath() + ".zip"; String zipFilePath = tempDirFile.getPath() + jodd.io.ZipUtil.ZIP_EXT;
ZipUtil.zip(tempDirFile.getPath(), zipFilePath); ZipUtil.zip(tempDirFile.getPath(), zipFilePath);
FileUploadUtils.download(request, response, new File(zipFilePath), true); FileUploadUtils.download(request, response, new File(zipFilePath), true);
} catch (Exception e) { } catch (Exception e) {
log.error("Generate code of table '{}' occurred an error. {}", tableName, e.getMessage(), e); log.error("Generate code of table '{}' occurred an error. {}", tableNames, e.getMessage(), e);
throw new BusinessException("代码生成失败,请手动清理生成文件"); throw new BusinessException("代码生成失败,请手动清理生成文件");
} }
} }

View File

@ -102,8 +102,10 @@ public class GeneratorController {
@Operation(summary = "生成代码", description = "生成代码") @Operation(summary = "生成代码", description = "生成代码")
@Parameter(name = "tableName", description = "表名称", required = true, example = "sys_user", in = ParameterIn.PATH) @Parameter(name = "tableName", description = "表名称", required = true, example = "sys_user", in = ParameterIn.PATH)
@SaCheckPermission("tool:generator:list") @SaCheckPermission("tool:generator:list")
@PostMapping("/{tableName}") @PostMapping("/{tableNames}")
public void generate(@PathVariable String tableName, HttpServletRequest request, HttpServletResponse response) { public void generate(@PathVariable List<String> tableNames,
generatorService.generate(tableName, request, response); HttpServletRequest request,
HttpServletResponse response) {
generatorService.generate(tableNames, request, response);
} }
} }