From 56a81b770471703a47eb22a1ca78860efa958415 Mon Sep 17 00:00:00 2001 From: konbai <1527468660@qq.com> Date: Sat, 19 Mar 2022 14:05:07 +0800 Subject: [PATCH] =?UTF-8?q?fix=20--=20=E5=90=8C=E6=AD=A5=20RuoYi-Vue-Plus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 5 + .../src/main/resources/application-prod.yml | 5 + .../src/main/resources/application.yml | 20 +- .../main/resources/i18n/messages.properties | 2 + .../resources/i18n/messages_en_US.properties | 2 + .../resources/i18n/messages_zh_CN.properties | 2 + .../ruoyi/common/annotation/RepeatSubmit.java | 4 +- .../com/ruoyi/common/constant/Constants.java | 4 +- .../ruoyi/common/constant/UserConstants.java | 20 + .../ruoyi/common/core/domain/TreeEntity.java | 4 +- .../common/core/domain/entity/SysDept.java | 2 +- .../common/core/domain/entity/SysMenu.java | 8 +- .../com/ruoyi/common/enums/DataBaseType.java | 49 + .../common/exception/GlobalException.java | 2 +- .../common/exception/ServiceException.java | 2 +- .../ruoyi/common/helper/DataBaseHelper.java | 70 + .../com/ruoyi/common/helper/LoginHelper.java | 2 +- .../demo/controller/TestDemoController.java | 2 +- .../java/com/ruoyi/demo/domain/TestTree.java | 2 +- .../com/ruoyi/demo/domain/bo/TestTreeBo.java | 2 +- .../framework/aspectj/RateLimiterAspect.java | 3 +- .../framework/aspectj/RepeatSubmitAspect.java | 44 +- ruoyi-generator/pom.xml | 20 + .../generator/controller/GenController.java | 16 +- .../com/ruoyi/generator/domain/GenTable.java | 6 + .../generator/domain/GenTableColumn.java | 18 +- .../generator/mapper/GenTableMapper.java | 13 +- .../service/GenTableServiceImpl.java | 69 +- .../generator/service/IGenTableService.java | 9 + .../ruoyi/generator/util/VelocityUtils.java | 11 +- .../src/main/resources/generator.yml | 4 +- .../mapper/generator/GenTableColumnMapper.xml | 38 +- .../mapper/generator/GenTableMapper.xml | 160 +- .../src/main/resources/vm/java/bo.java.vm | 2 +- .../src/main/resources/vm/java/domain.java.vm | 2 +- .../main/resources/vm/java/sub-domain.java.vm | 100 +- .../src/main/resources/vm/sql/oracle/sql.vm | 19 + .../src/main/resources/vm/sql/postgres/sql.vm | 20 + .../src/main/resources/vm/sql/sql.vm | 27 +- .../main/resources/vm/sql/sqlserver/sql.vm | 19 + .../main/resources/vm/vue/index-tree.vue.vm | 12 +- .../src/main/resources/vm/vue/index.vue.vm | 12 +- .../java/com/ruoyi/system/domain/SysOss.java | 3 +- .../ruoyi/system/mapper/SysDeptMapper.java | 16 +- .../ruoyi/system/mapper/SysMenuMapper.java | 17 +- .../ruoyi/system/mapper/SysRoleMapper.java | 8 +- .../ruoyi/system/mapper/SysUserMapper.java | 16 +- .../system/mapper/SysUserRoleMapper.java | 2 + .../service/impl/SysDataScopeServiceImpl.java | 18 +- .../service/impl/SysDeptServiceImpl.java | 29 +- .../service/impl/SysMenuServiceImpl.java | 20 +- .../service/impl/SysRoleServiceImpl.java | 27 +- .../service/impl/SysUserServiceImpl.java | 52 +- .../resources/mapper/system/SysDeptMapper.xml | 36 +- .../resources/mapper/system/SysMenuMapper.xml | 44 +- .../resources/mapper/system/SysPostMapper.xml | 12 - .../resources/mapper/system/SysRoleMapper.xml | 46 +- .../resources/mapper/system/SysUserMapper.xml | 73 +- .../mapper/system/SysUserRoleMapper.xml | 5 + ruoyi-ui/src/api/tool/gen.js | 10 + ruoyi-ui/src/assets/styles/sidebar.scss | 4 + ruoyi-ui/src/components/Crontab/hour.vue | 228 +- ruoyi-ui/src/components/TopNav/index.vue | 36 +- .../src/layout/components/Settings/index.vue | 3 +- ruoyi-ui/src/layout/index.vue | 4 +- ruoyi-ui/src/plugins/download.js | 5 +- ruoyi-ui/src/router/index.js | 6 + ruoyi-ui/src/store/modules/app.js | 9 +- ruoyi-ui/src/store/modules/permission.js | 7 +- ruoyi-ui/src/utils/generator/html.js | 4 +- ruoyi-ui/src/views/index.vue | 2 +- .../src/views/monitor/logininfor/index.vue | 6 +- ruoyi-ui/src/views/monitor/online/index.vue | 4 +- ruoyi-ui/src/views/monitor/operlog/index.vue | 7 +- ruoyi-ui/src/views/system/config/index.vue | 7 +- ruoyi-ui/src/views/system/dept/index.vue | 5 +- ruoyi-ui/src/views/system/dict/data.vue | 7 +- ruoyi-ui/src/views/system/dict/index.vue | 6 +- ruoyi-ui/src/views/system/menu/index.vue | 7 +- ruoyi-ui/src/views/system/notice/index.vue | 6 +- ruoyi-ui/src/views/system/post/index.vue | 6 +- ruoyi-ui/src/views/system/role/authUser.vue | 400 ++- ruoyi-ui/src/views/system/role/index.vue | 6 +- ruoyi-ui/src/views/system/role/selectUser.vue | 278 +- ruoyi-ui/src/views/system/user/index.vue | 6 +- ruoyi-ui/src/views/tool/gen/importTable.vue | 4 +- ruoyi-ui/src/views/tool/gen/index.vue | 6 +- script/docker/database.yml | 61 + script/docker/docker-compose.yml | 6 + ...次启动程序未自动生成表,可执行此脚本).sql | 0 .../mysql_ry_20220319.sql} | 212 +- script/sql/{test.sql => mysql/mysql_test.sql} | 40 +- .../mysql_xxl_job.sql} | 0 .../sql/mysql/update/update_ry_20200319.sql | 1 + .../{ => mysql}/update/update_ry_20220303.sql | 0 script/sql/oracle/oracle_ry_vue_4.X.sql | 952 +++++++ script/sql/oracle/oracle_test.sql | 196 ++ script/sql/postgres/postgres_ry_20220319.sql | 1081 ++++++++ script/sql/sqlserver/sqlserver_ry_vue_4.X.sql | 2361 +++++++++++++++++ 99 files changed, 6085 insertions(+), 1161 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java create mode 100644 ruoyi-generator/src/main/resources/vm/sql/oracle/sql.vm create mode 100644 ruoyi-generator/src/main/resources/vm/sql/postgres/sql.vm create mode 100644 ruoyi-generator/src/main/resources/vm/sql/sqlserver/sql.vm create mode 100644 script/docker/database.yml rename script/sql/{ => mysql}/flowable_6.7.2_mysql(首次启动程序未自动生成表,可执行此脚本).sql (100%) rename script/sql/{ry_20220309.sql => mysql/mysql_ry_20220319.sql} (91%) rename script/sql/{test.sql => mysql/mysql_test.sql} (93%) rename script/sql/{tables_xxl_job.sql => mysql/mysql_xxl_job.sql} (100%) create mode 100644 script/sql/mysql/update/update_ry_20200319.sql rename script/sql/{ => mysql}/update/update_ry_20220303.sql (100%) create mode 100644 script/sql/oracle/oracle_ry_vue_4.X.sql create mode 100644 script/sql/oracle/oracle_test.sql create mode 100644 script/sql/postgres/postgres_ry_20220319.sql create mode 100644 script/sql/sqlserver/sqlserver_ry_vue_4.X.sql diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 40a76b10..2e408e7f 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -63,6 +63,11 @@ spring: url: username: password: +# oracle: +# driverClassName: oracle.jdbc.OracleDriver +# url: jdbc:oracle:thin:@//localhost:1521/XE +# username: ROOT +# password: root druid: # 初始连接数 initialSize: 5 diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 493ce547..069639ea 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -70,6 +70,11 @@ spring: url: username: password: +# oracle: +# driverClassName: oracle.jdbc.OracleDriver +# url: jdbc:oracle:thin:@//172.30.0.36:1521/XE +# username: ROOT +# password: root druid: # 初始连接数 initialSize: 5 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index cfe7c262..a66e5c71 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -142,8 +142,6 @@ security: - /*/api-docs # druid 监控配置 - /druid/** - # 用户放行 - permit-all: # actuator 监控配置 - /actuator - /actuator/** @@ -165,25 +163,15 @@ mybatis-plus: typeAliasesPackage: com.ruoyi.**.domain # 启动时是否检查 MyBatis XML 文件的存在,默认不检查 checkConfigLocation: false - # 通过该属性可指定 MyBatis 的执行器,MyBatis 的执行器总共有三种: - # SIMPLE:每个语句创建新的预处理器 REUSE:会复用预处理器 BATCH:批量执行所有的更新 - executorType: SIMPLE configuration: # 自动驼峰命名规则(camel case)映射 mapUnderscoreToCamelCase: true - # 当设置为 true 的时候,懒加载的对象可能被任何懒属性全部加载,否则,每个属性都按需加载。需要和 lazyLoadingEnabled 一起使用。 - aggressiveLazyLoading: true # MyBatis 自动映射策略 # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射 autoMappingBehavior: PARTIAL # MyBatis 自动映射时未知列或未知属性处理策 # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 autoMappingUnknownColumnBehavior: NONE - # Mybatis一级缓存,默认为 SESSION - # SESSION session级别缓存 STATEMENT 关闭一级缓存 - localCacheScope: SESSION - # 开启Mybatis二级缓存,默认为 true - cacheEnabled: false # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl @@ -191,16 +179,10 @@ mybatis-plus: global-config: # 是否打印 Logo banner banner: true - # 是否初始化 SqlRunner - enableSqlRunner: false dbConfig: # 主键类型 # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID - idType: AUTO - # 表名是否使用驼峰转下划线命名,只对表名生效 - tableUnderline: true - # 大写命名,对表名和字段名均生效 - capitalMode: false + idType: ASSIGN_ID # 逻辑已删除值 logicDeleteValue: 2 # 逻辑未删除值 diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index ee68c98c..522d1bc8 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -36,3 +36,5 @@ no.update.permission=您没有修改数据的权限,请联系管理员添加 no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +repeat.submit.message=不允许重复提交,请稍候再试 +rate.limiter.message=访问过于频繁,请稍候再试 diff --git a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties index 960538a5..5dbdac59 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties @@ -36,3 +36,5 @@ no.update.permission=You do not have permission to modify data,please contact no.delete.permission=You do not have permission to delete data,please contact your administrator to add permissions [{0}] no.export.permission=You do not have permission to export data,please contact your administrator to add permissions [{0}] no.view.permission=You do not have permission to view data,please contact your administrator to add permissions [{0}] +repeat.submit.message=Repeat submit is not allowed, please try again later +rate.limiter.message=Visit too frequently, please try again later diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties index ee68c98c..522d1bc8 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -36,3 +36,5 @@ no.update.permission=您没有修改数据的权限,请联系管理员添加 no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +repeat.submit.message=不允许重复提交,请稍候再试 +rate.limiter.message=访问过于频繁,请稍候再试 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java index a8746676..d30962d0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java @@ -22,8 +22,8 @@ public @interface RepeatSubmit { TimeUnit timeUnit() default TimeUnit.MILLISECONDS; /** - * 提示消息 + * 提示消息 支持国际化 格式为 {code} */ - String message() default "不允许重复提交,请稍候再试"; + String message() default "{repeat.submit.message}"; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 5e07c96c..e2ffebdc 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -65,12 +65,12 @@ public interface Constants { /** * 登录用户 redis key */ - public static final String LOGIN_TOKEN_KEY = "Authorization:login:token:"; + String LOGIN_TOKEN_KEY = "Authorization:login:token:"; /** * 在线用户 redis key */ - public static final String ONLINE_TOKEN_KEY = "online_tokens:"; + String ONLINE_TOKEN_KEY = "online_tokens:"; /** * 防重提交 redis key diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java index 406d1441..9f800be2 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java @@ -22,11 +22,21 @@ public interface UserConstants { */ String EXCEPTION = "1"; + /** + * 用户正常状态 + */ + String USER_NORMAL = "0"; + /** * 用户封禁状态 */ String USER_DISABLE = "1"; + /** + * 角色正常状态 + */ + String ROLE_NORMAL = "0"; + /** * 角色封禁状态 */ @@ -62,6 +72,16 @@ public interface UserConstants { */ String NO_FRAME = "1"; + /** + * 菜单正常状态 + */ + String MENU_NORMAL = "0"; + + /** + * 菜单停用状态 + */ + String MENU_DISABLE = "1"; + /** * 菜单类型(目录) */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java index 5e7af739..f44eacd4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java @@ -16,7 +16,7 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) -public class TreeEntity extends BaseEntity { +public class TreeEntity extends BaseEntity { private static final long serialVersionUID = 1L; @@ -38,6 +38,6 @@ public class TreeEntity extends BaseEntity { */ @TableField(exist = false) @ApiModelProperty(value = "子部门") - private List children = new ArrayList<>(); + private List children = new ArrayList<>(); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java index 46e99368..ccfe07d9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java @@ -24,7 +24,7 @@ import javax.validation.constraints.Size; @EqualsAndHashCode(callSuper = true) @TableName("sys_dept") @ApiModel("部门业务对象") -public class SysDept extends TreeEntity { +public class SysDept extends TreeEntity { private static final long serialVersionUID = 1L; /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java index 8eb97d0e..8668481b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -1,8 +1,8 @@ package com.ruoyi.common.core.domain.entity; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonInclude; import com.ruoyi.common.core.domain.TreeEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -23,7 +23,7 @@ import javax.validation.constraints.Size; @EqualsAndHashCode(callSuper = true) @TableName("sys_menu") @ApiModel("菜单权限业务对象") -public class SysMenu extends TreeEntity { +public class SysMenu extends TreeEntity { /** * 菜单ID @@ -65,8 +65,7 @@ public class SysMenu extends TreeEntity { * 路由参数 */ @ApiModelProperty(value = "路由参数") - @TableField("`query`") - private String query; + private String queryParam; /** * 是否为外链(0是 1否) @@ -103,6 +102,7 @@ public class SysMenu extends TreeEntity { * 权限字符串 */ @ApiModelProperty(value = "权限字符串") + @JsonInclude(JsonInclude.Include.NON_NULL) @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") private String perms; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java new file mode 100644 index 00000000..5d0f05ad --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java @@ -0,0 +1,49 @@ +package com.ruoyi.common.enums; + +import com.ruoyi.common.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 数据库类型 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DataBaseType { + + /** + * MySQL + */ + MY_SQL("MySQL"), + + /** + * Oracle + */ + ORACLE("Oracle"), + + /** + * PostgreSQL + */ + POSTGRE_SQL("PostgreSQL"), + + /** + * SQL Server + */ + SQL_SERVER("Microsoft SQL Server"); + + private final String type; + + public static DataBaseType find(String databaseProductName) { + if (StringUtils.isBlank(databaseProductName)) { + return null; + } + for (DataBaseType type : values()) { + if (type.getType().equals(databaseProductName)) { + return type; + } + } + return null; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java index b1fc9c13..080785c9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java @@ -49,4 +49,4 @@ public class GlobalException extends RuntimeException { this.message = message; return this; } -} \ No newline at end of file +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java index 15ceb5ef..53f41b3b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java @@ -62,4 +62,4 @@ public final class ServiceException extends RuntimeException { this.detailMessage = detailMessage; return this; } -} \ No newline at end of file +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java new file mode 100644 index 00000000..c1adea31 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java @@ -0,0 +1,70 @@ +package com.ruoyi.common.helper; + +import cn.hutool.core.convert.Convert; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.ruoyi.common.enums.DataBaseType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import javax.sql.DataSource; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; + +/** + * 数据库助手 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DataBaseHelper { + + /** + * 获取当前数据库类型 + */ + public static DataBaseType getDataBaseType() { + DynamicRoutingDataSource ds = (DynamicRoutingDataSource) SpringUtils.getBean(DataSource.class); + DataSource dataSource = ds.determineDataSource(); + try { + DatabaseMetaData metaData = dataSource.getConnection().getMetaData(); + String databaseProductName = metaData.getDatabaseProductName(); + return DataBaseType.find(databaseProductName); + } catch (SQLException e) { + throw new ServiceException(e.getMessage()); + } + } + + public static boolean isMySql() { + return DataBaseType.MY_SQL == getDataBaseType(); + } + + public static boolean isOracle() { + return DataBaseType.ORACLE == getDataBaseType(); + } + + public static boolean isPostgerSql() { + return DataBaseType.POSTGRE_SQL == getDataBaseType(); + } + + public static boolean isSqlServer() { + return DataBaseType.SQL_SERVER == getDataBaseType(); + } + + public static String findInSet(Object var1, String var2) { + DataBaseType dataBasyType = getDataBaseType(); + String var = Convert.toStr(var1); + if (dataBasyType == DataBaseType.SQL_SERVER) { + // charindex(',100,' , ',0,100,101,') <> 0 + return "charindex('," + var + ",' , ','+" + var2 + "+',') <> 0"; + } else if (dataBasyType == DataBaseType.POSTGRE_SQL) { + // (select position(',100,' in ',0,100,101,')) <> 0 + return "(select position('," + var + ",' in ','||" + var2 + "||',')) <> 0"; + } else if (dataBasyType == DataBaseType.ORACLE) { + // instr(',0,100,101,' , ',100,') <> 0 + return "instr(','||" + var2 + "||',' , '," + var + ",') <> 0"; + } + // find_in_set(100 , '0,100,101') + return "find_in_set(" + var + " , " + var2 + ") <> 0"; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java index 864d23d6..83948a9a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java @@ -13,7 +13,7 @@ import lombok.NoArgsConstructor; /** * 登录鉴权助手 - * + * * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios * 可以组成 用户类型与设备类型多对多的 权限灵活控制 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java index 593f22ad..d1f994e5 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java @@ -117,7 +117,7 @@ public class TestDemoController extends BaseController { @ApiOperation("新增测试单表") @SaCheckPermission("demo:demo:add") @Log(title = "测试单表", businessType = BusinessType.INSERT) - @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "不允许重复提交") + @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "{repeat.submit.message}") @PostMapping() public R add(@RequestBody TestDemoBo bo) { // 使用校验工具对标 @Validated(AddGroup.class) 注解 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java index 1ca4a7ad..b480aa0c 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java @@ -17,7 +17,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName("test_tree") -public class TestTree extends TreeEntity { +public class TestTree extends TreeEntity { private static final long serialVersionUID = 1L; diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java index 29f4ac97..211a79f1 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java @@ -21,7 +21,7 @@ import javax.validation.constraints.NotNull; @Data @EqualsAndHashCode(callSuper = true) @ApiModel("测试树表业务对象") -public class TestTreeBo extends TreeEntity { +public class TestTreeBo extends TreeEntity { /** * 主键 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index 298eb43b..542b16bf 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -3,6 +3,7 @@ package com.ruoyi.framework.aspectj; import com.ruoyi.common.annotation.RateLimiter; import com.ruoyi.common.enums.LimitType; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.redis.RedisUtils; import lombok.extern.slf4j.Slf4j; @@ -37,7 +38,7 @@ public class RateLimiterAspect { } long number = RedisUtils.rateLimiter(combineKey, rateType, count, time); if (number == -1) { - throw new ServiceException("访问过于频繁,请稍候再试"); + throw new ServiceException(MessageUtils.message("rate.limiter.message")); } log.info("限制令牌 => {}, 剩余令牌 => {}, 缓存key => '{}'", count, number, combineKey); } catch (ServiceException e) { diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java index e7bbbdd6..d0422e9d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java @@ -5,8 +5,10 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.crypto.SecureUtil; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.redis.RedisUtils; @@ -14,6 +16,8 @@ import com.ruoyi.framework.config.properties.RepeatSubmitProperties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @@ -27,7 +31,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; /** - * 防止重复提交 + * 防止重复提交(参考美团GTIS防重系统) * * @author Lion Li */ @@ -37,6 +41,8 @@ import java.util.concurrent.TimeUnit; @Component public class RepeatSubmitAspect { + private static final ThreadLocal KEY_CACHE = new ThreadLocal<>(); + private final RepeatSubmitProperties repeatSubmitProperties; @Before("@annotation(repeatSubmit)") @@ -64,11 +70,45 @@ public class RepeatSubmitAspect { String key = RedisUtils.getCacheObject(cacheRepeatKey); if (key == null) { RedisUtils.setCacheObject(cacheRepeatKey, "", interval, TimeUnit.MILLISECONDS); + KEY_CACHE.set(cacheRepeatKey); } else { - throw new ServiceException(repeatSubmit.message()); + String message = repeatSubmit.message(); + if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) { + message = MessageUtils.message(StringUtils.substring(message, 1, message.length() - 1)); + } + throw new ServiceException(message); } } + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) { + if (jsonResult instanceof R) { + R r = (R) jsonResult; + if (r.getCode() == R.SUCCESS) { + return; + } + RedisUtils.deleteObject(KEY_CACHE.get()); + KEY_CACHE.remove(); + } + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) { + RedisUtils.deleteObject(KEY_CACHE.get()); + KEY_CACHE.remove(); + } + /** * 参数拼装 */ diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index 50580011..b647587f 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -29,6 +29,26 @@ ruoyi-common + + + mysql + mysql-connector-java + + + com.oracle.database.jdbc + ojdbc8 + + + + org.postgresql + postgresql + + + + com.microsoft.sqlserver + mssql-jdbc + + diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java index 09bf1aeb..e9e61e72 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -5,13 +5,12 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; -import com.ruoyi.generator.service.IGenTableColumnService; import com.ruoyi.generator.service.IGenTableService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -38,7 +37,6 @@ import java.util.Map; public class GenController extends BaseController { private final IGenTableService genTableService; - private final IGenTableColumnService genTableColumnService; /** * 查询代码生成列表 @@ -55,11 +53,11 @@ public class GenController extends BaseController { */ @ApiOperation("修改代码生成业务") @SaCheckPermission("tool:gen:query") - @GetMapping(value = "/{talbleId}") - public R> getInfo(@PathVariable Long talbleId) { - GenTable table = genTableService.selectGenTableById(talbleId); + @GetMapping(value = "/{tableId}") + public R> getInfo(@PathVariable Long tableId) { + GenTable table = genTableService.selectGenTableById(tableId); List tables = genTableService.selectGenTableAll(); - List list = genTableColumnService.selectGenTableColumnListByTableId(talbleId); + List list = genTableService.selectGenTableColumnListByTableId(tableId); Map map = new HashMap(); map.put("info", table); map.put("rows", list); @@ -82,10 +80,10 @@ public class GenController extends BaseController { */ @ApiOperation("查询数据表字段列表") @SaCheckPermission("tool:gen:list") - @GetMapping(value = "/column/{talbleId}") + @GetMapping(value = "/column/{tableId}") public TableDataInfo columnList(Long tableId) { TableDataInfo dataInfo = new TableDataInfo<>(); - List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + List list = genTableService.selectGenTableColumnListByTableId(tableId); dataInfo.setRows(list); dataInfo.setTotal(list.size()); return dataInfo; diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java index f8bbc474..45e9168e 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -150,6 +150,12 @@ public class GenTable extends BaseEntity { @TableField(exist = false) private String treeName; + /* + * 菜单id列表 + */ + @TableField(exist = false) + private List menuIds; + /** * 上级菜单ID字段 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java index 763acd74..1ea99179 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -8,7 +8,7 @@ import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.utils.StringUtils; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; +import org.apache.ibatis.type.JdbcType; import javax.validation.constraints.NotBlank; @@ -42,7 +42,7 @@ public class GenTableColumn extends BaseEntity { /** * 列描述 */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String columnComment; /** @@ -64,43 +64,43 @@ public class GenTableColumn extends BaseEntity { /** * 是否主键(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isPk; /** * 是否自增(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isIncrement; /** * 是否必填(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isRequired; /** * 是否为插入字段(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isInsert; /** * 是否编辑字段(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isEdit; /** * 是否列表字段(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isList; /** * 是否查询字段(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isQuery; /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index cbb92fdc..29bfe0de 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -16,23 +16,12 @@ import java.util.List; @InterceptorIgnore(dataPermission = "true") public interface GenTableMapper extends BaseMapperPlus { - - Page selectPageGenTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); - Page selectPageDbTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); - /** - * 查询业务列表 - * - * @param genTable 业务信息 - * @return 业务集合 - */ - List selectGenTableList(GenTable genTable); - /** * 查询据库列表 * - * @param genTable 业务信息 + * @param genTable 查询条件 * @return 数据库表集合 */ List selectDbTableList(GenTable genTable); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 154f0263..e988894b 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -3,8 +3,13 @@ package com.ruoyi.generator.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.GenConstants; @@ -28,7 +33,6 @@ 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.File; @@ -46,6 +50,7 @@ import java.util.zip.ZipOutputStream; * * @author Lion Li */ +@DS("#header.datasource") @Slf4j @RequiredArgsConstructor @Service @@ -54,6 +59,19 @@ public class GenTableServiceImpl implements IGenTableService { private final GenTableMapper baseMapper; private final GenTableColumnMapper genTableColumnMapper; + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectList(new LambdaQueryWrapper() + .eq(GenTableColumn::getTableId, tableId) + .orderByAsc(GenTableColumn::getSort)); + } + /** * 查询业务信息 * @@ -69,13 +87,7 @@ public class GenTableServiceImpl implements IGenTableService { @Override public TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery) { - Page page = baseMapper.selectPageGenTableList(pageQuery.build(), genTable); - return TableDataInfo.build(page); - } - - @Override - public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { - Page page = baseMapper.selectPageDbTableList(pageQuery.build(), genTable); + Page page = baseMapper.selectPage(pageQuery.build(), this.buildGenTableQueryWrapper(genTable)); return TableDataInfo.build(page); } @@ -87,7 +99,24 @@ public class GenTableServiceImpl implements IGenTableService { */ @Override public List selectGenTableList(GenTable genTable) { - return baseMapper.selectGenTableList(genTable); + return baseMapper.selectList(this.buildGenTableQueryWrapper(genTable)); + } + + private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { + Map params = genTable.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.like(StringUtils.isNotBlank(genTable.getTableName()), "lower(table_name)", StringUtils.lowerCase(genTable.getTableName())) + .like(StringUtils.isNotBlank(genTable.getTableComment()), "lower(table_comment)", StringUtils.lowerCase(genTable.getTableComment())) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "create_time", params.get("beginTime"), params.get("endTime")); + return wrapper; + } + + + @Override + public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { + Page page = baseMapper.selectPageDbTableList(pageQuery.build(), genTable); + return TableDataInfo.build(page); } /** @@ -129,7 +158,6 @@ public class GenTableServiceImpl implements IGenTableService { * @return 结果 */ @Override - @Transactional(rollbackFor = Exception.class) public void updateGenTable(GenTable genTable) { String options = JsonUtils.toJsonString(genTable.getParams()); genTable.setOptions(options); @@ -148,7 +176,6 @@ public class GenTableServiceImpl implements IGenTableService { * @return 结果 */ @Override - @Transactional(rollbackFor = Exception.class) public void deleteGenTableByIds(Long[] tableIds) { List ids = Arrays.asList(tableIds); baseMapper.deleteBatchIds(ids); @@ -161,7 +188,6 @@ public class GenTableServiceImpl implements IGenTableService { * @param tableList 导入表列表 */ @Override - @Transactional(rollbackFor = Exception.class) public void importGenTable(List tableList) { String operName = LoginHelper.getUsername(); try { @@ -198,6 +224,12 @@ public class GenTableServiceImpl implements IGenTableService { Map dataMap = new LinkedHashMap<>(); // 查询表信息 GenTable table = baseMapper.selectGenTableById(tableId); + Snowflake snowflake = IdUtil.getSnowflake(); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(snowflake.nextId()); + } + table.setMenuIds(menuIds); // 设置主子表信息 setSubTable(table); // 设置主键列信息 @@ -275,7 +307,6 @@ public class GenTableServiceImpl implements IGenTableService { * @param tableName 表名称 */ @Override - @Transactional(rollbackFor = Exception.class) public void synchDb(String tableName) { GenTable table = baseMapper.selectGenTableByName(tableName); List tableColumns = table.getColumns(); @@ -299,9 +330,8 @@ public class GenTableServiceImpl implements IGenTableService { column.setQueryType(prevColumn.getQueryType()); } if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() - && (column.isInsert() || column.isEdit()) - && ((column.isUsableColumn()) || (!column.isSuperColumn()))) - { + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) { // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 column.setIsRequired(prevColumn.getIsRequired()); column.setHtmlType(prevColumn.getHtmlType()); @@ -345,6 +375,12 @@ public class GenTableServiceImpl implements IGenTableService { private void generatorCode(String tableName, ZipOutputStream zip) { // 查询表信息 GenTable table = baseMapper.selectGenTableByName(tableName); + Snowflake snowflake = IdUtil.getSnowflake(); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(snowflake.nextId()); + } + table.setMenuIds(menuIds); // 设置主子表信息 setSubTable(table); // 设置主键列信息 @@ -477,3 +513,4 @@ public class GenTableServiceImpl implements IGenTableService { return genPath + File.separator + VelocityUtils.getFileName(template, table); } } + diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java index 27fac79e..092020a5 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -3,6 +3,7 @@ package com.ruoyi.generator.service; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; import java.util.List; import java.util.Map; @@ -14,6 +15,14 @@ import java.util.Map; */ public interface IGenTableService { + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + List selectGenTableColumnListByTableId(Long tableId); + TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 9cc1c34f..81afe56c 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.helper.DataBaseHelper; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; @@ -135,7 +136,15 @@ public class VelocityUtils { templates.add("vm/java/serviceImpl.java.vm"); templates.add("vm/java/controller.java.vm"); templates.add("vm/xml/mapper.xml.vm"); - templates.add("vm/sql/sql.vm"); + if (DataBaseHelper.isOracle()) { + templates.add("vm/sql/oracle/sql.vm"); + } else if (DataBaseHelper.isPostgerSql()) { + templates.add("vm/sql/postgers/sql.vm"); + } else if (DataBaseHelper.isSqlServer()) { + templates.add("vm/sql/sqlserver/sql.vm"); + } else { + templates.add("vm/sql/sql.vm"); + } templates.add("vm/js/api.js.vm"); if (GenConstants.TPL_CRUD.equals(tplCategory)) { templates.add("vm/vue/index.vue.vm"); diff --git a/ruoyi-generator/src/main/resources/generator.yml b/ruoyi-generator/src/main/resources/generator.yml index 5bd3dd67..d7e9a1aa 100644 --- a/ruoyi-generator/src/main/resources/generator.yml +++ b/ruoyi-generator/src/main/resources/generator.yml @@ -1,5 +1,5 @@ # 代码生成 -gen: +gen: # 作者 author: ruoyi # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool @@ -7,4 +7,4 @@ gen: # 自动去除表前缀,默认是false autoRemovePre: false # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) - tablePrefix: sys_ \ No newline at end of file + tablePrefix: sys_ diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml index 7ef97445..4614dd41 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -30,9 +30,41 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml index 8f0c2690..306f7af2 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -53,100 +53,126 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table - - - + + select table_name, table_comment, create_time, update_time + from information_schema.tables + AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%' + AND table_name NOT IN (select table_name from gen_table) AND lower(table_name) like lower(concat('%', #{genTable.tableName}, '%')) AND lower(table_comment) like lower(concat('%', #{genTable.tableComment}, '%')) - - AND date_format(create_time,'%y%m%d') >= date_format(#{genTable.params.beginTime},'%y%m%d') + order by create_time desc + + + select lower(dt.table_name) as table_name, dtc.comments as table_comment, uo.created as create_time, uo.last_ddl_time as update_time + from user_tables dt, user_tab_comments dtc, user_objects uo + where dt.table_name = dtc.table_name + and dt.table_name = uo.object_name + and uo.object_type = 'TABLE' + AND dt.table_name NOT LIKE 'QRTZ_%' AND dt.table_name NOT LIKE 'GEN_%' + AND lower(dt.table_name) NOT IN (select table_name from gen_table) + + AND lower(dt.table_name) like lower(concat(concat('%', #{genTable.tableName}), '%')) - - AND date_format(create_time,'%y%m%d') <= date_format(#{genTable.params.endTime},'%y%m%d') + + AND lower(dtc.comments) like lower(concat(concat('%', #{genTable.tableComment}), '%')) - + order by create_time desc + + + + + - - - - + + select table_name, table_comment, create_time, update_time + from information_schema.tables + AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%' + AND table_name NOT IN (select table_name from gen_table) AND lower(table_name) like lower(concat('%', #{tableName}, '%')) AND lower(table_comment) like lower(concat('%', #{tableComment}, '%')) - - AND date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') + order by create_time desc + + + select lower(dt.table_name) as table_name, dtc.comments as table_comment, uo.created as create_time, uo.last_ddl_time as update_time + from user_tables dt, user_tab_comments dtc, user_objects uo + where dt.table_name = dtc.table_name + and dt.table_name = uo.object_name + and uo.object_type = 'TABLE' + AND dt.table_name NOT LIKE 'QRTZ_%' AND dt.table_name NOT LIKE 'GEN_%' + AND lower(dt.table_name) NOT IN (select table_name from gen_table) + + AND lower(dt.table_name) like lower(concat(concat('%', #{tableName}), '%')) - - AND date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') + + AND lower(dtc.comments) like lower(concat(concat('%', #{tableComment}), '%')) - - - -