Commit 03ef1fc764c558111ba90650b61c229a8a9e7960

Authored by YunaiV
1 parent 5b723d02

将 dict 和 login log 迁移到共享库里

Showing 54 changed files with 330 additions and 493 deletions
README.md
@@ -88,6 +88,9 @@ @@ -88,6 +88,9 @@
88 | `yudao-admin-ui` | 管理后台的 UI 界面 | 88 | `yudao-admin-ui` | 管理后台的 UI 界面 |
89 | `yudao-user-server` | 用户前台的服务端 | 89 | `yudao-user-server` | 用户前台的服务端 |
90 | `yudao-user-ui` | 用户前台的 UI 界面 | 90 | `yudao-user-ui` | 用户前台的 UI 界面 |
  91 +| `yudao-core-service` | 通用服务,提供共享逻辑 |
  92 +
  93 +> 友情提示:`yudao-admin-server` 和 `yudao-user-server` 会存在需要复用的逻辑,通过 `yudao-core-service` 实现。
91 94
92 ### 后端 95 ### 后端
93 96
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java
1 package cn.iocoder.yudao.adminserver.modules.system.controller.dict; 1 package cn.iocoder.yudao.adminserver.modules.system.controller.dict;
2 2
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 6 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; 7 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.*; 8 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.*;
8 import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert; 9 import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert;
9 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO;  
10 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; 10 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService;
11 import io.swagger.annotations.Api; 11 import io.swagger.annotations.Api;
12 import io.swagger.annotations.ApiImplicitParam; 12 import io.swagger.annotations.ApiImplicitParam;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java
1 package cn.iocoder.yudao.adminserver.modules.system.controller.logger; 1 package cn.iocoder.yudao.adminserver.modules.system.controller.logger;
2 2
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 6 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
@@ -9,7 +10,6 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog @@ -9,7 +10,6 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog
9 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; 10 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
10 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO; 11 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO;
11 import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysLoginLogConvert; 12 import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysLoginLogConvert;
12 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO;  
13 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; 13 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
14 import io.swagger.annotations.Api; 14 import io.swagger.annotations.Api;
15 import io.swagger.annotations.ApiOperation; 15 import io.swagger.annotations.ApiOperation;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java
@@ -26,8 +26,7 @@ public interface SysAuthConvert { @@ -26,8 +26,7 @@ public interface SysAuthConvert {
26 26
27 SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class); 27 SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class);
28 28
29 - @Mapping(source = "updateTime", target = "updateTime", ignore = true)  
30 - // 字段相同,但是含义不同,忽略 29 + @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略
31 LoginUser convert0(SysUserDO bean); 30 LoginUser convert0(SysUserDO bean);
32 31
33 default LoginUser convert(SysUserDO bean) { 32 default LoginUser convert(SysUserDO bean) {
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java
1 package cn.iocoder.yudao.adminserver.modules.system.convert.dict; 1 package cn.iocoder.yudao.adminserver.modules.system.convert.dict;
2 2
  3 +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.*;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; 6 import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO;
5 -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.*;  
6 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO;  
7 import org.mapstruct.Mapper; 7 import org.mapstruct.Mapper;
8 import org.mapstruct.factory.Mappers; 8 import org.mapstruct.factory.Mappers;
9 9
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysLoginLogConvert.java
1 package cn.iocoder.yudao.adminserver.modules.system.convert.logger; 1 package cn.iocoder.yudao.adminserver.modules.system.convert.logger;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;  
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; 3 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO;
6 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO; 4 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO;
7 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO; 5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 import org.mapstruct.Mapper; 7 import org.mapstruct.Mapper;
9 import org.mapstruct.factory.Mappers; 8 import org.mapstruct.factory.Mappers;
10 9
@@ -15,8 +14,6 @@ public interface SysLoginLogConvert { @@ -15,8 +14,6 @@ public interface SysLoginLogConvert {
15 14
16 SysLoginLogConvert INSTANCE = Mappers.getMapper(SysLoginLogConvert.class); 15 SysLoginLogConvert INSTANCE = Mappers.getMapper(SysLoginLogConvert.class);
17 16
18 - SysLoginLogDO convert(SysLoginLogCreateReqDTO bean);  
19 -  
20 PageResult<SysLoginLogRespVO> convertPage(PageResult<SysLoginLogDO> page); 17 PageResult<SysLoginLogRespVO> convertPage(PageResult<SysLoginLogDO> page);
21 18
22 List<SysLoginLogExcelVO> convertList(List<SysLoginLogDO> list); 19 List<SysLoginLogExcelVO> convertList(List<SysLoginLogDO> list);
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java
1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict; 1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict;
2 2
  3 +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO;
  4 +import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 7 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 8 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO;  
7 -import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO;  
8 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO;  
9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
11 11
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/logger/SysLoginLogMapper.java
1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger; 1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger;
2 2
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; 7 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
7 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; 8 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
8 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO;  
9 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; 9 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
10 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
11 11
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java
1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dict; 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.dict;
2 2
  3 +import cn.iocoder.yudao.coreservice.modules.system.service.dict.SysDictDataCoreService;
3 import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; 4 import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage; 5 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage;
5 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; 6 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService;
@@ -18,12 +19,12 @@ import javax.annotation.Resource; @@ -18,12 +19,12 @@ import javax.annotation.Resource;
18 public class SysDictDataRefreshConsumer extends AbstractChannelMessageListener<SysDictDataRefreshMessage> { 19 public class SysDictDataRefreshConsumer extends AbstractChannelMessageListener<SysDictDataRefreshMessage> {
19 20
20 @Resource 21 @Resource
21 - private SysDictDataService dictDataService; 22 + private SysDictDataCoreService dictDataCoreService;
22 23
23 @Override 24 @Override
24 public void onMessage(SysDictDataRefreshMessage message) { 25 public void onMessage(SysDictDataRefreshMessage message) {
25 log.info("[onMessage][收到 DictData 刷新消息]"); 26 log.info("[onMessage][收到 DictData 刷新消息]");
26 - dictDataService.initLocalCache(); 27 + dictDataCoreService.initLocalCache();
27 } 28 }
28 29
29 } 30 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
@@ -12,13 +12,14 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeE @@ -12,13 +12,14 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeE
12 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; 12 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
13 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService; 13 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService;
14 import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; 14 import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService;
15 -import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;  
16 -import cn.iocoder.yudao.adminserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;  
17 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; 15 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
18 import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService; 16 import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
19 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; 17 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
20 import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; 18 import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
  19 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
  20 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
21 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 21 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  22 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
22 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; 23 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
23 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; 24 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
24 import cn.iocoder.yudao.framework.security.core.LoginUser; 25 import cn.iocoder.yudao.framework.security.core.LoginUser;
@@ -65,7 +66,7 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -65,7 +66,7 @@ public class SysAuthServiceImpl implements SysAuthService {
65 @Resource 66 @Resource
66 private SysCaptchaService captchaService; 67 private SysCaptchaService captchaService;
67 @Resource 68 @Resource
68 - private SysLoginLogService loginLogService; 69 + private SysLoginLogCoreService loginLogCoreService;
69 @Resource 70 @Resource
70 private SysUserSessionCoreService userSessionCoreService; 71 private SysUserSessionCoreService userSessionCoreService;
71 @Resource 72 @Resource
@@ -164,11 +165,12 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -164,11 +165,12 @@ public class SysAuthServiceImpl implements SysAuthService {
164 if (user != null) { 165 if (user != null) {
165 reqDTO.setUserId(user.getId()); 166 reqDTO.setUserId(user.getId());
166 } 167 }
  168 + reqDTO.setUserType(UserTypeEnum.ADMIN.getValue());
167 reqDTO.setUsername(username); 169 reqDTO.setUsername(username);
168 reqDTO.setUserAgent(ServletUtils.getUserAgent()); 170 reqDTO.setUserAgent(ServletUtils.getUserAgent());
169 reqDTO.setUserIp(ServletUtils.getClientIP()); 171 reqDTO.setUserIp(ServletUtils.getClientIP());
170 reqDTO.setResult(loginResult.getResult()); 172 reqDTO.setResult(loginResult.getResult());
171 - loginLogService.createLoginLog(reqDTO); 173 + loginLogCoreService.createLoginLog(reqDTO);
172 // 更新最后登录时间 174 // 更新最后登录时间
173 if (user != null && Objects.equals(SysLoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { 175 if (user != null && Objects.equals(SysLoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
174 userService.updateUserLogin(user.getId(), ServletUtils.getClientIP()); 176 userService.updateUserLogin(user.getId(), ServletUtils.getClientIP());
@@ -258,14 +260,16 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -258,14 +260,16 @@ public class SysAuthServiceImpl implements SysAuthService {
258 } 260 }
259 261
260 private void createLogoutLog(String username) { 262 private void createLogoutLog(String username) {
  263 + // TODO 芋艿:这里未设置 userId
261 SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); 264 SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO();
262 reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType()); 265 reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType());
263 reqDTO.setTraceId(TracerUtils.getTraceId()); 266 reqDTO.setTraceId(TracerUtils.getTraceId());
  267 + reqDTO.setUserType(UserTypeEnum.ADMIN.getValue());
264 reqDTO.setUsername(username); 268 reqDTO.setUsername(username);
265 reqDTO.setUserAgent(ServletUtils.getUserAgent()); 269 reqDTO.setUserAgent(ServletUtils.getUserAgent());
266 reqDTO.setUserIp(ServletUtils.getClientIP()); 270 reqDTO.setUserIp(ServletUtils.getClientIP());
267 reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult()); 271 reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult());
268 - loginLogService.createLoginLog(reqDTO); 272 + loginLogCoreService.createLoginLog(reqDTO);
269 } 273 }
270 274
271 @Override 275 @Override
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java
@@ -9,10 +9,12 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeE @@ -9,10 +9,12 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeE
9 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; 9 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
10 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService; 10 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
11 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; 11 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
12 -import cn.iocoder.yudao.adminserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;  
13 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; 12 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
14 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; 13 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
15 import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; 14 import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO;
  15 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
  16 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
  17 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
16 import cn.iocoder.yudao.framework.common.pojo.PageResult; 18 import cn.iocoder.yudao.framework.common.pojo.PageResult;
17 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; 19 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
18 import com.google.common.collect.Lists; 20 import com.google.common.collect.Lists;
@@ -42,7 +44,7 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { @@ -42,7 +44,7 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
42 @Resource 44 @Resource
43 private SysUserService userService; 45 private SysUserService userService;
44 @Resource 46 @Resource
45 - private SysLoginLogService loginLogService; 47 + private SysLoginLogCoreService loginLogCoreService;
46 48
47 @Resource 49 @Resource
48 private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO; 50 private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO;
@@ -84,11 +86,12 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { @@ -84,11 +86,12 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
84 SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO(); 86 SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO();
85 reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_TIMEOUT.getType()); 87 reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_TIMEOUT.getType());
86 reqDTO.setTraceId(TracerUtils.getTraceId()); 88 reqDTO.setTraceId(TracerUtils.getTraceId());
  89 + reqDTO.setUserType(UserTypeEnum.ADMIN.getValue());
87 reqDTO.setUsername(timeoutSessionDO.getUsername()); 90 reqDTO.setUsername(timeoutSessionDO.getUsername());
88 reqDTO.setUserAgent(timeoutSessionDO.getUserAgent()); 91 reqDTO.setUserAgent(timeoutSessionDO.getUserAgent());
89 reqDTO.setUserIp(timeoutSessionDO.getUserIp()); 92 reqDTO.setUserIp(timeoutSessionDO.getUserIp());
90 reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult()); 93 reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult());
91 - loginLogService.createLoginLog(reqDTO); 94 + loginLogCoreService.createLoginLog(reqDTO);
92 } 95 }
93 } 96 }
94 97
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java
1 package cn.iocoder.yudao.adminserver.modules.system.service.dict; 1 package cn.iocoder.yudao.adminserver.modules.system.service.dict;
2 2
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService; 5 import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService;
5 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; 6 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO;
6 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; 7 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO;
7 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; 8 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO;
8 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; 9 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO;
9 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO;  
10 10
11 import java.util.List; 11 import java.util.List;
12 12
@@ -15,12 +15,7 @@ import java.util.List; @@ -15,12 +15,7 @@ import java.util.List;
15 * 15 *
16 * @author ruoyi 16 * @author ruoyi
17 */ 17 */
18 -public interface SysDictDataService extends DictDataFrameworkService {  
19 -  
20 - /**  
21 - * 初始化字典数据的本地缓存  
22 - */  
23 - void initLocalCache(); 18 +public interface SysDictDataService {
24 19
25 /** 20 /**
26 * 创建字典数据 21 * 创建字典数据
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java
1 package cn.iocoder.yudao.adminserver.modules.system.service.dict.impl; 1 package cn.iocoder.yudao.adminserver.modules.system.service.dict.impl;
2 2
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;  
5 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
6 -import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO;  
7 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;  
8 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; 3 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO;
9 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; 4 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO;
10 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; 5 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO;
11 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; 6 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO;
12 import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert; 7 import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert;
13 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO;  
14 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; 8 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO;
15 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper; 9 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper;
16 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer; 10 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer;
17 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService; 11 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService;
18 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictTypeService; 12 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictTypeService;
  13 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
  14 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  15 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
19 import com.google.common.annotations.VisibleForTesting; 16 import com.google.common.annotations.VisibleForTesting;
20 -import com.google.common.collect.ImmutableTable;  
21 import lombok.extern.slf4j.Slf4j; 17 import lombok.extern.slf4j.Slf4j;
22 -import org.springframework.scheduling.annotation.Scheduled;  
23 import org.springframework.stereotype.Service; 18 import org.springframework.stereotype.Service;
24 19
25 -import javax.annotation.PostConstruct;  
26 import javax.annotation.Resource; 20 import javax.annotation.Resource;
27 import java.util.Comparator; 21 import java.util.Comparator;
28 import java.util.Date; 22 import java.util.Date;
29 import java.util.List; 23 import java.util.List;
30 24
31 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
32 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*; 25 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
  26 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
33 27
34 /** 28 /**
35 * 字典数据 Service 实现类 29 * 字典数据 Service 实现类
@@ -47,31 +41,6 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -47,31 +41,6 @@ public class SysDictDataServiceImpl implements SysDictDataService {
47 .comparing(SysDictDataDO::getDictType) 41 .comparing(SysDictDataDO::getDictType)
48 .thenComparingInt(SysDictDataDO::getSort); 42 .thenComparingInt(SysDictDataDO::getSort);
49 43
50 - /**  
51 - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期  
52 - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高  
53 - */  
54 - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L;  
55 -  
56 - /**  
57 - * 字典数据缓存,第二个 key 使用 label  
58 - *  
59 - * key1:字典类型 dictType  
60 - * key2:字典标签 label  
61 - */  
62 - private ImmutableTable<String, String, SysDictDataDO> labelDictDataCache;  
63 - /**  
64 - * 字典数据缓存,第二个 key 使用 value  
65 - *  
66 - * key1:字典类型 dictType  
67 - * key2:字典值 value  
68 - */  
69 - private ImmutableTable<String, String, SysDictDataDO> valueDictDataCache;  
70 - /**  
71 - * 缓存字典数据的最大更新时间,用于后续的增量轮询,判断是否有更新  
72 - */  
73 - private volatile Date maxUpdateTime;  
74 -  
75 @Resource 44 @Resource
76 private SysDictTypeService dictTypeService; 45 private SysDictTypeService dictTypeService;
77 46
@@ -81,34 +50,6 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -81,34 +50,6 @@ public class SysDictDataServiceImpl implements SysDictDataService {
81 @Resource 50 @Resource
82 private SysDictDataProducer dictDataProducer; 51 private SysDictDataProducer dictDataProducer;
83 52
84 - @Override  
85 - @PostConstruct  
86 - public synchronized void initLocalCache() {  
87 - // 获取字典数据列表,如果有更新  
88 - List<SysDictDataDO> dataList = this.loadDictDataIfUpdate(maxUpdateTime);  
89 - if (CollUtil.isEmpty(dataList)) {  
90 - return;  
91 - }  
92 -  
93 - // 构建缓存  
94 - ImmutableTable.Builder<String, String, SysDictDataDO> labelDictDataBuilder = ImmutableTable.builder();  
95 - ImmutableTable.Builder<String, String, SysDictDataDO> valueDictDataBuilder = ImmutableTable.builder();  
96 - dataList.forEach(dictData -> {  
97 - labelDictDataBuilder.put(dictData.getDictType(), dictData.getLabel(), dictData);  
98 - valueDictDataBuilder.put(dictData.getDictType(), dictData.getValue(), dictData);  
99 - });  
100 - labelDictDataCache = labelDictDataBuilder.build();  
101 - valueDictDataCache = valueDictDataBuilder.build();  
102 - assert dataList.size() > 0; // 断言,避免告警  
103 - maxUpdateTime = dataList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime();  
104 - log.info("[initLocalCache][缓存字典数据,数量为:{}]", dataList.size());  
105 - }  
106 -  
107 - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD)  
108 - public void schedulePeriodicRefresh() {  
109 - initLocalCache();  
110 - }  
111 -  
112 /** 53 /**
113 * 如果字典数据发生变化,从数据库中获取最新的全量字典数据。 54 * 如果字典数据发生变化,从数据库中获取最新的全量字典数据。
114 * 如果未发生变化,则返回空 55 * 如果未发生变化,则返回空
@@ -238,19 +179,4 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -238,19 +179,4 @@ public class SysDictDataServiceImpl implements SysDictDataService {
238 } 179 }
239 } 180 }
240 181
241 - @Override  
242 - public DictDataRespDTO getDictDataFromCache(String type, String value) {  
243 - return SysDictDataConvert.INSTANCE.convert02(valueDictDataCache.get(type, value));  
244 - }  
245 -  
246 - @Override  
247 - public DictDataRespDTO parseDictDataFromCache(String type, String label) {  
248 - return SysDictDataConvert.INSTANCE.convert02(labelDictDataCache.get(type, label));  
249 - }  
250 -  
251 - @Override  
252 - public List<DictDataRespDTO> listDictDatasFromCache(String type) {  
253 - return SysDictDataConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values());  
254 - }  
255 -  
256 } 182 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogService.java
1 package cn.iocoder.yudao.adminserver.modules.system.service.logger; 1 package cn.iocoder.yudao.adminserver.modules.system.service.logger;
2 2
3 -import cn.iocoder.yudao.adminserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;  
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; 3 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
6 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; 4 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
7 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO; 5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 7
9 import java.util.List; 8 import java.util.List;
10 9
@@ -14,13 +13,6 @@ import java.util.List; @@ -14,13 +13,6 @@ import java.util.List;
14 public interface SysLoginLogService { 13 public interface SysLoginLogService {
15 14
16 /** 15 /**
17 - * 创建登录日志  
18 - *  
19 - * @param reqDTO 日志信息  
20 - */  
21 - void createLoginLog(SysLoginLogCreateReqDTO reqDTO);  
22 -  
23 - /**  
24 * 获得登录日志分页 16 * 获得登录日志分页
25 * 17 *
26 * @param reqVO 分页条件 18 * @param reqVO 分页条件
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java
@@ -2,12 +2,9 @@ package cn.iocoder.yudao.adminserver.modules.system.service.logger.impl; @@ -2,12 +2,9 @@ package cn.iocoder.yudao.adminserver.modules.system.service.logger.impl;
2 2
3 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; 3 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
4 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; 4 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
5 -import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysLoginLogConvert;  
6 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO;  
7 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper; 5 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper;
8 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; 6 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
9 -import cn.iocoder.yudao.adminserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;  
10 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 7 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
11 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
12 import org.springframework.stereotype.Service; 9 import org.springframework.stereotype.Service;
13 10
@@ -24,14 +21,6 @@ public class SysLoginLogServiceImpl implements SysLoginLogService { @@ -24,14 +21,6 @@ public class SysLoginLogServiceImpl implements SysLoginLogService {
24 private SysLoginLogMapper loginLogMapper; 21 private SysLoginLogMapper loginLogMapper;
25 22
26 @Override 23 @Override
27 - public void createLoginLog(SysLoginLogCreateReqDTO reqDTO) {  
28 - SysLoginLogDO loginLog = SysLoginLogConvert.INSTANCE.convert(reqDTO);  
29 - loginLog.setUserType(UserTypeEnum.ADMIN.getValue());  
30 - // 插入  
31 - loginLogMapper.insert(loginLog);  
32 - }  
33 -  
34 - @Override  
35 public PageResult<SysLoginLogDO> getLoginLogPage(SysLoginLogPageReqVO reqVO) { 24 public PageResult<SysLoginLogDO> getLoginLogPage(SysLoginLogPageReqVO reqVO) {
36 return loginLogMapper.selectPage(reqVO); 25 return loginLogMapper.selectPage(reqVO);
37 } 26 }
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.system.service.auth; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.system.service.auth;
3 import cn.iocoder.yudao.adminserver.BaseDbUnitTest; 3 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
4 import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService; 4 import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
5 import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService; 5 import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
  6 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 7 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7 import cn.iocoder.yudao.framework.security.core.LoginUser; 8 import cn.iocoder.yudao.framework.security.core.LoginUser;
8 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO; 9 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO;
@@ -11,7 +12,6 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeE @@ -11,7 +12,6 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeE
11 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; 12 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
12 import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl; 13 import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl;
13 import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService; 14 import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService;
14 -import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;  
15 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; 15 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
16 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; 16 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
17 import cn.iocoder.yudao.framework.test.core.util.AssertUtils; 17 import cn.iocoder.yudao.framework.test.core.util.AssertUtils;
@@ -59,7 +59,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @@ -59,7 +59,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
59 @MockBean 59 @MockBean
60 private SysCaptchaService captchaService; 60 private SysCaptchaService captchaService;
61 @MockBean 61 @MockBean
62 - private SysLoginLogService loginLogService; 62 + private SysLoginLogCoreService loginLogCoreService;
63 @MockBean 63 @MockBean
64 private SysUserSessionCoreService userSessionCoreService; 64 private SysUserSessionCoreService userSessionCoreService;
65 @MockBean 65 @MockBean
@@ -132,7 +132,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @@ -132,7 +132,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
132 // 调用, 并断言异常 132 // 调用, 并断言异常
133 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_NOT_FOUND); 133 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_NOT_FOUND);
134 // 校验调用参数 134 // 校验调用参数
135 - verify(loginLogService, times(1)).createLoginLog( 135 + verify(loginLogCoreService, times(1)).createLoginLog(
136 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) 136 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
137 && o.getResult().equals(SysLoginResultEnum.CAPTCHA_NOT_FOUND.getResult())) 137 && o.getResult().equals(SysLoginResultEnum.CAPTCHA_NOT_FOUND.getResult()))
138 ); 138 );
@@ -150,7 +150,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @@ -150,7 +150,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
150 // 调用, 并断言异常 150 // 调用, 并断言异常
151 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_CODE_ERROR); 151 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_CODE_ERROR);
152 // 校验调用参数 152 // 校验调用参数
153 - verify(loginLogService, times(1)).createLoginLog( 153 + verify(loginLogCoreService, times(1)).createLoginLog(
154 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) 154 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
155 && o.getResult().equals(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult())) 155 && o.getResult().equals(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))
156 ); 156 );
@@ -171,7 +171,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @@ -171,7 +171,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
171 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_BAD_CREDENTIALS); 171 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_BAD_CREDENTIALS);
172 // 校验调用参数 172 // 校验调用参数
173 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); 173 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
174 - verify(loginLogService, times(1)).createLoginLog( 174 + verify(loginLogCoreService, times(1)).createLoginLog(
175 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) 175 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
176 && o.getResult().equals(SysLoginResultEnum.BAD_CREDENTIALS.getResult())) 176 && o.getResult().equals(SysLoginResultEnum.BAD_CREDENTIALS.getResult()))
177 ); 177 );
@@ -192,7 +192,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @@ -192,7 +192,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
192 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_USER_DISABLED); 192 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_USER_DISABLED);
193 // 校验调用参数 193 // 校验调用参数
194 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); 194 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
195 - verify(loginLogService, times(1)).createLoginLog( 195 + verify(loginLogCoreService, times(1)).createLoginLog(
196 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) 196 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
197 && o.getResult().equals(SysLoginResultEnum.USER_DISABLED.getResult())) 197 && o.getResult().equals(SysLoginResultEnum.USER_DISABLED.getResult()))
198 ); 198 );
@@ -213,7 +213,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @@ -213,7 +213,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
213 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_FAIL_UNKNOWN); 213 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_FAIL_UNKNOWN);
214 // 校验调用参数 214 // 校验调用参数
215 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); 215 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
216 - verify(loginLogService, times(1)).createLoginLog( 216 + verify(loginLogCoreService, times(1)).createLoginLog(
217 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) 217 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
218 && o.getResult().equals(SysLoginResultEnum.UNKNOWN_ERROR.getResult())) 218 && o.getResult().equals(SysLoginResultEnum.UNKNOWN_ERROR.getResult()))
219 ); 219 );
@@ -247,7 +247,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @@ -247,7 +247,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
247 assertEquals(sessionId, login); 247 assertEquals(sessionId, login);
248 // 校验调用参数 248 // 校验调用参数
249 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid()); 249 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
250 - verify(loginLogService, times(1)).createLoginLog( 250 + verify(loginLogCoreService, times(1)).createLoginLog(
251 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType()) 251 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
252 && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult())) 252 && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult()))
253 ); 253 );
@@ -264,7 +264,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest { @@ -264,7 +264,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
264 authService.logout(token); 264 authService.logout(token);
265 // 校验调用参数 265 // 校验调用参数
266 verify(userSessionCoreService, times(1)).deleteUserSession(token); 266 verify(userSessionCoreService, times(1)).deleteUserSession(token);
267 - verify(loginLogService, times(1)).createLoginLog( 267 + verify(loginLogCoreService, times(1)).createLoginLog(
268 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGOUT_SELF.getType()) 268 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGOUT_SELF.getType())
269 && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult())) 269 && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult()))
270 ); 270 );
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java
@@ -5,13 +5,13 @@ import cn.iocoder.yudao.adminserver.BaseDbAndRedisUnitTest; @@ -5,13 +5,13 @@ import cn.iocoder.yudao.adminserver.BaseDbAndRedisUnitTest;
5 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO; 5 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
6 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO; 6 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
7 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper; 7 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper;
8 -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper;  
9 import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum; 8 import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
10 import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysUserSessionServiceImpl; 9 import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysUserSessionServiceImpl;
11 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService; 10 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
12 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; 11 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
13 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO; 12 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
14 import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO; 13 import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO;
  14 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
15 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 15 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
16 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 16 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
17 import cn.iocoder.yudao.framework.common.pojo.PageResult; 17 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -22,8 +22,6 @@ import org.springframework.boot.test.mock.mockito.MockBean; @@ -22,8 +22,6 @@ import org.springframework.boot.test.mock.mockito.MockBean;
22 import org.springframework.context.annotation.Import; 22 import org.springframework.context.annotation.Import;
23 23
24 import javax.annotation.Resource; 24 import javax.annotation.Resource;
25 -import java.util.Arrays;  
26 -import java.util.Collections;  
27 import java.util.Date; 25 import java.util.Date;
28 import java.util.List; 26 import java.util.List;
29 import java.util.stream.Collectors; 27 import java.util.stream.Collectors;
@@ -55,7 +53,7 @@ public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest { @@ -55,7 +53,7 @@ public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest {
55 @MockBean 53 @MockBean
56 private SysUserService userService; 54 private SysUserService userService;
57 @MockBean 55 @MockBean
58 - private SysLoginLogService loginLogService; 56 + private SysLoginLogCoreService loginLogCoreService;
59 @MockBean 57 @MockBean
60 private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO; 58 private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO;
61 59
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java
1 package cn.iocoder.yudao.adminserver.modules.system.service.dict; 1 package cn.iocoder.yudao.adminserver.modules.system.service.dict;
2 2
3 import cn.iocoder.yudao.adminserver.BaseDbUnitTest; 3 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; 7 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO;
7 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; 8 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO;
8 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO; 9 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO;
9 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO; 10 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO;
10 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO;  
11 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO; 11 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO;
12 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper; 12 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper;
13 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer; 13 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer;
@@ -51,37 +51,6 @@ public class SysDictDataServiceTest extends BaseDbUnitTest { @@ -51,37 +51,6 @@ public class SysDictDataServiceTest extends BaseDbUnitTest {
51 @MockBean 51 @MockBean
52 private SysDictDataProducer dictDataProducer; 52 private SysDictDataProducer dictDataProducer;
53 53
54 - /**  
55 - * 测试加载到新的字典数据的情况  
56 - */  
57 - @Test  
58 - @SuppressWarnings("unchecked")  
59 - public void testInitLocalCache() {  
60 - // mock 数据  
61 - SysDictDataDO dictData01 = randomDictDataDO();  
62 - dictDataMapper.insert(dictData01);  
63 - SysDictDataDO dictData02 = randomDictDataDO();  
64 - dictDataMapper.insert(dictData02);  
65 -  
66 - // 调用  
67 - dictDataService.initLocalCache();  
68 - // 断言 labelDictDataCache 缓存  
69 - ImmutableTable<String, String, SysDictDataDO> labelDictDataCache =  
70 - (ImmutableTable<String, String, SysDictDataDO>) getFieldValue(dictDataService, "labelDictDataCache");  
71 - assertEquals(2, labelDictDataCache.size());  
72 - assertPojoEquals(dictData01, labelDictDataCache.get(dictData01.getDictType(), dictData01.getLabel()));  
73 - assertPojoEquals(dictData02, labelDictDataCache.get(dictData02.getDictType(), dictData02.getLabel()));  
74 - // 断言 valueDictDataCache 缓存  
75 - ImmutableTable<String, String, SysDictDataDO> valueDictDataCache =  
76 - (ImmutableTable<String, String, SysDictDataDO>) getFieldValue(dictDataService, "valueDictDataCache");  
77 - assertEquals(2, valueDictDataCache.size());  
78 - assertPojoEquals(dictData01, valueDictDataCache.get(dictData01.getDictType(), dictData01.getValue()));  
79 - assertPojoEquals(dictData02, valueDictDataCache.get(dictData02.getDictType(), dictData02.getValue()));  
80 - // 断言 maxUpdateTime 缓存  
81 - Date maxUpdateTime = (Date) getFieldValue(dictDataService, "maxUpdateTime");  
82 - assertEquals(ObjectUtils.max(dictData01.getUpdateTime(), dictData02.getUpdateTime()), maxUpdateTime);  
83 - }  
84 -  
85 @Test 54 @Test
86 public void testGetDictDataPage() { 55 public void testGetDictDataPage() {
87 // mock 数据 56 // mock 数据
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java
@@ -2,13 +2,12 @@ package cn.iocoder.yudao.adminserver.modules.system.service.logger; @@ -2,13 +2,12 @@ package cn.iocoder.yudao.adminserver.modules.system.service.logger;
2 2
3 import cn.hutool.core.util.RandomUtil; 3 import cn.hutool.core.util.RandomUtil;
4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest; 4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
5 -import cn.iocoder.yudao.adminserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; 5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
6 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 6 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
7 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; 8 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
9 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; 9 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
10 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; 10 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
11 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO;  
12 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper; 11 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper;
13 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum; 12 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
14 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; 13 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
@@ -35,30 +34,8 @@ public class SysLoginLogServiceImplTest extends BaseDbUnitTest { @@ -35,30 +34,8 @@ public class SysLoginLogServiceImplTest extends BaseDbUnitTest {
35 private SysLoginLogMapper loginLogMapper; 34 private SysLoginLogMapper loginLogMapper;
36 35
37 @Test 36 @Test
38 - public void testCreateLoginLog() {  
39 - String traceId = TracerUtils.getTraceId();  
40 - SysLoginLogCreateReqDTO reqDTO = RandomUtils.randomPojo(SysLoginLogCreateReqDTO.class, vo -> {  
41 - // 指定随机的范围,避免超出范围入库失败  
42 - vo.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());  
43 - vo.setResult(RandomUtil.randomEle(SysLoginResultEnum.values()).getResult());  
44 - // 使用TracerUtils生成的TraceId  
45 - vo.setTraceId(traceId);  
46 - });  
47 -  
48 - // 执行service方法  
49 - sysLoginLogService.createLoginLog(reqDTO);  
50 -  
51 - // 断言,忽略基本字段  
52 - SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null);  
53 - assertPojoEquals(reqDTO, sysLoginLogDO);  
54 - }  
55 -  
56 -  
57 - @Test  
58 public void testGetLoginLogPage() { 37 public void testGetLoginLogPage() {
59 -  
60 // 构造测试数据 38 // 构造测试数据
61 -  
62 // 登录成功的 39 // 登录成功的
63 SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> { 40 SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> {
64 logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType()); 41 logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());
yudao-core-service/pom.xml
@@ -23,6 +23,16 @@ @@ -23,6 +23,16 @@
23 <url>https://github.com/YunaiV/ruoyi-vue-pro</url> 23 <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
24 24
25 <dependencies> 25 <dependencies>
  26 + <!-- 业务组件 -->
  27 + <dependency>
  28 + <groupId>cn.iocoder.boot</groupId>
  29 + <artifactId>yudao-spring-boot-starter-biz-dict</artifactId>
  30 + </dependency>
  31 + <dependency>
  32 + <groupId>cn.iocoder.boot</groupId>
  33 + <artifactId>yudao-spring-boot-starter-biz-sms</artifactId>
  34 + </dependency>
  35 +
26 <!-- Web 相关 --> 36 <!-- Web 相关 -->
27 <dependency> 37 <dependency>
28 <groupId>cn.iocoder.boot</groupId> 38 <groupId>cn.iocoder.boot</groupId>
@@ -57,6 +67,12 @@ @@ -57,6 +67,12 @@
57 <artifactId>yudao-spring-boot-starter-test</artifactId> 67 <artifactId>yudao-spring-boot-starter-test</artifactId>
58 <scope>test</scope> 68 <scope>test</scope>
59 </dependency> 69 </dependency>
  70 +
  71 + <!-- 工具类相关 -->
  72 + <dependency>
  73 + <groupId>com.google.guava</groupId>
  74 + <artifactId>guava</artifactId>
  75 + </dependency>
60 </dependencies> 76 </dependencies>
61 77
62 </project> 78 </project>
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/dict/SysDictDataConvert.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/dict/SysDictDataCoreConvert.java
1 -package cn.iocoder.yudao.userserver.modules.system.convert.dict; 1 +package cn.iocoder.yudao.coreservice.modules.system.convert.dict;
2 2
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
3 import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; 4 import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO;
4 -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.dict.SysDictDataDO;  
5 import org.mapstruct.Mapper; 5 import org.mapstruct.Mapper;
6 import org.mapstruct.factory.Mappers; 6 import org.mapstruct.factory.Mappers;
7 7
@@ -9,9 +9,9 @@ import java.util.Collection; @@ -9,9 +9,9 @@ import java.util.Collection;
9 import java.util.List; 9 import java.util.List;
10 10
11 @Mapper 11 @Mapper
12 -public interface SysDictDataConvert { 12 +public interface SysDictDataCoreConvert {
13 13
14 - SysDictDataConvert INSTANCE = Mappers.getMapper(SysDictDataConvert.class); 14 + SysDictDataCoreConvert INSTANCE = Mappers.getMapper(SysDictDataCoreConvert.class);
15 15
16 DictDataRespDTO convert02(SysDictDataDO bean); 16 DictDataRespDTO convert02(SysDictDataDO bean);
17 17
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/logger/SysLoginLogCoreConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.convert.logger;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
  4 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.factory.Mappers;
  7 +
  8 +@Mapper
  9 +public interface SysLoginLogCoreConvert {
  10 +
  11 + SysLoginLogCoreConvert INSTANCE = Mappers.getMapper(SysLoginLogCoreConvert.class);
  12 +
  13 + SysLoginLogDO convert(SysLoginLogCreateReqDTO bean);
  14 +
  15 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/package-info.java 0 → 100644
  1 +/**
  2 + * 提供 POJO 类的实体转换
  3 + *
  4 + * 目前使用 MapStruct 框架
  5 + */
  6 +package cn.iocoder.yudao.coreservice.modules.system.convert;
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md 0 → 100644
  1 +<http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao>
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dict/SysDictDataDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/dict/SysDictDataDO.java
1 -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict; 1 +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysLoginLogDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/logger/SysLoginLogDO.java
1 -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger; 1 +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger;
2 2
3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;  
6 -import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum; 5 +import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum;
  6 +import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
8 import lombok.Data; 8 import lombok.Data;
9 import lombok.EqualsAndHashCode; 9 import lombok.EqualsAndHashCode;
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/dict/SysDictDataMapper.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/dict/SysDictDataCoreMapper.java
1 -package cn.iocoder.yudao.userserver.modules.system.dal.mysql.dict; 1 +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dict;
2 2
3 3
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.dict.SysDictDataDO; 5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
7 import org.apache.ibatis.annotations.Mapper; 7 import org.apache.ibatis.annotations.Mapper;
8 8
9 import java.util.Date; 9 import java.util.Date;
10 10
11 @Mapper 11 @Mapper
12 -public interface SysDictDataMapper extends BaseMapperX<SysDictDataDO> {  
13 -  
14 - default SysDictDataDO selectByDictTypeAndValue(String dictType, String value) {  
15 - return selectOne(new QueryWrapper<SysDictDataDO>().eq("dict_type", dictType)  
16 - .eq("value", value));  
17 - }  
18 -  
19 - default int selectCountByDictType(String dictType) {  
20 - return selectCount("dict_type", dictType);  
21 - } 12 +public interface SysDictDataCoreMapper extends BaseMapperX<SysDictDataDO> {
22 13
23 default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { 14 default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) {
24 return selectOne(new QueryWrapper<SysDictDataDO>().select("id") 15 return selectOne(new QueryWrapper<SysDictDataDO>().select("id")
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/logger/SysLoginLogMapper.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/logger/SysLoginLogCoreMapper.java
1 -package cn.iocoder.yudao.userserver.modules.system.dal.dataobject.logger; 1 +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.logger;
2 2
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 -import cn.iocoder.yudao.userserver.modules.system.dal.mysql.logger.SysLoginLogDO;  
5 import org.apache.ibatis.annotations.Mapper; 5 import org.apache.ibatis.annotations.Mapper;
6 6
7 @Mapper 7 @Mapper
8 -public interface SysLoginLogMapper extends BaseMapperX<SysLoginLogDO> { 8 +public interface SysLoginLogCoreMapper extends BaseMapperX<SysLoginLogDO> {
9 9
10 } 10 }
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/logger/SysLoginLogTypeEnum.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginLogTypeEnum.java
1 -package cn.iocoder.yudao.userserver.modules.system.enums.logger; 1 +package cn.iocoder.yudao.coreservice.modules.system.enums.logger;
2 2
3 import lombok.AllArgsConstructor; 3 import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/logger/SysLoginResultEnum.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginResultEnum.java
1 -package cn.iocoder.yudao.userserver.modules.system.enums.logger; 1 +package cn.iocoder.yudao.coreservice.modules.system.enums.logger;
2 2
3 import lombok.AllArgsConstructor; 3 import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.enums;
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/dict/SysDictDataService.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreService.java
1 -package cn.iocoder.yudao.userserver.modules.system.service.dict; 1 +package cn.iocoder.yudao.coreservice.modules.system.service.dict;
2 2
3 import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService; 3 import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService;
4 4
5 /** 5 /**
6 * 字典数据 Service 接口 6 * 字典数据 Service 接口
7 * 7 *
8 - * @author ruoyi 8 + * @author 芋道源码
9 */ 9 */
10 -public interface SysDictDataService extends DictDataFrameworkService { 10 +public interface SysDictDataCoreService extends DictDataFrameworkService {
11 11
12 /** 12 /**
13 * 初始化字典数据的本地缓存 13 * 初始化字典数据的本地缓存
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/dict/impl/SysDictDataServiceImpl.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/impl/SysDictDataCoreServiceImpl.java
1 -package cn.iocoder.yudao.userserver.modules.system.service.dict.impl; 1 +package cn.iocoder.yudao.coreservice.modules.system.service.dict.impl;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.coreservice.modules.system.convert.dict.SysDictDataCoreConvert;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
  6 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dict.SysDictDataCoreMapper;
  7 +import cn.iocoder.yudao.coreservice.modules.system.service.dict.SysDictDataCoreService;
4 import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO; 8 import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO;
5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 9 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 -import cn.iocoder.yudao.userserver.modules.system.convert.dict.SysDictDataConvert;  
7 -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.dict.SysDictDataDO;  
8 -import cn.iocoder.yudao.userserver.modules.system.dal.mysql.dict.SysDictDataMapper;  
9 -import cn.iocoder.yudao.userserver.modules.system.service.dict.SysDictDataService;  
10 import com.google.common.collect.ImmutableTable; 10 import com.google.common.collect.ImmutableTable;
11 import lombok.extern.slf4j.Slf4j; 11 import lombok.extern.slf4j.Slf4j;
12 import org.springframework.scheduling.annotation.Scheduled; 12 import org.springframework.scheduling.annotation.Scheduled;
@@ -21,11 +21,11 @@ import java.util.List; @@ -21,11 +21,11 @@ import java.util.List;
21 /** 21 /**
22 * 字典数据 Service 实现类 22 * 字典数据 Service 实现类
23 * 23 *
24 - * @author ruoyi 24 + * @author 芋道源码
25 */ 25 */
26 @Service 26 @Service
27 @Slf4j 27 @Slf4j
28 -public class SysDictDataServiceImpl implements SysDictDataService { 28 +public class SysDictDataCoreServiceImpl implements SysDictDataCoreService {
29 29
30 /** 30 /**
31 * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 31 * 定时执行 {@link #schedulePeriodicRefresh()} 的周期
@@ -53,7 +53,7 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -53,7 +53,7 @@ public class SysDictDataServiceImpl implements SysDictDataService {
53 private volatile Date maxUpdateTime; 53 private volatile Date maxUpdateTime;
54 54
55 @Resource 55 @Resource
56 - private SysDictDataMapper dictDataMapper; 56 + private SysDictDataCoreMapper dictDataCoreMapper;
57 57
58 @Override 58 @Override
59 @PostConstruct 59 @PostConstruct
@@ -95,28 +95,28 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -95,28 +95,28 @@ public class SysDictDataServiceImpl implements SysDictDataService {
95 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 95 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
96 log.info("[loadDictDataIfUpdate][首次加载全量字典数据]"); 96 log.info("[loadDictDataIfUpdate][首次加载全量字典数据]");
97 } else { // 判断数据库中是否有更新的字典数据 97 } else { // 判断数据库中是否有更新的字典数据
98 - if (!dictDataMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { 98 + if (!dictDataCoreMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) {
99 return null; 99 return null;
100 } 100 }
101 log.info("[loadDictDataIfUpdate][增量加载全量字典数据]"); 101 log.info("[loadDictDataIfUpdate][增量加载全量字典数据]");
102 } 102 }
103 // 第二步,如果有更新,则从数据库加载所有字典数据 103 // 第二步,如果有更新,则从数据库加载所有字典数据
104 - return dictDataMapper.selectList(); 104 + return dictDataCoreMapper.selectList();
105 } 105 }
106 106
107 @Override 107 @Override
108 public DictDataRespDTO getDictDataFromCache(String type, String value) { 108 public DictDataRespDTO getDictDataFromCache(String type, String value) {
109 - return SysDictDataConvert.INSTANCE.convert02(valueDictDataCache.get(type, value)); 109 + return SysDictDataCoreConvert.INSTANCE.convert02(valueDictDataCache.get(type, value));
110 } 110 }
111 111
112 @Override 112 @Override
113 public DictDataRespDTO parseDictDataFromCache(String type, String label) { 113 public DictDataRespDTO parseDictDataFromCache(String type, String label) {
114 - return SysDictDataConvert.INSTANCE.convert02(labelDictDataCache.get(type, label)); 114 + return SysDictDataCoreConvert.INSTANCE.convert02(labelDictDataCache.get(type, label));
115 } 115 }
116 116
117 @Override 117 @Override
118 public List<DictDataRespDTO> listDictDatasFromCache(String type) { 118 public List<DictDataRespDTO> listDictDatasFromCache(String type) {
119 - return SysDictDataConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values()); 119 + return SysDictDataCoreConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values());
120 } 120 }
121 121
122 } 122 }
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/logger/SysLoginLogService.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogCoreService.java
1 -package cn.iocoder.yudao.userserver.modules.system.service.logger; 1 +package cn.iocoder.yudao.coreservice.modules.system.service.logger;
2 2
3 -import cn.iocoder.yudao.userserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO; 3 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
4 4
5 /** 5 /**
6 - * 登录日志 Service 接口 6 + * 登录日志 Core Service 接口
7 */ 7 */
8 -public interface SysLoginLogService { 8 +public interface SysLoginLogCoreService {
9 9
10 /** 10 /**
11 * 创建登录日志 11 * 创建登录日志
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/dto/SysLoginLogCreateReqDTO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/dto/SysLoginLogCreateReqDTO.java
1 -package cn.iocoder.yudao.adminserver.modules.system.service.logger.dto; 1 +package cn.iocoder.yudao.coreservice.modules.system.service.logger.dto;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
@@ -31,6 +31,11 @@ public class SysLoginLogCreateReqDTO { @@ -31,6 +31,11 @@ public class SysLoginLogCreateReqDTO {
31 */ 31 */
32 private Long userId; 32 private Long userId;
33 /** 33 /**
  34 + * 用户类型
  35 + */
  36 + @NotNull(message = "用户类型不能为空")
  37 + private Integer userType;
  38 + /**
34 * 用户账号 39 * 用户账号
35 */ 40 */
36 @NotBlank(message = "用户账号不能为空") 41 @NotBlank(message = "用户账号不能为空")
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/impl/SysLoginLogCoreServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.logger.impl;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.convert.logger.SysLoginLogCoreConvert;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.logger.SysLoginLogCoreMapper;
  6 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
  7 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
  8 +import org.springframework.stereotype.Service;
  9 +
  10 +import javax.annotation.Resource;
  11 +
  12 +/**
  13 + * 登录日志 Service Core 实现
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Service
  18 +public class SysLoginLogCoreServiceImpl implements SysLoginLogCoreService {
  19 +
  20 + @Resource
  21 + private SysLoginLogCoreMapper loginLogMapper;
  22 +
  23 + @Override
  24 + public void createLoginLog(SysLoginLogCreateReqDTO reqDTO) {
  25 + SysLoginLogDO loginLog = SysLoginLogCoreConvert.INSTANCE.convert(reqDTO);
  26 + // 插入
  27 + loginLogMapper.insert(loginLog);
  28 + }
  29 +
  30 +}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/package-info.java deleted
1 -package cn.iocoder.yudao.coreservice.modules.system.service;  
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/dict/SysDictDataCoreServiceTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.dict;
  2 +
  3 +import cn.iocoder.yudao.coreservice.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.dict.SysDictDataCoreMapper;
  6 +import cn.iocoder.yudao.coreservice.modules.system.service.dict.impl.SysDictDataCoreServiceImpl;
  7 +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
  8 +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
  9 +import com.google.common.collect.ImmutableTable;
  10 +import org.junit.jupiter.api.Test;
  11 +import org.springframework.context.annotation.Import;
  12 +
  13 +import javax.annotation.Resource;
  14 +import java.util.Date;
  15 +import java.util.function.Consumer;
  16 +
  17 +import static cn.hutool.core.bean.BeanUtil.getFieldValue;
  18 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  19 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomCommonStatus;
  20 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  21 +import static org.junit.jupiter.api.Assertions.assertEquals;
  22 +
  23 +/**
  24 +* {@link SysDictDataCoreServiceImpl} 的单元测试类
  25 +*
  26 +* @author 芋道源码
  27 +*/
  28 +@Import(SysDictDataCoreServiceImpl.class)
  29 +public class SysDictDataCoreServiceTest extends BaseDbUnitTest {
  30 +
  31 + @Resource
  32 + private SysDictDataCoreServiceImpl dictDataCoreService;
  33 +
  34 + @Resource
  35 + private SysDictDataCoreMapper dictDataMapper;
  36 +
  37 + /**
  38 + * 测试加载到新的字典数据的情况
  39 + */
  40 + @Test
  41 + @SuppressWarnings("unchecked")
  42 + public void testInitLocalCache() {
  43 + // mock 数据
  44 + SysDictDataDO dictData01 = randomDictDataDO();
  45 + dictDataMapper.insert(dictData01);
  46 + SysDictDataDO dictData02 = randomDictDataDO();
  47 + dictDataMapper.insert(dictData02);
  48 +
  49 + // 调用
  50 + dictDataCoreService.initLocalCache();
  51 + // 断言 labelDictDataCache 缓存
  52 + ImmutableTable<String, String, SysDictDataDO> labelDictDataCache =
  53 + (ImmutableTable<String, String, SysDictDataDO>) getFieldValue(dictDataCoreService, "labelDictDataCache");
  54 + assertEquals(2, labelDictDataCache.size());
  55 + assertPojoEquals(dictData01, labelDictDataCache.get(dictData01.getDictType(), dictData01.getLabel()));
  56 + assertPojoEquals(dictData02, labelDictDataCache.get(dictData02.getDictType(), dictData02.getLabel()));
  57 + // 断言 valueDictDataCache 缓存
  58 + ImmutableTable<String, String, SysDictDataDO> valueDictDataCache =
  59 + (ImmutableTable<String, String, SysDictDataDO>) getFieldValue(dictDataCoreService, "valueDictDataCache");
  60 + assertEquals(2, valueDictDataCache.size());
  61 + assertPojoEquals(dictData01, valueDictDataCache.get(dictData01.getDictType(), dictData01.getValue()));
  62 + assertPojoEquals(dictData02, valueDictDataCache.get(dictData02.getDictType(), dictData02.getValue()));
  63 + // 断言 maxUpdateTime 缓存
  64 + Date maxUpdateTime = (Date) getFieldValue(dictDataCoreService, "maxUpdateTime");
  65 + assertEquals(ObjectUtils.max(dictData01.getUpdateTime(), dictData02.getUpdateTime()), maxUpdateTime);
  66 + }
  67 +
  68 + // ========== 随机对象 ==========
  69 +
  70 + @SafeVarargs
  71 + private static SysDictDataDO randomDictDataDO(Consumer<SysDictDataDO>... consumers) {
  72 + Consumer<SysDictDataDO> consumer = (o) -> {
  73 + o.setStatus(randomCommonStatus()); // 保证 status 的范围
  74 + };
  75 + return randomPojo(SysDictDataDO.class, ArrayUtils.append(consumer, consumers));
  76 + }
  77 +
  78 +}
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.logger;
  2 +
  3 +import cn.hutool.core.util.RandomUtil;
  4 +import cn.iocoder.yudao.coreservice.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
  6 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.logger.SysLoginLogCoreMapper;
  7 +import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum;
  8 +import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
  9 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
  10 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.impl.SysLoginLogCoreServiceImpl;
  11 +import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
  12 +import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
  13 +import org.junit.jupiter.api.Test;
  14 +import org.springframework.context.annotation.Import;
  15 +
  16 +import javax.annotation.Resource;
  17 +
  18 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  19 +
  20 +@Import(SysLoginLogCoreServiceImpl.class)
  21 +public class SysLoginLogServiceImplTest extends BaseDbUnitTest {
  22 +
  23 + @Resource
  24 + private SysLoginLogCoreServiceImpl loginLogCoreService;
  25 +
  26 + @Resource
  27 + private SysLoginLogCoreMapper loginLogCoreMapper;
  28 +
  29 + @Test
  30 + public void testCreateLoginLog() {
  31 + SysLoginLogCreateReqDTO reqDTO = RandomUtils.randomPojo(SysLoginLogCreateReqDTO.class, vo -> {
  32 + // 指定随机的范围,避免超出范围入库失败
  33 + vo.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());
  34 + vo.setResult(RandomUtil.randomEle(SysLoginResultEnum.values()).getResult());
  35 + vo.setTraceId(TracerUtils.getTraceId());
  36 + });
  37 +
  38 + // 调用
  39 + loginLogCoreService.createLoginLog(reqDTO);
  40 + // 断言,忽略基本字段
  41 + SysLoginLogDO sysLoginLogDO = loginLogCoreMapper.selectOne(null);
  42 + assertPojoEquals(reqDTO, sysLoginLogDO);
  43 + }
  44 +
  45 +}
yudao-core-service/src/test/resources/sql/clean.sql
@@ -2,3 +2,4 @@ @@ -2,3 +2,4 @@
2 2
3 -- sys 开头的 DB 3 -- sys 开头的 DB
4 DELETE FROM "sys_user_session"; 4 DELETE FROM "sys_user_session";
  5 +DELETE FROM "sys_dict_data";
yudao-core-service/src/test/resources/sql/create_tables.sql
@@ -18,3 +18,18 @@ CREATE TABLE IF NOT EXISTS `sys_user_session` ( @@ -18,3 +18,18 @@ CREATE TABLE IF NOT EXISTS `sys_user_session` (
18 PRIMARY KEY (`id`) 18 PRIMARY KEY (`id`)
19 ) COMMENT '用户在线 Session'; 19 ) COMMENT '用户在线 Session';
20 20
  21 +CREATE TABLE IF NOT EXISTS "sys_dict_data" (
  22 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  23 + "sort" int NOT NULL DEFAULT '0',
  24 + "label" varchar(100) NOT NULL DEFAULT '',
  25 + "value" varchar(100) NOT NULL DEFAULT '',
  26 + "dict_type" varchar(100) NOT NULL DEFAULT '',
  27 + "status" tinyint NOT NULL DEFAULT '0',
  28 + "remark" varchar(500) DEFAULT NULL,
  29 + "creator" varchar(64) DEFAULT '',
  30 + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  31 + "updater" varchar(64) DEFAULT '',
  32 + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  33 + "deleted" bit NOT NULL DEFAULT FALSE,
  34 + PRIMARY KEY ("id")
  35 +) COMMENT '字典数据表';
yudao-user-server/pom.xml
@@ -20,6 +20,11 @@ @@ -20,6 +20,11 @@
20 <!-- 业务组件 --> 20 <!-- 业务组件 -->
21 <dependency> 21 <dependency>
22 <groupId>cn.iocoder.boot</groupId> 22 <groupId>cn.iocoder.boot</groupId>
  23 + <artifactId>yudao-core-service</artifactId>
  24 + </dependency>
  25 +
  26 + <dependency>
  27 + <groupId>cn.iocoder.boot</groupId>
23 <artifactId>yudao-spring-boot-starter-biz-dict</artifactId> 28 <artifactId>yudao-spring-boot-starter-biz-dict</artifactId>
24 </dependency> 29 </dependency>
25 <dependency> 30 <dependency>
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/UserServerApplication.java
@@ -3,8 +3,8 @@ package cn.iocoder.yudao.userserver; @@ -3,8 +3,8 @@ package cn.iocoder.yudao.userserver;
3 import org.springframework.boot.SpringApplication; 3 import org.springframework.boot.SpringApplication;
4 import org.springframework.boot.autoconfigure.SpringBootApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
5 5
6 -@SpringBootApplication  
7 -public class UserServerApplication { 6 +@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package} 和 ${yudao.core-service.base-package}
  7 +@SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}", "${yudao.core-service.base-package}"})public class UserServerApplication {
8 8
9 public static void main(String[] args) { 9 public static void main(String[] args) {
10 SpringApplication.run(UserServerApplication.class, args); 10 SpringApplication.run(UserServerApplication.class, args);
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/user/MbrAuthConvert.java
1 package cn.iocoder.yudao.userserver.modules.member.convert.user; 1 package cn.iocoder.yudao.userserver.modules.member.convert.user;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
3 import cn.iocoder.yudao.framework.security.core.LoginUser; 4 import cn.iocoder.yudao.framework.security.core.LoginUser;
4 import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO; 5 import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
5 import org.mapstruct.Mapper; 6 import org.mapstruct.Mapper;
@@ -10,6 +11,11 @@ public interface MbrAuthConvert { @@ -10,6 +11,11 @@ public interface MbrAuthConvert {
10 11
11 MbrAuthConvert INSTANCE = Mappers.getMapper(MbrAuthConvert.class); 12 MbrAuthConvert INSTANCE = Mappers.getMapper(MbrAuthConvert.class);
12 13
13 - LoginUser convert(MbrUserDO bean); 14 + LoginUser convert0(MbrUserDO bean);
  15 +
  16 + default LoginUser convert(MbrUserDO bean) {
  17 + // 目的,为了设置 UserTypeEnum.MEMBER.getValue()
  18 + return convert0(bean).setUserType(UserTypeEnum.MEMBER.getValue());
  19 + }
14 20
15 } 21 }
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/auth/impl/MbrAuthServiceImpl.java
1 package cn.iocoder.yudao.userserver.modules.member.service.auth.impl; 1 package cn.iocoder.yudao.userserver.modules.member.service.auth.impl;
2 2
  3 +import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
  4 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
  5 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
3 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; 6 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
4 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; 7 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
5 import cn.iocoder.yudao.framework.security.core.LoginUser; 8 import cn.iocoder.yudao.framework.security.core.LoginUser;
6 import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.MbrAuthLoginReqVO; 9 import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.MbrAuthLoginReqVO;
7 import cn.iocoder.yudao.userserver.modules.member.convert.user.MbrAuthConvert; 10 import cn.iocoder.yudao.userserver.modules.member.convert.user.MbrAuthConvert;
8 import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO; 11 import cn.iocoder.yudao.userserver.modules.member.dal.dataobject.user.MbrUserDO;
9 -import cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants;  
10 import cn.iocoder.yudao.userserver.modules.member.service.auth.MbrAuthService; 12 import cn.iocoder.yudao.userserver.modules.member.service.auth.MbrAuthService;
11 import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService; 13 import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
12 -import cn.iocoder.yudao.userserver.modules.system.enums.logger.SysLoginLogTypeEnum;  
13 -import cn.iocoder.yudao.userserver.modules.system.enums.logger.SysLoginResultEnum;  
14 -import cn.iocoder.yudao.userserver.modules.system.service.auth.SysUserSessionService;  
15 -import cn.iocoder.yudao.userserver.modules.system.service.logger.SysLoginLogService;  
16 -import cn.iocoder.yudao.userserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;  
17 -import cn.iocoder.yudao.userserver.modules.system.service.logger.impl.SysLoginLogServiceImpl; 14 +import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum;
  15 +import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
18 import lombok.extern.slf4j.Slf4j; 16 import lombok.extern.slf4j.Slf4j;
19 import org.springframework.context.annotation.Lazy; 17 import org.springframework.context.annotation.Lazy;
20 import org.springframework.security.authentication.AuthenticationManager; 18 import org.springframework.security.authentication.AuthenticationManager;
@@ -29,7 +27,6 @@ import org.springframework.stereotype.Service; @@ -29,7 +27,6 @@ import org.springframework.stereotype.Service;
29 import org.springframework.util.Assert; 27 import org.springframework.util.Assert;
30 28
31 import javax.annotation.Resource; 29 import javax.annotation.Resource;
32 -  
33 import java.util.Objects; 30 import java.util.Objects;
34 31
35 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 32 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -51,9 +48,9 @@ public class MbrAuthServiceImpl implements MbrAuthService { @@ -51,9 +48,9 @@ public class MbrAuthServiceImpl implements MbrAuthService {
51 @Resource 48 @Resource
52 private MbrUserService userService; 49 private MbrUserService userService;
53 @Resource 50 @Resource
54 - private SysLoginLogService loginLogService; 51 + private SysLoginLogCoreService loginLogCoreService;
55 @Resource 52 @Resource
56 - private SysUserSessionService userSessionService; 53 + private SysUserSessionCoreService userSessionCoreService;
57 54
58 @Override 55 @Override
59 public UserDetails loadUserByUsername(String mobile) throws UsernameNotFoundException { 56 public UserDetails loadUserByUsername(String mobile) throws UsernameNotFoundException {
@@ -72,7 +69,7 @@ public class MbrAuthServiceImpl implements MbrAuthService { @@ -72,7 +69,7 @@ public class MbrAuthServiceImpl implements MbrAuthService {
72 LoginUser loginUser = this.login0(reqVO.getMobile(), reqVO.getPassword()); 69 LoginUser loginUser = this.login0(reqVO.getMobile(), reqVO.getPassword());
73 70
74 // 缓存登录用户到 Redis 中,返回 sessionId 编号 71 // 缓存登录用户到 Redis 中,返回 sessionId 编号
75 - return userSessionService.createUserSession(loginUser, userIp, userAgent); 72 + return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
76 } 73 }
77 74
78 private LoginUser login0(String username, String password) { 75 private LoginUser login0(String username, String password) {
@@ -114,7 +111,7 @@ public class MbrAuthServiceImpl implements MbrAuthService { @@ -114,7 +111,7 @@ public class MbrAuthServiceImpl implements MbrAuthService {
114 reqDTO.setUserAgent(ServletUtils.getUserAgent()); 111 reqDTO.setUserAgent(ServletUtils.getUserAgent());
115 reqDTO.setUserIp(ServletUtils.getClientIP()); 112 reqDTO.setUserIp(ServletUtils.getClientIP());
116 reqDTO.setResult(loginResult.getResult()); 113 reqDTO.setResult(loginResult.getResult());
117 - loginLogService.createLoginLog(reqDTO); 114 + loginLogCoreService.createLoginLog(reqDTO);
118 // 更新最后登录时间 115 // 更新最后登录时间
119 if (user != null && Objects.equals(SysLoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { 116 if (user != null && Objects.equals(SysLoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
120 userService.updateUserLogin(user.getId(), ServletUtils.getClientIP()); 117 userService.updateUserLogin(user.getId(), ServletUtils.getClientIP());
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/logger/SysLoginLogConvert.java deleted
1 -package cn.iocoder.yudao.userserver.modules.system.convert.logger;  
2 -  
3 -import cn.iocoder.yudao.userserver.modules.system.dal.mysql.logger.SysLoginLogDO;  
4 -import cn.iocoder.yudao.userserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;  
5 -import org.mapstruct.Mapper;  
6 -import org.mapstruct.factory.Mappers;  
7 -  
8 -@Mapper  
9 -public interface SysLoginLogConvert {  
10 -  
11 - SysLoginLogConvert INSTANCE = Mappers.getMapper(SysLoginLogConvert.class);  
12 -  
13 - SysLoginLogDO convert(SysLoginLogCreateReqDTO bean);  
14 -  
15 -}  
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/dict/SysDictDataDO.java deleted
1 -package cn.iocoder.yudao.userserver.modules.system.dal.dataobject.dict;  
2 -  
3 -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;  
4 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;  
5 -import com.baomidou.mybatisplus.annotation.TableId;  
6 -import com.baomidou.mybatisplus.annotation.TableName;  
7 -import lombok.Data;  
8 -import lombok.EqualsAndHashCode;  
9 -  
10 -/**  
11 - * 字典数据表  
12 - *  
13 - * @author ruoyi  
14 - */  
15 -@TableName("sys_dict_data")  
16 -@Data  
17 -@EqualsAndHashCode(callSuper = true)  
18 -public class SysDictDataDO extends BaseDO {  
19 -  
20 - /**  
21 - * 字典数据编号  
22 - */  
23 - @TableId  
24 - private Long id;  
25 - /**  
26 - * 字典排序  
27 - */  
28 - private Integer sort;  
29 - /**  
30 - * 字典标签  
31 - */  
32 - private String label;  
33 - /**  
34 - * 字典值  
35 - */  
36 - private String value;  
37 - /**  
38 - * 字典类型  
39 - *  
40 - * 冗余 {@link SysDictDataDO#getDictType()}  
41 - */  
42 - private String dictType;  
43 - /**  
44 - * 状态  
45 - *  
46 - * 枚举 {@link CommonStatusEnum}  
47 - */  
48 - private Integer status;  
49 - /**  
50 - * 备注  
51 - */  
52 - private String remark;  
53 -  
54 -}  
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/package-info.java deleted
1 -package cn.iocoder.yudao.userserver.modules.system.dal.dataobject;  
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/logger/SysLoginLogDO.java deleted
1 -package cn.iocoder.yudao.userserver.modules.system.dal.mysql.logger;  
2 -  
3 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;  
4 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;  
5 -import cn.iocoder.yudao.userserver.modules.system.enums.logger.SysLoginLogTypeEnum;  
6 -import cn.iocoder.yudao.userserver.modules.system.enums.logger.SysLoginResultEnum;  
7 -import com.baomidou.mybatisplus.annotation.TableName;  
8 -import lombok.Data;  
9 -import lombok.EqualsAndHashCode;  
10 -import lombok.ToString;  
11 -  
12 -/**  
13 - * 登录日志表  
14 - *  
15 - * 注意,包括登录和登出两种行为  
16 - *  
17 - * @author 芋道源码  
18 - */  
19 -@TableName("sys_login_log")  
20 -@Data  
21 -@EqualsAndHashCode(callSuper = true)  
22 -@ToString(callSuper = true)  
23 -public class SysLoginLogDO extends BaseDO {  
24 -  
25 - /**  
26 - * 日志主键  
27 - */  
28 - private Long id;  
29 - /**  
30 - * 日志类型  
31 - *  
32 - * 枚举 {@link SysLoginLogTypeEnum}  
33 - */  
34 - private Integer logType;  
35 - /**  
36 - * 链路追踪编号  
37 - */  
38 - private String traceId;  
39 - /**  
40 - * 用户编号  
41 - */  
42 - private Long userId;  
43 - /**  
44 - * 用户类型  
45 - *  
46 - * 枚举 {@link UserTypeEnum}  
47 - */  
48 - private Integer userType;  
49 - /**  
50 - * 用户账号  
51 - *  
52 - * 冗余,因为账号可以变更  
53 - */  
54 - private String username;  
55 - /**  
56 - * 登录结果  
57 - *  
58 - * 枚举 {@link SysLoginResultEnum}  
59 - */  
60 - private Integer result;  
61 - /**  
62 - * 用户 IP  
63 - */  
64 - private String userIp;  
65 - /**  
66 - * 浏览器 UA  
67 - */  
68 - private String userAgent;  
69 -  
70 -}  
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/package-info.java deleted
1 -package cn.iocoder.yudao.userserver.modules.system.enums;  
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/logger/dto/SysLoginLogCreateReqDTO.java deleted
1 -package cn.iocoder.yudao.userserver.modules.system.service.logger.dto;  
2 -  
3 -import lombok.Data;  
4 -  
5 -import javax.validation.constraints.NotBlank;  
6 -import javax.validation.constraints.NotEmpty;  
7 -import javax.validation.constraints.NotNull;  
8 -import javax.validation.constraints.Size;  
9 -  
10 -/**  
11 - * 登录日志创建 Request DTO  
12 - *  
13 - * @author 芋道源码  
14 - */  
15 -@Data  
16 -public class SysLoginLogCreateReqDTO {  
17 -  
18 - /**  
19 - * 日志类型  
20 - */  
21 - @NotNull(message = "日志类型不能为空")  
22 - private Integer logType;  
23 - /**  
24 - * 链路追踪编号  
25 - */  
26 - @NotEmpty(message = "链路追踪编号不能为空")  
27 - private String traceId;  
28 -  
29 - /**  
30 - * 用户编号  
31 - */  
32 - private Long userId;  
33 - /**  
34 - * 用户账号  
35 - */  
36 - @NotBlank(message = "用户账号不能为空")  
37 - @Size(max = 30, message = "用户账号长度不能超过30个字符")  
38 - private String username;  
39 -  
40 - /**  
41 - * 登录结果  
42 - */  
43 - @NotNull(message = "登录结果不能为空")  
44 - private Integer result;  
45 -  
46 - /**  
47 - * 用户 IP  
48 - */  
49 - @NotEmpty(message = "用户 IP 不能为空")  
50 - private String userIp;  
51 - /**  
52 - * 浏览器 UserAgent  
53 - */  
54 - @NotEmpty(message = "浏览器 UserAgent 不能为空")  
55 - private String userAgent;  
56 -  
57 -}  
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java deleted
1 -package cn.iocoder.yudao.userserver.modules.system.service.logger.impl;  
2 -  
3 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;  
4 -import cn.iocoder.yudao.userserver.modules.system.convert.logger.SysLoginLogConvert;  
5 -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.logger.SysLoginLogMapper;  
6 -import cn.iocoder.yudao.userserver.modules.system.dal.mysql.logger.SysLoginLogDO;  
7 -import cn.iocoder.yudao.userserver.modules.system.service.logger.SysLoginLogService;  
8 -import cn.iocoder.yudao.userserver.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;  
9 -import org.springframework.stereotype.Service;  
10 -  
11 -import javax.annotation.Resource;  
12 -  
13 -/**  
14 - * 登录日志 Service 实现  
15 - */  
16 -@Service  
17 -public class SysLoginLogServiceImpl implements SysLoginLogService {  
18 -  
19 - @Resource  
20 - private SysLoginLogMapper loginLogMapper;  
21 -  
22 - @Override  
23 - public void createLoginLog(SysLoginLogCreateReqDTO reqDTO) {  
24 - SysLoginLogDO loginLog = SysLoginLogConvert.INSTANCE.convert(reqDTO);  
25 - loginLog.setUserType(UserTypeEnum.MEMBER.getValue());  
26 - // 插入  
27 - loginLogMapper.insert(loginLog);  
28 - }  
29 -  
30 -}  
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/package-info.java deleted
1 -package cn.iocoder.yudao.userserver.modules.system.service;  
2 \ No newline at end of file 0 \ No newline at end of file
yudao-user-server/src/main/resources/application.yaml
@@ -31,7 +31,7 @@ mybatis-plus: @@ -31,7 +31,7 @@ mybatis-plus:
31 logic-delete-value: 1 # 逻辑已删除值(默认为 1) 31 logic-delete-value: 1 # 逻辑已删除值(默认为 1)
32 logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) 32 logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
33 mapper-locations: classpath*:mapper/*.xml 33 mapper-locations: classpath*:mapper/*.xml
34 - type-aliases-package: ${yudao.info.base-package}.modules.*.dal.dataobject 34 + type-aliases-package: ${yudao.info.base-package}.modules.*.dal.dataobject, ${yudao.core-service.base-package}.modules.*.dal.dataobject
35 35
36 --- #################### 芋道相关配置 #################### 36 --- #################### 芋道相关配置 ####################
37 37
@@ -39,6 +39,8 @@ yudao: @@ -39,6 +39,8 @@ yudao:
39 info: 39 info:
40 version: 1.0.0 40 version: 1.0.0
41 base-package: cn.iocoder.yudao.userserver 41 base-package: cn.iocoder.yudao.userserver
  42 + core-service:
  43 + base-package: cn.iocoder.yudao.coreservice
42 web: 44 web:
43 api-prefix: /api 45 api-prefix: /api
44 controller-package: ${yudao.info.base-package} 46 controller-package: ${yudao.info.base-package}