From 8be13f00a4ec642ebde27fff157a6b1681cabab7 Mon Sep 17 00:00:00 2001 From: ailanyin Date: Tue, 4 Jul 2023 17:53:04 +0800 Subject: [PATCH] add --- .../src/main/resources/application-dev.yml | 2 +- .../src/main/resources/application.yml | 3 - .../qiaoba-module-generator/pom.xml | 4 - .../generator/constant/GenConstants.java | 65 +++++++---- .../controller/GeneratorController.java | 66 ++++++++--- .../module/generator/entity/Generator.java | 6 + .../generator/entity/GeneratorTable.java | 6 +- .../entity/dto/GeneratorTableDto.java | 5 + .../mapper/GeneratorTableColumnMapper.java | 9 +- .../mapper/GeneratorTableMapper.java | 2 + .../service/GeneratorTableColumnService.java | 23 +++- .../service/GeneratorTableService.java | 44 +++++-- .../impl/GeneratorTableColumnServiceImpl.java | 19 ++- .../impl/GeneratorTableServiceImpl.java | 110 +++++++++++++++--- .../module/generator/util/GeneratorUtil.java | 47 +++++--- .../module/generator/util/VelocityUtil.java | 66 +++++++---- .../mapper/GeneratorTableColumnMapper.xml | 8 +- ...bleMapper.xml => GeneratorTableMapper.xml} | 8 +- .../src/main/resources/vm.zip | Bin 10666 -> 11457 bytes .../src/main/resources/vm/README | 1 + .../src/main/resources/vm/java/dto.java.vm | 1 - .../src/main/resources/vm/java/entity.java.vm | 3 - .../src/main/resources/vm/java/param.java.vm | 29 ++++- .../resources/vm/java/serviceImpl.java.vm | 25 ++++ 24 files changed, 417 insertions(+), 135 deletions(-) rename qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/{TableMapper.xml => GeneratorTableMapper.xml} (95%) create mode 100644 qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/README diff --git a/qiaoba-application/src/main/resources/application-dev.yml b/qiaoba-application/src/main/resources/application-dev.yml index 8099228..843c8a8 100644 --- a/qiaoba-application/src/main/resources/application-dev.yml +++ b/qiaoba-application/src/main/resources/application-dev.yml @@ -43,7 +43,7 @@ mybatis-plus: # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 autoMappingUnknownColumnBehavior: NONE # 控制台打印 SQL - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl logging: level: diff --git a/qiaoba-application/src/main/resources/application.yml b/qiaoba-application/src/main/resources/application.yml index 1305aab..e454204 100644 --- a/qiaoba-application/src/main/resources/application.yml +++ b/qiaoba-application/src/main/resources/application.yml @@ -115,9 +115,6 @@ springdoc: - group: '监控管理' paths-to-match: '/**' packages-to-scan: com.qiaoba.module.monitor.controller - - group: '代码生成' - paths-to-match: '/**' - packages-to-scan: com.qiaoba.module.generator.controller # knife4j的增强配置,不需要增强可以不配 knife4j: enable: true diff --git a/qiaoba-modules/qiaoba-module-generator/pom.xml b/qiaoba-modules/qiaoba-module-generator/pom.xml index a4c1a75..8f9a084 100644 --- a/qiaoba-modules/qiaoba-module-generator/pom.xml +++ b/qiaoba-modules/qiaoba-module-generator/pom.xml @@ -30,10 +30,6 @@ org.apache.velocity velocity-engine-core - - com.qiaoba - qiaoba-common-doc - com.qiaoba qiaoba-auth diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/constant/GenConstants.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/constant/GenConstants.java index d7d206f..61f4b31 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/constant/GenConstants.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/constant/GenConstants.java @@ -7,50 +7,42 @@ package com.qiaoba.module.generator.constant; */ public class GenConstants { + /*====================================[数据库]=========================================*/ + /** * 数据库字符串类型 */ - public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; + public static final String[] COLUMN_TYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; /** * 数据库文本类型 */ - public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; + public static final String[] COLUMN_TYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; /** * 数据库时间类型 */ - public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; + public static final String[] COLUMN_TYPE_TIME = {"datetime", "time", "date", "timestamp"}; /** * 数据库数字类型 */ - public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + public static final String[] COLUMN_TYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", "bit", "bigint", "float", "double", "decimal"}; /** - * 页面不需要编辑字段 + * 页面不需要处理的字段 */ - public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"}; + public static final String[] COLUMN_NAME_NOT_HANDLE = {"id", "create_user", "create_time", "del_flag", "update_user", + "update_time", "tenant_id"}; - /** - * 页面不需要显示的列表字段 - */ - public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by", - "update_time"}; - - /** - * 页面不需要查询字段 - */ - public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", - "update_time", "remark"}; /** * Entity基类字段 */ public static final String[] BASE_ENTITY = {"createUser", "createTime", "updateUser", "updateTime", "remark", "tenantId"}; - + /*====================================[前端控件]=========================================*/ /** * 文本框 */ @@ -96,6 +88,7 @@ public class GenConstants { */ public static final String HTML_EDITOR = "editor"; + /*====================================[后端类型]=========================================*/ /** * 字符串类型 */ @@ -141,33 +134,57 @@ public class GenConstants { */ public static final String REQUIRE = "1"; + /*====================================[特殊处理]=========================================*/ + /** - * 需求处理成 模糊搜索 的字段 + * 需要处理成 模糊搜索 的字段 */ public static final String[] HTML_LIKE_COLUMN = {"name", "code", "phone"}; /** - * 需求处理成 单选框 的字段 + * 需要处理成 单选框 的字段 */ public static final String[] HTML_RADIO_COLUMN = {"status"}; /** - * 需求处理成 下拉框 的字段 + * 需要处理成 下拉框 的字段 */ public static final String[] HTML_SELECT_COLUMN = {"type", "sex", "gender"}; /** - * 需求处理成 图片上传控件 的字段 + * 需要处理成 图片上传控件 的字段 */ public static final String[] HTML_IMAGE_COLUMN = {"image", "pic"}; /** - * 需求处理成 文件上传控件 的字段 + * 需要处理成 文件上传控件 的字段 */ public static final String[] HTML_FILE_COLUMN = {"file"}; /** - * 需求处理成 富文本 的字段 + * 需要处理成 富文本 的字段 */ public static final String[] HTML_EDITOR_COLUMN = {"content", "description"}; + + /*====================================[下载类型]=========================================*/ + + /** + * 下载-全部 + */ + public static final String TEMPLATE_TYPE_ALL = "all"; + + /** + * 下载-后端 + */ + public static final String TEMPLATE_TYPE_JAVA = "java"; + + /** + * 下载-前端 + */ + public static final String TEMPLATE_TYPE_VUE = "vue"; + + /** + * 下载-SQL + */ + public static final String TEMPLATE_TYPE_SQL = "sql"; } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/controller/GeneratorController.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/controller/GeneratorController.java index 207695a..7cb28fa 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/controller/GeneratorController.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/controller/GeneratorController.java @@ -1,19 +1,18 @@ package com.qiaoba.module.generator.controller; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.io.IoUtil; import com.qiaoba.common.base.result.AjaxResult; import com.qiaoba.common.database.entity.PageQuery; import com.qiaoba.common.database.entity.TableDataInfo; +import com.qiaoba.module.generator.constant.GenConstants; import com.qiaoba.module.generator.entity.GeneratorTable; import com.qiaoba.module.generator.entity.GeneratorTableColumn; import com.qiaoba.module.generator.entity.dto.GeneratorTableDto; import com.qiaoba.module.generator.entity.dto.TableDto; import com.qiaoba.module.generator.service.GeneratorTableColumnService; import com.qiaoba.module.generator.service.GeneratorTableService; -import io.swagger.v3.oas.annotations.Operation; +import com.qiaoba.module.generator.util.GeneratorUtil; import lombok.RequiredArgsConstructor; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,14 +39,16 @@ public class GeneratorController { private final GeneratorTableColumnService generatorTableColumnService; /** - * 查询代码生成列表 + * 代码生成列表 */ @GetMapping("/list") - @Operation(summary = "获取列表") public TableDataInfo list(TableDto dto, PageQuery pageQuery) { return generatorTableService.selectPageList(dto, pageQuery); } + /** + * 代码生成详细 + */ @GetMapping(value = "/{tableId}") public AjaxResult getInfo(@PathVariable String tableId) { GeneratorTable table = generatorTableService.selectById(tableId); @@ -58,6 +59,9 @@ public class GeneratorController { return AjaxResult.success(map); } + /** + * 修改代码生成 + */ @PutMapping public AjaxResult edit(@RequestBody GeneratorTableDto dto) { GeneratorTable generatorTable = BeanUtil.copyProperties(dto, GeneratorTable.class); @@ -66,31 +70,55 @@ public class GeneratorController { return AjaxResult.toAjax(result); } + /** + * 批量删除代码生成 + */ + @DeleteMapping("/{tableIds}") + public AjaxResult remove(@PathVariable List tableIds) { + return AjaxResult.toAjax(generatorTableService.deleteByIds(tableIds)); + } /** - * 导入表结构(保存) + * 数据库表列表(排除已导入表) + */ + @GetMapping("/db/list") + public TableDataInfo dbTableList(TableDto dto, PageQuery pageQuery) { + return generatorTableService.selectPageDbTableList(dto, pageQuery); + } + + /** + * 导入表结构 */ @PostMapping("/importTable") public AjaxResult importTable(@RequestBody TableDto dto) { return AjaxResult.toAjax(generatorTableService.importTable(dto)); } - @GetMapping("/download/{tableName}") - public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { - byte[] data = generatorTableService.downloadCode(tableName); - genCode(response, data); + /** + * 预览代码 + */ + @GetMapping("/preview/{tableId}") + public AjaxResult preview(@PathVariable("tableId") String tableId) { + Map dataMap = generatorTableService.previewCode(tableId, GenConstants.TEMPLATE_TYPE_ALL); + return AjaxResult.success(dataMap); } /** - * 生成zip文件 + * 下载文件 */ - private void genCode(HttpServletResponse response, byte[] data) throws IOException { - response.reset(); - response.addHeader("Access-Control-Allow-Origin", "*"); - response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); - response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); - response.addHeader("Content-Length", "" + data.length); - response.setContentType("application/octet-stream; charset=UTF-8"); - IoUtil.write(response.getOutputStream(), true, data); + @GetMapping("/download/{tableId}/{templateType}") + public void download(HttpServletResponse response, @PathVariable String tableId, @PathVariable String templateType) throws IOException { + byte[] data = generatorTableService.downloadCode(tableId, templateType); + GeneratorUtil.download(response, data); } + + /** + * 同步表结构 + */ + @GetMapping("/syncTable/{tableId}") + public AjaxResult syncTable(@PathVariable String tableId) { + generatorTableService.syncTable(tableId); + return AjaxResult.success(); + } + } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/Generator.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/Generator.java index 301ab76..08ece2f 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/Generator.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/Generator.java @@ -22,12 +22,18 @@ public class Generator implements Serializable { private List columns; + private List queryColumns; + private GeneratorTableColumn pkColumn; public boolean isBaseColumn(String column) { return ArrayUtil.contains(GenConstants.BASE_ENTITY, column); } + public boolean isQueryColumn(String isQuery) { + return BaseEnum.YES.getCode().equals(isQuery); + } + public boolean isPk(String isPk) { return BaseEnum.YES.getCode().equals(isPk); } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/GeneratorTable.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/GeneratorTable.java index ec0e50d..e73a228 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/GeneratorTable.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/GeneratorTable.java @@ -66,8 +66,8 @@ public class GeneratorTable implements Serializable { private String author; /** - * 生成路径(不填默认项目路径) + * 父级菜单ID */ - private String genPath; + private String parentMenuId; -} \ No newline at end of file +} diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/dto/GeneratorTableDto.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/dto/GeneratorTableDto.java index 36b4ff8..a3eb3a7 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/dto/GeneratorTableDto.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/entity/dto/GeneratorTableDto.java @@ -72,6 +72,11 @@ public class GeneratorTableDto implements Serializable { */ private String genPath; + /** + * 父级菜单ID + */ + private String parentMenuId; + /** * 字段信息 */ diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/mapper/GeneratorTableColumnMapper.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/mapper/GeneratorTableColumnMapper.java index dd9429b..a30ebd3 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/mapper/GeneratorTableColumnMapper.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/mapper/GeneratorTableColumnMapper.java @@ -23,5 +23,12 @@ public interface GeneratorTableColumnMapper extends BaseMapper selectListByTableName(String tableName); + List selectDbColumnList(String tableName); + + /** + * 通过 tableIds 批量删除 + * + * @param tableIds tableIds + */ + void deleteByTableIds(List tableIds); } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/mapper/GeneratorTableMapper.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/mapper/GeneratorTableMapper.java index 7516c7e..83b74f7 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/mapper/GeneratorTableMapper.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/mapper/GeneratorTableMapper.java @@ -1,5 +1,6 @@ package com.qiaoba.module.generator.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.qiaoba.module.generator.entity.GeneratorTable; @@ -14,6 +15,7 @@ import org.apache.ibatis.annotations.Param; * @version 1.0 * @since 2023/6/26 9:24 */ +@InterceptorIgnore(tenantLine = "true") public interface GeneratorTableMapper extends BaseMapper { /** diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/GeneratorTableColumnService.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/GeneratorTableColumnService.java index b72e4cc..6b3a3be 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/GeneratorTableColumnService.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/GeneratorTableColumnService.java @@ -21,7 +21,7 @@ public interface GeneratorTableColumnService { * @param allowNull 允许空 * @return list */ - List selectVoListByTableName(String tableName, boolean allowNull); + List selectDbColumnList(String tableName, boolean allowNull); /** * 查询表的字段信息 @@ -40,10 +40,31 @@ public interface GeneratorTableColumnService { */ Integer insert(GeneratorTableColumn generatorTableColumn); + /** + * 根据ID更新 + * + * @param generatorTableColumn generatorTableColumn + */ + void updateById(GeneratorTableColumn generatorTableColumn); + /** * 批量根据ID更新 * * @param columns columns */ void updateBatchById(List columns); + + /** + * 通过 tableIds 批量删除 + * + * @param tableIds tableIds + */ + void deleteByTableIds(List tableIds); + + /** + * 通过主键批量删除 + * + * @param ids 主键Ids + */ + void deleteByIds(List ids); } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/GeneratorTableService.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/GeneratorTableService.java index 59eb376..5bedf2a 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/GeneratorTableService.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/GeneratorTableService.java @@ -6,6 +6,9 @@ import com.qiaoba.module.generator.entity.GeneratorTable; import com.qiaoba.module.generator.entity.dto.TableDto; import com.qiaoba.module.generator.entity.vo.DbTableVo; +import java.util.List; +import java.util.Map; + /** * 数据库表 服务层 * @@ -16,7 +19,7 @@ import com.qiaoba.module.generator.entity.vo.DbTableVo; public interface GeneratorTableService { /** - * 查询业务列表 + * 查询代码生成列表 * * @param dto 查询条件 * @param pageQuery 分页 @@ -25,7 +28,7 @@ public interface GeneratorTableService { TableDataInfo selectPageList(TableDto dto, PageQuery pageQuery); /** - * 根据ID查询业务 + * 查询代码生成详细 * * @param tableId tableId * @return info @@ -33,7 +36,7 @@ public interface GeneratorTableService { GeneratorTable selectById(String tableId); /** - * 根据ID更新 + * 更新代码生成 * * @param generatorTable generatorTable * @return 结果 @@ -50,13 +53,13 @@ public interface GeneratorTableService { TableDataInfo selectPageDbTableList(TableDto dto, PageQuery pageQuery); /** - * 通过表名查询 + * 通过表名查询代码生成 * - * @param tableName 表名 + * @param tableId 表ID * @param allowNull 允许空 * @return GeneratorTable */ - GeneratorTable selectByTableName(String tableName, boolean allowNull); + GeneratorTable selectByTableId(String tableId, boolean allowNull); /** * 导入表结构 @@ -69,9 +72,34 @@ public interface GeneratorTableService { /** * 下载 * - * @param tableName 表名 + * @param tableId 表ID + * @param templateType 模板类型(前端/后端/sql/全部) * @return 文件字节 */ - byte[] downloadCode(String tableName); + byte[] downloadCode(String tableId, String templateType); + + /** + * 预览代码 + * + * @param tableId tableId + * @param templateType 模板类型(前端/后端/sql/全部) + * @return 结果 + */ + Map previewCode(String tableId, String templateType); + + /** + * 批量删除代码生成 + * + * @param tableIds tableIds + * @return 结果 + */ + int deleteByIds(List tableIds); + + /** + * 同步表结构 + * + * @param tableId 表ID + */ + void syncTable(String tableId); } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/impl/GeneratorTableColumnServiceImpl.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/impl/GeneratorTableColumnServiceImpl.java index 403ff71..6aee735 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/impl/GeneratorTableColumnServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/impl/GeneratorTableColumnServiceImpl.java @@ -28,8 +28,8 @@ public class GeneratorTableColumnServiceImpl implements GeneratorTableColumnServ private final GeneratorTableColumnMapper generatorTableColumnMapper; @Override - public List selectVoListByTableName(String tableName, boolean allowNull) { - List list = generatorTableColumnMapper.selectListByTableName(tableName); + public List selectDbColumnList(String tableName, boolean allowNull) { + List list = generatorTableColumnMapper.selectDbColumnList(tableName); if (CollUtil.isEmpty(list) && !allowNull) { throw new ServiceException(StrUtil.format("未查询到表字段信息, 表名: {}", tableName)); } @@ -53,8 +53,23 @@ public class GeneratorTableColumnServiceImpl implements GeneratorTableColumnServ return generatorTableColumnMapper.insert(generatorTableColumn); } + @Override + public void updateById(GeneratorTableColumn generatorTableColumn) { + generatorTableColumnMapper.updateById(generatorTableColumn); + } + @Override public void updateBatchById(List columns) { Db.updateBatchById(columns); } + + @Override + public void deleteByTableIds(List tableIds) { + generatorTableColumnMapper.deleteByTableIds(tableIds); + } + + @Override + public void deleteByIds(List ids) { + generatorTableColumnMapper.deleteBatchIds(ids); + } } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/impl/GeneratorTableServiceImpl.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/impl/GeneratorTableServiceImpl.java index 4f5fb1b..fc735ad 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/impl/GeneratorTableServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/service/impl/GeneratorTableServiceImpl.java @@ -1,11 +1,10 @@ package com.qiaoba.module.generator.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; -import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Sequence; import com.qiaoba.common.base.constants.BaseConstant; import com.qiaoba.common.base.enums.BaseEnum; import com.qiaoba.common.base.exceptions.ServiceException; @@ -30,12 +29,14 @@ import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.StringWriter; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -81,12 +82,10 @@ public class GeneratorTableServiceImpl implements GeneratorTableService { } @Override - public GeneratorTable selectByTableName(String tableName, boolean allowNull) { - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(GeneratorTable::getTableName, tableName); - GeneratorTable generatorTable = generatorTableMapper.selectOne(wrapper); + public GeneratorTable selectByTableId(String tableId, boolean allowNull) { + GeneratorTable generatorTable = generatorTableMapper.selectById(tableId); if (Objects.isNull(generatorTable) && !allowNull) { - throw new ServiceException(StrUtil.format("未查到表信息, 表名: {}", tableName)); + throw new ServiceException(StrUtil.format("未查到表信息, 表ID: {}", tableId)); } return generatorTable; } @@ -96,7 +95,7 @@ public class GeneratorTableServiceImpl implements GeneratorTableService { GeneratorTable generatorTable = GeneratorUtil.dtoToGeneratorTable(dto); int result = generatorTableMapper.insert(generatorTable); if (result > BaseConstant.HANDLE_ERROR) { - List columnVos = generatorTableColumnService.selectVoListByTableName(dto.getTableName(), false); + List columnVos = generatorTableColumnService.selectDbColumnList(dto.getTableName(), false); for (TableColumnVo columnVo : columnVos) { GeneratorTableColumn generatorTableColumn = GeneratorUtil.initColumn(columnVo, generatorTable.getTableId()); generatorTableColumnService.insert(generatorTableColumn); @@ -106,38 +105,103 @@ public class GeneratorTableServiceImpl implements GeneratorTableService { } @Override - public byte[] downloadCode(String tableName) { + public byte[] downloadCode(String tableId, String templateType) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); - generatorCode(tableName, zip); + generatorCode(tableId, templateType, zip); IoUtil.close(zip); return outputStream.toByteArray(); } - private void generatorCode(String tableName, ZipOutputStream zip) { + @Override + public Map previewCode(String tableId, String templateType) { + Map dataMap = new LinkedHashMap<>(); // 查询表信息 - GeneratorTable table = selectByTableName(tableName, false); + GeneratorTable table = selectByTableId(tableId, false); // 查询字段信息 List columns = generatorTableColumnService.selectListByTableId(table.getTableId(), false); Generator generator = new Generator(table, columns); // 设置主键列信息 setPkColumn(generator); + // 设置查询字段信息 + setQueryColumns(generator); // 初始化 Velocity VelocityFactory.init(); // 设置参数 VelocityContext context = VelocityUtil.setVariables(generator); // 获取模板列表 - List templates = VelocityUtil.getTemplateList(); + List templates = VelocityUtil.getTemplateList(templateType); for (String template : templates) { // 渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, BaseConstant.UTF8); tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteByIds(List tableIds) { + int result = generatorTableMapper.deleteBatchIds(tableIds); + if (result > BaseConstant.HANDLE_ERROR) { + generatorTableColumnService.deleteByTableIds(tableIds); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncTable(String tableId) { + // 查询表信息 + GeneratorTable table = selectByTableId(tableId, false); + // 查询最新表结构 + List dbColumns = generatorTableColumnService.selectDbColumnList(table.getTableName(), false); + // 查询保存的表结构 + List generatorTableColumns = generatorTableColumnService.selectListByTableId(tableId, false); + // 构造比较map + Map generatorTableColumnMap = generatorTableColumns.stream().collect(Collectors.toMap(GeneratorTableColumn::getColumnName, Function.identity())); + List dbTableColumnNames = dbColumns.stream().map(TableColumnVo::getColumnName).collect(Collectors.toList()); + // 开始比较 + dbColumns.forEach(column -> { + GeneratorTableColumn generatorTableColumn = GeneratorUtil.initColumn(column, tableId); + // 字段名不变 + if (generatorTableColumnMap.containsKey(column.getColumnName())) { + GeneratorTableColumn prevColumn = generatorTableColumnMap.get(column.getColumnName()); + generatorTableColumn.setColumnId(prevColumn.getColumnId()); + if (BaseEnum.YES.getCode().equals(generatorTableColumn.getIsList())) { + // 如果是列表,继续保留查询方式/字典类型选项 + generatorTableColumn.setDictType(prevColumn.getDictType()); + generatorTableColumn.setQueryType(prevColumn.getQueryType()); + } + generatorTableColumnService.updateById(generatorTableColumn); + } else { + generatorTableColumnService.insert(generatorTableColumn); + } + }); + + List deleteIds = new ArrayList<>(); + for (GeneratorTableColumn generatorTableColumn : generatorTableColumns) { + if (!dbTableColumnNames.contains(generatorTableColumn.getColumnName())) { + deleteIds.add(generatorTableColumn.getColumnId()); + } + } + if (CollUtil.isNotEmpty(deleteIds)) { + generatorTableColumnService.deleteByIds(deleteIds); + } + } + + private void generatorCode(String tableId, String templateType, ZipOutputStream zip) { + // 查询表信息 + GeneratorTable table = selectByTableId(tableId, false); + Map dataMap = previewCode(tableId, templateType); + for (String key : dataMap.keySet()) { + String code = dataMap.get(key); try { // 添加到zip - zip.putNextEntry(new ZipEntry(VelocityUtil.getFileName(template, table))); - IoUtil.write(zip, false, sw.toString().getBytes()); - IoUtil.close(sw); + zip.putNextEntry(new ZipEntry(VelocityUtil.getFileName(key, table))); + IoUtil.write(zip, false, code.getBytes()); zip.flush(); zip.closeEntry(); } catch (IOException e) { @@ -168,4 +232,14 @@ public class GeneratorTableServiceImpl implements GeneratorTableService { generator.setPkColumn(generator.getColumns().get(0)); } } + + private void setQueryColumns(Generator generator) { + List queryColumns = new ArrayList<>(); + for (GeneratorTableColumn column : generator.getColumns()) { + if (generator.isQueryColumn(column.getIsQuery())) { + queryColumns.add(column); + } + } + generator.setQueryColumns(queryColumns); + } } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/util/GeneratorUtil.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/util/GeneratorUtil.java index 59e8cc5..2444bd5 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/util/GeneratorUtil.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/util/GeneratorUtil.java @@ -1,6 +1,7 @@ package com.qiaoba.module.generator.util; +import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; import com.qiaoba.common.base.constants.BaseConstant; import com.qiaoba.common.base.utils.ArrayUtil; @@ -11,6 +12,8 @@ import com.qiaoba.module.generator.entity.GeneratorTableColumn; import com.qiaoba.module.generator.entity.dto.TableDto; import com.qiaoba.module.generator.entity.vo.TableColumnVo; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; /** @@ -35,23 +38,22 @@ public class GeneratorUtil { column.setQueryType(GenConstants.QUERY_EQ); column.setColumnType(vo.getColumnType()); setType(column, vo.getColumnType()); - // 插入字段(默认所有字段都需要插入) - column.setIsInsert(GenConstants.REQUIRE); + column.setIsPk(vo.getIsPk()); column.setIsRequired(vo.getIsRequired()); - // 编辑字段 - if (!ArrayUtil.contains(GenConstants.COLUMNNAME_NOT_EDIT, column.getColumnName()) && !BaseConstant.YES.equals(column.getIsPk())) { + // (排除基类字段) + if (!ArrayUtil.contains(GenConstants.COLUMN_NAME_NOT_HANDLE, column.getColumnName()) && !BaseConstant.YES.equals(column.getIsPk())) { + column.setIsInsert(GenConstants.REQUIRE); column.setIsEdit(GenConstants.REQUIRE); - } - // 列表字段 - if (!ArrayUtil.contains(GenConstants.COLUMNNAME_NOT_LIST, column.getColumnName()) && !BaseConstant.YES.equals(column.getIsPk())) { column.setIsList(GenConstants.REQUIRE); - } - // 查询字段 - if (!ArrayUtil.contains(GenConstants.COLUMNNAME_NOT_QUERY, column.getColumnName()) && !BaseConstant.YES.equals(column.getIsPk())) { - column.setIsQuery(GenConstants.REQUIRE); + } + // 查询字段 + if (ArrayUtil.containsValueIgnoreCase(GenConstants.HTML_LIKE_COLUMN, column.getColumnName())) { + column.setIsQuery(GenConstants.REQUIRE); + column.setQueryType(GenConstants.QUERY_LIKE); + } return column; } @@ -107,21 +109,21 @@ public class GeneratorUtil { // varchar(50) -> varchar columnType = StrUtil.subBefore(columnType, "(", false); // 字符串 or 长文本 - if (ArrayUtil.contains(GenConstants.COLUMNTYPE_STR, columnType) || ArrayUtil.contains(GenConstants.COLUMNTYPE_TEXT, columnType)) { + if (ArrayUtil.contains(GenConstants.COLUMN_TYPE_STR, columnType) || ArrayUtil.contains(GenConstants.COLUMN_TYPE_TEXT, columnType)) { // 字符串长度超过500设置为文本域 Integer columnLength = getColumnLength(column.getColumnType()); - String htmlType = columnLength >= 500 || ArrayUtil.contains(GenConstants.COLUMNTYPE_TEXT, columnType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + String htmlType = columnLength >= 500 || ArrayUtil.contains(GenConstants.COLUMN_TYPE_TEXT, columnType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; column.setHtmlType(htmlType); } // 时间类型 - if (ArrayUtil.contains(GenConstants.COLUMNTYPE_TIME, columnType)) { + if (ArrayUtil.contains(GenConstants.COLUMN_TYPE_TIME, columnType)) { column.setJavaType(GenConstants.TYPE_DATE); column.setHtmlType(GenConstants.HTML_DATETIME); } // 数字类型 - if (ArrayUtil.contains(GenConstants.COLUMNTYPE_NUMBER, columnType)) { + if (ArrayUtil.contains(GenConstants.COLUMN_TYPE_NUMBER, columnType)) { column.setHtmlType(GenConstants.HTML_INPUT); // 如果是浮点型 统一用BigDecimal List strList = StrUtil.split(StrUtil.subBetween(column.getColumnType(), "(", ")"), ","); @@ -139,10 +141,6 @@ public class GeneratorUtil { } } - // 字段包含中 LIKE_COLUMN 设置 type = like - if (ArrayUtil.containsValueIgnoreCase(GenConstants.HTML_LIKE_COLUMN, column.getColumnName())) { - column.setQueryType(GenConstants.QUERY_LIKE); - } // 单选框 if (ArrayUtil.containsValueIgnoreCase(GenConstants.HTML_RADIO_COLUMN, column.getColumnName())) { column.setHtmlType(GenConstants.HTML_RADIO); @@ -181,4 +179,15 @@ public class GeneratorUtil { } } + /** + * 生成zip文件 + */ + public static void download(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.addHeader("Content-Length", String.valueOf(data.length)); + response.setContentType("application/octet-stream; charset=UTF-8"); + IoUtil.write(response.getOutputStream(), true, data); + } } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/util/VelocityUtil.java b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/util/VelocityUtil.java index cb4f4cf..6f71eae 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/util/VelocityUtil.java +++ b/qiaoba-modules/qiaoba-module-generator/src/main/java/com/qiaoba/module/generator/util/VelocityUtil.java @@ -3,7 +3,9 @@ package com.qiaoba.module.generator.util; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.StrUtil; +import com.qiaoba.common.base.constants.BaseConstant; import com.qiaoba.common.base.context.BaseContext; +import com.qiaoba.module.generator.constant.GenConstants; import com.qiaoba.module.generator.entity.Generator; import com.qiaoba.module.generator.entity.GeneratorTable; import org.apache.commons.lang3.StringUtils; @@ -25,7 +27,6 @@ public class VelocityUtil { private static final String VM_DOMAIN = "entity.java.vm"; private static final String VM_DTO = "dto.java.vm"; private static final String VM_PARAM = "param.java.vm"; - private static final String VM_SUB_DOMAIN = "sub-entity.java.vm"; private static final String VM_MAPPER = "mapper.java.vm"; private static final String VM_MAPPER_XML = "mapper.xml.vm"; private static final String VM_SERVICE = "service.java.vm"; @@ -45,30 +46,49 @@ public class VelocityUtil { */ private static final String MYBATIS_PATH = "main/resources/mapper"; - /** - * 默认上级菜单,系统工具 - */ - private static final String DEFAULT_PARENT_MENU_ID = "3"; - /** * 加载模板 * * @return 模板集合 */ - public static List getTemplateList() { + public static List getTemplateList(String templateType) { List templates = new ArrayList<>(); - templates.add("vm/java/entity.java.vm"); - templates.add("vm/java/dto.java.vm"); - templates.add("vm/java/param.java.vm"); - templates.add("vm/java/mapper.java.vm"); - templates.add("vm/java/service.java.vm"); - templates.add("vm/java/serviceImpl.java.vm"); - templates.add("vm/java/controller.java.vm"); - - templates.add("vm/js/api.js.vm"); - templates.add("vm/sql/sql.vm"); - templates.add("vm/vue/index.vue.vm"); - + // 全部 + if (GenConstants.TEMPLATE_TYPE_ALL.equals(templateType)) { + // 后端 + templates.add("vm/java/entity.java.vm"); + templates.add("vm/java/dto.java.vm"); + templates.add("vm/java/param.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + // 前端 + templates.add("vm/js/api.js.vm"); + templates.add("vm/vue/index.vue.vm"); + // SQL + templates.add("vm/sql/sql.vm"); + } + // 后端 + else if (GenConstants.TEMPLATE_TYPE_JAVA.equals(templateType)) { + // 后端 + templates.add("vm/java/entity.java.vm"); + templates.add("vm/java/dto.java.vm"); + templates.add("vm/java/param.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + } + // 前端 + else if (GenConstants.TEMPLATE_TYPE_VUE.equals(templateType)) { + // 前端 + templates.add("vm/js/api.js.vm"); + templates.add("vm/vue/index.vue.vm"); + } else { + // SQL + templates.add("vm/sql/sql.vm"); + } return templates; } @@ -92,10 +112,10 @@ public class VelocityUtil { velocityContext.put("author", generator.getTable().getAuthor()); velocityContext.put("datetime", DateUtil.now()); velocityContext.put("pkColumn", generator.getPkColumn()); - // todo - //velocityContext.put("importList", getImportList(generator.getTable())) + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); velocityContext.put("columns", generator.getColumns()); + velocityContext.put("queryColumns", generator.getQueryColumns()); velocityContext.put("table", generator.getTable()); velocityContext.put("generator", generator); @@ -107,7 +127,9 @@ public class VelocityUtil { velocityContext.put("selectMenuId", new Snowflake().nextIdStr()); velocityContext.put("tenantId", BaseContext.getTenantId()); - velocityContext.put("parentMenuId", "0"); + + String parentMenuId = generator.getTable().getParentMenuId(); + velocityContext.put("parentMenuId", StrUtil.isNotBlank(parentMenuId) ? parentMenuId : BaseConstant.DEFAULT_PARENT_ID_VALUE); return velocityContext; } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/GeneratorTableColumnMapper.xml b/qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/GeneratorTableColumnMapper.xml index b7626b9..90ddef5 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/GeneratorTableColumnMapper.xml +++ b/qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/GeneratorTableColumnMapper.xml @@ -13,10 +13,16 @@ - select column_name, (case when (is_nullable = 'no' column_key != 'PRI') then '1' else null end) as is_required, (case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort, column_comment, column_type from information_schema.columns where table_schema = (select database()) and table_name = (#{tableName}) order by ordinal_position + + delete from generator_table_column where table_id in + + #{tableId} + + diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/TableMapper.xml b/qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/GeneratorTableMapper.xml similarity index 95% rename from qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/TableMapper.xml rename to qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/GeneratorTableMapper.xml index 3b9e7f9..08194a2 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/TableMapper.xml +++ b/qiaoba-modules/qiaoba-module-generator/src/main/resources/mapper/GeneratorTableMapper.xml @@ -15,8 +15,8 @@ select table_name, table_comment, create_time, update_time from information_schema.tables where table_schema = (select database()) - AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%' - AND table_name NOT IN (select table_name from gen_table) + AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'generator_%' + AND table_name NOT IN (select table_name from generator_table) AND lower(table_name) like lower(concat('%', #{dto.tableName}, '%')) @@ -34,7 +34,7 @@ and dt.table_name = uo.object_name and uo.object_type = 'TABLE' AND dt.table_name NOT LIKE 'XXL_JOB_%' AND dt.table_name NOT LIKE 'GEN_%' - AND dt.table_name NOT IN (select table_name from gen_table) + AND dt.table_name NOT IN (select table_name from generator_table) AND lower(dt.table_name) like lower(concat(concat('%', #{dto.tableName}), '%')) @@ -59,7 +59,7 @@ AND n.nspname ]]> ''::name ) list_table where table_name NOT LIKE 'xxl_job_%' AND table_name NOT LIKE 'gen_%' - AND table_name NOT IN (select table_name from gen_table) + AND table_name NOT IN (select table_name from generator_table) AND lower(table_name) like lower(concat('%', #{dto.tableName}, '%')) diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm.zip b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm.zip index fb7704a13f36436aec21866a5168076c28573106..513c624e602987798840d23c3e6d7645e7361a6f 100644 GIT binary patch delta 3403 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 G68Z~_7{?m` diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/README b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/README new file mode 100644 index 0000000..4473c4b --- /dev/null +++ b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/README @@ -0,0 +1 @@ +如果不慎使用了IDEA代码格式化, 导致代码生成出来的数据异常, 删除vm目录下的所有文件, 解压vm.zip下的文件即可 diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/dto.java.vm b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/dto.java.vm index 4844fd7..ea3db47 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/dto.java.vm +++ b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/dto.java.vm @@ -25,7 +25,6 @@ public class ${ClassName}Dto implements Serializable { #if(!$generator.isBaseColumn($column.javaField)) ## 是主键 #if($generator.isPk($column.isPk)) - @Schema(description = "$column.columnComment") private String $column.javaField; ## 不是主键 diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/entity.java.vm b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/entity.java.vm index eeb7a71..7bb7207 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/entity.java.vm +++ b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/entity.java.vm @@ -26,9 +26,6 @@ public class ${ClassName} extends BaseEntity{ #if(!$generator.isBaseColumn($column.javaField)) ## 是主键 #if($generator.isPk($column.isPk)) - /** - * $column.columnComment - */ @TableId private String $column.javaField; diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/param.java.vm b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/param.java.vm index 50c7151..f3414c7 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/param.java.vm +++ b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/param.java.vm @@ -4,10 +4,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; +import java.util.Date; + import java.io.Serializable; /** - * ${functionName} Param + * ${functionName} 查询参数 * * @author ${author} * @version 1.0 @@ -18,5 +20,30 @@ import java.io.Serializable; public class ${ClassName}Param implements Serializable { private static final long serialVersionUID=1L; +## 遍历字段 +#foreach ($column in $queryColumns) +#if($column.queryType == "BETWEEN") +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #if($column.javaType == "Date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + #end + @Schema(description = "开始$column.columnComment") + private $column.javaType start$AttrName; + + #if($column.javaType == "Date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + #end + @Schema(description = "结束$column.columnComment") + private $column.javaType end$AttrName; + +#else + + #if($column.javaType == "Date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + #end + @Schema(description = "$column.columnComment") + private $column.javaType $column.javaField; +#end +#end } diff --git a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/serviceImpl.java.vm b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/serviceImpl.java.vm index a89794c..7e8c271 100644 --- a/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/qiaoba-modules/qiaoba-module-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -2,6 +2,7 @@ package ${packageName}.service.impl; import java.util.*; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.qiaoba.auth.utils.SecurityUtil; import com.qiaoba.common.base.exceptions.ServiceException; @@ -94,6 +95,30 @@ public class ${ClassName}ServiceImpl implements ${ClassName}Service { private QueryWrapper<${ClassName}> param2Wrapper(${ClassName}Param param) { QueryWrapper<${ClassName}> wrapper = new QueryWrapper<>(); +#if($queryColumns.size() > 0) + wrapper.lambda() +#foreach ($column in $queryColumns) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#if($column.queryType == "EQ") + .eq(ObjectUtil.isNotEmpty(param.get${AttrName}()), ${ClassName}::get${AttrName}, param.get${AttrName}())#if($foreach.count == $queryColumns.size());#end +#elseif($column.queryType == "NE") + .ne(ObjectUtil.isNotEmpty(param.get${AttrName}()), ${ClassName}::get${AttrName}, param.get${AttrName}())#if($foreach.count == $queryColumns.size());#end +#elseif($column.queryType == "GT") + .gt(ObjectUtil.isNotEmpty(param.get${AttrName}()), ${ClassName}::get${AttrName}, param.get${AttrName}())#if($foreach.count == $queryColumns.size());#end +#elseif($column.queryType == "GTE") + .ge(ObjectUtil.isNotEmpty(param.get${AttrName}()), ${ClassName}::get${AttrName}, param.get${AttrName}())#if($foreach.count == $queryColumns.size());#end +#elseif($column.queryType == "LT") + .lt(ObjectUtil.isNotEmpty(param.get${AttrName}()), ${ClassName}::get${AttrName}, param.get${AttrName}())#if($foreach.count == $queryColumns.size());#end +#elseif($column.queryType == "LTE") + .le(ObjectUtil.isNotEmpty(param.get${AttrName}()), ${ClassName}::get${AttrName}, param.get${AttrName}())#if($foreach.count == $queryColumns.size());#end +#elseif($column.queryType == "LIKE") + .like(ObjectUtil.isNotEmpty(param.get${AttrName}()), ${ClassName}::get${AttrName}, param.get${AttrName}())#if($foreach.count == $queryColumns.size());#end +#elseif($column.queryType == "BETWEEN") + .between((ObjectUtil.isNotEmpty(param.getStart${AttrName}()) && ObjectUtil.isNotEmpty(param.getEnd${AttrName}())), + ${ClassName}::get${AttrName}, param.getStart${AttrName}(), param.getEnd${AttrName}())#if($foreach.count == $queryColumns.size());#end +#end +#end +#end return wrapper; } }