mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 22:57:17 +08:00 
			
		
		
		
	feat(generator): 新增代码批量生成功能
This commit is contained in:
		| @@ -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; | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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("代码生成失败,请手动清理生成文件"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -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); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Yoofff
					Yoofff