Skip to content

Commit ddf4145

Browse files
committed
update: 同步 RuoYi-Vue-Plus(v4.7.0) 更新
1 parent ae5fc22 commit ddf4145

File tree

87 files changed

+785
-333
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+785
-333
lines changed

.github/FUNDING.yml

Lines changed: 0 additions & 1 deletion
This file was deleted.

pom.xml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
<properties>
1616
<ruoyi-flowable-plus.version>0.8.3</ruoyi-flowable-plus.version>
17-
<spring-boot.version>2.7.9</spring-boot.version>
17+
<spring-boot.version>2.7.11</spring-boot.version>
1818
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1919
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
2020
<java.version>1.8</java.version>
@@ -27,17 +27,19 @@
2727
<satoken.version>1.34.0</satoken.version>
2828
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
2929
<p6spy.version>3.9.1</p6spy.version>
30-
<hutool.version>5.8.15</hutool.version>
30+
<hutool.version>5.8.18</hutool.version>
3131
<okhttp.version>4.10.0</okhttp.version>
3232
<spring-boot-admin.version>2.7.10</spring-boot-admin.version>
33-
<redisson.version>3.20.0</redisson.version>
33+
<redisson.version>3.20.1</redisson.version>
3434
<lock4j.version>2.2.3</lock4j.version>
3535
<dynamic-ds.version>3.5.2</dynamic-ds.version>
3636
<alibaba-ttl.version>2.14.2</alibaba-ttl.version>
37-
<xxl-job.version>2.3.1</xxl-job.version>
37+
<xxl-job.version>2.4.0</xxl-job.version>
3838
<lombok.version>1.18.26</lombok.version>
3939
<bouncycastle.version>1.72</bouncycastle.version>
4040
<flowable.version>6.8.0</flowable.version>
41+
<!-- 离线IP地址定位库 -->
42+
<ip2region.version>2.7.0</ip2region.version>
4143

4244
<!-- 临时修复 snakeyaml 漏洞 -->
4345
<snakeyaml.version>1.33</snakeyaml.version>
@@ -259,6 +261,13 @@
259261
<version>${alibaba-ttl.version}</version>
260262
</dependency>
261263

264+
<!-- 离线IP地址定位库 ip2region -->
265+
<dependency>
266+
<groupId>org.lionsoul</groupId>
267+
<artifactId>ip2region</artifactId>
268+
<version>${ip2region.version}</version>
269+
</dependency>
270+
262271
<!-- 临时修复 snakeyaml 漏洞 -->
263272
<dependency>
264273
<groupId>org.yaml</groupId>

ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import com.ruoyi.common.core.domain.R;
1111
import com.ruoyi.common.enums.CaptchaType;
1212
import com.ruoyi.common.utils.StringUtils;
13+
import com.ruoyi.common.utils.email.MailUtils;
1314
import com.ruoyi.common.utils.redis.RedisUtils;
1415
import com.ruoyi.common.utils.reflect.ReflectUtils;
1516
import com.ruoyi.common.utils.spring.SpringUtils;
1617
import com.ruoyi.framework.config.properties.CaptchaProperties;
18+
import com.ruoyi.framework.config.properties.MailProperties;
1719
import com.ruoyi.sms.config.properties.SmsProperties;
1820
import com.ruoyi.sms.core.SmsTemplate;
1921
import com.ruoyi.sms.entity.SmsResult;
@@ -47,15 +49,15 @@ public class CaptchaController {
4749
private final CaptchaProperties captchaProperties;
4850
private final SmsProperties smsProperties;
4951
private final ISysConfigService configService;
52+
private final MailProperties mailProperties;
5053

5154
/**
5255
* 短信验证码
5356
*
5457
* @param phonenumber 用户手机号
5558
*/
5659
@GetMapping("/captchaSms")
57-
public R<Void> smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}")
58-
String phonenumber) {
60+
public R<Void> smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
5961
if (!smsProperties.getEnabled()) {
6062
return R.fail("当前系统没有开启短信功能!");
6163
}
@@ -75,6 +77,28 @@ public R<Void> smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}")
7577
return R.ok();
7678
}
7779

80+
/**
81+
* 邮箱验证码
82+
*
83+
* @param email 邮箱
84+
*/
85+
@GetMapping("/captchaEmail")
86+
public R<Void> emailCode(@NotBlank(message = "{user.email.not.blank}") String email) {
87+
if (!mailProperties.getEnabled()) {
88+
return R.fail("当前系统没有开启邮箱功能!");
89+
}
90+
String key = CacheConstants.CAPTCHA_CODE_KEY + email;
91+
String code = RandomUtil.randomNumbers(4);
92+
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
93+
try {
94+
MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。");
95+
} catch (Exception e) {
96+
log.error("验证码短信发送异常 => {}", e.getMessage());
97+
return R.fail(e.getMessage());
98+
}
99+
return R.ok();
100+
}
101+
78102
/**
79103
* 生成验证码
80104
*/

ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ public class CacheController {
3333
private final static List<SysCache> CACHES = new ArrayList<>();
3434

3535
static {
36-
CACHES.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
3736
CACHES.add(new SysCache(CacheConstants.ONLINE_TOKEN_KEY, "在线用户"));
3837
CACHES.add(new SysCache(CacheNames.SYS_CONFIG, "配置信息"));
3938
CACHES.add(new SysCache(CacheNames.SYS_DICT, "数据字典"));

ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public TableDataInfo<SysUserOnline> list(String ipaddr, String userName) {
4545
List<String> keys = StpUtil.searchTokenValue("", 0, -1, false);
4646
List<UserOnlineDTO> userOnlineDTOList = new ArrayList<>();
4747
for (String key : keys) {
48-
String token = key.replace(CacheConstants.LOGIN_TOKEN_KEY, "");
48+
String token = StringUtils.substringAfterLast(key, ":");
4949
// 如果已经过期则跳过
5050
if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) {
5151
continue;

ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.ruoyi.common.core.domain.R;
66
import com.ruoyi.common.core.domain.entity.SysMenu;
77
import com.ruoyi.common.core.domain.entity.SysUser;
8+
import com.ruoyi.common.core.domain.model.EmailLoginBody;
89
import com.ruoyi.common.core.domain.model.LoginBody;
910
import com.ruoyi.common.core.domain.model.LoginUser;
1011
import com.ruoyi.common.core.domain.model.SmsLoginBody;
@@ -57,7 +58,7 @@ public R<Map<String, Object>> login(@Validated @RequestBody LoginBody loginBody)
5758
}
5859

5960
/**
60-
* 短信登录(示例)
61+
* 短信登录
6162
*
6263
* @param smsLoginBody 登录信息
6364
* @return 结果
@@ -72,6 +73,21 @@ public R<Map<String, Object>> smsLogin(@Validated @RequestBody SmsLoginBody smsL
7273
return R.ok(ajax);
7374
}
7475

76+
/**
77+
* 邮件登录
78+
*
79+
* @param body 登录信息
80+
* @return 结果
81+
*/
82+
@PostMapping("/emailLogin")
83+
public R<Map<String, Object>> emailLogin(@Validated @RequestBody EmailLoginBody body) {
84+
Map<String, Object> ajax = new HashMap<>();
85+
// 生成令牌
86+
String token = loginService.emailLogin(body.getEmail(), body.getEmailCode());
87+
ajax.put(Constants.TOKEN, token);
88+
return R.ok(ajax);
89+
}
90+
7591
/**
7692
* 小程序登录(示例)
7793
*

ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,14 @@
22

33

44
import cn.dev33.satoken.annotation.SaCheckPermission;
5-
import cn.hutool.core.convert.Convert;
65
import cn.hutool.core.util.ObjectUtil;
7-
import cn.hutool.http.HttpException;
8-
import cn.hutool.http.HttpUtil;
96
import com.ruoyi.common.annotation.Log;
107
import com.ruoyi.common.core.controller.BaseController;
118
import com.ruoyi.common.core.domain.PageQuery;
129
import com.ruoyi.common.core.domain.R;
1310
import com.ruoyi.common.core.page.TableDataInfo;
1411
import com.ruoyi.common.core.validate.QueryGroup;
1512
import com.ruoyi.common.enums.BusinessType;
16-
import com.ruoyi.common.exception.ServiceException;
17-
import com.ruoyi.common.utils.file.FileUtils;
18-
import com.ruoyi.oss.core.OssClient;
19-
import com.ruoyi.oss.factory.OssFactory;
20-
import com.ruoyi.system.domain.SysOss;
2113
import com.ruoyi.system.domain.bo.SysOssBo;
2214
import com.ruoyi.system.domain.vo.SysOssVo;
2315
import com.ruoyi.system.service.ISysOssService;
@@ -80,7 +72,7 @@ public R<List<SysOssVo>> listByIds(@NotEmpty(message = "主键不能为空")
8072
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
8173
public R<Map<String, String>> upload(@RequestPart("file") MultipartFile file) {
8274
if (ObjectUtil.isNull(file)) {
83-
throw new ServiceException("上传文件不能为空");
75+
return R.fail("上传文件不能为空");
8476
}
8577
SysOssVo oss = iSysOssService.upload(file);
8678
Map<String, String> map = new HashMap<>(2);

ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
package com.ruoyi.web.controller.system;
22

33
import cn.dev33.satoken.annotation.SaCheckPermission;
4-
import cn.dev33.satoken.exception.NotLoginException;
5-
import cn.dev33.satoken.stp.StpUtil;
6-
import cn.hutool.core.collection.CollUtil;
74
import com.ruoyi.common.annotation.Log;
8-
import com.ruoyi.common.constant.CacheConstants;
9-
import com.ruoyi.common.constant.UserConstants;
105
import com.ruoyi.common.core.controller.BaseController;
116
import com.ruoyi.common.core.domain.PageQuery;
127
import com.ruoyi.common.core.domain.R;
138
import com.ruoyi.common.core.domain.entity.SysDept;
149
import com.ruoyi.common.core.domain.entity.SysRole;
1510
import com.ruoyi.common.core.domain.entity.SysUser;
16-
import com.ruoyi.common.core.domain.model.LoginUser;
1711
import com.ruoyi.common.core.page.TableDataInfo;
1812
import com.ruoyi.common.enums.BusinessType;
19-
import com.ruoyi.common.helper.LoginHelper;
2013
import com.ruoyi.common.utils.poi.ExcelUtil;
2114
import com.ruoyi.system.domain.SysUserRole;
2215
import com.ruoyi.system.service.ISysDeptService;
@@ -112,25 +105,7 @@ public R<Void> edit(@Validated @RequestBody SysRole role) {
112105
}
113106

114107
if (roleService.updateRole(role) > 0) {
115-
List<String> keys = StpUtil.searchTokenValue("", 0, -1, false);
116-
if (CollUtil.isEmpty(keys)) {
117-
return R.ok();
118-
}
119-
// 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作
120-
keys.parallelStream().forEach(key -> {
121-
String token = key.replace(CacheConstants.LOGIN_TOKEN_KEY, "");
122-
// 如果已经过期则跳过
123-
if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) {
124-
return;
125-
}
126-
LoginUser loginUser = LoginHelper.getLoginUser(token);
127-
if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(role.getRoleId()))) {
128-
try {
129-
StpUtil.logoutByTokenValue(token);
130-
} catch (NotLoginException ignored) {
131-
}
132-
}
133-
});
108+
roleService.cleanOnlineUserByRole(role.getRoleId());
134109
return R.ok();
135110
}
136111
return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员");

ruoyi-admin/src/main/resources/application.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ logging:
5151
level:
5252
com.ruoyi: @logging.level@
5353
org.springframework: warn
54-
config: classpath:logback.xml
54+
config: classpath:logback-plus.xml
5555

5656
# 用户配置
5757
user:

ruoyi-admin/src/main/resources/i18n/messages.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ user.password.not.blank=用户密码不能为空
1818
user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间
1919
user.password.not.valid=* 5-50个字符
2020
user.email.not.valid=邮箱格式错误
21+
user.email.not.blank=邮箱不能为空
2122
user.phonenumber.not.blank=用户手机号不能为空
2223
user.mobile.phone.number.not.valid=手机号格式错误
2324
user.login.success=登录成功
@@ -42,4 +43,7 @@ rate.limiter.message=访问过于频繁,请稍候再试
4243
sms.code.not.blank=短信验证码不能为空
4344
sms.code.retry.limit.count=短信验证码输入错误{0}次
4445
sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{1}分钟
46+
email.code.not.blank=邮箱验证码不能为空
47+
email.code.retry.limit.count=邮箱验证码输入错误{0}次
48+
email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,帐户锁定{1}分钟
4549
xcx.code.not.blank=小程序code不能为空

0 commit comments

Comments
 (0)