sync -- 同步 RuoYi-Vue-Plus 更新。

使用 spring cglib 替换 停止维护的 cglib
修复 cos_api bcprov-jdk15on 漏洞
修复 guava 漏洞 统一依赖版本
修复 tlog 依赖漏洞
优化登录失败相关部分代码结构
优化文件上传、图片上传组件 文件列表展示文件原名便于后续处理, 完善组件删除功能
springboot 2.6.6 => 2.6.7
发布 4.1.0
This commit is contained in:
konbai
2022-05-06 22:42:32 +08:00
parent 4d3f6652b7
commit f6995953d8
52 changed files with 451 additions and 1082 deletions

View File

@@ -1,4 +1,4 @@
### 使用版本
### 使用版本(未按照模板填写直接删除)
### 问题描述

46
pom.xml
View File

@@ -6,15 +6,15 @@
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-flowable-plus</artifactId>
<version>4.0.1</version>
<version>4.1.0</version>
<name>RuoYi-Flowable-Plus</name>
<url>https://gitee.com/KonBAI-Q/ruoyi-flowable-plus</url>
<description>RuoYi-Flowable-Plus后台管理系统</description>
<properties>
<ruoyi-flowable-plus.version>4.0.1</ruoyi-flowable-plus.version>
<spring-boot.version>2.6.6</spring-boot.version>
<ruoyi-flowable-plus.version>4.1.0</ruoyi-flowable-plus.version>
<spring-boot.version>2.6.7</spring-boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
@@ -26,14 +26,13 @@
<poi.version>4.1.2</poi.version>
<commons-compress.version>1.21</commons-compress.version>
<easyexcel.version>3.0.5</easyexcel.version>
<cglib.version>3.3.0</cglib.version>
<velocity.version>2.3</velocity.version>
<satoken.version>1.29.0</satoken.version>
<mybatis-plus.version>3.5.1</mybatis-plus.version>
<p6spy.version>3.9.1</p6spy.version>
<hutool.version>5.7.22</hutool.version>
<okhttp.version>4.9.2</okhttp.version>
<spring-boot-admin.version>2.6.5</spring-boot-admin.version>
<okhttp.version>4.9.3</okhttp.version>
<spring-boot-admin.version>2.6.6</spring-boot-admin.version>
<redisson.version>3.17.0</redisson.version>
<lock4j.version>2.2.1</lock4j.version>
<dynamic-ds.version>3.5.1</dynamic-ds.version>
@@ -43,12 +42,14 @@
<!-- jdk11 缺失依赖 jaxb-->
<jaxb.version>3.0.1</jaxb.version>
<!-- 统一 guava 版本 解决隐式漏洞问题 -->
<guava.version>30.0-jre</guava.version>
<!-- OSS 配置 -->
<qiniu.version>7.9.3</qiniu.version>
<qiniu.version>7.9.5</qiniu.version>
<aliyun.oss.version>3.14.0</aliyun.oss.version>
<qcloud.cos.version>5.6.68</qcloud.cos.version>
<minio.version>8.3.7</minio.version>
<qcloud.cos.version>5.6.72</qcloud.cos.version>
<minio.version>8.3.8</minio.version>
<!-- docker 配置 -->
<docker.registry.url>localhost</docker.registry.url>
@@ -135,12 +136,6 @@
</exclusions>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>${cglib.version}</version>
</dependency>
<!-- velocity代码生成使用模板 -->
<dependency>
<groupId>org.apache.velocity</groupId>
@@ -232,6 +227,20 @@
<groupId>com.yomahub</groupId>
<artifactId>tlog-web-spring-boot-starter</artifactId>
<version>${tlog.version}</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
<exclusion>
<artifactId>dom4j</artifactId>
<groupId>dom4j</groupId>
</exclusion>
<exclusion>
<artifactId>commons-beanutils</artifactId>
<groupId>commons-beanutils</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
@@ -240,6 +249,13 @@
<version>${tlog.version}</version>
</dependency>
<!-- 统一 guava 版本 解决隐式漏洞问题 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<!-- flowable -->
<dependency>
<groupId>org.flowable</groupId>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>

View File

@@ -59,7 +59,7 @@ public class SysOssConfigController extends BaseController {
@GetMapping("/{ossConfigId}")
public R<SysOssConfigVo> getInfo(@ApiParam("OSS配置ID")
@NotNull(message = "主键不能为空")
@PathVariable("ossConfigId") Integer ossConfigId) {
@PathVariable("ossConfigId") Long ossConfigId) {
return R.ok(iSysOssConfigService.queryById(ossConfigId));
}

View File

@@ -18,7 +18,6 @@ import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain.SysOss;
import com.ruoyi.system.domain.bo.SysOssBo;
import com.ruoyi.system.domain.vo.SysOssVo;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysOssService;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
@@ -48,7 +47,6 @@ import java.util.Map;
public class SysOssController extends BaseController {
private final ISysOssService iSysOssService;
private final ISysConfigService iSysConfigService;
/**
* 查询OSS对象存储列表
@@ -77,7 +75,8 @@ public class SysOssController extends BaseController {
SysOss oss = iSysOssService.upload(file);
Map<String, String> map = new HashMap<>(2);
map.put("url", oss.getUrl());
map.put("fileName", oss.getFileName());
map.put("fileName", oss.getOriginalName());
map.put("ossId", oss.getOssId().toString());
return R.ok(map);
}

View File

@@ -1,41 +1,34 @@
--- # 监控配置
spring:
boot:
admin:
# Spring Boot Admin Client 客户端的相关配置
client:
# 增加客户端开关
enabled: true
# 设置 Spring Boot Admin Server 地址
url: http://localhost:9090/admin
instance:
service-host-type: IP
username: ruoyi
password: 123456
--- # 监控中心配置
spring.boot.admin.client:
# 增加客户端开关
enabled: true
url: http://localhost:9090/admin
instance:
service-host-type: IP
username: ruoyi
password: 123456
--- # xxl-job 配置
xxl:
job:
# 执行器开关
enabled: false
# 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
admin-addresses: http://localhost:9100/xxl-job-admin
# 执行器通讯TOKEN非空时启用
access-token: xxl-job
# 执行器配置
executor:
# 执行器AppName执行器心跳注册分组依据为空则关闭自动注册
appname: xxl-job-executor
# 执行器端口号 执行器从9101开始往后写
port: 9101
# 执行器注册:默认IP:PORT
address:
# 执行器IP默认自动获取IP
ip:
# 执行器运行日志文件存储磁盘路径
logpath: ./logs/xxl-job
# 执行器日志文件保存天数大于3生效
logretentiondays: 30
xxl.job:
# 执行器开关
enabled: false
# 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
admin-addresses: http://localhost:9100/xxl-job-admin
# 执行器通讯TOKEN非空时启用
access-token: xxl-job
executor:
# 执行器AppName执行器心跳注册分组依据为空则关闭自动注册
appname: xxl-job-executor
# 执行器端口号 执行器从9101开始往后写
port: 9101
# 执行器注册默认IP:PORT
address:
# 执行器IP:默认自动获取IP
ip:
# 执行器运行日志文件存储磁盘路径
logpath: ./logs/xxl-job
# 执行器日志文件保存天数大于3生效
logretentiondays: 30
--- # 数据源配置
spring:
@@ -55,7 +48,7 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://localhost:3306/ry-flowable-plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&nullCatalogMeansCurrent=true
url: jdbc:mysql://localhost:3306/ry-flowable-plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
username: root
password: root
# 从库数据源
@@ -106,29 +99,27 @@ spring:
filters: stat
--- # druid 配置
spring:
datasource:
druid:
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
spring.datasource.druid:
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring:
@@ -151,8 +142,6 @@ redisson:
threads: 4
# Netty线程池数量
nettyThreads: 8
# 传输模式
transportMode: "NIO"
# 单节点配置
singleServerConfig:
# 客户端名称
@@ -165,9 +154,5 @@ redisson:
idleConnectionTimeout: 10000
# 命令等待超时,单位:毫秒
timeout: 3000
# 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。
retryAttempts: 3
# 命令重试发送时间间隔,单位:毫秒
retryInterval: 1500
# 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50

View File

@@ -1,48 +1,37 @@
--- # 配置临时路径存储
spring:
servlet:
multipart:
# 临时文件存储位置 避免临时文件被系统清理报错
location: /ruoyi/server/temp
--- # 临时文件存储位置 避免临时文件被系统清理报错
spring.servlet.multipart.location: /ruoyi/server/temp
--- # 监控配置
spring:
boot:
admin:
# Spring Boot Admin Client 客户端的相关配置
client:
# 增加客户端开关
enabled: true
# 设置 Spring Boot Admin Server 地址
url: http://172.30.0.90:9090/admin
instance:
service-host-type: IP
username: ruoyi
password: 123456
--- # 监控中心配置
spring.boot.admin.client:
# 增加客户端开关
enabled: true
url: http://172.30.0.90:9090/admin
instance:
service-host-type: IP
username: ruoyi
password: 123456
--- # xxl-job 配置
xxl:
job:
# 执行器开关
enabled: true
# 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
admin-addresses: http://172.30.0.92:9100/xxl-job-admin
# 执行器通讯TOKEN非空时启用
access-token: xxl-job
# 执行器配置
executor:
# 执行器AppName执行器心跳注册分组依据为空则关闭自动注册
appname: xxl-job-executor
# 执行器端口号 执行器从9101开始往后写
port: 9101
# 执行器注册:默认IP:PORT
address:
# 执行器IP默认自动获取IP
ip:
# 执行器运行日志文件存储磁盘路径
logpath: ./logs/xxl-job
# 执行器日志文件保存天数大于3生效
logretentiondays: 30
xxl.job:
# 执行器开关
enabled: true
# 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
admin-addresses: http://172.30.0.92:9100/xxl-job-admin
# 执行器通讯TOKEN非空时启用
access-token: xxl-job
executor:
# 执行器AppName执行器心跳注册分组依据为空则关闭自动注册
appname: xxl-job-executor
# 执行器端口号 执行器从9101开始往后写
port: 9101
# 执行器注册默认IP:PORT
address:
# 执行器IP:默认自动获取IP
ip:
# 执行器运行日志文件存储磁盘路径
logpath: ./logs/xxl-job
# 执行器日志文件保存天数大于3生效
logretentiondays: 30
--- # 数据源配置
spring:
@@ -113,29 +102,27 @@ spring:
filters: stat
--- # druid 配置
spring:
datasource:
druid:
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
spring.datasource.druid:
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring:
@@ -158,8 +145,6 @@ redisson:
threads: 16
# Netty线程池数量
nettyThreads: 32
# 传输模式
transportMode: "NIO"
# 单节点配置
singleServerConfig:
# 客户端名称
@@ -172,9 +157,5 @@ redisson:
idleConnectionTimeout: 10000
# 命令等待超时,单位:毫秒
timeout: 3000
# 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。
retryAttempts: 3
# 命令重试发送时间间隔,单位:毫秒
retryInterval: 1500
# 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50

View File

@@ -75,10 +75,6 @@ spring:
restart:
# 热部署开关
enabled: true
# 与vue整合部署使用
thymeleaf:
# 将系统模板放置到最前面 否则会与 springboot-admin 页面冲突
template-resolver-order: 1
mvc:
pathmatch:
# 适配 boot 2.6 路由与 springfox 兼容
@@ -107,16 +103,12 @@ sa-token:
is-concurrent: true
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# 是否尝试从请求体里读取token
is-read-body: false
# 是否尝试从header里读取token
is-read-head: true
# 是否尝试从cookie里读取token
is-read-cookie: false
# token前缀
token-prefix: "Bearer"
# token风格
token-style: uuid
# jwt秘钥
jwt-secret-key: abcdefghijklmnopqrstuvwxyz
# 是否输出操作日志
@@ -149,11 +141,6 @@ security:
- /actuator
- /actuator/**
# 重复提交
repeat-submit:
# 全局间隔时间(毫秒)
interval: 5000
# MyBatisPlus配置
# https://baomidou.com/config/
mybatis-plus:
@@ -256,20 +243,10 @@ xss:
thread-pool:
# 是否开启线程池
enabled: false
# 核心线程池大小
corePoolSize: 8
# 最大可创建的线程数
maxPoolSize: 16
# 队列最大长度
queueCapacity: 128
# 线程池维护线程所允许的空闲时间
keepAliveSeconds: 300
# 线程池对拒绝任务(无线程可用)的处理策略
# CALLER_RUNS_POLICY 调用方执行
# DISCARD_OLDEST_POLICY 放弃最旧的
# DISCARD_POLICY 丢弃
# ABORT_POLICY 中止
rejectedExecutionHandler: CALLER_RUNS_POLICY
--- # redisson 缓存配置
redisson:
@@ -297,8 +274,6 @@ lock4j:
management:
endpoints:
web:
# Actuator 提供的 API 接口的根目录。默认为 /actuator
base-path: /actuator
exposure:
# 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
# 生产环境不建议放开所有 根据项目需求放开即可

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -69,11 +69,6 @@
<artifactId>easyexcel</artifactId>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
</dependency>
<!-- yml解析器 -->
<dependency>
<groupId>org.yaml</groupId>

View File

@@ -14,6 +14,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
/**
@@ -53,6 +54,7 @@ public class SysDictType extends BaseEntity {
@ExcelProperty(value = "字典类型")
@NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
@Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
private String dictType;
/**

View File

@@ -0,0 +1,39 @@
package com.ruoyi.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 登录类型
*
* @author Lion Li
*/
@Getter
@AllArgsConstructor
public enum LoginType {
/**
* 密码登录
*/
PASSWORD("user.password.retry.limit.exceed", "user.password.retry.limit.count"),
/**
* 短信登录
*/
SMS("sms.code.retry.limit.exceed", "sms.code.retry.limit.count"),
/**
* 小程序登录
*/
XCX("", "");
/**
* 登录重试超出限制提示
*/
final String retryLimitExceed;
/**
* 登录重试限制计数提示
*/
final String retryLimitCount;
}

View File

@@ -1,26 +0,0 @@
package com.ruoyi.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 线程池 拒绝策略 泛型
*
* @author Lion Li
*/
@Getter
@AllArgsConstructor
public enum ThreadPoolRejectedPolicy {
CALLER_RUNS_POLICY("调用方执行", ThreadPoolExecutor.CallerRunsPolicy.class),
DISCARD_OLDEST_POLICY("放弃最旧的", ThreadPoolExecutor.DiscardOldestPolicy.class),
DISCARD_POLICY("丢弃", ThreadPoolExecutor.DiscardPolicy.class),
ABORT_POLICY("中止", ThreadPoolExecutor.AbortPolicy.class);
private final String name;
private final Class<? extends RejectedExecutionHandler> clazz;
}

View File

@@ -1,15 +1,20 @@
package com.ruoyi.common.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.SimpleCache;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.extra.cglib.CglibUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.cglib.core.Converter;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* bean深拷贝工具(基于 cglib 性能优异)
@@ -37,7 +42,8 @@ public class BeanCopyUtils {
if (ObjectUtil.isNull(desc)) {
return null;
}
return CglibUtil.copy(source, desc);
final V target = ReflectUtil.newInstanceIfPossible(desc);
return copy(source, target);
}
/**
@@ -54,7 +60,8 @@ public class BeanCopyUtils {
if (ObjectUtil.isNull(desc)) {
return null;
}
CglibUtil.copy(source, desc);
BeanCopier beanCopier = BeanCopierCache.INSTANCE.get(source.getClass(), desc.getClass(), null);
beanCopier.copy(source, desc, null);
return desc;
}
@@ -72,7 +79,11 @@ public class BeanCopyUtils {
if (CollUtil.isEmpty(sourceList)) {
return CollUtil.newArrayList();
}
return CglibUtil.copyList(sourceList, () -> ReflectUtil.newInstanceIfPossible(desc));
return sourceList.stream().map(source -> {
V target = ReflectUtil.newInstanceIfPossible(desc);
copy(source, target);
return target;
}).collect(Collectors.toList());
}
/**
@@ -81,11 +92,12 @@ public class BeanCopyUtils {
* @param bean 数据来源实体
* @return map对象
*/
@SuppressWarnings("unchecked")
public static <T> Map<String, Object> copyToMap(T bean) {
if (ObjectUtil.isNull(bean)) {
return null;
}
return CglibUtil.toMap(bean);
return BeanMap.create(bean);
}
/**
@@ -102,7 +114,8 @@ public class BeanCopyUtils {
if (ObjectUtil.isNull(beanClass)) {
return null;
}
return CglibUtil.toBean(map, beanClass);
T bean = ReflectUtil.newInstanceIfPossible(beanClass);
return mapToBean(map, bean);
}
/**
@@ -119,6 +132,54 @@ public class BeanCopyUtils {
if (ObjectUtil.isNull(bean)) {
return null;
}
return CglibUtil.fillBean(map, bean);
BeanMap.create(bean).putAll(map);
return bean;
}
/**
* BeanCopier属性缓存<br>
* 缓存用于防止多次反射造成的性能问题
*
* @author Looly
* @since 5.4.1
*/
public enum BeanCopierCache {
/**
* BeanCopier属性缓存单例
*/
INSTANCE;
private final SimpleCache<String, BeanCopier> cache = new SimpleCache<>();
/**
* 获得类与转换器生成的key在{@link BeanCopier}的Map中对应的元素
*
* @param srcClass 源Bean的类
* @param targetClass 目标Bean的类
* @param converter 转换器
* @return Map中对应的BeanCopier
*/
public BeanCopier get(Class<?> srcClass, Class<?> targetClass, Converter converter) {
final String key = genKey(srcClass, targetClass, converter);
return cache.get(key, () -> BeanCopier.create(srcClass, targetClass, converter != null));
}
/**
* 获得类与转换器生成的key
*
* @param srcClass 源Bean的类
* @param targetClass 目标Bean的类
* @param converter 转换器
* @return 属性名和Map映射的key
*/
private String genKey(Class<?> srcClass, Class<?> targetClass, Converter converter) {
final StringBuilder key = StrUtil.builder()
.append(srcClass.getName()).append('#').append(targetClass.getName());
if(null != converter){
key.append('#').append(converter.getClass().getName());
}
return key.toString();
}
}
}

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-extend</artifactId>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-extend</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>

View File

@@ -4,7 +4,7 @@
<parent>
<artifactId>ruoyi-extend</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<artifactId>ruoyi-xxl-job-admin</artifactId>
<packaging>jar</packaging>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -12,7 +12,6 @@ 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;
import com.ruoyi.framework.config.properties.RepeatSubmitProperties;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
@@ -43,12 +42,10 @@ public class RepeatSubmitAspect {
private static final ThreadLocal<String> KEY_CACHE = new ThreadLocal<>();
private final RepeatSubmitProperties repeatSubmitProperties;
@Before("@annotation(repeatSubmit)")
public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable {
// 如果注解不为0 则使用注解数值
long interval = repeatSubmitProperties.getInterval();
long interval = 0;
if (repeatSubmit.interval() > 0) {
interval = repeatSubmit.timeUnit().toMillis(repeatSubmit.interval());
}

View File

@@ -53,8 +53,7 @@ public class RedisConfig extends CachingConfigurerSupport {
Config config = new Config();
config.setThreads(redissonProperties.getThreads())
.setNettyThreads(redissonProperties.getNettyThreads())
.setCodec(JsonJacksonCodec.INSTANCE)
.setTransportMode(redissonProperties.getTransportMode());
.setCodec(JsonJacksonCodec.INSTANCE);
RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig();
if (ObjectUtil.isNotNull(singleServerConfig)) {
@@ -65,8 +64,6 @@ public class RedisConfig extends CachingConfigurerSupport {
.setDatabase(redisProperties.getDatabase())
.setPassword(StringUtils.isNotBlank(redisProperties.getPassword()) ? redisProperties.getPassword() : null)
.setTimeout(singleServerConfig.getTimeout())
.setRetryAttempts(singleServerConfig.getRetryAttempts())
.setRetryInterval(singleServerConfig.getRetryInterval())
.setClientName(singleServerConfig.getClientName())
.setIdleConnectionTimeout(singleServerConfig.getIdleConnectionTimeout())
.setSubscriptionConnectionPoolSize(singleServerConfig.getSubscriptionConnectionPoolSize())
@@ -87,11 +84,8 @@ public class RedisConfig extends CachingConfigurerSupport {
.setConnectTimeout(((Long) redisProperties.getTimeout().toMillis()).intValue())
.setPassword(StringUtils.isNotBlank(redisProperties.getPassword()) ? redisProperties.getPassword() : null)
.setTimeout(clusterServersConfig.getTimeout())
.setRetryAttempts(clusterServersConfig.getRetryAttempts())
.setRetryInterval(clusterServersConfig.getRetryInterval())
.setClientName(clusterServersConfig.getClientName())
.setIdleConnectionTimeout(clusterServersConfig.getIdleConnectionTimeout())
.setPingConnectionInterval(clusterServersConfig.getPingConnectionInterval())
.setSubscriptionConnectionPoolSize(clusterServersConfig.getSubscriptionConnectionPoolSize())
.setMasterConnectionMinimumIdleSize(clusterServersConfig.getMasterConnectionMinimumIdleSize())
.setMasterConnectionPoolSize(clusterServersConfig.getMasterConnectionPoolSize())
@@ -144,8 +138,6 @@ public class RedisConfig extends CachingConfigurerSupport {
* threads: 16
* # Netty线程池数量
* nettyThreads: 32
* # 传输模式
* transportMode: "NIO"
* # 集群配置
* clusterServersConfig:
* # 客户端名称
@@ -160,14 +152,8 @@ public class RedisConfig extends CachingConfigurerSupport {
* slaveConnectionPoolSize: 64
* # 连接空闲超时,单位:毫秒
* idleConnectionTimeout: 10000
* # ping连接间隔
* pingConnectionInterval: 1000
* # 命令等待超时,单位:毫秒
* timeout: 3000
* # 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。
* retryAttempts: 3
* # 命令重试发送时间间隔,单位:毫秒
* retryInterval: 1500
* # 发布和订阅连接池大小
* subscriptionConnectionPoolSize: 50
* # 读取模式

View File

@@ -1,7 +1,6 @@
package com.ruoyi.framework.config;
import com.ruoyi.common.utils.Threads;
import com.ruoyi.common.utils.reflect.ReflectUtils;
import com.ruoyi.framework.config.properties.ThreadPoolProperties;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -10,7 +9,6 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@@ -23,6 +21,11 @@ import java.util.concurrent.ThreadPoolExecutor;
@Configuration
public class ThreadPoolConfig {
/**
* 核心线程数 = cpu 核心数 + 1
*/
private final int core = Runtime.getRuntime().availableProcessors() + 1;
@Autowired
private ThreadPoolProperties threadPoolProperties;
@@ -30,12 +33,11 @@ public class ThreadPoolConfig {
@ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true")
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(threadPoolProperties.getMaxPoolSize());
executor.setCorePoolSize(threadPoolProperties.getCorePoolSize());
executor.setMaxPoolSize(core);
executor.setCorePoolSize(core * 2);
executor.setQueueCapacity(threadPoolProperties.getQueueCapacity());
executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds());
RejectedExecutionHandler handler = ReflectUtils.newInstance(threadPoolProperties.getRejectedExecutionHandler().getClazz());
executor.setRejectedExecutionHandler(handler);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
@@ -44,7 +46,7 @@ public class ThreadPoolConfig {
*/
@Bean(name = "scheduledExecutorService")
protected ScheduledExecutorService scheduledExecutorService() {
return new ScheduledThreadPoolExecutor(threadPoolProperties.getCorePoolSize(),
return new ScheduledThreadPoolExecutor(core,
new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
new ThreadPoolExecutor.CallerRunsPolicy()) {
@Override

View File

@@ -4,7 +4,6 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import org.redisson.config.ReadMode;
import org.redisson.config.SubscriptionMode;
import org.redisson.config.TransportMode;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@@ -30,11 +29,6 @@ public class RedissonProperties {
*/
private int nettyThreads;
/**
* 传输模式
*/
private TransportMode transportMode;
/**
* 单机服务配置
*/
@@ -79,16 +73,6 @@ public class RedissonProperties {
*/
private int timeout;
/**
* 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。
*/
private int retryAttempts;
/**
* 命令重试发送时间间隔,单位:毫秒
*/
private int retryInterval;
/**
* 发布和订阅连接池大小
*/
@@ -130,26 +114,11 @@ public class RedissonProperties {
*/
private int idleConnectionTimeout;
/**
* ping超时
*/
private int pingConnectionInterval;
/**
* 命令等待超时,单位:毫秒
*/
private int timeout;
/**
* 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。
*/
private int retryAttempts;
/**
* 命令重试发送时间间隔,单位:毫秒
*/
private int retryInterval;
/**
* 发布和订阅连接池大小
*/

View File

@@ -1,22 +0,0 @@
package com.ruoyi.framework.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 重复提交 配置属性
*
* @author Lion Li
*/
@Data
@Component
@ConfigurationProperties(prefix = "repeat-submit")
public class RepeatSubmitProperties {
/**
* 间隔时间(毫秒)
*/
private int interval;
}

View File

@@ -1,6 +1,5 @@
package com.ruoyi.framework.config.properties;
import com.ruoyi.common.enums.ThreadPoolRejectedPolicy;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@@ -20,16 +19,6 @@ public class ThreadPoolProperties {
*/
private boolean enabled;
/**
* 核心线程池大小
*/
private int corePoolSize;
/**
* 最大可创建的线程数
*/
private int maxPoolSize;
/**
* 队列最大长度
*/
@@ -40,9 +29,4 @@ public class ThreadPoolProperties {
*/
private int keepAliveSeconds;
/**
* 线程池对拒绝任务(无线程可用)的处理策略
*/
private ThreadPoolRejectedPolicy rejectedExecutionHandler;
}

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -78,14 +78,24 @@
v-hasPermi="['${moduleName}:${businessName}:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="el-icon-sort"
size="mini"
@click="toggleExpandAll"
>展开/折叠</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table
v-if="refreshTable"
v-loading="loading"
:data="${businessName}List"
row-key="${treeCode}"
default-expand-all
:default-expand-all="isExpandAll"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
#foreach($column in $columns)
@@ -293,6 +303,10 @@ export default {
title: "",
// 是否显示弹出层
open: false,
// 是否展开,默认全部展开
isExpandAll: true,
// 重新渲染表格状态
refreshTable: true,
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
@@ -423,6 +437,14 @@ export default {
this.open = true;
this.title = "添加${functionName}";
},
/** 展开/折叠操作 */
toggleExpandAll() {
this.refreshTable = false;
this.isExpandAll = !this.isExpandAll;
this.$nextTick(() => {
this.refreshTable = true;
});
},
/** 修改按钮操作 */
handleUpdate(row) {
this.loading = true;

View File

@@ -76,14 +76,23 @@
v-hasPermi="['${moduleName}:${businessName}:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="Sort"
@click="toggleExpandAll"
>展开/折叠</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table
v-if="refreshTable"
v-loading="loading"
:data="${businessName}List"
row-key="${treeCode}"
default-expand-all
:default-expand-all="isExpandAll"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
#foreach($column in $columns)
@@ -282,6 +291,8 @@ const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const title = ref("");
const isExpandAll = ref(true);
const refreshTable = ref(true);
#foreach ($column in $columns)
#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
@@ -404,6 +415,15 @@ async function handleAdd(row) {
title.value = "添加${functionName}";
}
/** 展开/折叠操作 */
function toggleExpandAll() {
refreshTable.value = false;
isExpandAll.value = !isExpandAll.value;
nextTick(() => {
refreshTable.value = true;
});
}
/** 修改按钮操作 */
async function handleUpdate(row) {
loading.value = true;

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -42,6 +42,10 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>

View File

@@ -79,6 +79,8 @@ public class MinioOssStrategy extends AbstractOssStrategy {
@Override
public UploadResult upload(InputStream inputStream, String path, String contentType) {
try {
// 解决 inputStream.available() 再 socket 下传输延迟问题 导致获取数值不精确
Thread.sleep(1000);
minioClient.putObject(PutObjectArgs.builder()
.bucket(properties.getBucketName())
.object(path)

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi-flowable-plus</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.0.1</version>
<version>4.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -24,7 +24,7 @@ public interface ISysOssConfigService {
/**
* 查询单个
*/
SysOssConfigVo queryById(Integer ossConfigId);
SysOssConfigVo queryById(Long ossConfigId);
/**
* 查询列表

View File

@@ -11,6 +11,7 @@ import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.XcxLoginUser;
import com.ruoyi.common.core.service.LogininforService;
import com.ruoyi.common.enums.DeviceType;
import com.ruoyi.common.enums.LoginType;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
@@ -28,6 +29,7 @@ import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
/**
* 登录校验方法
@@ -60,35 +62,8 @@ public class SysLoginService {
if (captchaOnOff) {
validateCaptcha(username, code, uuid, request);
}
// 获取用户登录错误次数(可自定义限制策略 例如: key + username + ip)
Integer errorNumber = RedisUtils.getCacheObject(Constants.LOGIN_ERROR + username);
// 锁定时间内登录 则踢出
if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) {
asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request);
throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME);
}
SysUser user = loadUserByUsername(username);
if (!BCrypt.checkpw(password, user.getPassword())) {
// 是否第一次
errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
// 达到规定错误次数 则锁定登录
if (errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) {
RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber, Constants.LOGIN_ERROR_LIMIT_TIME, TimeUnit.MINUTES);
asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request);
throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME);
} else {
// 未达到规定错误次数 则递增
RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber);
asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", errorNumber), request);
throw new UserException("user.password.retry.limit.count", errorNumber);
}
}
// 登录成功 清空错误次数
RedisUtils.deleteObject(Constants.LOGIN_ERROR + username);
checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, user.getPassword()));
// 此处可根据登录用户的数据不同 自行创建 loginUser
LoginUser loginUser = buildLoginUser(user);
// 生成token
@@ -104,33 +79,7 @@ public class SysLoginService {
SysUser user = loadUserByPhonenumber(phonenumber);
HttpServletRequest request = ServletUtils.getRequest();
// 获取用户登录错误次数(可自定义限制策略 例如: key + username + ip)
Integer errorNumber = RedisUtils.getCacheObject(Constants.LOGIN_ERROR + user.getUserName());
// 锁定时间内登录 则踢出
if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) {
asyncService.recordLogininfor(user.getUserName(), Constants.LOGIN_FAIL, MessageUtils.message("sms.code.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request);
throw new UserException("sms.code.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME);
}
if (!validateSmsCode(phonenumber, smsCode)) {
// 是否第一次
errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
// 达到规定错误次数 则锁定登录
if (errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) {
RedisUtils.setCacheObject(Constants.LOGIN_ERROR + user.getUserName(), errorNumber, Constants.LOGIN_ERROR_LIMIT_TIME, TimeUnit.MINUTES);
asyncService.recordLogininfor(user.getUserName(), Constants.LOGIN_FAIL, MessageUtils.message("sms.code.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request);
throw new UserException("sms.code.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME);
} else {
// 未达到规定错误次数 则递增
RedisUtils.setCacheObject(Constants.LOGIN_ERROR + user.getUserName(), errorNumber);
asyncService.recordLogininfor(user.getUserName(), Constants.LOGIN_FAIL, MessageUtils.message("sms.code.retry.limit.count", errorNumber), request);
throw new UserException("sms.code.retry.limit.count", errorNumber);
}
}
// 登录成功 清空错误次数
RedisUtils.deleteObject(Constants.LOGIN_ERROR + user.getUserName());
checkLogin(LoginType.SMS, user.getUserName(), () -> !validateSmsCode(phonenumber, smsCode));
// 此处可根据登录用户的数据不同 自行创建 loginUser
LoginUser loginUser = buildLoginUser(user);
// 生成token
@@ -276,4 +225,42 @@ public class SysLoginService {
sysUser.setUpdateBy(username);
userService.updateUserProfile(sysUser);
}
/**
* 登录校验
*/
private void checkLogin(LoginType loginType, String username, Supplier<Boolean> supplier) {
HttpServletRequest request = ServletUtils.getRequest();
String errorKey = Constants.LOGIN_ERROR + username;
Integer errorLimitTime = Constants.LOGIN_ERROR_LIMIT_TIME;
Integer setErrorNumber = Constants.LOGIN_ERROR_NUMBER;
String loginFail = Constants.LOGIN_FAIL;
// 获取用户登录错误次数(可自定义限制策略 例如: key + username + ip)
Integer errorNumber = RedisUtils.getCacheObject(errorKey);
// 锁定时间内登录 则踢出
if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(setErrorNumber)) {
asyncService.recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), errorLimitTime), request);
throw new UserException(loginType.getRetryLimitExceed(), errorLimitTime);
}
if (supplier.get()) {
// 是否第一次
errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1;
// 达到规定错误次数 则锁定登录
if (errorNumber.equals(setErrorNumber)) {
RedisUtils.setCacheObject(errorKey, errorNumber, errorLimitTime, TimeUnit.MINUTES);
asyncService.recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), errorLimitTime), request);
throw new UserException(loginType.getRetryLimitExceed(), errorLimitTime);
} else {
// 未达到规定错误次数 则递增
RedisUtils.setCacheObject(errorKey, errorNumber);
asyncService.recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber), request);
throw new UserException(loginType.getRetryLimitCount(), errorNumber);
}
}
// 登录成功 清空错误次数
RedisUtils.deleteObject(errorKey);
}
}

View File

@@ -63,7 +63,7 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
}
@Override
public SysOssConfigVo queryById(Integer ossConfigId) {
public SysOssConfigVo queryById(Long ossConfigId) {
return baseMapper.selectVoById(ossConfigId);
}

View File

@@ -32,6 +32,7 @@
<id property="deptId" column="dept_id"/>
<result property="parentId" column="parent_id"/>
<result property="deptName" column="dept_name"/>
<result property="ancestors" column="ancestors"/>
<result property="orderNum" column="order_num"/>
<result property="leader" column="leader"/>
<result property="status" column="dept_status"/>
@@ -66,6 +67,7 @@
u.remark,
d.dept_id,
d.parent_id,
d.ancestors,
d.dept_name,
d.order_num,
d.leader,

View File

@@ -11,7 +11,7 @@ cd ruoyi-ui
npm install
# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npm.taobao.org
npm install --registry=https://registry.npmmirror.com
# 启动服务
npm run dev

View File

@@ -1,12 +1,12 @@
@echo off
echo.
echo [<5B><>Ϣ] <20><>װWeb<65><62><EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD>node_modules<65>ļ<EFBFBD><C4BC><EFBFBD>
echo [<5B><>Ϣ] <20><>װWeb<65><62><EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD>node_modules<65>ļ<EFBFBD><C4BC><EFBFBD>
echo.
%~d0
cd %~dp0
cd ..
npm install --registry=https://registry.npm.taobao.org
npm install --registry=https://registry.npmmirror.com
pause
pause

View File

@@ -1,6 +1,6 @@
{
"name": "ruoyi-flowable-plus",
"version": "4.0.1",
"version": "4.1.0",
"description": "RuoYi-Flowable-Plus后台管理系统",
"author": "KonBAI",
"license": "MIT",
@@ -41,13 +41,13 @@
"clipboard": "2.0.8",
"core-js": "3.19.1",
"echarts": "4.9.0",
"element-ui": "2.15.6",
"element-ui": "2.15.8",
"file-saver": "2.0.5",
"fuse.js": "6.4.3",
"highlight.js": "^10.5.0",
"js-beautify": "1.13.0",
"js-cookie": "3.0.1",
"jsencrypt": "3.2.1",
"jsencrypt": "3.0.0-rc.1",
"nprogress": "0.2.0",
"quill": "1.3.7",
"screenfull": "5.0.2",

View File

@@ -41,6 +41,7 @@
<script>
import { getToken } from "@/utils/auth";
import { delOss } from "@/api/system/oss";
export default {
name: "FileUpload",
@@ -89,9 +90,7 @@ export default {
const list = Array.isArray(val) ? val : this.value.split(',');
// 然后将数组转为对象数组
this.fileList = list.map(item => {
if (typeof item === "string") {
item = { name: item, url: item };
}
item = { name: item.name, url: item.url, ossId: item.ossId };
item.uid = item.uid || new Date().getTime() + temp++;
return item;
});
@@ -153,12 +152,12 @@ export default {
// 上传成功回调
handleUploadSuccess(res, file) {
if (res.code === 200) {
this.uploadList.push({ name: res.data.fileName, url: res.data.url });
this.uploadList.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId });
if (this.uploadList.length === this.number) {
this.fileList = this.fileList.concat(this.uploadList);
this.uploadList = [];
this.number = 0;
this.$emit("input", this.listToString(this.fileList));
this.$emit("input", this.fileList);
this.$modal.closeLoading();
}
} else {
@@ -168,26 +167,20 @@ export default {
},
// 删除文件
handleDelete(index) {
let ossId = this.fileList[index].ossId;
delOss(ossId);
this.fileList.splice(index, 1);
this.$emit("input", this.listToString(this.fileList));
this.$emit("input", this.fileList);
},
// 获取文件名称
getFileName(name) {
// 如果是url那么取最后的名字 如果不是直接返回
if (name.lastIndexOf("/") > -1) {
return name.slice(name.lastIndexOf("/") + 1);
} else {
return "";
return name;
}
},
// 对象转成指定字符串分隔
listToString(list, separator) {
let strs = "";
separator = separator || ",";
for (let i in list) {
strs += list[i].url + separator;
}
return strs != "" ? strs.substr(0, strs.length - 1) : "";
},
},
};
</script>

View File

@@ -44,6 +44,7 @@
<script>
import { getToken } from "@/utils/auth";
import { delOss } from "@/api/system/oss";
export default {
props: {
@@ -92,9 +93,8 @@ export default {
const list = Array.isArray(val) ? val : this.value.split(',');
// 然后将数组转为对象数组
this.fileList = list.map(item => {
if (typeof item === "string") {
item = { name: item, url: item };
}
// 此处name使用ossId 防止删除出现重名
item = { name: item.ossId, url: item.url, ossId: item.ossId };
return item;
});
} else {
@@ -117,19 +117,21 @@ export default {
handleRemove(file, fileList) {
const findex = this.fileList.map(f => f.name).indexOf(file.name);
if(findex > -1) {
let ossId = this.fileList[findex].ossId;
delOss(ossId);
this.fileList.splice(findex, 1);
this.$emit("input", this.listToString(this.fileList));
this.$emit("input", this.fileList);
}
},
// 上传成功回调
handleUploadSuccess(res) {
if (res.code == 200) {
this.uploadList.push({ name: res.data.fileName, url: res.data.url });
this.uploadList.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId });
if (this.uploadList.length === this.number) {
this.fileList = this.fileList.concat(this.uploadList);
this.uploadList = [];
this.number = 0;
this.$emit("input", this.listToString(this.fileList));
this.$emit("input", this.fileList);
this.$modal.closeLoading();
}
} else {
@@ -182,15 +184,6 @@ export default {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
// 对象转成指定字符串分隔
listToString(list, separator) {
let strs = "";
separator = separator || ",";
for (let i in list) {
strs += list[i].url + separator;
}
return strs != '' ? strs.substr(0, strs.length - 1) : '';
}
}
};
</script>

View File

@@ -30,13 +30,14 @@
<script>
import { constantRoutes } from "@/router";
// 隐藏侧边栏路由
const hideList = ['/index', '/user/profile'];
export default {
data() {
return {
// 顶部栏初始数
visibleNumber: 5,
// 是否为首次加载
isFrist: false,
// 当前激活菜单的 index
currentIndex: undefined
};
@@ -88,17 +89,10 @@ export default {
activeMenu() {
const path = this.$route.path;
let activePath = path;
if (path.lastIndexOf("/") > 0) {
if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) {
const tmpPath = path.substring(1, path.length);
activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/"));
this.$store.dispatch('app/toggleSideBarHide', false);
} else if ("/index" == path || "" == path) {
if (!this.isFrist) {
this.isFrist = true;
} else {
activePath = "index";
}
this.$store.dispatch('app/toggleSideBarHide', true);
} else if(!this.$route.children) {
activePath = path;
this.$store.dispatch('app/toggleSideBarHide', true);

View File

@@ -55,10 +55,10 @@ export default {
return store.dispatch('tagsView/delOthersViews', obj || router.currentRoute);
},
// 添加tab页签
openPage(title, url) {
openPage(title, url, params) {
var obj = { path: url, meta: { title: title } }
store.dispatch('tagsView/addView', obj);
return router.push(url);
return router.push({ path: url, query: params });
},
// 修改tab页签
updatePage(obj) {

View File

@@ -39,14 +39,24 @@
v-hasPermi="['demo:tree:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="el-icon-sort"
size="mini"
@click="toggleExpandAll"
>展开/折叠</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table
v-if="refreshTable"
v-loading="loading"
:data="treeList"
row-key="id"
default-expand-all
:default-expand-all="isExpandAll"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
<el-table-column label="父id" prop="parentId" />
@@ -54,12 +64,12 @@
<el-table-column label="用户id" align="center" prop="userId" />
<el-table-column label="树节点名" align="center" prop="treeName" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<template #default="scope">
<el-button
size="mini"
type="text"
@@ -135,6 +145,10 @@ export default {
title: "",
// 是否显示弹出层
open: false,
// 是否展开,默认全部展开
isExpandAll: true,
// 重新渲染表格状态
refreshTable: true,
// 创建时间时间范围
daterangeCreateTime: [],
// 查询参数
@@ -233,6 +247,14 @@ export default {
this.open = true;
this.title = "添加测试树表";
},
/** 展开/折叠操作 */
toggleExpandAll() {
this.refreshTable = false;
this.isExpandAll = !this.isExpandAll;
this.$nextTick(() => {
this.refreshTable = true;
});
},
/** 修改按钮操作 */
handleUpdate(row) {
this.loading = true;

View File

@@ -8,9 +8,12 @@
<br/>
* 前端开发框架 VueElement UI<br/>
* 后端开发框架 Spring Boot<br/>
* 容器框架 Undertow 基于 Netty 的高性能容器<br/>
* 权限认证框架 Sa-Token 支持多终端认证系统<br/>
* 容器框架 Undertow 基于 XNIO 的高性能容器<br/>
* 权限认证框架 Sa-TokenJwt 支持多终端认证系统<br/>
* 关系数据库 MySQL 适配 8.X 最低 5.7<br/>
* 关系数据库 Oracle 适配 11g 12c<br/>
* 关系数据库 PostgreSQL 适配 13 14<br/>
* 关系数据库 SQLServer 适配 2017 2019<br/>
* 缓存数据库 Redis 适配 6.X 最低 4.X<br/>
* 数据库框架 Mybatis-Plus 快速 CRUD 增加开发效率<br/>
* 数据库框架 p6spy 更强劲的 SQL 分析<br/>
@@ -19,11 +22,11 @@
* Redis客户端 Redisson 性能强劲API丰富<br/>
* 分布式限流 Redisson 全局请求IP集群ID 多种限流<br/>
* 分布式锁 Lock4j 注解锁工具锁 多种多样<br/>
* 分布式幂等 Lock4j 基于分布式锁实现<br/>
* 分布式幂等 Redisson 拦截重复提交<br/>
* 分布式日志 TLog 支持跟踪链路日志记录性能分析链路排查<br/>
* 分布式任务调度 Xxl-Job 高性能 高可靠 易扩展<br/>
* 文件存储 Minio 本地存储<br/>
* 文件存储 七牛阿里腾讯 云存储<br/>
* 分布式文件存储 Minio 本地存储<br/>
* 分布式云存储 七牛阿里腾讯 云存储<br/>
* 监控框架 SpringBoot-Admin 全方位服务监控<br/>
* 校验框架 Validation 增强接口安全性 严谨性<br/>
* Excel框架 Alibaba EasyExcel 性能优异 扩展性强<br/>
@@ -56,6 +59,14 @@
@click="goTarget('https://github.com/JavaLionLi/RuoYi-Vue-Plus')"
>访问GitHub</el-button
>
<el-button
type="primary"
size="mini"
icon="el-icon-cloudy"
plain
@click="goTarget('https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4106467&doc_id=1469725')"
>更新日志</el-button
>
</p>
</el-col>
@@ -94,634 +105,6 @@
</el-col>
</el-row>
<el-divider />
<el-row :gutter="20">
<el-col :xs="24" :sm="24" :md="12" :lg="8">
<el-card class="update-log">
<div slot="header" class="clearfix">
<span>更新日志</span>
</div>
<el-collapse accordion>
<el-collapse-item title="v4.0.1 - 2022-03-01">
<ol>
<li>update 图片上传 文件上传 支持并发上传</li>
<li>update 组件ImageUpload支持多图同时选择上传</li>
<li>udpate 组件fileUpload支持多文件同时选择上传</li>
<li>update springboot 2.6.3 => 2.6.4</li>
<li>update hutool 5.7.20 => 5.7.21</li>
<li>update qiniu 7.9.2 => 7.9.3</li>
<li>update minio 8.3.5 => 8.3.7</li>
<li>update 优化 R 默认返回 msg</li>
<li>update 增加 用户注册 用户类型默认值</li>
<li>update 增加用户登出日志</li>
<li>update 更新 多用户多设备的注释说明</li>
<li>update 优化 是否为管理员的判断</li>
<li>update 优化 页面若未匹配到字典标签则返回原字典值</li>
<li>update 调整用户登录 将日志调整到最后 防止获取不到用户警告</li>
<li>update 优化随机数生成方式 避免容易生成两个相同随机数的问题</li>
<li>fix 修复代码生成 基于路径生成 路径为空问题</li>
<li>fix 恢复误删 @Async 注解线程池配置类</li>
<li>fix 修复 minio 适配 https 导致的问题</li>
<li>fix 修复分页组件请求两次问题</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v4.0.0 - 2022-02-18">
<ol>
<li>[重大更新] 重写项目整体结构 数据处理下沉至Mapper符合MVC规范 减少循环依赖</li>
<li>[重磅更新] 主分支与satoken分支合并 权限统一使用 sa-token</li>
<li>[重磅更新] 适配升级 SpringBoot 2.6</li>
<li>[重磅更新] EasyExcel大版本升级3.X</li>
<li>[重磅更新] 移除链式调用注解 因链式调用不符合java规范 导致很多问题</li>
<li>[重磅更新] 增加 轻量级 分布式队列 支持</li>
<li>[重磅更新] 增加 数据脱敏注解 使用序列化控制脱敏 支持多种表达式</li>
<li>[重磅更新] 重构 使用 Spring 简化 oss 模块代码</li>
<li>[重磅更新] 重构 调整返回类型为 R 精简 Controller 代码</li>
<li>update springboot 2.5.8 => 2.6.3</li>
<li>update mybatis-plus 3.4.3.4 => 3.5.1</li>
<li>update maven-jar-plugin 3.2.0 => 3.2.2</li>
<li>update maven-war-plugin 3.2.0 => 3.2.2</li>
<li>update maven-compiler-plugin 3.1 => 3.9.0</li>
<li>update hutool 5.7.18 => 5.7.20</li>
<li>update springboot-admin 2.6.0 => 2.6.2</li>
<li>update redisson 3.16.7 => 3.16.8</li>
<li>update qiniu 7.9.0 => 7.9.2</li>
<li>update aliyun 3.13.1 => 3.14.0</li>
<li>update qcloud 5.6.58 => 5.6.68</li>
<li>update minio 8.3.4 => 8.3.5</li>
<li>update 用户管理部门查询选择节点后分页参数初始</li>
<li>update 防重复提交标识组合key + url + header</li>
<li>update 接口文档增加 basic 账号密码验证</li>
<li>update 用户修改减少一次角色列表关联查询</li>
<li>update 优化部门修改缩放后出现的错位问题</li>
<li>update 指定 maven 资源过滤为具体文件 防止错误过滤</li>
<li>update hutool 引入改为 bom 依赖项引入</li>
<li>update 降低开发环境 redis连接池数量</li>
<li>update 升级 springboot 2.6.X 解决 springfox 兼容性问题</li>
<li>update 优化多用户体系处理 更名 LoginUtils LoginHelper 支持 LoginUser 多级缓存</li>
<li>update 优化加载字典缓存数据</li>
<li>update 数据库更改 对接多用户体系</li>
<li>update 移除掉 StringUtils 语义不明确的api方法 使用特定工具替换</li>
<li>update 优化登录注册在接口通过`@Validated`注解进行数据基础校验</li>
<li>update 优化 查询登录用户数据 统一走缓存</li>
<li>update 优化 redisson 配置 去除掉不常用的配置 使用默认配置</li>
<li>update 用户访问控制时校验数据权限防止越权</li>
<li>update 修改用户注册报未登录警告</li>
<li>update 调整oss预览开关 使用前端直接调用更改配置参数</li>
<li>update 使用 satoken 自带的 BCrypt 工具 替换 Security 加密工具 减少依赖</li>
<li>update 优化 TreeBuildUtils 工具 使用反射自动获取顶级父id</li>
<li>update 使用 hutool Dict 优化 JsonUtils 防止类型解析异常</li>
<li>update 优化代码生成 使用新 JsonUtils.parseMap 方法</li>
<li>update 更新 所有 oss 均支持 https 配置</li>
<li>add 增加 RedisUtils 工具 hasKey 检查key存在方法</li>
<li>add 增加 监控中心 自定义事件通知</li>
<li>add 增加 3.X update 4.0 更新sql</li>
<li>fix 修复登录失效后多次请求提示多次弹窗问题</li>
<li>fix 修复 StringUtils 通配符匹配无效</li>
<li>fix 修复选项卡点击右键刷新丢失参数问题</li>
<li>fix 修复 数据权限 缓存方法名错误问题</li>
<li>fix 修复自定义组件`file-upload`无法显示第一个文件列表显示的文件比实际文件少一个的问题</li>
<li>fix 修复因升级 sa-token 导致 doLogin 无法获取 token 问题</li>
<li>fix 修复分页组件请求两次问题</li>
<li>remove 移除过期代码 分页工具相关</li>
<li>remove 移除过期代码 多数据源切换</li>
<li>remove 移除过期代码 数据权限</li>
<li>3.X 版本进入维护阶段 不进行更新 只修复bug 持续维护到2022年10月</li>
<li>4.X 版本公测将近一个月 大部分bug已修复 官网主分支更改为 4.X 版本 推荐使用</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.5.0 - 2021-12-28">
<ol>
<li>[重大更新] 重写数据权限实现</li>
<li>[重磅更新] 重构分页 简化使用</li>
<li>[重磅更新] 用户登录 支持校验错误次数锁定登录</li>
<li>[重磅更新] 增加 jdbc 批处理参数 大幅提升批量操作性能 对原生语句与 MP 均有效</li>
<li>update springboot 2.5.7 => 2.5.8 升级预防 log4j2 问题</li>
<li>update springboot-admin 2.5.4 => 2.5.5</li>
<li>update hutool 5.7.16 => 5.7.18</li>
<li>update redisson 3.16.4 => 3.16.7</li>
<li>update dynamic-ds 3.4.1 => 3.5.0</li>
<li>update qiniu 7.8.0 => 7.9.0</li>
<li>update minio 8.3.3 => 8.3.4</li>
<li>update tlog 1.3.4 => 1.3.6 启用 tlog 自动配置</li>
<li>update clipboard 2.0.6 => 2.0.8</li>
<li>update 多数据源切换标注过期 3.6.0 移除 推荐使用原生注解</li>
<li>update 通用权限服务 迁移回 ruoyi-framework 模块</li>
<li>update 使用 hutool-jwt 替换老旧 jjwt 依赖</li>
<li>update 调整 OSS 表字段内容长度</li>
<li>update LoginUser 增加角色缓存 优化角色权限代码</li>
<li>update 使用 Cglib 重构 BeanCopyUtils 性能优异</li>
<li>update 禁止所有工具类实例化 优化代码书写规范</li>
<li>update 优化查询用户的角色组岗位组代码</li>
<li>update 更新 RedisUtils 返回客户端实例</li>
<li>update 修改 健康检查权限 改为用户放行 提高安全性</li>
<li>update hutool 工具 改为单包引入 减少无用依赖</li>
<li>update ServicePlusImpl 功能 下沉到 BaseMapperPlus</li>
<li>update 去除 jdk17 标签 由于很多组件还未适配 导致一些问题</li>
<li>udpate 代码生成预览支持复制内容</li>
<li>update 用户导入提示溢出则显示滚动条</li>
<li>update 路由支持单独配置菜单或角色权限</li>
<li>update 优化web拦截器 使用原生接口处理 默认非生产环境开启</li>
<li>update 调整监控依赖 common 迁移到 framework</li>
<li>add 新增 Vue3 分支 代码生成模板(由于组件还未完善 仅供学习)</li>
<li>add 增加 RedisUtils 注册监听器方法</li>
<li>add 增加 自定义 Xss 校验注解 用户导入增加 Bean 校验</li>
<li>add oss下载增加 loading </li>
<li>add 新增图片预览组件</li>
<li>add 集成compression-webpack-plugin插件实现打包Gzip压缩</li>
<li>add 新增 SqlUtils 检查关键字方法</li>
<li>fix 修复 集群雪花id重复问题 使用网卡信息绑定生成</li>
<li>fix 修复 count 语法异常</li>
<li>fix 修复更改密码问题</li>
<li>fix 修复sql关键字处理 防止解析器报错</li>
<li>fix 修复 TreeBuildUtils 顶节点不为 0 问题</li>
<li>fix 修复 SysOssConfig 主键类型错误</li>
<li>fix 修复代码生成 导出注解错误</li>
<li>fix 修复 redisson 集群模式 路径未匹配协议头问题</li>
<li>fix 修复打包后字体图标偶现的乱码问题</li>
<li>fix 修复版本差异导致的懒加载报错问题</li>
<li>fix 修复代码生成字典组重复问题</li>
<li>remove 删除 jjwt 无用依赖</li>
<li>remove 移除过期 用户导入</li>
<li>remove 移除过期工具 DictUtils</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.4.0 - 2021-11-29">
<ol>
<li>update [重磅更新] 重构 Excel 导入 支持 Validator 校验 支持自定义监听器</li>
<li>update [重磅更新] Validator 校验框架支持国际化</li>
<li>update springboot 2.5.6 => 2.5.7</li>
<li>update hutool 5.7.15 => 5.7.16</li>
<li>update okhttp 4.9.1 => 4.9.2</li>
<li>update spring-boot-admin 2.5.2 => 2.5.4</li>
<li>update redisson 3.16.3 => 3.16.4</li>
<li>update tlog 1.3.3 => 1.3.4</li>
<li>update axios 0.21.0 => 0.24.0</li>
<li>update core-js 3.8.1 => 3.19.1</li>
<li>update js-cookie 2.2.1 => 3.0.1</li>
<li>update velocity 1.7 => 2.3</li>
<li>update 升级 docker 基础镜像</li>
<li>update 基于 hutool 封装树构建工具 重构部门与菜单树结构返回</li>
<li>update 减少使用特定数据库函数</li>
<li>update 配置应用前缀路径 改为配置文件统一配置</li>
<li>update 升级 swagger 配置 使用 knife4j 增强模式</li>
<li>update 监控中心 集成监控客户端 实现自监控</li>
<li>update 调度中心 集成监控客户端 注册到监控中心</li>
<li>update 优化 tab 对象简化页签操作</li>
<li>update 解耦 LoginUser SysUser 强关联</li>
<li>update 更新 RepeatSubmit 注解 aop 处理 针对特殊参数进行过滤</li>
<li>update DictUtils 字典工具类 标记过期 3.5.0 版本移除 使用 DictService 代替</li>
<li>update 抽象 DictService 通用 字典服务</li>
<li>update 抽象 ConfigService 通用 参数配置服务</li>
<li>update 基于 DictService 重构 Excel 内字典查询功能</li>
<li>update OSS 模块 整体重命名 消除歧义</li>
<li>update 更新 redis.conf 存储策略 aof rdb 配置参数</li>
<li>update 初始化数据转移到 ApplicationRunner 统一处理</li>
<li>update 优化时间查询语句</li>
<li>add 增加 框架缓存懒加载 开关</li>
<li>add 新增 监控中心 Bean 初始化 startup trace 监控插件</li>
<li>add 增加 ValidatorUtils 校验框架工具 用于在非 Controller 的地方校验对象</li>
<li>fix 修复 SysOssSysOssConfig 未继承 BaseEntity 基础实体问题</li>
<li>fix 修复 xxl-job-admin 部署问题</li>
<li>fix 修复 回显数据字典键值修正</li>
<li>fix 修复 Linux 清除临时目录 导致上传找不到目录报错问题</li>
<li>fix 修复通用实体 传参无法接收问题</li>
<li>fix 修复 SysLoginController 接口文档书写错误问题</li>
<li>fix 修复 用户逻辑删除 差异问题</li>
<li>fix 修复 OSS 七牛云 token 过期未刷新问题</li>
<li>fix 修复 分页工具 排序字段 null 处理</li>
<li>fix 修复 用户导入字典使用错误</li>
<li>fix 修复 关闭 xss 功能导致可重复读 RepeatableFilter 失效</li>
<li>fix 修复 使用 this.$options.data 报错问题</li>
<li>fix 修复 代码生成复选框字典遗漏问题</li>
<li>fix 修复 重复提交不生效问题 由于概念不同 使用 RedisUtils 重构</li>
<li>fix 修复 OSS 工厂 未实例化服务更新加载问题</li>
<li>remove 移除 quartz 相关代码与依赖</li>
<li>remove 移除 feign 相关代码与依赖</li>
<li>remove 移除 MybatisPlusRedisCache 二级缓存</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.3.0 - 2021-10-29">
<ol>
<li>add [重磅更新] 增加分布式日志框架 TLog</li>
<li>add [重磅更新] 增加分布式任务调度系统 Xxl-Job</li>
<li>add [重大更新] 增加 ruoyi-job 任务调度模块(基于xxl-job)</li>
<li>update [重大更新]全业务 增加 接口文档注解 格式化代码</li>
<li>update springboot 2.5.5 => 2.5.6</li>
<li>update springboot-admin 2.5.1 => 2.5.2</li>
<li>update element-ui 2.15.5 => 2.15.6</li>
<li>update hutool 5.7.13 => 5.7.15</li>
<li>update qcloud.cos 5.6.55 => 5.6.58</li>
<li>update minio 8.3.0 => 8.3.3</li>
<li>update 更新 element 2.15.6 表格样式</li>
<li>update 优化 代码生成常量 关于 BO VO 注释</li>
<li>update 优化代码生成 导入表 列表返回 主键默认选中</li>
<li>update MybatisPlusRedisCache 标记过期 推荐使用 spring-cache</li>
<li>update Quartz 标记过期 推荐迁移至新框架 xxl-job</li>
<li>update Feign 标记过期</li>
<li>update 前端增加默认国际化参数</li>
<li>update 更新 Admin 监控 注释 避免错误使用</li>
<li>update Admin 监控增加日志文件输出</li>
<li>update 优化 xxl-job-admin 增加格式化日志输出与 docker 镜像</li>
<li>update 更新 xxl-job 执行器开关功能</li>
<li>update 代码生成 改为生成抽象实体</li>
<li>update 代码生成 搜索框 更新文本域生成 用于模糊查询</li>
<li>update 通用数据注入改为适配通用实体类</li>
<li>update 使用路由懒加载提升页面响应速度</li>
<li>update 迁移所有脚本文件至 script 目录</li>
<li>update swagger 组顺序配置</li>
<li>update sql 文件更新 xxljob 控制台菜单</li>
<li>update 前端增加 任务调度中心页面与环境及 nginx 配置</li>
<li>update 合并 oss.sql 至主 sql</li>
<li>update 补全国际化文件(英文)</li>
<li>update 更新关于全局路径设置与文档链接</li>
<li>update 删除无用 setUsername 使用自动注入</li>
<li>update RedisUtils 更新删除 hash 数据方法</li>
<li>fix 修复 多数据源 aop 语法错误</li>
<li>fix 修复 子菜单无 query 参数问题</li>
<li>fix 修复 oss 配置删除时删除缓存 bug</li>
<li>fix 修复无权限获取请求头 download-filename 导致文件名为空问题</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.2.0 - 2021-9-28">
<ol>
<li>update [重大改动]接口文档 支持分组配置</li>
<li>update [重大改动]security 路径配置抽取到配置文件</li>
<li>update [重大改动] framework system 模块 解耦 调整依赖结构 解决依赖冲突</li>
<li>update [重大改动]重写 防重提交实现 使用分布式锁 解决并发问题 压测通过</li>
<li>update springboot 2.5.4 => 2.5.5 bugfix版本</li>
<li>update mybatis-plus 3.4.3.3 => 3.4.3.4 bugfix版本</li>
<li>update redisson 3.16.2 => 3.16.3 bugfix版本</li>
<li>update easyexcel 2.2.10 => 2.2.11</li>
<li>update hutool 5.7.11 => 5.7.13</li>
<li>update file-saver 2.0.4 => 2.0.5</li>
<li>update dart-sass 1.32.0 => 1.32.13</li>
<li>update sass-loader 10.1.0 => 10.1.1</li>
<li>update 优化代码生成 根据MP生成特性 调整导入表结构默认值合理化</li>
<li>update 将所有 云存储字样 改为 对象存储 避免误解</li>
<li>update 更新 @Cacheable 错误用法 注意事项</li>
<li>update 优化 AddressUtils 空校验处理</li>
<li>update 菜单管理支持配置路由参数</li>
<li>update 优化aop语法 使用spring自动注入注解</li>
<li>update 使用 Redisson 限流工具 重写限流实现</li>
<li>update 使用 vue-data-dict 简化数据字典使用</li>
<li>update 增加日志注解新增是否保存响应参数开关</li>
<li>update 用户未登录日志改为 warn 级别</li>
<li>update OSS模块 关于下载403报错信息优化</li>
<li>update 更新 Actuator prod 默认暴漏端点 增加暴漏 logfile 日志端点</li>
<li>update 默认适配jdk11 测试 jdk17 无异常</li>
<li>update 封装通用下载方法简化下载使用</li>
<li>add 新增通用方法简化模态/缓存使用</li>
<li>add 增加 限流演示案例</li>
<li>add 增加 redis redisson 集群配置</li>
<li>fix Cron表达式生成器关闭时销毁避免再次打开时存在上一次修改的数据</li>
<li>fix 全局限流key会多出一个"-" 将其移动到IP后面 去除多余的空格</li>
<li>fix 修复多主键代码生成bug</li>
<li>fix 修复 @Cacheable @DataScope 冲突问题</li>
<li>fix 修复代码生成页面数据编辑保存之后总是跳转第一页的问题</li>
<li>remove 移除过期工具 RedisCache</li>
<li>remove 移除无用配置类 ServerConfig</li>
<li>remove 移除 SysUser 无用字段 salt</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.1.0 - 2021-9-7">
<ol>
<li>add [重大改动] 过期 RedisCache 新增 RedisUtils 工具类 新增 发布订阅功能 更灵巧便于使用</li>
<li>add [重大改动] 新增 saveOrUpdateAll 方法 可完美替代 saveOrUpdateBatch 高性能</li>
<li>update [重大改动] 重写 InsertAll 方法实现 可完美替代 saveBatch 秒级插入上万数据</li>
<li>update [重大改动] 更改OSS上传通用路径生成 按照年月日分三级目录</li>
<li>update [重大改动] MP字段验证策略更改为 NOT_NULL 个别特殊字段使用注解单独处理</li>
<li>update [重大改动] 所有业务适配 RedisUtils 新工具</li>
<li>update springboot 2.5.3 => 2.5.4</li>
<li>update spring-boot-admin 2.5.0 => 2.5.1</li>
<li>update mybatis-plus 3.4.3 => 3.4.3.3 适配升级 (包含不兼容升级)</li>
<li>update aliyun.oss 3.13.0 => 3.13.1</li>
<li>update qcloud.cos 5.6.47 => 5.6.51</li>
<li>update hutool 5.7.9 => 5.7.11</li>
<li>update maven-jar-plugin 3.1.1 => 3.2.0</li>
<li>update feign-okhttp 11.2 => 11.6</li>
<li>update redisson 3.16.1 => 3.16.2</li>
<li>add 优化 docker 增加 redis 配置文件</li>
<li>add 新增暗色菜单风格主题</li>
<li>add 菜单&部门新增展开/折叠功能</li>
<li>add 页签右键按钮添加图标 页签新增关闭左侧</li>
<li>update 优化 OSS 模块与上传组件 异常处理</li>
<li>update 更新 jackson 配置 支持 LocalDateTime 全局格式化</li>
<li>update 优化 使用权限工具 获取用户信息</li>
<li>update 自定义可拖动弹窗宽度指令</li>
<li>update 重构 将下载excel工具提取到全局</li>
<li>update 定时任务对检查异常进行事务回滚</li>
<li>update 优化spy配置文件为 UTF8编码 解决中文注释乱码问题</li>
<li>update 修改时检查用户数据权限范围</li>
<li>update 解决 logout 写死 无法扩展路径问题</li>
<li>update 优化代码生成 导入与同步 批处理效率</li>
<li>update 修改时检查用户数据权限范围</li>
<li>update 修改代码生成字典回显样式</li>
<li>update 修改数据字典回显</li>
<li>update 优化验证码配置 使用泛型 防止错误输入</li>
<li>update 优化全局线程池配置 使用泛型 防止错误输入</li>
<li>update 使用 MP 全局配置分页溢出</li>
<li>update 代码生成器 导入表时查询 新创建表的优先排序在前面</li>
<li>update 定时任务支持在线生成cron表达式</li>
<li>update 自定义弹层溢出滚动样式</li>
<li>update 优化分页工具排序处理</li>
<li>update 优化 oss配置 使用发布订阅工具 刷新配置</li>
<li>update 代码生成 查询数据库列表 按照时间倒序</li>
<li>update 使用MP自行判断数据库类型</li>
<li>fix 修复保存配置主题颜色失效问题</li>
<li>fix 修复 导出雪花id excel失真问题</li>
<li>fix 修复 druid 监控 集群模式下 无法路由到同一台服务器问题</li>
<li>fix 解决搜索校验不通过问题</li>
<li>fix 修复定时器工具编写错误问题</li>
<li>fix 修复 minio perfix 问题</li>
<li>fix 修复 富文本图片路径错误问题</li>
<li>fix 修复 OSS配置清空被过滤问题</li>
<li>fix 修复 excel 导入与 class 未对应问题</li>
<li>fix 修复字典组件值为整形不显示问题</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.0.0 - 2021-8-18">
<ol>
<li>add [重大更新]重写 OSS 模块相关实现 支持动态配置(页面配置)</li>
<li>add [重大更新]增加 jackson 超出 JS 最大数值自动转字符串(雪花id序列化)处理</li>
<li>add [重大更新]重写 防重提交拦截器 支持全局与注解自定义 拦截时间配置配置 优化逻辑</li>
<li>add [重大更新]新增是否开启用户注册功能</li>
<li>add [重大更新]增加 easyexcel 工具类</li>
<li>add [重大更新]集成 性能分析插件 p6spy 更强劲的 SQL 分析</li>
<li>add [重大更新]增加 完整国际化解决方案</li>
<li>add [重大更新]支持自定义注解实现接口限流</li>
<li>update feign-okhttp 11.0 => 11.2</li>
<li>update okhttp 3.19.4 => 4.9.1</li>
<li>update minio 8.2.0 => 8.3.0</li>
<li>update hutool 5.7.6 => 5.7.7</li>
<li>update element-ui 2.15.2 => 2.15.5</li>
<li>update springboot admin 2.4.3 => 2.5.0 (新增 Quartz 专属监控页)</li>
<li>add 增加 admin 监控客户端开关</li>
<li>add 增加 国际化演示demo</li>
<li>update 更新软件架构图</li>
<li>update 优化XSS跨站脚本过滤</li>
<li>update 优化BLOB下载时清除URL对象引用</li>
<li>update 更新 防重提交拦截器 demo演示案例</li>
<li>update 日常字符串校验 统一重构到 StringUtils 便于维护扩展</li>
<li>update 修改 自动注入器 用户未登录异常拦截抛出警告 返回Null</li>
<li>update 重构 统一使用 流工具下载</li>
<li>update 重写 所有业务导出 适配easyexcel工具</li>
<li>update 移动文件存储业务到 system 模块</li>
<li>update 代码生成模板 适配新excel导出</li>
<li>update Actuator 配置 移动到全局配置</li>
<li>update 统一镜像时区配置 移除主机时间映射</li>
<li>update 更改多数据源框架更清晰的依赖名</li>
<li>update 更新 阿里云 maven源 新地址</li>
<li>update 补全基础实体 文档注解</li>
<li>update 代码生成文档注解 增加必填判断配置</li>
<li>update 注入器 insert 增加 update 字段处理</li>
<li>update 默认首页使用keep-alive缓存</li>
<li>fix 生产minio回显问题</li>
<li>fix 修复角色分配用户页面接收参数与传递参数类型不一致导致的错误</li>
<li>fix 修复代码生成 删除按钮报错 loading 不取消问题</li>
<li>fix 解决登录后浏览器后台Breadcrumb组件报错</li>
<li>fix 修复DictUtils方法报错</li>
<li>fix 头像上传 未走OSS存储问题</li>
<li>fix oss列表 jpeg 不回显问题</li>
<li>fix 修复操作日志根据状态查询异常问题</li>
<li>remove 移除原生excel工具</li>
<li>remove 移除通用上传下载接口与配置</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.6.0 - 2021-7-28">
<ol>
<li>add [重大新增] 增加 OSS 对象存储模块</li>
<li>remove [重大改动] 删除 自带通用上传 接口 使用OSS模块替换<li>
<li>update [重大改动] 重写VO转换 支持深拷贝 将VO类抽象到 ServicePlus 泛型处理<li>
<li>update [重大改动] 多BO合并 使用分组校验 生成BO代码<li>
<li>update [重大改动] 重构 IServicePlus 功能 增加 BeanCopyUtils 深拷贝工具<li>
<li>update springboot 2.4.9 => 2.5.3<li>
<li>update hutool 5.7.4 => 5.7.6<li>
<li>update minio 8.2.2 => 8.3.0<li>
<li>update docker plugin 1.2.0 => 1.2.2<li>
<li>update redisson 3.16.0 => 3.16.1<li>
<li>update datasource 3.4.0 => 3.4.1<li>
<li>update element-ui 2.15.2 => 2.15.3<li>
<li>add 演示Demo增加自定义分页接口案例</li>
<li>add 角色&菜单新增字段属性提示信息</li>
<li>update 更新druid配置 独立配置更明显</li>
<li>update 顶部菜单排除隐藏的默认路由</li>
<li>update 富文本新增上传文件大小限制</li>
<li>update 导入用户样式调整</li>
<li>update 顶部菜单样式调整</li>
<li>update 密码框新增显示切换密码图标</li>
<li>update 内链设置meta信息</li>
<li>update 跳转路由高亮相对应的菜单栏</li>
<li>fix 修复多数据源druid全局配置缩进错误 引起无效配置问题</li>
<li>fix 修复定时任务日志执行状态显示</li>
<li>fix 修复 授权角色空数据问题</li>
<li>fix 修复 DictData 删除逻辑问题</li>
<li>fix 修复任意账户越权漏洞</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.5.2 - 2021-7-19">
<ol>
<li>update 优化代码生成器注释格式</li>
<li>fix 回滚代码生成 批处理优化</li>
<li>fix 代码生成 queryType 重复勾选数据库无默认值问题</li>
<li>fix 修复接口单参数校验无效问题</li>
<li>fix 代码生成 queryType >= <= 标识符错误问题</li>
<li>fix 修复代码生成字典问题</li>
<li>fix 修复 thread-pool: enabled 配置不生效问题</li>
<li>remove 删除无用文档与脚本</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.5.1 - 2021-7-13">
<ol>
<li>update 验证码开关 转移到表 参数管理 </li>
<li>update 使用hutool重构 判断是否url</li>
<li>fix 修复 docker业务集群部署与文件上传的问题</li>
<li>fix 修复代码生成同步表结构id冲突问题</li>
<li>fix 修复代码生成选择字典 无法取消问题</li>
<li>fix 修复代码生成字典为null问题</li>
<li>fix 图片上传 多图时无法删除相应图片修复</li>
<li>remove 删除富文本video事件</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.5.0 - 2021-7-12">
<ol>
<li>update springboot 2.4.7 => 2.4.8</li>
<li>update knife4j 3.0.2 => 3.0.3</li>
<li>update hutool 5.7.2 => 5.7.4</li>
<li>update spring-boot-admin 2.4.1 => 2.4.3</li>
<li>update redisson 3.15.2 => 3.16.0</li>
<li>add 增加 docker 编排 shell 脚本</li>
<li>add 增加 feign 熔断 自定义结构体解析方法 demo 注释</li>
<li>add 用户管理新增分配角色功能</li>
<li>add 角色管理新增分配用户功能</li>
<li>add 增加spring-cache演示案例</li>
<li>update 独立 springboot-admin 监控到扩展模块项目</li>
<li>update springboot-admin 监控 增加用户登录权限管理</li>
<li>update 优化代码生成器 批量导入</li>
<li>update 优化 增加MP注入异常拦截</li>
<li>update 关闭默认二级缓存 推荐使用 spring-cache 注解手动缓存</li>
<li>update FileUpload ImageUpload组件 支持多图片上传</li>
<li>update 优化中英文语言配置</li>
<li>update 规范maven写法</li>
<li>fix redis获取map属性bug修复</li>
<li>fix 修复 按钮loading 后端500卡死问题</li>
<li>fix 相对路径下载问题</li>
<li>fix 修复 hutool 工具返回结果不一致问题</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.4.0 - 2021-6-24">
<ol>
<li>update springboot 2.3.11 => 2.4.7</li>
<li>update springboot-admin 2.3.1 => 2.4.1</li>
<li>update feign 2.2.6 => 3.0.3</li>
<li>update hutool 5.6.7 => 5.7.2</li>
<li>update 多数据源替换成dynamic-datasource</li>
<li>update 适配 jdk11</li>
<li>update 集成 Lock4j 分布式锁</li>
<li>update 移除 fastjson 增加 jackson 工具类 重写相关业务</li>
<li>update 优化 异步工厂重写 使用 spring 异步处理</li>
<li>update 全局挂载字典标签组件</li>
<li>update 日志列表支持排序操作</li>
<li>update 更新 feign demo 更清晰的用法</li>
<li>update 更新多数据源演示案例</li>
<li>add 增加 ServicePlusImpl 自动以实现类 重写移除事务注解方法 防止多数据源失效</li>
<li>add 增加 自定义 批量insert方法</li>
<li>add 增加 Swagger3 用法示例</li>
<li>fix 修复地址ip地址特殊回环问题</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.3.2 - 2021-6-11">
<ol>
<li>add redis锁工具类编写</li>
<li>update spring-cache 整合 redisson</li>
<li>update MybatisPlus整合Redis二级缓存</li>
<li>update swagger 升级为 3.0.0 使用 OAS_30 协议</li>
<li>update 优化 代码生成器 增加表单防重注解</li>
<li>update 优化 锁切面代码 key到常量类</li>
<li>fix 修复相对路径上传异常问题</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.3.1 - 2021-6-4">
<ol>
<li>add 增加 redisson 分布式锁 注解与demo案例</li>
<li>add 增加 Oracle 分支</li>
<li>update 优化 redis 空密码兼容性</li>
<li>update 优化前端代码生成按钮增加 loading</li>
<li>fix 修复 redisson 不能批量删除的bug</li>
<li>fix 修复表单构建选择下拉选择控制台报错问题</li>
<li>fix 修复 vo 代码生成 主键列表显示 重复生成bug</li>
<li>fix 修复上传路径 win 打包编译为 win 路径, linux 报错bug</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.3.0 - 2021-6-1">
<ol>
<li>add 升级 luttuce redisson 性能更强 工具更全</li>
<li>add 增加测试数据sql文件</li>
<li>add 增加demo模块 单表演示案例(包含数据权限)</li>
<li>update 完美修复 数据权限功能(支持单表多表过滤)</li>
<li>update 优化代码生成模板</li>
<li>update 优化 system 模块 批量操作性能</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.2.1 - 2021-5-29">
<ol>
<li>add 增加 security 权限框架 @Async 异步注解配置</li>
<li>update 优化dataScope参数防止注入</li>
<li>update 优化参数&字典缓存操作</li>
<li>update 增加修改包名文档</li>
<li>update 文档增加演示图例</li>
<li>fix 修复部门类sql符号错误</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.2.0 - 2021-5-25">
<ol>
<li>同步升级 RuoYi-Vue 3.5.0</li>
<li>add 增加验证码开关</li>
<li>add 新增IE浏览器版本过低提示页面</li>
<li>update 升级druid到最新版本v1.2.6</li>
<li>update 升级fastjson到最新版1.2.76</li>
<li>update 修改bo加入判断是否设置必填再加载必填注解</li>
<li>update 生成vue模板导出按钮点击后添加遮罩</li>
<li>update Redis设置HashKey序列化</li>
<li>update 优化Redis序列化配置</li>
<li>fix 修复代码生成器中表字段取消必填无法更新问题</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.1.2 - 2021-5-21">
<ol>
<li>update springboot 升级 2.3.11</li>
<li>update mybatis-plus 升级 3.4.3 分页Plus对象适配更新</li>
<li>update 验证码生成更新为无符号整数计算</li>
<li>update 请求响应对象 分页对象 结构修改 适配接口文档配置</li>
<li>update swagger增加请求前缀</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.1.1 - 2021-5-19">
<ol>
<li>update 配置统一提取为 properties 配置类</li>
<li>update 分页工具 删除过期方法</li>
<li>update admin 实时监控日志 改为保留一天</li>
<li>fix 修复swagger开关无法控制关闭问题</li>
<li>fix maven install 异常</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.1.0 - 2021-5-17">
<ol>
<li>update knife4j升级3.0.2</li>
<li>update 增强分页工具兼容性</li>
<li>update 通用Service接口 增加自定义vo转换函数</li>
<li>remove 移除ruoyi自带服务监控(Admin已全部包含)</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.0.0 - 2021-5-15">
<ol>
<li>springboot 升级 2.3.10 依赖全面升级适配</li>
<li>add 增加分页工具</li>
<li>add 增加 增强Mapper 增强Service 重写业务适配</li>
<li>add 代码生成器 增加校验注解</li>
<li>update 代码生成器修改为MP分页</li>
<li>update 使用 MP 分页工具 重构业务</li>
<li>update 重写文档介绍</li>
<li>remove 移除 pagehelper 分页工具</li>
<li>fix 修复代码生成 数据权限问题</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v1.0.2 - 2021-5-13">
<ol>
<li>update 更新整合打包文档 重新排版</li>
<li>fix vue与boot整合打包与admin页面路由冲突</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v1.0.1 - 2021-5-11">
<ol>
<li>update 更新banner</li>
<li>update 配置转移到 yml 文件 统一管理</li>
<li>update 上传媒体类型添加视频格式</li>
<li>update 树级结构更新子节点使用replaceFirst</li>
<li>update 删除操作日志记录日志</li>
<li>fix 修正导入表权限标识</li>
<li>fix 文件上传时报错</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v1.0.0 - 2021-5-10">
<ol>
<li>RuoYi-Vue-Plus 后台管理系统正式发布</li>
<li>ORM框架 使用 Mybatis-Plus 3.4.2 简化CRUD</li>
<li>Bean简化 使用 Lombok 简化 get set toString 等等</li>
<li>容器改动 Tomcat 改为 并发性能更好的 undertow</li>
<li>所有原生功能使用 Mybatis-Plus Lombok 重写</li>
<li>代码生成模板 改为适配 Mybatis-Plus 的代码</li>
<li>代码生成模板 拆分出Vo,QueryBo,AddBo,EditBo等领域对象</li>
<li>项目修改为 maven多环境配置</li>
<li>swagger 修改为 knife4j</li>
<li>集成 Hutool 5.X 并重写RuoYi部分功能</li>
<li>集成 Feign 接口化管理 Http 请求(如三方请求 支付,短信,推送等)</li>
<li>集成 spring-boot-admin 全方位监控</li>
<li>增加demo模块示例(给不会增加模块的小伙伴做参考)</li>
</ol>
</el-collapse-item>
</el-collapse>
</el-card>
</el-col>
</el-row>
</div>
</template>
@@ -731,7 +114,7 @@ export default {
data() {
return {
// 版本号
version: "4.0.1",
version: "4.1.0",
};
},
methods: {

View File

@@ -330,7 +330,9 @@ export default {
/** 修改按钮操作 */
handleEditTable(row) {
const tableId = row.tableId || this.ids[0];
this.$router.push({ path: '/tool/gen-edit/index/' + tableId, query: { pageNum: this.queryParams.pageNum } });
const tableName = row.tableName || this.tableNames[0];
const params = { pageNum: this.queryParams.pageNum };
this.$tab.openPage("修改[" + tableName + "]生成配置", '/tool/gen-edit/index/' + tableId, params);
},
/** 删除按钮操作 */
handleDelete(row) {

View File

@@ -110,7 +110,7 @@ services:
ipv4_address: 172.30.0.54
ruoyi-server1:
image: ruoyi/ruoyi-server:4.0.1
image: ruoyi/ruoyi-server:4.1.0
container_name: ruoyi-server1
environment:
# 时区上海
@@ -125,7 +125,7 @@ services:
ipv4_address: 172.30.0.60
ruoyi-server2:
image: "ruoyi/ruoyi-server:4.0.1"
image: "ruoyi/ruoyi-server:4.1.0"
container_name: ruoyi-server2
environment:
# 时区上海
@@ -140,7 +140,7 @@ services:
ipv4_address: 172.30.0.61
ruoyi-monitor-admin:
image: ruoyi/ruoyi-monitor-admin:4.0.1
image: ruoyi/ruoyi-monitor-admin:4.1.0
container_name: ruoyi-monitor-admin
environment:
# 时区上海
@@ -155,7 +155,7 @@ services:
ipv4_address: 172.30.0.90
ruoyi-xxl-job-admin:
image: ruoyi/ruoyi-xxl-job-admin:4.0.1
image: ruoyi/ruoyi-xxl-job-admin:4.1.0
container_name: ruoyi-xxl-job-admin
environment:
# 时区上海

View File

@@ -5,7 +5,7 @@ drop table if exists sys_dept;
create table sys_dept (
dept_id bigint(20) not null auto_increment comment '部门id',
parent_id bigint(20) default 0 comment '父部门id',
ancestors varchar(50) default '' comment '祖级列表',
ancestors varchar(500) default '' comment '祖级列表',
dept_name varchar(30) default '' comment '部门名称',
order_num int(4) default 0 comment '显示顺序',
leader varchar(20) default null comment '负责人',

View File

@@ -1 +1,3 @@
alter table sys_menu change query query_param varchar(255) default null comment '路由参数';
alter table sys_dept modify column ancestors varchar(500) null default '' comment '祖级列表';

View File

@@ -4,7 +4,7 @@
create table sys_dept (
dept_id number(20) not null,
parent_id number(20) default 0,
ancestors varchar2(50) default '',
ancestors varchar2(500) default '',
dept_name varchar2(30) default '',
order_num number(4) default 0,
leader varchar2(20) default null,

View File

@@ -6,7 +6,7 @@ create table if not exists sys_dept
(
dept_id int8,
parent_id int8 default 0,
ancestors varchar(50) default ''::varchar,
ancestors varchar(500)default ''::varchar,
dept_name varchar(30) default ''::varchar,
order_num int4 default 0,
leader varchar(20) default null::varchar,

View File

@@ -425,7 +425,7 @@ CREATE TABLE [sys_dept]
(
[dept_id] bigint NOT NULL,
[parent_id] bigint DEFAULT ((0)) NULL,
[ancestors] nvarchar(50) DEFAULT '' NULL,
[ancestors] nvarchar(500)DEFAULT '' NULL,
[dept_name] nvarchar(30) DEFAULT '' NULL,
[order_num] int DEFAULT ((0)) NULL,
[leader] nvarchar(20) NULL,