diff --git a/snowy-admin-web/src/api/gen/genBasicApi.js b/snowy-admin-web/src/api/gen/genBasicApi.js new file mode 100644 index 00000000..b0a43234 --- /dev/null +++ b/snowy-admin-web/src/api/gen/genBasicApi.js @@ -0,0 +1,45 @@ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/gen/basic/${url}`, ...arg) + +export default { + // 获取代码生成基础分页 + basicPage(data) { + return request('page', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除代码生成基础 + basicDelete(data) { + return request('delete', data) + }, + // 获取代码生成基础详情 + basicDetail(data) { + return request('detail', data, 'get') + }, + // 获取所有表信息 + basicTables(data) { + return request('tables', data, 'get') + }, + // 获取表内所有字段信息 + basicTableColumns(data) { + return request('tableColumns', data, 'get') + }, + // 执行代码生成 压缩包 + basicExecGenBiz(data) { + const options = { + responseType: 'blob' + } + return request('execGenZip', data, 'get', options) + }, + // 执行代码生成 项目内 + basicExecGenPro(data) { + return request('execGenPro', data) + }, + // 预览代码生成 + basicPreviewGen(data) { + return request('previewGen', data, 'get') + } +} diff --git a/snowy-admin-web/src/api/gen/genConfigApi.js b/snowy-admin-web/src/api/gen/genConfigApi.js new file mode 100644 index 00000000..7d881a26 --- /dev/null +++ b/snowy-admin-web/src/api/gen/genConfigApi.js @@ -0,0 +1,26 @@ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/gen/config/${url}`, ...arg) + +export default { + // 获取代码生成详情配置列表 + configList(data) { + return request('list', data, 'get') + }, + // 提交表单 edit为true时为编辑,默认为新增 + submitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除代码生成详情配置 + configDelete(data) { + return request('delete', data) + }, + // 获取代码生成详情配置详情 + configDetail(data) { + return request('detail', data, 'get') + }, + // 批量编辑代码生成详细配置 + configEditBatch(data) { + return request('editBatch', data) + } +} diff --git a/snowy-admin-web/src/utils/tool.js b/snowy-admin-web/src/utils/tool.js index 4105e7d8..2fa58708 100644 --- a/snowy-admin-web/src/utils/tool.js +++ b/snowy-admin-web/src/utils/tool.js @@ -108,6 +108,24 @@ tool.dictTypeList = (dictValue) => { return [] } +// 获取某个code下字典的列表,基于dictTypeList 改进,保留老的,逐步替换 +tool.dictList = (dictValue) => { + const dictTypeTree = tool.dictDataAll() + if (!dictTypeTree) { + return [] + } + const tree = dictTypeTree.find((item) => item.dictValue === dictValue) + if (tree) { + return tree.children.map((item) => { + return { + value: item['dictValue'], + label: item['name'] + } + }) + } + return [] +} + // 生成UUID tool.snowyUuid = () => { let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { diff --git a/snowy-admin-web/src/views/gen/basic.vue b/snowy-admin-web/src/views/gen/basic.vue new file mode 100644 index 00000000..b8524c1b --- /dev/null +++ b/snowy-admin-web/src/views/gen/basic.vue @@ -0,0 +1,378 @@ + + + + diff --git a/snowy-admin-web/src/views/gen/config.vue b/snowy-admin-web/src/views/gen/config.vue new file mode 100644 index 00000000..1041e87a --- /dev/null +++ b/snowy-admin-web/src/views/gen/config.vue @@ -0,0 +1,406 @@ + + + + diff --git a/snowy-admin-web/src/views/gen/index.vue b/snowy-admin-web/src/views/gen/index.vue new file mode 100644 index 00000000..ab15aafa --- /dev/null +++ b/snowy-admin-web/src/views/gen/index.vue @@ -0,0 +1,213 @@ + + + diff --git a/snowy-admin-web/src/views/gen/preview.vue b/snowy-admin-web/src/views/gen/preview.vue new file mode 100644 index 00000000..d3107773 --- /dev/null +++ b/snowy-admin-web/src/views/gen/preview.vue @@ -0,0 +1,79 @@ + + + diff --git a/snowy-admin-web/src/views/gen/steps.vue b/snowy-admin-web/src/views/gen/steps.vue new file mode 100644 index 00000000..01ff94ca --- /dev/null +++ b/snowy-admin-web/src/views/gen/steps.vue @@ -0,0 +1,164 @@ + + + diff --git a/snowy-plugin-api/pom.xml b/snowy-plugin-api/pom.xml index a30a0961..5a3e4aef 100644 --- a/snowy-plugin-api/pom.xml +++ b/snowy-plugin-api/pom.xml @@ -27,6 +27,9 @@ snowy-plugin-dev-api + + snowy-plugin-gen-api + snowy-plugin-sys-api diff --git a/snowy-plugin-api/snowy-plugin-gen-api/README.md b/snowy-plugin-api/snowy-plugin-gen-api/README.md new file mode 100644 index 00000000..cf90cc6f --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-gen-api/README.md @@ -0,0 +1 @@ +# 代码生成插件api接口 \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-gen-api/pom.xml b/snowy-plugin-api/snowy-plugin-gen-api/pom.xml new file mode 100644 index 00000000..b8ecd146 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-gen-api/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin-api + 2.0.0 + + + snowy-plugin-gen-api + jar + 代码生成插件api接口 + + + + + vip.xiaonuo + snowy-common + ${project.parent.version} + + + \ No newline at end of file diff --git a/snowy-plugin-api/snowy-plugin-gen-api/src/main/java/vip/xiaonuo/gen/package-info.java b/snowy-plugin-api/snowy-plugin-gen-api/src/main/java/vip/xiaonuo/gen/package-info.java new file mode 100644 index 00000000..b969cb1f --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-gen-api/src/main/java/vip/xiaonuo/gen/package-info.java @@ -0,0 +1,13 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen; diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysButtonApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysButtonApi.java new file mode 100644 index 00000000..bde0a905 --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysButtonApi.java @@ -0,0 +1,30 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.api; + +/** + * 按钮API + * + * @author xuyuxiang + * @date 2022/11/1 13:45 + **/ +public interface SysButtonApi { + + /** + * 代码生成按钮插入 + * + * @author xuyuxiang + * @date 2022/11/1 13:48 + **/ + void addForGenButton(String menuId, String className, String functionName); +} diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysMenuApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysMenuApi.java new file mode 100644 index 00000000..33534b5a --- /dev/null +++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysMenuApi.java @@ -0,0 +1,30 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.api; + +/** + * 菜单API + * + * @author xuyuxiang + * @date 2022/11/1 13:44 + **/ +public interface SysMenuApi { + + /** + * 代码生成菜单插入 + * + * @author xuyuxiang + * @date 2022/11/1 13:48 + **/ + String addForGenMenu(String parentId, String busName, String module, String title, String path); +} diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java index 5e0e4ed4..b0fdab2a 100644 --- a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java +++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysRoleApi.java @@ -39,4 +39,12 @@ public interface SysRoleApi { * @date 2022/7/22 14:49 **/ List roleSelector(String orgId, String category, String searchKey); + + /** + * 代码生成菜单按钮授权 + * + * @author xuyuxiang + * @date 2022/11/1 15:58 + **/ + void grantForGenMenuAndButton(String menuId); } diff --git a/snowy-plugin/pom.xml b/snowy-plugin/pom.xml index 92d9db4a..1c90c934 100644 --- a/snowy-plugin/pom.xml +++ b/snowy-plugin/pom.xml @@ -27,6 +27,9 @@ snowy-plugin-dev + + snowy-plugin-gen + snowy-plugin-sys diff --git a/snowy-plugin/snowy-plugin-gen/README.md b/snowy-plugin/snowy-plugin-gen/README.md new file mode 100644 index 00000000..53c11bd8 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/README.md @@ -0,0 +1 @@ +# 代码生成插件 diff --git a/snowy-plugin/snowy-plugin-gen/pom.xml b/snowy-plugin/snowy-plugin-gen/pom.xml new file mode 100644 index 00000000..3ef12172 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + + vip.xiaonuo + snowy-plugin + 2.0.0 + + + snowy-plugin-gen + jar + 代码生成插件 + + + 1.31.0 + 1.2.40.Beetl.RELEASE + + + + + + vip.xiaonuo + snowy-plugin-gen-api + ${project.parent.version} + + + + + vip.xiaonuo + snowy-plugin-sys-api + ${project.parent.version} + + + + + com.ibeetl + beetl-framework-starter + ${beetl.version} + + + diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/config/GenConfigure.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/config/GenConfigure.java new file mode 100644 index 00000000..d1af964f --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/config/GenConfigure.java @@ -0,0 +1,68 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.core.config; + + +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.RequestMethod; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import vip.xiaonuo.common.pojo.CommonResult; + +import javax.annotation.Resource; + +/** + * 代码生成相关配置 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Configuration +public class GenConfigure { + + @Resource + private OpenApiExtensionResolver openApiExtensionResolver; + + /** + * API文档分组配置 + * + * @author xuyuxiang + * @date 2022/7/7 16:18 + **/ + @Bean(value = "genDocApi") + public Docket sysDocApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + .title("代码生成GEN") + .description("代码生成GEN") + .termsOfServiceUrl("https://www.xiaonuo.vip") + .contact(new Contact("SNOWY_TEAM","https://www.xiaonuo.vip", "xiaonuobase@qq.com")) + .version("2.0.0") + .build()) + .globalResponseMessage(RequestMethod.GET, CommonResult.responseList()) + .globalResponseMessage(RequestMethod.POST, CommonResult.responseList()) + .groupName("代码生成GEN") + .select() + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .apis(RequestHandlerSelectors.basePackage("vip.xiaonuo.gen")) + .paths(PathSelectors.any()) + .build().extensions(openApiExtensionResolver.buildExtensions("代码生成GEN")); + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/enums/GenBuildInEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/enums/GenBuildInEnum.java new file mode 100644 index 00000000..e433e289 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/enums/GenBuildInEnum.java @@ -0,0 +1,26 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.core.enums; + +import lombok.Getter; + +/** + * 代码生成标识枚举 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +public enum GenBuildInEnum { + +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/util/GenDbTypeUtil.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/util/GenDbTypeUtil.java new file mode 100644 index 00000000..245efe48 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/core/util/GenDbTypeUtil.java @@ -0,0 +1,91 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.core.util; + +import cn.hutool.core.util.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import vip.xiaonuo.gen.modular.basic.enums.GenJavaTypeEnum; + +/** + * 数据库类型工具类 + * + * @author xuyuxiang + * @date 2022/10/26 16:33 + **/ +@Slf4j +public class GenDbTypeUtil { + + /** + * 根据数据库字段类型获取Java类型 + * + * @author xuyuxiang + * @date 2022/10/26 16:34 + **/ + public static String getJavaTypeBySqlType(String dataType) { + if(ObjectUtil.isEmpty(dataType)) { + log.info(">>> 字段的数据库类型为空,使用默认值String"); + return GenJavaTypeEnum.String.getValue(); + } + dataType = dataType.toUpperCase(); + if(dataType.startsWith("INT")) { + //如果以int开头,则直接返回int,兼容pgsql中int2 int8等 + return GenJavaTypeEnum.Integer.getValue(); + } + switch(dataType){ + case "NVARCHAR": + case "NVARCHAR2": + case "CHAR": + case "VARCHAR": + case "ENUM": + case "SET": + case "TEXT": + case "LONGTEXT": + case "NCHAR": + case "BLOB": + case "NCLOB": + case "IMAGE": + return GenJavaTypeEnum.String.getValue(); + case "INTEGER": + case "BIGINT": + case "NUMBER": + case "ID": + return GenJavaTypeEnum.Long.getValue(); + case "TINYINT": + case "SMALLINT": + case "MEDIUMINT": + return GenJavaTypeEnum.Integer.getValue(); + case "BIT": + case "BOOLEAN": + return GenJavaTypeEnum.Boolean.getValue(); + case "FLOAT": + return GenJavaTypeEnum.Float.getValue(); + case "DOUBLE": + case "MONEY": + case "SMALLMONEY": + return GenJavaTypeEnum.Double.getValue(); + case "DECIMAL": + case "NUMERIC": + case "REAL": + return GenJavaTypeEnum.BigDecimal.getValue(); + case "DATE": + case "DATETIME": + case "YEAR": + case "TIME": + case "TIMESTAMP": + return GenJavaTypeEnum.Date.getValue(); + default: + log.info(">>> 字段的数据库类型:{}无法匹配,使用默认值String", dataType); + return GenJavaTypeEnum.String.getValue(); + } + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/controller/GenBasicController.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/controller/GenBasicController.java new file mode 100644 index 00000000..03512e81 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/controller/GenBasicController.java @@ -0,0 +1,197 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.gen.modular.basic.entity.GenBasic; +import vip.xiaonuo.gen.modular.basic.param.*; +import vip.xiaonuo.gen.modular.basic.result.GenBasicPreviewResult; +import vip.xiaonuo.gen.modular.basic.result.GenBasicTableColumnResult; +import vip.xiaonuo.gen.modular.basic.result.GenBasicTableResult; +import vip.xiaonuo.gen.modular.basic.service.GenBasicService; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.io.IOException; +import java.util.List; + +/** + * 代码生成基础控制器 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Api(tags = "代码生成基础控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 1) +@RestController +@Validated +public class GenBasicController { + + @Resource + private GenBasicService genBasicService; + + /** + * 获取代码生成基础分页 + * + * @author yubaoshan + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取代码生成基础分页") + @GetMapping("/gen/basic/page") + public CommonResult> page(GenBasicPageParam genBasicPageParam) { + return CommonResult.data(genBasicService.page(genBasicPageParam)); + } + + /** + * 添加代码生成基础 + * + * @author yubaoshan + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加代码生成基础") + @CommonLog("添加代码生成基础") + @PostMapping("/gen/basic/add") + public CommonResult add(@RequestBody @Valid GenBasicAddParam genBasicAddParam) { + return CommonResult.data(genBasicService.add(genBasicAddParam)); + } + + /** + * 编辑代码生成基础 + * + * @author yubaoshan + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑代码生成基础") + @CommonLog("编辑代码生成基础") + @PostMapping("/gen/basic/edit") + public CommonResult edit(@RequestBody @Valid GenBasicEditParam genBasicEditParam) { + return CommonResult.data(genBasicService.edit(genBasicEditParam)); + } + + /** + * 删除代码生成基础 + * + * @author yubaoshan + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除代码生成基础") + @CommonLog("删除代码生成基础") + @PostMapping("/gen/basic/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList genBasicIdParamList) { + genBasicService.delete(genBasicIdParamList); + return CommonResult.ok(); + } + + /** + * 获取代码生成基础详情 + * + * @author yubaoshan + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取代码生成基础详情") + @GetMapping("/gen/basic/detail") + public CommonResult detail(@Valid GenBasicIdParam genBasicIdParam) { + return CommonResult.data(genBasicService.detail(genBasicIdParam)); + } + + /** + * 获取所有表信息 + * + * @author yubaoshan + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 6) + @ApiOperation("获取所有表信息") + @GetMapping("/gen/basic/tables") + public CommonResult> dbsTable() { + return CommonResult.data(genBasicService.tables()); + } + + /** + * 获取表内所有字段信息 + * + * @author yubaoshan + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 7) + @ApiOperation("获取表内所有字段信息") + @GetMapping("/gen/basic/tableColumns") + public CommonResult> tableColumns(GenBasicTableColumnParam genBasicTableColumnParam) { + return CommonResult.data(genBasicService.tableColumns(genBasicTableColumnParam)); + } + + /** + * 执行代码生成 + * + * @author xuyuxiang + * @date 2022/6/21 15:44 + **/ + @ApiOperationSupport(order = 8) + @ApiOperation("执行代码生成(压缩包)") + @CommonLog("执行代码生成(压缩包)") + @GetMapping(value = "/gen/basic/execGenZip", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + public void execGenZip(@Valid GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException { + genBasicService.execGenZip(genBasicIdParam, response); + } + + /** + * 执行代码生成 + * + * @author yubaoshan + * @date 2022/10/31 02:17 + **/ + @ApiOperationSupport(order = 9) + @ApiOperation("执行代码生成(项目内)") + @CommonLog("执行代码生成(项目内)") + @PostMapping(value = "/gen/basic/execGenPro") + public CommonResult execGenPro(@RequestBody @Valid GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException { + genBasicService.execGenPro(genBasicIdParam, response); + return CommonResult.ok(); + } + + /** + * 预览代码生成 + * + * @author xuyuxiang + * @date 2022/6/21 15:44 + **/ + @ApiOperationSupport(order = 10) + @ApiOperation("预览代码生成") + @CommonLog("预览代码生成") + @GetMapping(value = "/gen/basic/previewGen") + public CommonResult previewGen(@Valid GenBasicIdParam genBasicIdParam) { + return CommonResult.data(genBasicService.previewGen(genBasicIdParam)); + } +} + diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/entity/GenBasic.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/entity/GenBasic.java new file mode 100644 index 00000000..9bb6ab17 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/entity/GenBasic.java @@ -0,0 +1,91 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 代码生成基础 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +@Setter +@TableName("GEN_BASIC") +public class GenBasic extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 主表名称 */ + @ApiModelProperty(value = "主表名称", position = 2) + private String dbTable; + + /** 主表主键 */ + @ApiModelProperty(value = "主表主键", position = 3) + private String dbTableKey; + + /** 表前缀移除 */ + @ApiModelProperty(value = "表前缀移除", position = 4) + private String tablePrefix; + + /** 生成方式 */ + @ApiModelProperty(value = "生成方式", position = 5) + private String generateType; + + /** 所属模块 */ + @ApiModelProperty(value = "所属模块", position = 6) + private String module; + + /** 上级目录 */ + @ApiModelProperty(value = "上级目录", position = 7) + private String menuPid; + + /** 功能名 */ + @ApiModelProperty(value = "功能名", position = 8) + private String functionName; + + /** 业务名 */ + @ApiModelProperty(value = "业务名", position = 9) + private String busName; + + /** 类名 */ + @ApiModelProperty(value = "类名", position = 10) + private String className; + + /** 表单布局 */ + @ApiModelProperty(value = "表单布局", position = 11) + private String formLayout; + + /** 使用栅格 */ + @ApiModelProperty(value = "使用栅格", position = 12) + private String gridWhether; + + /** 排序 */ + @ApiModelProperty(value = "排序", position = 13) + private Integer sortCode; + + /** 包名 */ + @ApiModelProperty(value = "包名", position = 14) + private String packageName; + + /** 作者 */ + @ApiModelProperty(value = "作者", position = 15) + private String authorName; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenEffectTypeEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenEffectTypeEnum.java new file mode 100644 index 00000000..2cafb21f --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenEffectTypeEnum.java @@ -0,0 +1,58 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.enums; + +import lombok.Getter; + +/** + * 作用类型枚举 + * + * @author xuyuxiang + * @date 2022/10/28 9:57 + **/ +@Getter +public enum GenEffectTypeEnum { + + /** 输入框 */ + INPUT("INPUT"), + + /** 文本框 */ + TEXTAREA("TEXTAREA"), + + /** 下拉框 */ + SELECT("SELECT"), + + /** 单选框 */ + RADIO("RADIO"), + + /** 复选框 */ + CHECKBOX("CHECKBOX"), + + /** 日期选择器 */ + DATEPICKER("DATEPICKER"), + + /** 时间选择器 */ + TIMEPICKER("TIMEPICKER"), + + /** 数字输入框 */ + INPUTNUMBER("INPUTNUMBER"), + + /** 滑动数字条 */ + SLIDER("SLIDER"); + + private final String value; + + GenEffectTypeEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenJavaTypeEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenJavaTypeEnum.java new file mode 100644 index 00000000..c0100535 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenJavaTypeEnum.java @@ -0,0 +1,55 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.enums; + +import lombok.Getter; + +/** + * Java类型枚举 + * + * @author xuyuxiang + * @date 2022/10/28 9:57 + **/ +@Getter +public enum GenJavaTypeEnum { + + /** Integer */ + Integer("Integer"), + + /** Long */ + Long("Long"), + + /** String */ + String("String"), + + /** Boolean */ + Boolean("Boolean"), + + /** Float */ + Float("Float"), + + /** Double */ + Double("Double"), + + /** Date */ + Date("Date"), + + /** BigDecimal */ + BigDecimal("BigDecimal"); + + private final String value; + + GenJavaTypeEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenTypeEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenTypeEnum.java new file mode 100644 index 00000000..85042a27 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenTypeEnum.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.enums; + +import lombok.Getter; + +/** + * 生成方式枚举 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +public enum GenTypeEnum { + + /** 压缩包 */ + ZIP("ZIP"), + + /** 项目内 */ + PRO("PRO"); + + private final String value; + + GenTypeEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenYesNoEnum.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenYesNoEnum.java new file mode 100644 index 00000000..b20caccc --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/enums/GenYesNoEnum.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.enums; + +import lombok.Getter; + +/** + * 是与否枚举 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +public enum GenYesNoEnum { + + /** 是 */ + Y("Y"), + + /** 否 */ + N("N"); + + private final String value; + + GenYesNoEnum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/GenBasicMapper.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/GenBasicMapper.java new file mode 100644 index 00000000..c9cf1b4a --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/GenBasicMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.gen.modular.basic.entity.GenBasic; + +/** + * 代码生成基础Mapper接口 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +public interface GenBasicMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/mapping/GenBasicMapper.xml b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/mapping/GenBasicMapper.xml new file mode 100644 index 00000000..1f181892 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/mapper/mapping/GenBasicMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicAddParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicAddParam.java new file mode 100644 index 00000000..7931651b --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicAddParam.java @@ -0,0 +1,98 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; + +/** + * 代码生成基础添加参数 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +@Setter +public class GenBasicAddParam { + + /** 主表名称 */ + @ApiModelProperty(value = "主表名称", required = true, position = 1) + @NotNull(message = "dbTable不能为空") + private String dbTable; + + /** 主表主键 */ + @ApiModelProperty(value = "主表主键", required = true, position = 2) + @NotNull(message = "dbTableKey不能为空") + private String dbTableKey; + + /** 表前缀移除 */ + @ApiModelProperty(value = "表前缀移除", required = true, position = 3) + @NotNull(message = "tablePrefix不能为空") + private String tablePrefix; + + /** 生成方式 */ + @ApiModelProperty(value = "生成方式", required = true, position = 4) + @NotNull(message = "generateType不能为空") + private String generateType; + + /** 所属模块 */ + @ApiModelProperty(value = "所属模块", required = true, position = 5) + @NotNull(message = "module不能为空") + private String module; + + /** 上级目录 */ + @ApiModelProperty(value = "上级目录", required = true, position = 6) + @NotNull(message = "menuPid不能为空") + private String menuPid; + + /** 功能名 */ + @ApiModelProperty(value = "功能名", required = true, position = 7) + @NotNull(message = "functionName不能为空") + private String functionName; + + /** 业务名 */ + @ApiModelProperty(value = "业务名", required = true, position = 8) + @NotNull(message = "busName不能为空") + private String busName; + + /** 类名 */ + @ApiModelProperty(value = "类名", required = true, position = 9) + @NotNull(message = "className不能为空") + private String className; + + /** 表单布局 */ + @ApiModelProperty(value = "表单布局", required = true, position = 10) + @NotNull(message = "formLayout不能为空") + private String formLayout; + + /** 使用栅格 */ + @ApiModelProperty(value = "使用栅格", required = true, position = 11) + @NotNull(message = "gridWhether不能为空") + private String gridWhether; + + /** 排序 */ + @ApiModelProperty(value = "排序", required = true, position = 12) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 作者名 */ + @ApiModelProperty(value = "作者名", required = true, position = 13) + private String authorName; + + /** 包名 */ + @ApiModelProperty(value = "包名", required = true, position = 14) + private String packageName; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicEditParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicEditParam.java new file mode 100644 index 00000000..07390b4a --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicEditParam.java @@ -0,0 +1,104 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; + +/** + * 代码生成基础编辑参数 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +@Setter +public class GenBasicEditParam { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + @NotNull(message = "id不能为空") + private String id; + + /** 主表名称 */ + @ApiModelProperty(value = "主表名称", position = 2) + @NotNull(message = "dbTable不能为空") + private String dbTable; + + /** 主表主键 */ + @ApiModelProperty(value = "主表主键", position = 3) + @NotNull(message = "dbTableKey不能为空") + private String dbTableKey; + + /** 表前缀移除 */ + @ApiModelProperty(value = "表前缀移除", position = 4) + @NotNull(message = "tablePrefix不能为空") + private String tablePrefix; + + /** 生成方式 */ + @ApiModelProperty(value = "生成方式", position = 5) + @NotNull(message = "generateType不能为空") + private String generateType; + + /** 所属模块 */ + @ApiModelProperty(value = "所属模块", position = 6) + @NotNull(message = "module不能为空") + private String module; + + /** 上级目录 */ + @ApiModelProperty(value = "上级目录", position = 7) + @NotNull(message = "menuPid不能为空") + private String menuPid; + + /** 功能名 */ + @ApiModelProperty(value = "功能名", position = 8) + @NotNull(message = "functionName不能为空") + private String functionName; + + /** 业务名 */ + @ApiModelProperty(value = "业务名", position = 9) + @NotNull(message = "busName不能为空") + private String busName; + + /** 类名 */ + @ApiModelProperty(value = "类名", position = 10) + @NotNull(message = "className不能为空") + private String className; + + /** 表单布局 */ + @ApiModelProperty(value = "表单布局", position = 11) + @NotNull(message = "formLayout不能为空") + private String formLayout; + + /** 使用栅格 */ + @ApiModelProperty(value = "使用栅格", position = 12) + @NotNull(message = "gridWhether不能为空") + private String gridWhether; + + /** 排序 */ + @ApiModelProperty(value = "排序", position = 13) + @NotNull(message = "sortCode不能为空") + private Integer sortCode; + + /** 作者名 */ + @ApiModelProperty(value = "作者名", required = true, position = 14) + @NotNull(message = "authorName不能为空") + private String authorName; + + /** 包名 */ + @ApiModelProperty(value = "包名 */", position = 15) + private String packageName; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicIdParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicIdParam.java new file mode 100644 index 00000000..b17ca2d7 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 代码生成基础Id参数 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +@Setter +public class GenBasicIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicPageParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicPageParam.java new file mode 100644 index 00000000..9dde4ce5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicPageParam.java @@ -0,0 +1,44 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 代码生成基础查询参数 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ +@Getter +@Setter +public class GenBasicPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicTableColumnParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicTableColumnParam.java new file mode 100644 index 00000000..4bfc3e30 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/param/GenBasicTableColumnParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 数据源库字段列表参数 + * + * @author xuyuxiang + * @date 2022/7/29 9:59 + */ +@Getter +@Setter +public class GenBasicTableColumnParam { + + /** 表名称 */ + @ApiModelProperty(value = "表名称", required = true) + @NotBlank(message = "表名称不能为空") + private String tableName; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicPreviewResult.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicPreviewResult.java new file mode 100644 index 00000000..c5429fc2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicPreviewResult.java @@ -0,0 +1,59 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 预览代码生成结果 + * + * @author xuyuxiang + * @date 2022/10/28 17:03 + **/ +@Getter +@Setter +public class GenBasicPreviewResult { + + /** SQL代码结果集 */ + @ApiModelProperty(value = "SQL代码结果集", position = 1) + private List genBasicCodeSqlResultList; + + /** 前端代码结果集 */ + @ApiModelProperty(value = "前端代码结果集", position = 2) + private List genBasicCodeFrontendResultList; + + /** 后端代码结果集 */ + @ApiModelProperty(value = "后端代码结果集", position = 3) + private List genBasicCodeBackendResultList; + + @Getter + @Setter + public static class GenBasicCodeResult { + + /** 代码文件名称 */ + @ApiModelProperty(value = "代码文件名称", position = 1) + private String codeFileName; + + /** 代码文件带路径名称 */ + @ApiModelProperty(value = "代码文件带路径名称", position = 2) + private String codeFileWithPathName; + + /** 代码文件内容 */ + @ApiModelProperty(value = "代码文件内容", position = 2) + private String codeFileContent; + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableColumnResult.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableColumnResult.java new file mode 100644 index 00000000..0572fc99 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableColumnResult.java @@ -0,0 +1,40 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 数据库表字段结果 + * + * @author xuyuxiang + * @date 2022/7/19 19:06 + **/ +@Getter +@Setter +public class GenBasicTableColumnResult { + + /** 字段名称 */ + @ApiModelProperty(value = "字段名称", position = 1) + private String columnName; + + /** 字段类型 */ + @ApiModelProperty(value = "字段类型", position = 2) + private String typeName; + + /** 字段注释 */ + @ApiModelProperty(value = "字段注释", position = 3) + private String columnRemark; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableResult.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableResult.java new file mode 100644 index 00000000..698c7ef4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/result/GenBasicTableResult.java @@ -0,0 +1,36 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 数据库表结果 + * + * @author xuyuxiang + * @date 2022/7/19 19:06 + **/ +@Getter +@Setter +public class GenBasicTableResult { + + /** 表名称 */ + @ApiModelProperty(value = "表名称", position = 1) + private String tableName; + + /** 表注释 */ + @ApiModelProperty(value = "表注释", position = 2) + private String tableRemark; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/GenBasicService.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/GenBasicService.java new file mode 100644 index 00000000..5ac4969a --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/GenBasicService.java @@ -0,0 +1,122 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.gen.modular.basic.entity.GenBasic; +import vip.xiaonuo.gen.modular.basic.param.*; +import vip.xiaonuo.gen.modular.basic.result.GenBasicPreviewResult; +import vip.xiaonuo.gen.modular.basic.result.GenBasicTableColumnResult; +import vip.xiaonuo.gen.modular.basic.result.GenBasicTableResult; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +/** + * 代码生成基础Service接口 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +public interface GenBasicService extends IService { + + /** + * 查询代码生成基础分页 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ + Page page(GenBasicPageParam genBasicPageParam); + + /** + * 添加代码生成基础 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ + GenBasic add(GenBasicAddParam genBasicAddParam); + + /** + * 编辑代码生成基础 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ + GenBasic edit(GenBasicEditParam genBasicEditParam); + + /** + * 删除代码生成基础 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ + void delete(List genBasicIdParamList); + + /** + * 获取代码生成基础详情 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ + GenBasic detail(GenBasicIdParam genBasicIdParam); + + /** + * 获取代码生成基础详情 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ + GenBasic queryEntity(String id); + + /** + * 获取所有表信息 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ + List tables(); + + /** + * 获取表内所有字段信息 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ + List tableColumns(GenBasicTableColumnParam genBasicTableColumnParam); + + /** + * 执行代码生成 + * + * @author xuyuxiang yubaoshan + * @date 2022/10/28 9:37 + **/ + void execGenZip(GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException; + + /** + * 执行代码生成 + * + * @author xuyuxiang + * @date 2022/10/28 9:37 + **/ + void execGenPro(GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException; + + /** + * 预览代码生成 + * + * @author xuyuxiang + * @date 2022/10/28 17:08 + **/ + GenBasicPreviewResult previewGen(GenBasicIdParam genBasicIdParam); +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/impl/GenBasicServiceImpl.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/impl/GenBasicServiceImpl.java new file mode 100644 index 00000000..18cdfb2c --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/basic/service/impl/GenBasicServiceImpl.java @@ -0,0 +1,640 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.basic.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.beetl.core.Configuration; +import org.beetl.core.GroupTemplate; +import org.beetl.core.Template; +import org.beetl.core.resource.ClasspathResourceLoader; +import org.springframework.core.env.Environment; +import org.springframework.jdbc.support.JdbcUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.common.page.CommonPageRequest; +import vip.xiaonuo.common.util.CommonDownloadUtil; +import vip.xiaonuo.common.util.CommonResponseUtil; +import vip.xiaonuo.gen.core.util.GenDbTypeUtil; +import vip.xiaonuo.gen.modular.basic.entity.GenBasic; +import vip.xiaonuo.gen.modular.basic.enums.GenEffectTypeEnum; +import vip.xiaonuo.gen.modular.basic.enums.GenYesNoEnum; +import vip.xiaonuo.gen.modular.basic.mapper.GenBasicMapper; +import vip.xiaonuo.gen.modular.basic.param.*; +import vip.xiaonuo.gen.modular.basic.result.GenBasicPreviewResult; +import vip.xiaonuo.gen.modular.basic.result.GenBasicTableColumnResult; +import vip.xiaonuo.gen.modular.basic.result.GenBasicTableResult; +import vip.xiaonuo.gen.modular.basic.service.GenBasicService; +import vip.xiaonuo.gen.modular.config.entity.GenConfig; +import vip.xiaonuo.gen.modular.config.param.GenConfigAddParam; +import vip.xiaonuo.gen.modular.config.service.GenConfigService; +import vip.xiaonuo.sys.api.SysButtonApi; +import vip.xiaonuo.sys.api.SysMenuApi; +import vip.xiaonuo.sys.api.SysRoleApi; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 代码生成基础Service接口实现类 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Service +public class GenBasicServiceImpl extends ServiceImpl implements GenBasicService { + + private static final String DB_URL_KEY = "spring.datasource.dynamic.datasource.master.url"; + + private static final String DB_USERNAME_KEY = "spring.datasource.dynamic.datasource.master.username"; + + private static final String DB_PASSWORD_KEY = "spring.datasource.dynamic.datasource.master.password"; + + private static final String MODULE_KEY = "biz"; + + private static final String GEN_PROJECT_FRONT_PLUGIN_KEY = "snowy-admin-web"; + + private static final String GEN_PROJECT_PLUGIN_KEY = "snowy-plugin"; + + private static final String GEN_PROJECT_PLUGIN_BIZ_KEY = GEN_PROJECT_PLUGIN_KEY + File.separator + "snowy-plugin-biz"; + + private static final List GEN_SQL_FILE_LIST = CollectionUtil.newArrayList( + JSONUtil.createObj().set("name", "Mysql.sql.btl"), + JSONUtil.createObj().set("name", "Oracle.sql.btl")); + + private static final List GEN_FRONT_FILE_LIST = CollectionUtil.newArrayList( + JSONUtil.createObj().set("name", "Api.js.btl").set("path", "api" + File.separator + MODULE_KEY), + JSONUtil.createObj().set("name", "form.vue.btl").set("path", "views" + File.separator + MODULE_KEY), + JSONUtil.createObj().set("name", "index.vue.btl").set("path", "views" + File.separator + MODULE_KEY)); + + private static final List GEN_BACKEND_FILE_LIST = CollectionUtil.newArrayList( + JSONUtil.createObj().set("name", "Controller.java.btl").set("path", "controller"), + JSONUtil.createObj().set("name", "Entity.java.btl").set("path", "entity"), + JSONUtil.createObj().set("name", "Enum.java.btl").set("path", "enums"), + JSONUtil.createObj().set("name", "Mapper.java.btl").set("path", "mapper"), + JSONUtil.createObj().set("name", "Mapper.xml.btl").set("path", "mapper" + File.separator + "mapping"), + JSONUtil.createObj().set("name", "AddParam.java.btl").set("path", "param"), + JSONUtil.createObj().set("name", "EditParam.java.btl").set("path", "param"), + JSONUtil.createObj().set("name", "IdParam.java.btl").set("path", "param"), + JSONUtil.createObj().set("name", "PageParam.java.btl").set("path", "param"), + JSONUtil.createObj().set("name", "Service.java.btl").set("path", "service"), + JSONUtil.createObj().set("name", "ServiceImpl.java.btl").set("path", "service" + File.separator + "impl")); + + private static final String SORT_CODE_KEY = "SORT_CODE"; + + private static final String CREATE_USER_KEY = "CREATE_USER"; + + private static final String CREATE_TIME_KEY = "CREATE_TIME"; + + private static final String UPDATE_USER_KEY = "UPDATE_USER"; + + private static final String UPDATE_TIME_KEY = "UPDATE_TIME"; + + @Resource + private Environment environment; + + @Resource + private MybatisPlusProperties mybatisPlusProperties; + + @Resource + private GenConfigService genConfigService; + + @Resource + private SysMenuApi sysMenuApi; + + @Resource + private SysButtonApi sysButtonApi; + + @Resource + private SysRoleApi sysRoleApi; + + @Override + public Page page(GenBasicPageParam genBasicPageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if(ObjectUtil.isAllNotEmpty(genBasicPageParam.getSortField(), genBasicPageParam.getSortOrder())) { + CommonSortOrderEnum.validate(genBasicPageParam.getSortOrder()); + queryWrapper.orderBy(true, genBasicPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(genBasicPageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(GenBasic::getSortCode); + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public GenBasic add(GenBasicAddParam genBasicAddParam) { + GenBasic genBasic = BeanUtil.toBean(genBasicAddParam, GenBasic.class); + this.save(genBasic); + GenBasicTableColumnParam tableColumnParam = new GenBasicTableColumnParam(); + tableColumnParam.setTableName(genBasic.getDbTable()); + List resultList = this.tableColumns(tableColumnParam); + for (int i = 0; i < resultList.size(); i++) { + GenBasicTableColumnResult item = resultList.get(i); + GenConfigAddParam addParam = new GenConfigAddParam(); + addParam.setBasicId(genBasic.getId()); + if (item.getColumnName().equals(genBasic.getDbTableKey())) { + addParam.setIsTableKey(GenYesNoEnum.Y.getValue()); + } else { + addParam.setIsTableKey(GenYesNoEnum.N.getValue()); + } + addParam.setFieldName(item.getColumnName()); + addParam.setFieldType(item.getTypeName()); + addParam.setFieldRemark(item.getColumnRemark()); + addParam.setFieldJavaType(GenDbTypeUtil.getJavaTypeBySqlType(item.getTypeName())); + addParam.setEffectType(GenEffectTypeEnum.INPUT.getValue().toLowerCase()); + // 除主键、删除标志、创建人、创建时间、修改人和修改时间外,所有默认在列表显示、在增改显示、非列省略、非必填,非查询 + String logicDeleteField = mybatisPlusProperties.getGlobalConfig().getDbConfig().getLogicDeleteField(); + if(ObjectUtil.isEmpty(logicDeleteField)) { + logicDeleteField = "DELETE_FLAG"; + } + if(genBasic.getDbTableKey().equalsIgnoreCase(item.getColumnName()) || + logicDeleteField.equalsIgnoreCase(item.getColumnName()) || + CREATE_USER_KEY.equalsIgnoreCase(item.getColumnName()) || + CREATE_TIME_KEY.equalsIgnoreCase(item.getColumnName()) || + UPDATE_USER_KEY.equalsIgnoreCase(item.getColumnName()) || + UPDATE_TIME_KEY.equalsIgnoreCase(item.getColumnName())) { + addParam.setWhetherTable(GenYesNoEnum.N.getValue()); + addParam.setWhetherAddUpdate(GenYesNoEnum.N.getValue()); + } else { + addParam.setWhetherTable(GenYesNoEnum.Y.getValue()); + addParam.setWhetherAddUpdate(GenYesNoEnum.Y.getValue()); + } + addParam.setWhetherRetract(GenYesNoEnum.N.getValue()); + addParam.setWhetherRequired(GenYesNoEnum.N.getValue()); + addParam.setQueryWhether(GenYesNoEnum.N.getValue()); + addParam.setSortCode(i); + GenConfig genConfig = BeanUtil.toBean(addParam, GenConfig.class); + genConfigService.save(genConfig); + } + return genBasic; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public GenBasic edit(GenBasicEditParam genBasicEditParam) { + GenBasic genBasic = this.queryEntity(genBasicEditParam.getId()); + BeanUtil.copyProperties(genBasicEditParam, genBasic); + this.updateById(genBasic); + return genBasic; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List genBasicIdParamList) { + List basicIdIdList = CollStreamUtil.toList(genBasicIdParamList, GenBasicIdParam::getId); + if(ObjectUtil.isNotEmpty(basicIdIdList)) { + // 级联删除配置 + genConfigService.remove(new LambdaQueryWrapper().in(GenConfig::getBasicId, basicIdIdList)); + // 执行删除 + this.removeBatchByIds(basicIdIdList); + } + } + + @Override + public GenBasic detail(GenBasicIdParam genBasicIdParam) { + return this.queryEntity(genBasicIdParam.getId()); + } + + @Override + public GenBasic queryEntity(String id) { + GenBasic genBasic = this.getById(id); + if(ObjectUtil.isEmpty(genBasic)) { + throw new CommonException("代码生成基础不存在,id值为:{}", id); + } + return genBasic; + } + + @Override + public List tables() { + Connection conn = null; + ResultSet rs = null; + try { + conn = DriverManager.getConnection(Objects.requireNonNull(environment.getProperty(DB_URL_KEY)), + Objects.requireNonNull(environment.getProperty(DB_USERNAME_KEY)), + Objects.requireNonNull(environment.getProperty(DB_PASSWORD_KEY))); + DatabaseMetaData metaData = conn.getMetaData(); + String url = metaData.getURL(); + String schema = null; + if (url.toLowerCase().contains("oracle")) { + schema = metaData.getUserName(); + } + List tables = new ArrayList<>(); + rs = metaData.getTables(null, schema, "%", new String[]{"TABLE", "VIEW"}); + while (rs.next()) { + String tableName = rs.getString("TABLE_NAME").toUpperCase(); + if (!tableName.startsWith("ACT_")) { + GenBasicTableResult genBasicTableResult = new GenBasicTableResult(); + genBasicTableResult.setTableName(tableName); + String remarks = rs.getString("REMARKS"); + if(ObjectUtil.isEmpty(remarks)) { + genBasicTableResult.setTableRemark(tableName); + } else { + genBasicTableResult.setTableRemark(remarks); + } + tables.add(genBasicTableResult); + } + } + return tables; + } catch (SQLException sqlException) { + sqlException.printStackTrace(); + throw new CommonException("获取数据库表失败"); + } finally { + JdbcUtils.closeResultSet(rs); + JdbcUtils.closeConnection(conn); + } + } + + @Override + public List tableColumns(GenBasicTableColumnParam genBasicTableColumnParam) { + Connection conn = null; + ResultSet rs = null; + try { + conn = DriverManager.getConnection(Objects.requireNonNull(environment.getProperty(DB_URL_KEY)), + Objects.requireNonNull(environment.getProperty(DB_USERNAME_KEY)), + Objects.requireNonNull(environment.getProperty(DB_PASSWORD_KEY))); + DatabaseMetaData metaData = conn.getMetaData(); + String url = metaData.getURL(); + String schema = null; + if (url.toLowerCase().contains("oracle")) { + schema = metaData.getUserName(); + } + List columns = new ArrayList<>(); + rs = metaData.getColumns(null, schema, genBasicTableColumnParam.getTableName(), "%"); + while (rs.next()) { + String columnName = rs.getString("COLUMN_NAME").toUpperCase(); + GenBasicTableColumnResult genBasicTableColumnResult = new GenBasicTableColumnResult(); + genBasicTableColumnResult.setColumnName(columnName); + String remarks = rs.getString("REMARKS"); + if(ObjectUtil.isEmpty(remarks)) { + genBasicTableColumnResult.setColumnRemark(columnName); + } else { + genBasicTableColumnResult.setColumnRemark(remarks); + } + String typeName = rs.getString("TYPE_NAME").toUpperCase(); + if(ObjectUtil.isEmpty(typeName)) { + genBasicTableColumnResult.setTypeName("NONE"); + } else { + genBasicTableColumnResult.setTypeName(typeName); + } + columns.add(genBasicTableColumnResult); + } + return columns; + } catch (SQLException sqlException) { + sqlException.printStackTrace(); + throw new CommonException("获取数据库表字段失败,表名称:{}", genBasicTableColumnParam.getTableName()); + } finally { + JdbcUtils.closeResultSet(rs); + JdbcUtils.closeConnection(conn); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void execGenZip(GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException { + File tempFolder = this.genTempFolder(genBasicIdParam, response, true); + if(tempFolder == null) { + CommonResponseUtil.renderError(response, "代码生成基础不存在,id值为:" + genBasicIdParam.getId()); + return; + } + // 压缩 + File zip = ZipUtil.zip(tempFolder); + // 压缩完毕删除临时目录 + FileUtil.del(tempFolder); + // 下载 + CommonDownloadUtil.download(zip, response); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void execGenPro(GenBasicIdParam genBasicIdParam, HttpServletResponse response) throws IOException { + File tempFolder = this.genTempFolder(genBasicIdParam, response, false); + // 定义前端生成的目录 + String genProjectFrontendPath = System.getProperty("user.dir") + File.separator + GEN_PROJECT_FRONT_PLUGIN_KEY + File.separator + "src"; + + if(!FileUtil.exist(genProjectFrontendPath)) { + throw new CommonException("前端代码生成位置:{}不存在,请检查位置", genProjectFrontendPath); + } + + // 定义后端生成的目录 + String genProjectBackendPath = System.getProperty("user.dir") + File.separator + GEN_PROJECT_PLUGIN_BIZ_KEY + File.separator + "src" + + File.separator + "main" + File.separator + "java"; + + if(!FileUtil.exist(genProjectFrontendPath)) { + throw new CommonException("后端代码生成位置:{}不存在,请检查位置", genProjectBackendPath); + } + try { + GenBasic genBasic = this.queryEntity(genBasicIdParam.getId()); + + // 生成菜单 + String menuId = sysMenuApi.addForGenMenu(genBasic.getMenuPid(), genBasic.getBusName(), genBasic.getModule(), genBasic.getFunctionName() + "管理", + StrUtil.SLASH + MODULE_KEY + StrUtil.SLASH + genBasic.getBusName()); + + // 生成按钮 + sysButtonApi.addForGenButton(menuId, genBasic.getClassName(), genBasic.getFunctionName()); + + // 授权菜单 + sysRoleApi.grantForGenMenuAndButton(menuId); + + //前端代码移动到前端 + FileUtil.moveContent(FileUtil.file(tempFolder + File.separator + "frontend"), FileUtil.file(genProjectFrontendPath), true); + + // 后端代码移动到后端 + FileUtil.moveContent(FileUtil.file(tempFolder + File.separator + "backend"), FileUtil.file(genProjectBackendPath), true); + + // 移动完毕删除临时目录 + FileUtil.del(tempFolder); + } catch (Exception e) { + e.printStackTrace(); + throw new CommonException("代码生成异常"); + } + } + + /** + * 获取临时目录 + * + * @author xuyuxiang yubaoshan + * @date 2022/10/28 21:36 + */ + private File genTempFolder(GenBasicIdParam genBasicIdParam, HttpServletResponse response, boolean isZip) throws IOException { + GenBasic genBasic = this.getById(genBasicIdParam.getId()); + if(ObjectUtil.isEmpty(genBasic)) { + // 如果是压缩包下载应该使用CommonResponseUtil渲染异常 + if(isZip) { + return null; + } else { + // 否则可以直接抛出异常 + throw new CommonException("代码生成基础不存在,id值为:{}", genBasicIdParam.getId()); + } + } + GenBasicPreviewResult genBasicPreviewResult = this.previewGen(genBasicIdParam); + // 先删除压缩包 + FileUtil.del(FileUtil.getTmpDirPath() + File.separator + genBasic.getFunctionName() + ".zip"); + // 生成临时目录 + File tempFolder = FileUtil.file(FileUtil.getTmpDirPath() + File.separator + genBasic.getFunctionName()); + // 生成前端代码到临时目录 + genBasicPreviewResult.getGenBasicCodeFrontendResultList().forEach(genBasicCodeResult -> + FileUtil.writeUtf8String(genBasicCodeResult.getCodeFileContent(), FileUtil.file(tempFolder + File.separator + + "frontend" + File.separator + genBasicCodeResult.getCodeFileWithPathName()))); + // 生成后端代码到临时目录 + genBasicPreviewResult.getGenBasicCodeBackendResultList().forEach(genBasicCodeResult -> + FileUtil.writeUtf8String(genBasicCodeResult.getCodeFileContent(), FileUtil.file(tempFolder + File.separator + + "backend" + File.separator + genBasicCodeResult.getCodeFileWithPathName()))); + return tempFolder; + } + + @Override + public GenBasicPreviewResult previewGen(GenBasicIdParam genBasicIdParam) { + GenBasic genBasic = this.queryEntity(genBasicIdParam.getId()); + JSONObject bindingJsonObject = this.getBindingJsonObject(genBasic); + GenBasicPreviewResult genBasicPreviewResult = new GenBasicPreviewResult(); + try { + // SQL基础路径 + String genSqlBasicPath = "sql"; + // 前端 + GroupTemplate groupTemplateSql = new GroupTemplate(new ClasspathResourceLoader("sqlend"), + Configuration.defaultConfiguration()); + List genBasicCodeSqlResultList = CollectionUtil.newArrayList(); + GEN_SQL_FILE_LIST.forEach(fileJsonObject -> { + String fileTemplateName = fileJsonObject.getStr("name"); + GenBasicPreviewResult.GenBasicCodeResult genBasicCodeSqlResult = new GenBasicPreviewResult.GenBasicCodeResult(); + Template templateFront = groupTemplateSql.getTemplate(fileTemplateName); + templateFront.binding(bindingJsonObject); + String resultName = StrUtil.removeSuffix(fileTemplateName, ".btl"); + genBasicCodeSqlResult.setCodeFileName(resultName); + genBasicCodeSqlResult.setCodeFileWithPathName(genSqlBasicPath + File.separator + resultName); + genBasicCodeSqlResult.setCodeFileContent(templateFront.render()); + genBasicCodeSqlResultList.add(genBasicCodeSqlResult); + }); + genBasicPreviewResult.setGenBasicCodeSqlResultList(genBasicCodeSqlResultList); + + // 前端基础路径 + String genFrontBasicPath = ""; + // 前端 + GroupTemplate groupTemplateFront = new GroupTemplate(new ClasspathResourceLoader("frontend"), + Configuration.defaultConfiguration()); + List genBasicCodeFrontendResultList = CollectionUtil.newArrayList(); + GEN_FRONT_FILE_LIST.forEach(fileJsonObject -> { + String fileTemplateName = fileJsonObject.getStr("name"); + String fileTemplatePath = fileJsonObject.getStr("path"); + GenBasicPreviewResult.GenBasicCodeResult genBasicCodeFrontResult = new GenBasicPreviewResult.GenBasicCodeResult(); + Template templateFront = groupTemplateFront.getTemplate(fileTemplateName); + templateFront.binding(bindingJsonObject); + String resultName = StrUtil.removeSuffix(fileTemplateName, ".btl"); + if(fileTemplateName.equalsIgnoreCase("Api.js.btl")) { + resultName = StrUtil.lowerFirst(genBasic.getClassName()) + resultName; + genBasicCodeFrontResult.setCodeFileName(resultName); + genBasicCodeFrontResult.setCodeFileWithPathName(genFrontBasicPath + fileTemplatePath + File.separator + resultName); + } else { + genBasicCodeFrontResult.setCodeFileName(resultName); + genBasicCodeFrontResult.setCodeFileWithPathName(genFrontBasicPath + fileTemplatePath + File.separator + genBasic.getBusName() + File.separator + resultName); + } + genBasicCodeFrontResult.setCodeFileContent(templateFront.render()); + genBasicCodeFrontendResultList.add(genBasicCodeFrontResult); + }); + genBasicPreviewResult.setGenBasicCodeFrontendResultList(genBasicCodeFrontendResultList); + + // 后端基础路径 + String genBackendBasicPath = StrUtil.replace(genBasic.getPackageName(), StrUtil.DOT, File.separator) + + File.separator + MODULE_KEY + File.separator + "modular" + File.separator + genBasic.getBusName() + File.separator; + // 后端 + GroupTemplate groupTemplateBackEnd = new GroupTemplate(new ClasspathResourceLoader("backend"), + Configuration.defaultConfiguration()); + List genBasicCodeBackendResultList = CollectionUtil.newArrayList(); + GEN_BACKEND_FILE_LIST.forEach(fileJsonObject -> { + String fileTemplateName = fileJsonObject.getStr("name"); + String fileTemplatePath = fileJsonObject.getStr("path"); + GenBasicPreviewResult.GenBasicCodeResult genBasicCodeBackendResult = new GenBasicPreviewResult.GenBasicCodeResult(); + Template templateBackend = groupTemplateBackEnd.getTemplate(fileTemplateName); + templateBackend.binding(bindingJsonObject); + String resultName = StrUtil.removeSuffix(fileTemplateName, ".btl"); + if(fileTemplateName.equalsIgnoreCase("Entity.java.btl")) { + resultName = ".java"; + } + genBasicCodeBackendResult.setCodeFileName(genBasic.getClassName() + resultName); + genBasicCodeBackendResult.setCodeFileWithPathName(genBackendBasicPath + fileTemplatePath + File.separator + genBasic.getClassName() + resultName); + genBasicCodeBackendResult.setCodeFileContent(templateBackend.render()); + genBasicCodeBackendResultList.add(genBasicCodeBackendResult); + }); + genBasicPreviewResult.setGenBasicCodeBackendResultList(genBasicCodeBackendResultList); + } catch (Exception e) { + e.printStackTrace(); + throw new CommonException("代码生成异常"); + } + return genBasicPreviewResult; + } + + /** + * 根据代码生成基础获取构造的参数 + * + * @author xuyuxiang + * @date 2022/10/28 21:36 + */ + public JSONObject getBindingJsonObject(GenBasic genBasic) { + JSONObject bindingJsonObject = JSONUtil.createObj(); + // 代码模块名 + bindingJsonObject.set("moduleName", MODULE_KEY); + // 功能名 + bindingJsonObject.set("functionName", genBasic.getFunctionName()); + // 业务名 + bindingJsonObject.set("busName", genBasic.getBusName()); + // 包名 + bindingJsonObject.set("packageName", genBasic.getPackageName()); + // 库名 + bindingJsonObject.set("dbTable", genBasic.getDbTable()); + // 类名 + bindingJsonObject.set("className", genBasic.getClassName()); + // 类首字母小写名 + bindingJsonObject.set("classNameFirstLower", StrUtil.lowerFirst(genBasic.getClassName())); + // 主键名 + bindingJsonObject.set("dbTableKey", genBasic.getDbTableKey()); + // 主键Java类型 + bindingJsonObject.set("dbTableKeyJavaType", "String"); + // 主键名驼峰 + bindingJsonObject.set("dbTableKeyCamelCase", StrUtil.toCamelCase(genBasic.getDbTableKey().toLowerCase())); + // 主键首字母大写名 + bindingJsonObject.set("dbTableKeyFirstUpper", StrUtil.upperFirst(genBasic.getDbTableKey().toLowerCase())); + // 主键注释 + bindingJsonObject.set("dbTableKeyRemark", genBasic.getDbTableKey()); + // 表单布局 + bindingJsonObject.set("formLayout", genBasic.getFormLayout()); + // 使用栅格 + bindingJsonObject.set("gridWhether", genBasic.getGridWhether().equalsIgnoreCase(GenYesNoEnum.Y.getValue())); + // 父菜单ID + bindingJsonObject.set("parentId", genBasic.getMenuPid()); + // 菜单ID + bindingJsonObject.set("menuId", IdWorker.getIdStr()); + // 菜单编码 + bindingJsonObject.set("menuCode", RandomUtil.randomString(10)); + // 菜单路径 + bindingJsonObject.set("menuPath", StrUtil.SLASH + MODULE_KEY + StrUtil.SLASH + genBasic.getBusName()); + // 菜单组件 + bindingJsonObject.set("menuComponent", MODULE_KEY + StrUtil.SLASH + genBasic.getBusName() + StrUtil.SLASH + "index"); + // 模块ID + bindingJsonObject.set("moduleId", genBasic.getModule()); + // 添加按钮ID + bindingJsonObject.set("addButtonId", IdWorker.getIdStr()); + // 编辑按钮ID + bindingJsonObject.set("editButtonId", IdWorker.getIdStr()); + // 删除按钮ID + bindingJsonObject.set("deleteButtonId", IdWorker.getIdStr()); + // 批量删除按钮ID + bindingJsonObject.set("batchDeleteButtonId", IdWorker.getIdStr()); + // 作者 + bindingJsonObject.set("authorName", genBasic.getAuthorName()); + // 生成时间 + bindingJsonObject.set("genTime", DateUtil.format(DateTime.now(), " yyyy/MM/dd HH:mm")); + // 定义配置详情列表 + List configList = CollectionUtil.newArrayList(); + // 定义是否有排序字段 + AtomicBoolean hasSortCodeField = new AtomicBoolean(false); + genConfigService.list(new LambdaQueryWrapper().eq(GenConfig::getBasicId, genBasic.getId())) + .forEach(genConfig -> { + // 定义字段信息 + JSONObject configItem = JSONUtil.createObj(); + if(genConfig.getFieldName().equalsIgnoreCase(SORT_CODE_KEY)) { + hasSortCodeField.set(true); + } + // 如果是主键,则无需作为添加参数,需要作为编辑参数,需要主键注解 + if(genConfig.getFieldName().equalsIgnoreCase(genBasic.getDbTableKey())) { + configItem.set("needAdd", false); + configItem.set("needEdit", true); + configItem.set("needPage", false); + configItem.set("needPageType", "none"); + configItem.set("required", true); + configItem.set("needTableId", true); + bindingJsonObject.set("dbTableKeyJavaType", genConfig.getFieldJavaType()); + bindingJsonObject.set("dbTableKeyRemark", genConfig.getFieldRemark()); + } else { + // 排除删除标志 + String logicDeleteField = mybatisPlusProperties.getGlobalConfig().getDbConfig().getLogicDeleteField(); + if(ObjectUtil.isEmpty(logicDeleteField)) { + logicDeleteField = "DELETE_FLAG"; + } + if(genConfig.getFieldName().equalsIgnoreCase(logicDeleteField)) { + configItem.set("needAdd", false); + configItem.set("needEdit", false); + configItem.set("needPage", false); + configItem.set("needPageType", "none"); + configItem.set("required", false); + configItem.set("needTableId", false); + } else { + boolean needAddAndUpdate = genConfig.getWhetherAddUpdate().equalsIgnoreCase(GenYesNoEnum.Y.getValue()); + configItem.set("needAdd", needAddAndUpdate); + configItem.set("needEdit", needAddAndUpdate); + configItem.set("needPage", genConfig.getQueryWhether().equalsIgnoreCase(GenYesNoEnum.Y.getValue())); + configItem.set("needPageType", genConfig.getQueryType()); + configItem.set("required", genConfig.getWhetherRequired().equalsIgnoreCase(GenYesNoEnum.Y.getValue())); + configItem.set("needTableId", false); + } + } + // 列显示 + configItem.set("whetherTable", genConfig.getWhetherTable().equalsIgnoreCase(GenYesNoEnum.Y.getValue())); + // 列省略 + configItem.set("whetherRetract", genConfig.getWhetherRetract().equalsIgnoreCase(GenYesNoEnum.Y.getValue())); + // 增改 + configItem.set("whetherAddUpdate", genConfig.getWhetherAddUpdate().equalsIgnoreCase(GenYesNoEnum.Y.getValue())); + // 作用类型 + configItem.set("effectType", genConfig.getEffectType()); + // 字典值 + configItem.set("dictTypeCode", genConfig.getDictTypeCode()); + // 实体类型 + configItem.set("fieldJavaType", genConfig.getFieldJavaType()); + // 字段驼峰名 + configItem.set("fieldNameCamelCase", StrUtil.toCamelCase(genConfig.getFieldName().toLowerCase())); + // 字段驼峰首字母大写名 + configItem.set("fieldNameCamelCaseFirstUpper", StrUtil.upperFirst(StrUtil.toCamelCase(genConfig.getFieldName().toLowerCase()))); + // 字段注释 + configItem.set("fieldRemark", genConfig.getFieldRemark()); + // 是否需要自动插入 + configItem.set("needAutoInsert", CREATE_USER_KEY.equalsIgnoreCase(genConfig.getFieldName()) || + CREATE_TIME_KEY.equalsIgnoreCase(genConfig.getFieldName())); + // 是否需要自动更新 + configItem.set("needAutoUpdate", UPDATE_USER_KEY.equalsIgnoreCase(genConfig.getFieldName()) || + UPDATE_TIME_KEY.equalsIgnoreCase(genConfig.getFieldName())); + configList.add(configItem); + + }); + // 配置信息 + bindingJsonObject.set("configList", configList); + // 有排序字段 + bindingJsonObject.set("hasSortCodeField", hasSortCodeField.get()); + return bindingJsonObject; + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/controller/GenConfigController.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/controller/GenConfigController.java new file mode 100644 index 00000000..dde3b55a --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/controller/GenConfigController.java @@ -0,0 +1,125 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import vip.xiaonuo.common.annotation.CommonLog; +import vip.xiaonuo.common.pojo.CommonResult; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.gen.modular.config.entity.GenConfig; +import vip.xiaonuo.gen.modular.config.param.GenConfigEditParam; +import vip.xiaonuo.gen.modular.config.param.GenConfigIdParam; +import vip.xiaonuo.gen.modular.config.param.GenConfigListParam; +import vip.xiaonuo.gen.modular.config.service.GenConfigService; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 代码生成详细配置控制器 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Api(tags = "代码生成详细配置控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 2) +@RestController +@Validated +public class GenConfigController { + + @Resource + private GenConfigService genConfigService; + + /** + * 获取代码生成详细配置分页 + * + * @author yubaoshan + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取代码生成详细配置分页") + @GetMapping("/gen/config/list") + public CommonResult> list(GenConfigListParam genConfigListParam) { + return CommonResult.data(genConfigService.list(genConfigListParam)); + } + + /** + * 编辑代码生成详细配置 + * + * @author yubaoshan + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 2) + @ApiOperation("编辑代码生成详细配置") + @CommonLog("编辑代码生成详细配置") + @PostMapping("/gen/config/edit") + public CommonResult edit(@RequestBody @Valid GenConfigEditParam genConfigEditParam) { + genConfigService.edit(genConfigEditParam); + return CommonResult.ok(); + } + + /** + * 删除代码生成详细配置 + * + * @author yubaoshan + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 3) + @ApiOperation("删除代码生成详细配置") + @CommonLog("删除代码生成详细配置") + @PostMapping("/gen/config/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList genConfigIdParamList) { + genConfigService.delete(genConfigIdParamList); + return CommonResult.ok(); + } + + /** + * 获取代码生成详细配置详情 + * + * @author yubaoshan + * @date 2022/4/24 20:00 + */ + @ApiOperationSupport(order = 4) + @ApiOperation("获取代码生成详细配置详情") + @GetMapping("/gen/config/detail") + public CommonResult detail(@Valid GenConfigIdParam genConfigIdParam) { + return CommonResult.data(genConfigService.detail(genConfigIdParam)); + } + + /** + * 批量编辑代码生成详细配置 + * + * @author yubaoshan + * @date 2022/4/24 20:47 + */ + @ApiOperationSupport(order = 5) + @ApiOperation("批量编辑代码生成详细配置") + @CommonLog("批量编辑代码生成详细配置") + @PostMapping("/gen/config/editBatch") + public CommonResult editBatch(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList genConfigEditParamList) { + genConfigService.editBatch(genConfigEditParamList); + return CommonResult.ok(); + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/entity/GenConfig.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/entity/GenConfig.java new file mode 100644 index 00000000..3919135d --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/entity/GenConfig.java @@ -0,0 +1,95 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import vip.xiaonuo.common.pojo.CommonEntity; + +/** + * 代码生成详细配置 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +@Setter +@TableName("GEN_CONFIG") +public class GenConfig extends CommonEntity { + + /** id */ + @ApiModelProperty(value = "id", position = 1) + private String id; + + /** 基础ID */ + @ApiModelProperty(value = "基础ID", position = 2) + private String basicId; + + /** 是否主键 */ + @ApiModelProperty(value = "是否主键", position = 3) + private String isTableKey; + + /** 字段 */ + @ApiModelProperty(value = "字段", position = 4) + private String fieldName; + + /** 注释 */ + @ApiModelProperty(value = "注释", position = 5) + private String fieldRemark; + + /** 类型 */ + @ApiModelProperty(value = "类型", position = 6) + private String fieldType; + + /** 实体类型 */ + @ApiModelProperty(value = "实体类型", position = 7) + private String fieldJavaType; + + /** 作用类型 */ + @ApiModelProperty(value = "作用类型", position = 8) + private String effectType; + + /** 字典 */ + @ApiModelProperty(value = "字典", position = 9) + private String dictTypeCode; + + /** 列表显示 */ + @ApiModelProperty(value = "列表显示", position = 10) + private String whetherTable; + + /** 列省略 */ + @ApiModelProperty(value = "列省略", position = 11) + private String whetherRetract; + + /** 增改 */ + @ApiModelProperty(value = "增改", position = 12) + private String whetherAddUpdate; + + /** 必填 */ + @ApiModelProperty(value = "必填", position = 13) + private String whetherRequired; + + /** 查询 */ + @ApiModelProperty(value = "查询", position = 14) + private String queryWhether; + + /** 查询方式 */ + @ApiModelProperty(value = "查询方式", position = 15) + private String queryType; + + /** 排序 */ + @ApiModelProperty(value = "排序", position = 16) + private String sortCode; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/GenConfigMapper.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/GenConfigMapper.java new file mode 100644 index 00000000..88f5a574 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/GenConfigMapper.java @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.xiaonuo.gen.modular.config.entity.GenConfig; + +/** + * 代码生成详细配置Mapper接口 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +public interface GenConfigMapper extends BaseMapper { +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/mapping/GenConfigMapper.xml b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/mapping/GenConfigMapper.xml new file mode 100644 index 00000000..b893445b --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/mapper/mapping/GenConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigAddParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigAddParam.java new file mode 100644 index 00000000..22c28f01 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigAddParam.java @@ -0,0 +1,95 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 代码生成详细配置添加参数 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +@Setter +public class GenConfigAddParam { + + /** 基础ID */ + @ApiModelProperty(value = "基础ID", required = true, position = 1) + @NotBlank(message = "basicId不能为空") + private String basicId; + + /** 是否是主键 */ + @ApiModelProperty(value = "是否是主键", required = true, position = 2) + @NotBlank(message = "isTableKey不能为空") + private String isTableKey; + + /** 字段 */ + @ApiModelProperty(value = "字段", required = true, position = 3) + @NotBlank(message = "fieldName不能为空") + private String fieldName; + + /** 注释 */ + @ApiModelProperty(value = "注释", required = true, position = 4) + @NotBlank(message = "fieldRemark不能为空") + private String fieldRemark; + + /** 类型 */ + @ApiModelProperty(value = "类型", required = true, position = 5) + @NotBlank(message = "fieldType不能为空") + private String fieldType; + + /** 实体类型 */ + @ApiModelProperty(value = "实体类型", position = 6) + private String fieldJavaType; + + /** 作用类型 */ + @ApiModelProperty(value = "作用类型", position = 7) + private String effectType; + + /** 字典 */ + @ApiModelProperty(value = "字典", position = 8) + private String dictTypeCode; + + /** 列表显示 */ + @ApiModelProperty(value = "列表显示", position = 9) + private String whetherTable; + + /** 列省略 */ + @ApiModelProperty(value = "列省略", position = 10) + private String whetherRetract; + + /** 增改 */ + @ApiModelProperty(value = "增改", position = 11) + private String whetherAddUpdate; + + /** 必填 */ + @ApiModelProperty(value = "必填", position = 12) + private String whetherRequired; + + /** 查询 */ + @ApiModelProperty(value = "查询", position = 13) + private String queryWhether; + + /** 查询方式 */ + @ApiModelProperty(value = "查询方式", position = 14) + private String queryType; + + /** 排序 */ + @ApiModelProperty(value = "排序", position = 15) + private Integer sortCode; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigEditParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigEditParam.java new file mode 100644 index 00000000..b59906d1 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigEditParam.java @@ -0,0 +1,107 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 代码生成详细配置编辑参数 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +@Setter +public class GenConfigEditParam { + + /** id */ + @ApiModelProperty(value = "id", required = true, position = 1) + @NotBlank(message = "id不能为空") + private String id; + + /** 基础ID */ + @ApiModelProperty(value = "基础ID", required = true, position = 2) + @NotBlank(message = "basicId不能为空") + private String basicId; + + /** 是否主键 */ + @ApiModelProperty(value = "是否主键", required = true, position = 3) + @NotBlank(message = "isTableKey不能为空") + private String isTableKey; + + /** 字段 */ + @ApiModelProperty(value = "字段", required = true, position = 4) + @NotBlank(message = "fieldName不能为空") + private String fieldName; + + /** 注释 */ + @ApiModelProperty(value = "注释", required = true, position = 5) + @NotBlank(message = "fieldRemark不能为空") + private String fieldRemark; + + /** 类型 */ + @ApiModelProperty(value = "类型", required = true, position = 6) + @NotBlank(message = "fieldType不能为空") + private String fieldType; + + /** 实体类型 */ + @ApiModelProperty(value = "实体类型", required = true, position = 7) + @NotBlank(message = "fieldJavaType不能为空") + private String fieldJavaType; + + /** 作用类型 */ + @ApiModelProperty(value = "作用类型", required = true, position = 8) + @NotBlank(message = "effectType不能为空") + private String effectType; + + /** 字典 */ + @ApiModelProperty(value = "字典", required = true, position = 9) + private String dictTypeCode; + + /** 列表显示 */ + @ApiModelProperty(value = "列表显示", required = true, position = 10) + @NotBlank(message = "whetherTable不能为空") + private String whetherTable; + + /** 列省略 */ + @ApiModelProperty(value = "列省略", required = true, position = 11) + @NotBlank(message = "whetherRetract不能为空") + private String whetherRetract; + + /** 增改 */ + @ApiModelProperty(value = "增改", required = true, position = 12) + @NotBlank(message = "whetherAddUpdate不能为空") + private String whetherAddUpdate; + + /** 必填 */ + @ApiModelProperty(value = "必填", required = true, position = 13) + @NotBlank(message = "whetherRequired不能为空") + private String whetherRequired; + + /** 查询 */ + @ApiModelProperty(value = "查询", required = true, position = 14) + @NotBlank(message = "queryWhether不能为空") + private String queryWhether; + + /** 查询方式 */ + @ApiModelProperty(value = "查询方式", required = true, position = 15) + private String queryType; + + /** 排序 */ + @ApiModelProperty(value = "排序", required = true, position = 16) + private Integer sortCode; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigIdParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigIdParam.java new file mode 100644 index 00000000..93f3ed18 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigIdParam.java @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 代码生成详细配置Id参数 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Getter +@Setter +public class GenConfigIdParam { + + /** id */ + @ApiModelProperty(value = "id", required = true) + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigListParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigListParam.java new file mode 100644 index 00000000..5aac3589 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigListParam.java @@ -0,0 +1,43 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 代码生成详细配置查询参数 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ +@Getter +@Setter +public class GenConfigListParam { + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 基础ID */ + @ApiModelProperty(value = "基础ID") + @NotBlank(message = "basicId不能为空") + private String basicId; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigPageParam.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigPageParam.java new file mode 100644 index 00000000..28396caa --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/param/GenConfigPageParam.java @@ -0,0 +1,51 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * 代码生成详细配置查询参数 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ +@Getter +@Setter +public class GenConfigPageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 基础ID */ + @ApiModelProperty(value = "基础ID") + @NotBlank(message = "basicId不能为空") + private String basicId; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/GenConfigService.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/GenConfigService.java new file mode 100644 index 00000000..f7a3ea48 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/GenConfigService.java @@ -0,0 +1,79 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.xiaonuo.common.pojo.CommonValidList; +import vip.xiaonuo.gen.modular.config.entity.GenConfig; +import vip.xiaonuo.gen.modular.config.param.GenConfigEditParam; +import vip.xiaonuo.gen.modular.config.param.GenConfigIdParam; +import vip.xiaonuo.gen.modular.config.param.GenConfigListParam; + +import java.util.List; + +/** + * 代码生成详细配置配置Service接口 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +public interface GenConfigService extends IService { + + /** + * 查询代码生成详细配置列表 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ + List list(GenConfigListParam genConfigListParam); + + /** + * 编辑代码生成详细配置 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ + void edit(GenConfigEditParam genConfigEditParam); + + /** + * 删除代码生成详细配置 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ + void delete(List genConfigIdParamList); + + /** + * 获取代码生成详细配置详情 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + */ + GenConfig detail(GenConfigIdParam genConfigIdParam); + + /** + * 获取代码生成详细配置详情 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ + GenConfig queryEntity(String id); + + /** + * 批量编辑代码生成详细配置 + * + * @author xuyuxiang + * @date 2022/10/28 13:49 + **/ + void editBatch(List genConfigEditParamList); +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/impl/GenConfigServiceImpl.java b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/impl/GenConfigServiceImpl.java new file mode 100644 index 00000000..0eadf0da --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/java/vip/xiaonuo/gen/modular/config/service/impl/GenConfigServiceImpl.java @@ -0,0 +1,95 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.gen.modular.config.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import vip.xiaonuo.common.enums.CommonSortOrderEnum; +import vip.xiaonuo.common.exception.CommonException; +import vip.xiaonuo.gen.modular.config.entity.GenConfig; +import vip.xiaonuo.gen.modular.config.mapper.GenConfigMapper; +import vip.xiaonuo.gen.modular.config.param.GenConfigEditParam; +import vip.xiaonuo.gen.modular.config.param.GenConfigIdParam; +import vip.xiaonuo.gen.modular.config.param.GenConfigListParam; +import vip.xiaonuo.gen.modular.config.service.GenConfigService; + +import java.util.List; + +/** + * 代码生成详情配置Service接口实现类 + * + * @author yubaoshan + * @date 2022/10/25 22:33 + **/ +@Service +public class GenConfigServiceImpl extends ServiceImpl implements GenConfigService { + + @Override + public List list(GenConfigListParam genConfigListParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + queryWrapper.lambda().eq(GenConfig::getBasicId, genConfigListParam.getBasicId()); + if(ObjectUtil.isAllNotEmpty(genConfigListParam.getSortField(), genConfigListParam.getSortOrder())) { + CommonSortOrderEnum.validate(genConfigListParam.getSortOrder()); + queryWrapper.orderBy(true, genConfigListParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(genConfigListParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(GenConfig::getSortCode); + } + return this.list(queryWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void edit(GenConfigEditParam genConfigEditParam) { + GenConfig genConfig = this.queryEntity(genConfigEditParam.getId()); + BeanUtil.copyProperties(genConfigEditParam, genConfig); + this.updateById(genConfig); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List genConfigIdParamList) { + List basicIdIdList = CollStreamUtil.toList(genConfigIdParamList, GenConfigIdParam::getId); + if(ObjectUtil.isNotEmpty(basicIdIdList)) { + // 执行删除 + this.removeBatchByIds(basicIdIdList); + } + } + + @Override + public GenConfig detail(GenConfigIdParam genConfigIdParam) { + return this.queryEntity(genConfigIdParam.getId()); + } + + @Override + public GenConfig queryEntity(String id) { + GenConfig genConfig = this.getById(id); + if(ObjectUtil.isEmpty(genConfig)) { + throw new CommonException("代码生成详情配置不存在,id值为:{}", id); + } + return genConfig; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void editBatch(List genConfigEditParamList) { + genConfigEditParamList.forEach(this::edit); + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/AddParam.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/AddParam.java.btl new file mode 100644 index 00000000..e7b3f972 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/AddParam.java.btl @@ -0,0 +1,44 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * ${functionName}添加参数 + * + * @author ${authorName} + * @date ${genTime} + **/ +@Getter +@Setter +public class ${className}AddParam { + + <% for(var i = 0; i < configList.~size; i++) { %> + <% if(configList[i].needAdd) { %> + /** ${configList[i].fieldRemark} */ + @ApiModelProperty(value = "${configList[i].fieldRemark}",<% if(configList[i].required) { %> required = true,<% } %> position = ${i + 1}) + <% if(configList[i].required) { %> + <% if(configList[i].fieldJavaType == 'String') { %>@NotBlank<% } else { %>@NotNull<% } %>(message = "${configList[i].fieldNameCamelCase}不能为空") + <% } else { %><% } %> + private ${configList[i].fieldJavaType} ${configList[i].fieldNameCamelCase}; + + <% } %> + <% } %> +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Controller.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Controller.java.btl new file mode 100644 index 00000000..2e16bba4 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Controller.java.btl @@ -0,0 +1,125 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import ${packageName}.common.annotation.CommonLog; +import ${packageName}.common.pojo.CommonResult; +import ${packageName}.common.pojo.CommonValidList; +import ${packageName}.${moduleName}.modular.${busName}.entity.${className}; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}AddParam; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}EditParam; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}IdParam; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}PageParam; +import ${packageName}.${moduleName}.modular.${busName}.service.${className}Service; + +import javax.annotation.Resource; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; + +/** + * ${functionName}控制器 + * + * @author ${authorName} + * @date ${genTime} + */ +@Api(tags = "${functionName}控制器") +@ApiSupport(author = "SNOWY_TEAM", order = 1) +@RestController +@Validated +public class ${className}Controller { + + @Resource + private ${className}Service ${classNameFirstLower}Service; + + /** + * 获取${functionName}分页 + * + * @author ${authorName} + * @date ${genTime} + */ + @ApiOperationSupport(order = 1) + @ApiOperation("获取${functionName}分页") + @GetMapping("/${moduleName}/${busName}/page") + public CommonResult> page(${className}PageParam ${classNameFirstLower}PageParam) { + return CommonResult.data(${classNameFirstLower}Service.page(${classNameFirstLower}PageParam)); + } + + /** + * 添加${functionName} + * + * @author ${authorName} + * @date ${genTime} + */ + @ApiOperationSupport(order = 2) + @ApiOperation("添加${functionName}") + @CommonLog("添加${functionName}") + @PostMapping("/${moduleName}/${busName}/add") + public CommonResult add(@RequestBody @Valid ${className}AddParam ${classNameFirstLower}AddParam) { + ${classNameFirstLower}Service.add(${classNameFirstLower}AddParam); + return CommonResult.ok(); + } + + /** + * 编辑${functionName} + * + * @author ${authorName} + * @date ${genTime} + */ + @ApiOperationSupport(order = 3) + @ApiOperation("编辑${functionName}") + @CommonLog("编辑${functionName}") + @PostMapping("/${moduleName}/${busName}/edit") + public CommonResult edit(@RequestBody @Valid ${className}EditParam ${classNameFirstLower}EditParam) { + ${classNameFirstLower}Service.edit(${classNameFirstLower}EditParam); + return CommonResult.ok(); + } + + /** + * 删除${functionName} + * + * @author ${authorName} + * @date ${genTime} + */ + @ApiOperationSupport(order = 4) + @ApiOperation("删除${functionName}") + @CommonLog("删除${functionName}") + @PostMapping("/${moduleName}/${busName}/delete") + public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") + CommonValidList<${className}IdParam> ${classNameFirstLower}IdParamList) { + ${classNameFirstLower}Service.delete(${classNameFirstLower}IdParamList); + return CommonResult.ok(); + } + + /** + * 获取${functionName}详情 + * + * @author ${authorName} + * @date ${genTime} + */ + @ApiOperationSupport(order = 5) + @ApiOperation("获取${functionName}详情") + @GetMapping("/${moduleName}/${busName}/detail") + public CommonResult<${className}> detail(@Valid ${className}IdParam ${classNameFirstLower}IdParam) { + return CommonResult.data(${classNameFirstLower}Service.detail(${classNameFirstLower}IdParam)); + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/EditParam.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/EditParam.java.btl new file mode 100644 index 00000000..a3768f51 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/EditParam.java.btl @@ -0,0 +1,44 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * ${functionName}编辑参数 + * + * @author ${authorName} + * @date ${genTime} + **/ +@Getter +@Setter +public class ${className}EditParam { + + <% for(var i = 0; i < configList.~size; i++) { %> + <% if(configList[i].needEdit) { %> + /** ${configList[i].fieldRemark} */ + @ApiModelProperty(value = "${configList[i].fieldRemark}",<% if(configList[i].required) { %> required = true,<% } %> position = ${i + 1}) + <% if(configList[i].required) { %> + <% if(configList[i].fieldJavaType == 'String') { %>@NotBlank<% } else { %>@NotNull<% } %>(message = "${configList[i].fieldNameCamelCase}不能为空") + <% } else { %><% } %> + private ${configList[i].fieldJavaType} ${configList[i].fieldNameCamelCase}; + + <% } %> + <% } %> +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Entity.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Entity.java.btl new file mode 100644 index 00000000..2fcc7e88 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Entity.java.btl @@ -0,0 +1,52 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import java.util.Date; + +/** + * ${functionName}实体 + * + * @author ${authorName} + * @date ${genTime} + **/ +@Getter +@Setter +@TableName("${dbTable}") +public class ${className} { + + <% for(var i = 0; i < configList.~size; i++) { %> + /** ${configList[i].fieldRemark} */ + <% if(configList[i].needTableId) { %> + @TableId + <% } else { %><% } %> + @ApiModelProperty(value = "${configList[i].fieldRemark}", position = ${i + 1}) + <% if(configList[i].needAutoInsert) { %> + @TableField(fill = FieldFill.INSERT) + <% } else { %><% } %> + <% if(configList[i].needAutoUpdate) { %> + @TableField(fill = FieldFill.UPDATE) + <% } else { %><% } %> + private ${configList[i].fieldJavaType} ${configList[i].fieldNameCamelCase}; + <% if(i == configList.~size - 1) { %><% } else { %> + + <% } %> + <% } %> +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Enum.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Enum.java.btl new file mode 100644 index 00000000..d87196eb --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Enum.java.btl @@ -0,0 +1,34 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.enums; + +import lombok.Getter; + +/** + * ${functionName}枚举 + * + * @author ${authorName} + * @date ${genTime} + **/ +@Getter +public enum ${className}Enum { + + /** 测试 */ + TEST("TEST"); + + private final String value; + + ${className}Enum(String value) { + this.value = value; + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/IdParam.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/IdParam.java.btl new file mode 100644 index 00000000..c6566616 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/IdParam.java.btl @@ -0,0 +1,35 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * ${functionName}Id参数 + * + * @author ${authorName} + * @date ${genTime} + **/ +@Getter +@Setter +public class ${className}IdParam { + + /** ${dbTableKeyRemark} */ + @ApiModelProperty(value = "${dbTableKeyRemark}", required = true) + @NotBlank(message = "${dbTableKeyCamelCase}不能为空") + private ${dbTableKeyJavaType} ${dbTableKeyCamelCase}; +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.java.btl new file mode 100644 index 00000000..581fb2f2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.java.btl @@ -0,0 +1,25 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import ${packageName}.${moduleName}.modular.${busName}.entity.${className}; + +/** + * ${functionName}Mapper接口 + * + * @author ${authorName} + * @date ${genTime} + **/ +public interface ${className}Mapper extends BaseMapper<${className}> { +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.xml.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.xml.btl new file mode 100644 index 00000000..7d90b198 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Mapper.xml.btl @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/PageParam.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/PageParam.java.btl new file mode 100644 index 00000000..117ddde6 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/PageParam.java.btl @@ -0,0 +1,69 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import java.util.Date; + +/** + * ${functionName}查询参数 + * + * @author ${authorName} + * @date ${genTime} + **/ +@Getter +@Setter +public class ${className}PageParam { + + /** 当前页 */ + @ApiModelProperty(value = "当前页码") + private Integer current; + + /** 每页条数 */ + @ApiModelProperty(value = "每页条数") + private Integer size; + + /** 排序字段 */ + @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName") + private String sortField; + + /** 排序方式 */ + @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND") + private String sortOrder; + + /** 关键词 */ + @ApiModelProperty(value = "关键词") + private String searchKey; + + <% for(var i = 0; i < configList.~size; i++) { %> + <% if(configList[i].needPage) { %> + <% if(configList[i].effectType == 'datepicker') { %> + /** ${configList[i].fieldRemark}开始 */ + @ApiModelProperty(value = "${configList[i].fieldRemark}开始") + private String start${configList[i].fieldNameCamelCaseFirstUpper}; + + /** ${configList[i].fieldRemark}结束 */ + @ApiModelProperty(value = "${configList[i].fieldRemark}结束") + private String end${configList[i].fieldNameCamelCaseFirstUpper}; + + <% } else { %> + /** ${configList[i].fieldRemark} */ + @ApiModelProperty(value = "${configList[i].fieldRemark}") + private ${configList[i].fieldJavaType} ${configList[i].fieldNameCamelCase}; + + <% } %> + <% } %> + <% } %> +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Service.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Service.java.btl new file mode 100644 index 00000000..e8daf4d5 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/Service.java.btl @@ -0,0 +1,80 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import ${packageName}.${moduleName}.modular.${busName}.entity.${className}; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}AddParam; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}EditParam; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}IdParam; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}PageParam; + +import java.util.List; + +/** + * ${functionName}Service接口 + * + * @author ${authorName} + * @date ${genTime} + **/ +public interface ${className}Service extends IService<${className}> { + + /** + * 获取${functionName}分页 + * + * @author ${authorName} + * @date ${genTime} + */ + Page<${className}> page(${className}PageParam ${classNameFirstLower}PageParam); + + /** + * 添加${functionName} + * + * @author ${authorName} + * @date ${genTime} + */ + void add(${className}AddParam ${classNameFirstLower}AddParam); + + /** + * 编辑${functionName} + * + * @author ${authorName} + * @date ${genTime} + */ + void edit(${className}EditParam ${classNameFirstLower}EditParam); + + /** + * 删除${functionName} + * + * @author ${authorName} + * @date ${genTime} + */ + void delete(List<${className}IdParam> ${classNameFirstLower}IdParamList); + + /** + * 获取${functionName}详情 + * + * @author ${authorName} + * @date ${genTime} + */ + ${className} detail(${className}IdParam ${classNameFirstLower}IdParam); + + /** + * 获取${functionName}详情 + * + * @author ${authorName} + * @date ${genTime} + **/ + ${className} queryEntity(String id); +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/ServiceImpl.java.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/ServiceImpl.java.btl new file mode 100644 index 00000000..a60f75ad --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/backend/ServiceImpl.java.btl @@ -0,0 +1,109 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package ${packageName}.${moduleName}.modular.${busName}.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.common.enums.CommonSortOrderEnum; +import ${packageName}.common.exception.CommonException; +import ${packageName}.common.page.CommonPageRequest; +import ${packageName}.${moduleName}.modular.${busName}.entity.${className}; +import ${packageName}.${moduleName}.modular.${busName}.mapper.${className}Mapper; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}AddParam; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}EditParam; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}IdParam; +import ${packageName}.${moduleName}.modular.${busName}.param.${className}PageParam; +import ${packageName}.${moduleName}.modular.${busName}.service.${className}Service; + +import java.util.List; + +/** + * ${functionName}Service接口实现类 + * + * @author ${authorName} + * @date ${genTime} + **/ +@Service +public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${className}> implements ${className}Service { + + @Override + public Page<${className}> page(${className}PageParam ${classNameFirstLower}PageParam) { + QueryWrapper<${className}> queryWrapper = new QueryWrapper<>(); + <% for(var i = 0; i < configList.~size; i++) { %> + <% if(configList[i].needPage) { %> + <% if(configList[i].effectType == 'datepicker') { %> + if(ObjectUtil.isNotEmpty(${classNameFirstLower}PageParam.getStart${configList[i].fieldNameCamelCaseFirstUpper}()) && ObjectUtil.isNotEmpty(${classNameFirstLower}PageParam.getEnd${configList[i].fieldNameCamelCaseFirstUpper}())) { + queryWrapper.lambda().between(${className}::get${configList[i].fieldNameCamelCaseFirstUpper}, ${classNameFirstLower}PageParam.getStart${configList[i].fieldNameCamelCaseFirstUpper}(), ${classNameFirstLower}PageParam.getEnd${configList[i].fieldNameCamelCaseFirstUpper}()); + } + <% } else { %> + if(ObjectUtil.isNotEmpty(${classNameFirstLower}PageParam.get${configList[i].fieldNameCamelCaseFirstUpper}())) { + queryWrapper.lambda().${configList[i].needPageType}(${className}::get${configList[i].fieldNameCamelCaseFirstUpper}, ${classNameFirstLower}PageParam.get${configList[i].fieldNameCamelCaseFirstUpper}()); + } + <% } %> + <% } %> + <% } %> + if(ObjectUtil.isAllNotEmpty(${classNameFirstLower}PageParam.getSortField(), ${classNameFirstLower}PageParam.getSortOrder())) { + CommonSortOrderEnum.validate(${classNameFirstLower}PageParam.getSortOrder()); + queryWrapper.orderBy(true, ${classNameFirstLower}PageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), + StrUtil.toUnderlineCase(${classNameFirstLower}PageParam.getSortField())); + } else { + <% if(hasSortCodeField) { %> + queryWrapper.lambda().orderByAsc(${className}::getSortCode); + <% } else { %> + queryWrapper.lambda().orderByAsc(${className}::get${dbTableKeyFirstUpper}); + <% } %> + } + return this.page(CommonPageRequest.defaultPage(), queryWrapper); + } + + @Override + public void add(${className}AddParam ${classNameFirstLower}AddParam) { + ${className} ${classNameFirstLower} = BeanUtil.toBean(${classNameFirstLower}AddParam, ${className}.class); + this.save(${classNameFirstLower}); + } + + @Override + public void edit(${className}EditParam ${classNameFirstLower}EditParam) { + ${className} ${classNameFirstLower} = this.queryEntity(${classNameFirstLower}EditParam.getId()); + BeanUtil.copyProperties(${classNameFirstLower}EditParam, ${classNameFirstLower}); + this.updateById(${classNameFirstLower}); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void delete(List<${className}IdParam> ${classNameFirstLower}IdParamList) { + // 执行删除 + this.removeBatchByIds(CollStreamUtil.toList(${classNameFirstLower}IdParamList, ${className}IdParam::getId)); + } + + @Override + public ${className} detail(${className}IdParam ${classNameFirstLower}IdParam) { + return this.queryEntity(${classNameFirstLower}IdParam.getId()); + } + + @Override + public ${className} queryEntity(String id) { + ${className} ${classNameFirstLower} = this.getById(id); + if(ObjectUtil.isEmpty(${classNameFirstLower})) { + throw new CommonException("${functionName}不存在,id值为:{}", id); + } + return ${classNameFirstLower}; + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/Api.js.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/Api.js.btl new file mode 100644 index 00000000..f9d2826d --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/Api.js.btl @@ -0,0 +1,32 @@ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/${moduleName}/${busName}/` + url, ...arg) + +/** + * ${functionName}Api接口管理器 + * + * @author ${authorName} + * @date ${genTime} + **/ +export default { + // 获取${functionName}分页 + ${classNameFirstLower}Page(data) { + return request('page', data, 'get') + }, + // 获取${functionName}列表 + ${classNameFirstLower}List(data) { + return request('list', data, 'get') + }, + // 提交${functionName}表单 edit为true时为编辑,默认为新增 + ${classNameFirstLower}SubmitForm(data, edit = false) { + return request(edit ? 'add' : 'edit', data) + }, + // 删除${functionName} + ${classNameFirstLower}Delete(data) { + return request('delete', data) + }, + // 获取${functionName}详情 + ${classNameFirstLower}Detail(data) { + return request('detail', data, 'get') + } +} diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/form.vue.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/form.vue.btl new file mode 100644 index 00000000..4905e259 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/form.vue.btl @@ -0,0 +1,175 @@ + + + diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/index.vue.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/index.vue.btl new file mode 100644 index 00000000..3adfbd36 --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/frontend/index.vue.btl @@ -0,0 +1,254 @@ + + + diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Mysql.sql.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Mysql.sql.btl new file mode 100644 index 00000000..7d920c9a --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Mysql.sql.btl @@ -0,0 +1,14 @@ +/* + Source Server Type : MySQL + Date: ${genTime} +*/ + +INSERT INTO `SYS_RESOURCE` VALUES ('${menuId}', '${parentId}', '${functionName}管理', '${busName}', '${menuCode}', 'MENU', '${moduleId}', 'MENU', '${menuPath}', '${menuComponent}', NULL, NULL, 99, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); + +INSERT INTO `SYS_RESOURCE` VALUES ('${addButtonId}', '${menuId}', '新增${functionName}', NULL, '${classNameFirstLower}Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); + +INSERT INTO `SYS_RESOURCE` VALUES ('${batchDeleteButtonId}', '${menuId}', '批量删除${functionName}', NULL, '${classNameFirstLower}BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); + +INSERT INTO `SYS_RESOURCE` VALUES ('${editButtonId}', '${menuId}', '编辑${functionName}', NULL, '${classNameFirstLower}Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); + +INSERT INTO `SYS_RESOURCE` VALUES ('${deleteButtonId}', '${menuId}', '删除${functionName}', NULL, '${classNameFirstLower}Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); diff --git a/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Oracle.sql.btl b/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Oracle.sql.btl new file mode 100644 index 00000000..d588ab5f --- /dev/null +++ b/snowy-plugin/snowy-plugin-gen/src/main/resources/sqlend/Oracle.sql.btl @@ -0,0 +1,14 @@ +/* + Source Server Type: Oracle + Date: ${genTime} +*/ + +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${menuId}', '${parentId}', '${functionName}管理', '${busName}', '${menuCode}', 'MENU', '${moduleId}', 'MENU', '${menuPath}', '${menuComponent}', NULL, NULL, '99', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); + +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${addButtonId}', '${menuId}', '新增${functionName}', NULL, '${classNameFirstLower}Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '1', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); + +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${batchDeleteButtonId}', '${menuId}', '批量删除${functionName}', NULL, '${classNameFirstLower}BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '2', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); + +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${editButtonId}', '${menuId}', '编辑${functionName}', NULL, '${classNameFirstLower}Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '3', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); + +INSERT INTO "SNOWY"."SYS_RESOURCE" VALUES ('${deleteButtonId}', '${menuId}', '删除${functionName}', NULL, '${classNameFirstLower}Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, '4', NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL); diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysButtonApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysButtonApiProvider.java new file mode 100644 index 00000000..301cd8b2 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysButtonApiProvider.java @@ -0,0 +1,39 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.provider; + +import org.springframework.stereotype.Service; +import vip.xiaonuo.sys.api.SysButtonApi; +import vip.xiaonuo.sys.api.SysMenuApi; +import vip.xiaonuo.sys.modular.resource.service.SysButtonService; +import vip.xiaonuo.sys.modular.resource.service.SysMenuService; + +import javax.annotation.Resource; + +/** + * 按钮API接口实现类 + * + * @author xuyuxiang + * @date 2022/11/1 13:50 + **/ +@Service +public class SysButtonApiProvider implements SysButtonApi { + + @Resource + private SysButtonService sysButtonService; + + @Override + public void addForGenButton(String menuId, String className, String functionName) { + sysButtonService.addForGenButton(menuId, className, functionName); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysMenuApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysMenuApiProvider.java new file mode 100644 index 00000000..a8798951 --- /dev/null +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/provider/SysMenuApiProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package vip.xiaonuo.sys.modular.resource.provider; + +import org.springframework.stereotype.Service; +import vip.xiaonuo.sys.api.SysMenuApi; +import vip.xiaonuo.sys.modular.resource.service.SysMenuService; + +import javax.annotation.Resource; + +/** + * 菜单API接口实现类 + * + * @author xuyuxiang + * @date 2022/11/1 13:50 + **/ +@Service +public class SysMenuApiProvider implements SysMenuApi { + + @Resource + private SysMenuService sysMenuService; + + @Override + public String addForGenMenu(String parentId, String busName, String module, String title, String path) { + return sysMenuService.addForGenMenu(parentId, busName, title, module, path); + } +} diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java index 82bdfd3c..4a69b8e0 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysButtonService.java @@ -46,6 +46,15 @@ public interface SysButtonService extends IService { */ void add(SysButtonAddParam sysButtonAddParam); + /** + * 代码生成按钮插入 + * + * @author xuyuxiang + * @date 2022/11/1 15:34 + * @return java.lang.String + **/ + void addForGenButton(String menuId, String className, String functionName); + /** * 编辑按钮 * diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java index 1aeb3b88..e9263a75 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/SysMenuService.java @@ -54,6 +54,14 @@ public interface SysMenuService extends IService { */ void add(SysMenuAddParam sysMenuAddParam); + /** + * 代码生成菜单插入 + * + * @author xuyuxiang + * @date 2022/11/1 14:06 + **/ + String addForGenMenu(String parentId, String busName, String title, String module, String path); + /** * 编辑菜单 * diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java index d1ecac68..3c8c39a9 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysButtonServiceImpl.java @@ -96,6 +96,21 @@ public class SysButtonServiceImpl extends ServiceImpl { + SysButtonAddParam sysButtonAddParam = new SysButtonAddParam(); + BeanUtil.copyProperties(jsonObject, sysButtonAddParam); + sysButtonAddParam.setParentId(sysMenu.getId()); + this.add(sysButtonAddParam); + }); + } + @Override public void edit(SysButtonEditParam sysButtonEditParam) { SysButton sysButton = this.queryEntity(sysButtonEditParam.getId()); diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java index db960281..ef5b9a12 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/resource/service/impl/SysMenuServiceImpl.java @@ -28,6 +28,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import vip.xiaonuo.common.enums.CommonSortOrderEnum; import vip.xiaonuo.common.exception.CommonException; import vip.xiaonuo.common.page.CommonPageRequest; @@ -125,6 +126,45 @@ public class SysMenuServiceImpl extends ServiceImpl impl this.save(sysMenu); } + @Transactional(rollbackFor = Exception.class) + @Override + public String addForGenMenu(String parentId, String busName, String title, String module, String path) { + // 参数校验 + if(!parentId.equals("0")) { + SysMenu parentMenu = this.queryEntity(parentId); + if(ObjectUtil.isEmpty(parentMenu)) { + throw new CommonException("上级菜单不存在,id值为:{}", parentId); + } + if(!parentMenu.getModule().equals(module)) { + throw new CommonException("module与上级菜单不一致"); + } + } + // 删除老菜单(同时删除其下面的菜单、按钮,清除对应的角色与资源信息 + SysMenu sysOldMenu = this.getOne(new LambdaQueryWrapper().eq(SysMenu::getTitle, title) + .eq(SysMenu::getCategory, SysResourceCategoryEnum.MENU.getValue()) + .eq(SysMenu::getMenuType, SysResourceMenuTypeEnum.MENU.getValue()).eq(SysMenu::getPath, path)); + if(ObjectUtil.isNotEmpty(sysOldMenu)) { + SysMenuIdParam sysMenuIdParam = new SysMenuIdParam(); + sysMenuIdParam.setId(sysOldMenu.getId()); + this.delete(CollectionUtil.newArrayList(sysMenuIdParam)); + } + // 插入新菜单 + SysMenu sysMenu = new SysMenu(); + sysMenu.setParentId(parentId); + sysMenu.setTitle(title); + sysMenu.setName(busName); + sysMenu.setCode(RandomUtil.randomString(10)); + sysMenu.setCategory(SysResourceCategoryEnum.MENU.getValue()); + sysMenu.setModule(module); + sysMenu.setMenuType(SysResourceMenuTypeEnum.MENU.getValue()); + sysMenu.setPath(path); + sysMenu.setComponent(StrUtil.removePrefix(path, StrUtil.SLASH) + StrUtil.SLASH + "index"); + sysMenu.setIcon("appstore-outlined"); + sysMenu.setSortCode(99); + this.save(sysMenu); + return sysMenu.getId(); + } + private void checkParam(SysMenuAddParam sysMenuAddParam) { SysResourceMenuTypeEnum.validate(sysMenuAddParam.getMenuType()); if(SysResourceMenuTypeEnum.MENU.getValue().equals(sysMenuAddParam.getMenuType())) { diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java index 4ea37ece..64a32b40 100644 --- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java +++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/role/provider/SysRoleApiProvider.java @@ -12,12 +12,26 @@ */ package vip.xiaonuo.sys.modular.role.provider; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import vip.xiaonuo.sys.api.SysRoleApi; +import vip.xiaonuo.sys.core.enums.SysBuildInEnum; +import vip.xiaonuo.sys.modular.relation.entity.SysRelation; +import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum; +import vip.xiaonuo.sys.modular.relation.service.SysRelationService; +import vip.xiaonuo.sys.modular.resource.entity.SysButton; +import vip.xiaonuo.sys.modular.resource.entity.SysMenu; +import vip.xiaonuo.sys.modular.resource.enums.SysResourceCategoryEnum; +import vip.xiaonuo.sys.modular.resource.service.SysButtonService; +import vip.xiaonuo.sys.modular.resource.service.SysMenuService; import vip.xiaonuo.sys.modular.role.entity.SysRole; +import vip.xiaonuo.sys.modular.role.enums.SysRoleCategoryEnum; +import vip.xiaonuo.sys.modular.role.param.SysRoleGrantResourceParam; import vip.xiaonuo.sys.modular.role.param.SysRoleSelectorRoleParam; import vip.xiaonuo.sys.modular.role.service.SysRoleService; @@ -37,6 +51,15 @@ public class SysRoleApiProvider implements SysRoleApi { @Resource private SysRoleService sysRoleService; + @Resource + private SysMenuService sysMenuService; + + @Resource + private SysButtonService sysButtonService; + + @Resource + private SysRelationService sysRelationService; + @Override public boolean orgHasRole(List orgIdList) { return sysRoleService.count(new LambdaQueryWrapper().in(SysRole::getOrgId, orgIdList)) > 0; @@ -50,4 +73,34 @@ public class SysRoleApiProvider implements SysRoleApi { sysRoleSelectorRoleParam.setSearchKey(searchKey); return sysRoleService.roleSelector(sysRoleSelectorRoleParam).stream().map(JSONUtil::parseObj).collect(Collectors.toList()); } + + @Transactional(rollbackFor = Exception.class) + @Override + public void grantForGenMenuAndButton(String menuId) { + String superAdminRoleId = sysRoleService.getOne(new LambdaQueryWrapper().eq(SysRole::getCode, SysBuildInEnum.BUILD_IN_ROLE_CODE.getValue()) + .eq(SysRole::getCategory, SysRoleCategoryEnum.GLOBAL.getValue())).getId(); + SysRoleGrantResourceParam sysRoleGrantResourceParam = new SysRoleGrantResourceParam(); + sysRoleGrantResourceParam.setId(superAdminRoleId); + SysMenu sysMenu = sysMenuService.queryEntity(menuId); + SysRoleGrantResourceParam.SysRoleGrantResource sysRoleGrantResource = new SysRoleGrantResourceParam.SysRoleGrantResource(); + sysRoleGrantResource.setMenuId(sysMenu.getId()); + List buttonIdList = sysButtonService.list(new LambdaQueryWrapper().eq(SysButton::getParentId, + sysMenu.getId()).eq(SysButton::getCategory, SysResourceCategoryEnum.BUTTON.getValue())).stream() + .map(SysButton::getId).collect(Collectors.toList()); + sysRoleGrantResource.setButtonInfo(buttonIdList); + sysRoleGrantResourceParam.setGrantInfoList(CollectionUtil.newArrayList(sysRoleGrantResource)); + + List menuIdList = sysRoleGrantResourceParam.getGrantInfoList().stream() + .map(SysRoleGrantResourceParam.SysRoleGrantResource::getMenuId).collect(Collectors.toList()); + List extJsonList = sysRoleGrantResourceParam.getGrantInfoList().stream() + .map(JSONUtil::toJsonStr).collect(Collectors.toList()); + + List existMenuIdList = sysMenuService.list(new LambdaQueryWrapper().eq(SysMenu::getCategory, + SysResourceCategoryEnum.MENU.getValue())).stream().map(SysMenu::getId).collect(Collectors.toList()); + if(ObjectUtil.isNotEmpty(existMenuIdList)) { + sysRelationService.remove(new LambdaQueryWrapper().eq(SysRelation::getObjectId, superAdminRoleId) + .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue()).notIn(SysRelation::getTargetId, existMenuIdList)); + } + sysRelationService.saveRelationBatchWithAppend(superAdminRoleId, menuIdList, SysRelationCategoryEnum.SYS_ROLE_HAS_RESOURCE.getValue(), extJsonList); + } } diff --git a/snowy-web-app/pom.xml b/snowy-web-app/pom.xml index 872814a0..0fe6a311 100644 --- a/snowy-web-app/pom.xml +++ b/snowy-web-app/pom.xml @@ -120,6 +120,13 @@ ${project.parent.version} + + + vip.xiaonuo + snowy-plugin-gen + ${project.parent.version} + + vip.xiaonuo