diff --git a/continew-admin-generator/src/main/java/top/charles7c/continew/admin/generator/config/properties/GeneratorProperties.java b/continew-admin-generator/src/main/java/top/charles7c/continew/admin/generator/config/properties/GeneratorProperties.java index d8f94972..684af7bf 100644 --- a/continew-admin-generator/src/main/java/top/charles7c/continew/admin/generator/config/properties/GeneratorProperties.java +++ b/continew-admin-generator/src/main/java/top/charles7c/continew/admin/generator/config/properties/GeneratorProperties.java @@ -16,6 +16,7 @@ package top.charles7c.continew.admin.generator.config.properties; +import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.map.MapUtil; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -71,5 +72,15 @@ public class GeneratorProperties { * 排除字段 */ private String[] excludeFields; + + /** + * 扩展名 + */ + private String extension = FileNameUtil.EXT_JAVA; + + /** + * 是否为后端模板 + */ + private boolean backend = true; } } diff --git a/continew-admin-generator/src/main/java/top/charles7c/continew/admin/generator/service/impl/GeneratorServiceImpl.java b/continew-admin-generator/src/main/java/top/charles7c/continew/admin/generator/service/impl/GeneratorServiceImpl.java index 54b3e652..a081e207 100644 --- a/continew-admin-generator/src/main/java/top/charles7c/continew/admin/generator/service/impl/GeneratorServiceImpl.java +++ b/continew-admin-generator/src/main/java/top/charles7c/continew/admin/generator/service/impl/GeneratorServiceImpl.java @@ -21,7 +21,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; @@ -227,7 +226,7 @@ public class GeneratorServiceImpl implements GeneratorService { .lastIndexOfIgnoreCase(packageName, StringConstants.DOT) + 1); genConfigMap.put("apiModuleName", apiModuleName); genConfigMap.put("apiName", StrUtil.lowerFirst(genConfig.getClassNamePrefix())); - // 渲染后端代码 + // 渲染代码 String classNamePrefix = genConfig.getClassNamePrefix(); Map templateConfigMap = generatorProperties.getTemplateConfigs(); for (Map.Entry templateConfigEntry : templateConfigMap.entrySet()) { @@ -235,27 +234,22 @@ public class GeneratorServiceImpl implements GeneratorService { String className = classNamePrefix + StrUtil.nullToEmpty(templateConfigEntry.getKey()); genConfigMap.put("className", className); TemplateConfig templateConfig = templateConfigEntry.getValue(); - String content = TemplateUtils.render(templateConfig.getTemplatePath(), genConfigMap); + boolean isBackend = templateConfig.isBackend(); + String extension = templateConfig.getExtension(); GeneratePreviewResp generatePreview = new GeneratePreviewResp(); - generatePreview.setFileName(className + FileNameUtil.EXT_JAVA); - generatePreview.setContent(content); - generatePreview.setBackend(true); + generatePreview.setBackend(isBackend); generatePreviewList.add(generatePreview); + if (isBackend) { + generatePreview.setFileName(className + extension); + generatePreview.setContent(TemplateUtils.render(templateConfig.getTemplatePath(), genConfigMap)); + } else { + generatePreview.setFileName(".vue".equals(extension) && "index".equals(templateConfigEntry.getKey()) + ? "index.vue" + : this.getFrontendFileName(classNamePrefix, className, extension)); + genConfigMap.put("fieldConfigs", fieldConfigList); + generatePreview.setContent(TemplateUtils.render(templateConfig.getTemplatePath(), genConfigMap)); + } } - // 渲染前端代码 - // api 代码 - genConfigMap.put("fieldConfigs", fieldConfigList); - String apiContent = TemplateUtils.render("api.ftl", genConfigMap); - GeneratePreviewResp apiGeneratePreview = new GeneratePreviewResp(); - apiGeneratePreview.setFileName(classNamePrefix.toLowerCase() + ".ts"); - apiGeneratePreview.setContent(apiContent); - generatePreviewList.add(apiGeneratePreview); - // view 代码 - String viewContent = TemplateUtils.render("index.ftl", genConfigMap); - GeneratePreviewResp viewGeneratePreview = new GeneratePreviewResp(); - viewGeneratePreview.setFileName("index.vue"); - viewGeneratePreview.setContent(viewContent); - generatePreviewList.add(viewGeneratePreview); return generatePreviewList; } @@ -265,45 +259,12 @@ public class GeneratorServiceImpl implements GeneratorService { String tempDir = SystemUtil.getUserInfo().getTempDir(); // 删除旧代码 FileUtil.del(tempDir + projectProperties.getAppName()); - tableNames.forEach(tableName -> { // 初始化配置及数据 List generatePreviewList = this.preview(tableName); - GenConfigDO genConfig = genConfigMapper.selectById(tableName); - // 生成后端代码 - Map> generatePreviewListMap = generatePreviewList.stream() - .collect(Collectors.groupingBy(GeneratePreviewResp::isBackend)); - this.generateBackendCode(generatePreviewListMap.get(true), genConfig); - // 生成前端代码 - List frontendGeneratePreviewList = generatePreviewListMap.get(false); - String packageName = genConfig.getPackageName(); - String moduleName = StrUtil.subSuf(packageName, StrUtil - .lastIndexOfIgnoreCase(packageName, StringConstants.DOT) + 1); - - // 例如:continew-admin-ui/src - String frontendBasicPackagePath = tempDir + String.join(File.separator, projectProperties - .getAppName(), projectProperties.getAppName() + "-ui", "src"); - // 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); - } + // 生成代码 + this.generateCode(generatePreviewList, genConfigMapper.selectById(tableName)); }); - // 打包下载 File tempDirFile = new File(tempDir, projectProperties.getAppName()); String zipFilePath = tempDirFile.getPath() + jodd.io.ZipUtil.ZIP_EXT; @@ -316,27 +277,46 @@ public class GeneratorServiceImpl implements GeneratorService { } /** - * 生成后端代码 + * 生成代码 * * @param generatePreviewList 生成预览列表 * @param genConfig 生成配置 */ - private void generateBackendCode(List generatePreviewList, GenConfigDO genConfig) { + private void generateCode(List generatePreviewList, GenConfigDO genConfig) { + // 获取前后端基础路径 String backendBasicPackagePath = this.buildBackendBasicPackagePath(genConfig); + String frontendBasicPackagePath = SystemUtil.getUserInfo().getTempDir() + String + .join(File.separator, projectProperties.getAppName(), projectProperties.getAppName() + "-ui"); + String packageName = genConfig.getPackageName(); + String moduleName = StrUtil.subSuf(packageName, StrUtil + .lastIndexOfIgnoreCase(packageName, StringConstants.DOT) + 1); + // 生成代码 Map templateConfigMap = generatorProperties.getTemplateConfigs(); for (GeneratePreviewResp generatePreview : generatePreviewList) { // 获取对应模板配置 - TemplateConfig templateConfig = templateConfigMap.get(generatePreview.getFileName() - .replace(genConfig.getClassNamePrefix(), StringConstants.EMPTY) - .replace(FileNameUtil.EXT_JAVA, StringConstants.EMPTY)); - // 例如:continew-admin/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl - String packagePath = String.join(File.separator, backendBasicPackagePath, templateConfig.getPackageName() - .replace(StringConstants.DOT, File.separator)); - // 例如:continew-admin/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/XxxServiceImpl.java - File classFile = new File(packagePath, generatePreview.getFileName()); + TemplateConfig templateConfig = templateConfigMap.getOrDefault(StrUtil.subBefore(generatePreview + .getFileName(), StringConstants.DOT, true) + .replace(genConfig.getClassNamePrefix(), StringConstants.EMPTY), templateConfigMap.get("api")); + String packagePath; + if (generatePreview.isBackend()) { + // 例如:continew-admin/continew-system/src/main/java/top/continew/admin/system/service/impl + packagePath = String.join(File.separator, backendBasicPackagePath, templateConfig.getPackageName() + .replace(StringConstants.DOT, File.separator)); + } else { + // 例如:continew-admin/continew-admin-ui/src/views/system + packagePath = String.join(File.separator, frontendBasicPackagePath, templateConfig.getPackageName() + .replace(StringConstants.SLASH, File.separator), moduleName); + // 例如:continew-admin/continew-admin-ui/src/views/system/user + packagePath = ".vue".equals(templateConfig.getExtension()) + ? packagePath + File.separator + StrUtil.lowerFirst(genConfig.getClassNamePrefix()) + : packagePath; + } + // 后端:continew-admin/continew-system/src/main/java/top/continew/admin/system/service/impl/XxxServiceImpl.java + // 前端:continew-admin/continew-admin-ui/src/views/system/user/index.vue + File file = new File(packagePath, generatePreview.getFileName()); // 如果已经存在,且不允许覆盖,则跳过 - if (!classFile.exists() || Boolean.TRUE.equals(genConfig.getIsOverride())) { - FileUtil.writeUtf8String(generatePreview.getContent(), classFile); + if (!file.exists() || Boolean.TRUE.equals(genConfig.getIsOverride())) { + FileUtil.writeUtf8String(generatePreview.getContent(), file); } } } @@ -348,13 +328,25 @@ public class GeneratorServiceImpl implements GeneratorService { * @return 后端包路径 */ private String buildBackendBasicPackagePath(GenConfigDO genConfig) { - // 例如:continew-admin/continew-admin-system/src/main/java/top/charles7c/continew/admin/system + // 例如:continew-admin/continew-system/src/main/java/top/continew/admin/system return SystemUtil.getUserInfo().getTempDir() + String.join(File.separator, projectProperties .getAppName(), projectProperties.getAppName(), genConfig.getModuleName(), "src", "main", "java", genConfig .getPackageName() .replace(StringConstants.DOT, File.separator)); } + /** + * 获取前端文件名 + * + * @param classNamePrefix 类名前缀 + * @param className 类名 + * @param extension 扩展名 + * @return 前端文件名 + */ + private String getFrontendFileName(String classNamePrefix, String className, String extension) { + return (".ts".equals(extension) ? StrUtil.lowerFirst(classNamePrefix) : className) + extension; + } + /** * 预处理生成配置 * diff --git a/continew-admin-generator/src/main/resources/templates/api.ftl b/continew-admin-generator/src/main/resources/templates/api.ftl deleted file mode 100644 index a23e5253..00000000 --- a/continew-admin-generator/src/main/resources/templates/api.ftl +++ /dev/null @@ -1,57 +0,0 @@ -import axios from 'axios'; -import qs from 'query-string'; - -const BASE_URL = '/${apiModuleName}/${apiName}'; - -export interface DataRecord { -<#if fieldConfigs??> -<#list fieldConfigs as fieldConfig> - ${fieldConfig.fieldName}?: string; - - createUserString?: string; - updateUserString?: string; - -} - -export interface ListParam { -<#if fieldConfigs??> -<#list fieldConfigs as fieldConfig> - <#if fieldConfig.showInQuery> - ${fieldConfig.fieldName}?: string; - - - - page?: number; - size?: number; - sort?: Array; -} - -export interface ListRes { - list: DataRecord[]; - total: number; -} - -export function list(params: ListParam) { - return axios.get(`${'$'}{BASE_URL}`, { - params, - paramsSerializer: (obj) => { - return qs.stringify(obj); - }, - }); -} - -export function get(id: string) { - return axios.get(`${'$'}{BASE_URL}/${'$'}{id}`); -} - -export function add(req: DataRecord) { - return axios.post(BASE_URL, req); -} - -export function update(req: DataRecord, id: string) { - return axios.put(`${'$'}{BASE_URL}/${'$'}{id}`, req); -} - -export function del(ids: string | Array) { - return axios.delete(`${'$'}{BASE_URL}/${'$'}{ids}`); -} diff --git a/continew-admin-generator/src/main/resources/templates/Controller.ftl b/continew-admin-generator/src/main/resources/templates/backend/Controller.ftl similarity index 100% rename from continew-admin-generator/src/main/resources/templates/Controller.ftl rename to continew-admin-generator/src/main/resources/templates/backend/Controller.ftl diff --git a/continew-admin-generator/src/main/resources/templates/DetailResp.ftl b/continew-admin-generator/src/main/resources/templates/backend/DetailResp.ftl similarity index 100% rename from continew-admin-generator/src/main/resources/templates/DetailResp.ftl rename to continew-admin-generator/src/main/resources/templates/backend/DetailResp.ftl diff --git a/continew-admin-generator/src/main/resources/templates/Entity.ftl b/continew-admin-generator/src/main/resources/templates/backend/Entity.ftl similarity index 100% rename from continew-admin-generator/src/main/resources/templates/Entity.ftl rename to continew-admin-generator/src/main/resources/templates/backend/Entity.ftl diff --git a/continew-admin-generator/src/main/resources/templates/Mapper.ftl b/continew-admin-generator/src/main/resources/templates/backend/Mapper.ftl similarity index 100% rename from continew-admin-generator/src/main/resources/templates/Mapper.ftl rename to continew-admin-generator/src/main/resources/templates/backend/Mapper.ftl diff --git a/continew-admin-generator/src/main/resources/templates/Query.ftl b/continew-admin-generator/src/main/resources/templates/backend/Query.ftl similarity index 100% rename from continew-admin-generator/src/main/resources/templates/Query.ftl rename to continew-admin-generator/src/main/resources/templates/backend/Query.ftl diff --git a/continew-admin-generator/src/main/resources/templates/Req.ftl b/continew-admin-generator/src/main/resources/templates/backend/Req.ftl similarity index 100% rename from continew-admin-generator/src/main/resources/templates/Req.ftl rename to continew-admin-generator/src/main/resources/templates/backend/Req.ftl diff --git a/continew-admin-generator/src/main/resources/templates/Resp.ftl b/continew-admin-generator/src/main/resources/templates/backend/Resp.ftl similarity index 100% rename from continew-admin-generator/src/main/resources/templates/Resp.ftl rename to continew-admin-generator/src/main/resources/templates/backend/Resp.ftl diff --git a/continew-admin-generator/src/main/resources/templates/Service.ftl b/continew-admin-generator/src/main/resources/templates/backend/Service.ftl similarity index 100% rename from continew-admin-generator/src/main/resources/templates/Service.ftl rename to continew-admin-generator/src/main/resources/templates/backend/Service.ftl diff --git a/continew-admin-generator/src/main/resources/templates/ServiceImpl.ftl b/continew-admin-generator/src/main/resources/templates/backend/ServiceImpl.ftl similarity index 100% rename from continew-admin-generator/src/main/resources/templates/ServiceImpl.ftl rename to continew-admin-generator/src/main/resources/templates/backend/ServiceImpl.ftl diff --git a/continew-admin-generator/src/main/resources/templates/frontend/AddModal.ftl b/continew-admin-generator/src/main/resources/templates/frontend/AddModal.ftl new file mode 100644 index 00000000..493b6a63 --- /dev/null +++ b/continew-admin-generator/src/main/resources/templates/frontend/AddModal.ftl @@ -0,0 +1,103 @@ + + + diff --git a/continew-admin-generator/src/main/resources/templates/frontend/DetailDrawer.ftl b/continew-admin-generator/src/main/resources/templates/frontend/DetailDrawer.ftl new file mode 100644 index 00000000..bf5eabc3 --- /dev/null +++ b/continew-admin-generator/src/main/resources/templates/frontend/DetailDrawer.ftl @@ -0,0 +1,41 @@ + + + + + diff --git a/continew-admin-generator/src/main/resources/templates/frontend/api.ftl b/continew-admin-generator/src/main/resources/templates/frontend/api.ftl new file mode 100644 index 00000000..842978e3 --- /dev/null +++ b/continew-admin-generator/src/main/resources/templates/frontend/api.ftl @@ -0,0 +1,58 @@ +import http from '@/utils/http' + +const BASE_URL = '/${apiModuleName}/${apiName}' + +export interface ${classNamePrefix}Resp { +<#if fieldConfigs??> +<#list fieldConfigs as fieldConfig> + <#if fieldConfig.showInList> + ${fieldConfig.fieldName}: string + + + createUserString: string + updateUserString: string + +} +export interface ${classNamePrefix}DetailResp { +<#if fieldConfigs??> +<#list fieldConfigs as fieldConfig> + ${fieldConfig.fieldName}: string + + createUserString: string + updateUserString: string + +} +export interface ${classNamePrefix}Query extends PageQuery { +<#if fieldConfigs??> +<#list fieldConfigs as fieldConfig> + <#if fieldConfig.showInQuery> + ${fieldConfig.fieldName}: string + + + +} + +/** @desc 查询${businessName}列表 */ +export function list${classNamePrefix}(query: ${classNamePrefix}Query) { + return http.get>(`${'$'}{BASE_URL}`, query) +} + +/** @desc 查询${businessName}详情 */ +export function get${classNamePrefix}(id: string) { + return http.get<${classNamePrefix}DetailResp>(`${'$'}{BASE_URL}/${'$'}{id}`) +} + +/** @desc 新增${businessName} */ +export function add${classNamePrefix}(data: any) { + return http.post(`${'$'}{BASE_URL}`, data) +} + +/** @desc 修改${businessName} */ +export function update${classNamePrefix}(data: any, id: string) { + return http.put(`${'$'}{BASE_URL}/${'$'}{id}`, data) +} + +/** @desc 删除${businessName} */ +export function delete${classNamePrefix}(id: string) { + return http.del(`${'$'}{BASE_URL}/${'$'}{id}`) +} diff --git a/continew-admin-generator/src/main/resources/templates/frontend/index.ftl b/continew-admin-generator/src/main/resources/templates/frontend/index.ftl new file mode 100644 index 00000000..22cbf013 --- /dev/null +++ b/continew-admin-generator/src/main/resources/templates/frontend/index.ftl @@ -0,0 +1,148 @@ + + + + + diff --git a/continew-admin-generator/src/main/resources/templates/index.ftl b/continew-admin-generator/src/main/resources/templates/index.ftl deleted file mode 100644 index 09259a9d..00000000 --- a/continew-admin-generator/src/main/resources/templates/index.ftl +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - - diff --git a/continew-admin-webapi/pom.xml b/continew-admin-webapi/pom.xml index b3b6ba23..10010bf1 100644 --- a/continew-admin-webapi/pom.xml +++ b/continew-admin-webapi/pom.xml @@ -43,6 +43,7 @@ continew-admin-generator + top.charles7c.continew continew-admin-system diff --git a/continew-admin-webapi/src/main/resources/config/application-generator.yml b/continew-admin-webapi/src/main/resources/config/application-generator.yml index 59f17133..c686c7c9 100644 --- a/continew-admin-webapi/src/main/resources/config/application-generator.yml +++ b/continew-admin-webapi/src/main/resources/config/application-generator.yml @@ -42,7 +42,7 @@ generator: templateConfigs: DO: # 模板路径 - templatePath: Entity.ftl + templatePath: backend/Entity.ftl # 包名称 packageName: model.entity # 排除字段 @@ -53,20 +53,20 @@ generator: - updateUser - updateTime Query: - templatePath: Query.ftl + templatePath: backend/Query.ftl packageName: model.query Req: - templatePath: Req.ftl + templatePath: backend/Req.ftl packageName: model.req Resp: - templatePath: Resp.ftl + templatePath: backend/Resp.ftl packageName: model.resp excludeFields: - id - createUser - createTime DetailResp: - templatePath: DetailResp.ftl + templatePath: backend/DetailResp.ftl packageName: model.resp excludeFields: - id @@ -75,14 +75,34 @@ generator: - updateUser - updateTime Mapper: - templatePath: Mapper.ftl + templatePath: backend/Mapper.ftl packageName: mapper Service: - templatePath: Service.ftl + templatePath: backend/Service.ftl packageName: service ServiceImpl: - templatePath: ServiceImpl.ftl + templatePath: backend/ServiceImpl.ftl packageName: service.impl Controller: - templatePath: Controller.ftl - packageName: controller \ No newline at end of file + templatePath: backend/Controller.ftl + packageName: controller + api: + templatePath: frontend/api.ftl + packageName: src/apis + extension: .ts + backend: false + index: + templatePath: frontend/index.ftl + packageName: src/views + extension: .vue + backend: false + AddModal: + templatePath: frontend/AddModal.ftl + packageName: src/views + extension: .vue + backend: false + DetailDrawer: + templatePath: frontend/DetailDrawer.ftl + packageName: src/views + extension: .vue + backend: false \ No newline at end of file