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

fix 工作流部分移除@Autowired和@Resource注解,改用构造器注入
fix 修复"我的流程"流程分类显示错误问题
fix 修复流程模块分页错误bug
update 图片上传 文件上传 支持并发上传
update 组件ImageUpload支持多图同时选择上传
udpate 组件fileUpload支持多文件同时选择上传
update qiniu 7.9.2 => 7.9.3
update minio 8.3.5 => 8.3.7
update 优化 R 默认返回 msg
update 增加 用户注册 用户类型默认值
update 增加用户登出日志
update 更新 多用户多设备的注释说明
update 优化 是否为管理员的判断
update 优化 页面若未匹配到字典标签则返回原字典值
update 调整用户登录 将日志调整到最后 防止获取不到用户警告
update 优化随机数生成方式 避免容易生成两个相同随机数的问题
fix 修复代码生成 基于路径生成 路径为空问题
fix 恢复误删 @Async 注解线程池配置类
fix 修复 minio 适配 https 导致的问题
fix 修复分页组件请求两次问题
This commit is contained in:
konbai
2022-03-01 21:52:51 +08:00
parent 994de50e9d
commit 822f85903a
53 changed files with 378 additions and 141 deletions

View File

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

View File

@@ -41,14 +41,14 @@ public class UnsignedMathGenerator implements CodeGenerator {
@Override
public String generate() {
final int limit = getLimit();
int min = RandomUtil.randomInt(limit);
int max = RandomUtil.randomInt(min, limit);
String number1 = Integer.toString(max);
String number2 = Integer.toString(min);
number1 = StringUtils.rightPad(number1, this.numberLength, CharUtil.SPACE);
number2 = StringUtils.rightPad(number2, this.numberLength, CharUtil.SPACE);
int a = RandomUtil.randomInt(limit);
int b = RandomUtil.randomInt(limit);
String max = Integer.toString(Math.max(a,b));
String min = Integer.toString(Math.min(a,b));
max = StringUtils.rightPad(max, this.numberLength, CharUtil.SPACE);
min = StringUtils.rightPad(min, this.numberLength, CharUtil.SPACE);
return number1 + RandomUtil.randomChar(OPERATORS) + number2 + '=';
return max + RandomUtil.randomChar(OPERATORS) + min + '=';
}
@Override

View File

@@ -109,4 +109,10 @@ public interface UserConstants {
*/
int PASSWORD_MIN_LENGTH = 5;
int PASSWORD_MAX_LENGTH = 20;
/**
* 管理员ID
*/
Long ADMIN_ID = 1L;
}

View File

@@ -38,11 +38,11 @@ public class R<T> implements Serializable {
private T data;
public static <T> R<T> ok() {
return restResult(null, SUCCESS, null);
return restResult(null, SUCCESS, "操作成功");
}
public static <T> R<T> ok(T data) {
return restResult(data, SUCCESS, null);
return restResult(data, SUCCESS, "操作成功");
}
public static <T> R<T> ok(String msg) {
@@ -54,7 +54,7 @@ public class R<T> implements Serializable {
}
public static <T> R<T> fail() {
return restResult(null, FAIL, null);
return restResult(null, FAIL, "操作失败");
}
public static <T> R<T> fail(String msg) {
@@ -62,7 +62,7 @@ public class R<T> implements Serializable {
}
public static <T> R<T> fail(T data) {
return restResult(data, FAIL, null);
return restResult(data, FAIL, "操作失败");
}
public static <T> R<T> fail(String msg, T data) {

View File

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.convert.ExcelDictConvert;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
@@ -132,11 +133,7 @@ public class SysRole extends BaseEntity {
@ApiModelProperty(value = "是否管理员")
public boolean isAdmin() {
return isAdmin(this.roleId);
}
public static boolean isAdmin(Long roleId) {
return roleId != null && 1L == roleId;
return UserConstants.ADMIN_ID.equals(this.roleId);
}
}

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ruoyi.common.annotation.Sensitive;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.enums.SensitiveStrategy;
import com.ruoyi.common.xss.Xss;
@@ -185,11 +186,7 @@ public class SysUser extends BaseEntity {
@ApiModelProperty(value = "是否管理员")
public boolean isAdmin() {
return isAdmin(this.userId);
}
public static boolean isAdmin(Long userId) {
return userId != null && 1L == userId;
return UserConstants.ADMIN_ID.equals(this.userId);
}
}

View File

@@ -2,6 +2,7 @@ package com.ruoyi.common.helper;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.DeviceType;
import com.ruoyi.common.enums.UserType;
@@ -137,12 +138,11 @@ public class LoginHelper {
* @return 结果
*/
public static boolean isAdmin(Long userId) {
return userId != null && 1L == userId;
return UserConstants.ADMIN_ID.equals(userId);
}
public static boolean isAdmin() {
Long userId = getUserId();
return userId != null && 1L == userId;
return isAdmin(getUserId());
}
}

View File

@@ -7,6 +7,11 @@ import org.apache.commons.lang3.time.DateFormatUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
/**
@@ -116,6 +121,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
return new Date(time);
}
/**
* 计算相差天数
*/
public static int differentDaysByMillisecond(Date date1, Date date2)
{
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
}
/**
* 计算两个时间差
*/
@@ -136,4 +149,21 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
// long sec = diff % nd % nh % nm / ns;
return day + "" + hour + "小时" + min + "分钟";
}
/**
* 增加 LocalDateTime ==> Date
*/
public static Date toDate(LocalDateTime temporalAccessor) {
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
/**
* 增加 LocalDate ==> Date
*/
public static Date toDate(LocalDate temporalAccessor) {
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
}

View File

@@ -86,7 +86,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
* 例:<br>
* 通常使用format("this is {} for {}", "a", "b") -> this is a for b<br>
* 转义{} format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
* 转义{} format("this is \\{} for {}", "a", "b") -> this is {} for a<br>
* 转义\ format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
*
* @param template 文本模板,被替换的部分用 {} 表示
@@ -231,4 +231,43 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
return matcher.match(pattern, url);
}
/**
* 数字左边补齐0使之达到指定长度。注意如果数字转换为字符串后长度大于size则只保留 最后size个字符。
*
* @param num 数字对象
* @param size 字符串指定长度
* @return 返回数字的字符串格式,该字符串为指定长度。
*/
public static final String padl(final Number num, final int size) {
return padl(num.toString(), size, '0');
}
/**
* 字符串左补齐。如果原始字符串s长度大于size则只保留最后size个字符。
*
* @param s 原始字符串
* @param size 字符串指定长度
* @param c 用于补齐的字符
* @return 返回指定长度的字符串,由原字符串左补齐或截取得到。
*/
public static final String padl(final String s, final int size, final char c) {
final StringBuilder sb = new StringBuilder(size);
if (s != null) {
final int len = s.length();
if (s.length() <= size) {
for (int i = size - len; i > 0; i--) {
sb.append(c);
}
sb.append(s);
} else {
return s.substring(len - size, len);
}
} else {
for (int i = size; i > 0; i--) {
sb.append(c);
}
}
return sb.toString();
}
}

View File

@@ -22,7 +22,6 @@ public class FileUtils extends FileUtil {
*
* @param response 响应对象
* @param realFileName 真实文件名
* @return
*/
public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
String percentEncodedFileName = percentEncode(realFileName);
@@ -35,7 +34,6 @@ public class FileUtils extends FileUtil {
.append("utf-8''")
.append(percentEncodedFileName);
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
response.setHeader("Content-disposition", contentDispositionValue.toString());
response.setHeader("download-filename", percentEncodedFileName);