Commit ceef984d15c79a0f4aa8d14d6228365d28ec8afa

Authored by YunaiV
2 parents 4909342d 468dbc66

Merge remote-tracking branch 'origin/master'

Showing 267 changed files with 3571 additions and 2130 deletions
README.md
... ... @@ -88,6 +88,9 @@
88 88 | `yudao-admin-ui` | 管理后台的 UI 界面 |
89 89 | `yudao-user-server` | 用户前台的服务端 |
90 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  
... ...
http-client.env.json
1 1 {
2 2 "local": {
3 3 "baseUrl": "http://127.0.0.1:48080/api",
  4 + "userServerUrl": "http://127.0.0.1:28080/api",
4 5 "token": "test1"
5 6 }
6 7 }
... ...
... ... @@ -12,6 +12,7 @@
12 12 <module>yudao-framework</module>
13 13 <module>yudao-admin-server</module>
14 14 <module>yudao-user-server</module>
  15 + <module>yudao-core-service</module>
15 16 </modules>
16 17  
17 18 <name>${artifactId}</name>
... ...
yudao-admin-server/pom.xml
... ... @@ -20,6 +20,11 @@
20 20 <!-- 业务组件 -->
21 21 <dependency>
22 22 <groupId>cn.iocoder.boot</groupId>
  23 + <artifactId>yudao-core-service</artifactId>
  24 + </dependency>
  25 +
  26 + <dependency>
  27 + <groupId>cn.iocoder.boot</groupId>
23 28 <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
24 29 </dependency>
25 30 <dependency>
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/AdminServerApplication.java
... ... @@ -3,7 +3,8 @@ package cn.iocoder.yudao.adminserver;
3 3 import org.springframework.boot.SpringApplication;
4 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
5 5  
6   -@SpringBootApplication
  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}"})
7 8 public class AdminServerApplication {
8 9  
9 10 public static void main(String[] args) {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/config/InfConfigController.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.controller.config;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 7 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7 8 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.*;
8 9 import cn.iocoder.yudao.adminserver.modules.infra.convert.config.InfConfigConvert;
9   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO;
10 10 import cn.iocoder.yudao.adminserver.modules.infra.service.config.InfConfigService;
11 11 import io.swagger.annotations.Api;
12 12 import io.swagger.annotations.ApiImplicitParam;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/file/InfFileController.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.controller.file;
2 2  
3 3 import cn.hutool.core.io.IoUtil;
  4 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
4 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
7 8 import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFileRespVO;
8 9 import cn.iocoder.yudao.adminserver.modules.infra.convert.file.InfFileConvert;
9   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO;
10 10 import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService;
11 11 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
12 12 import io.swagger.annotations.Api;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiAccessLogController.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.controller.logger;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
... ... @@ -9,7 +10,6 @@ import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccess
9 10 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO;
10 11 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO;
11 12 import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiAccessLogConvert;
12   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
13 13 import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiAccessLogService;
14 14 import io.swagger.annotations.Api;
15 15 import io.swagger.annotations.ApiOperation;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/controller/logger/InfApiErrorLogController.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.controller.logger;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
... ... @@ -9,7 +10,6 @@ import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorl
9 10 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO;
10 11 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO;
11 12 import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiErrorLogConvert;
12   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
13 13 import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiErrorLogService;
14 14 import io.swagger.annotations.Api;
15 15 import io.swagger.annotations.ApiImplicitParam;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/config/InfConfigConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.convert.config;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO;
5 6 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExcelVO;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigRespVO;
7 8 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO;
9 9 import org.mapstruct.Mapper;
10 10 import org.mapstruct.factory.Mappers;
11 11  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/file/InfFileConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.convert.file;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFileRespVO;
5   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO;
6 6 import org.mapstruct.Mapper;
7 7 import org.mapstruct.factory.Mappers;
8 8  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiAccessLogConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.convert.logger;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO;
5 6 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExcelVO;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO;
7   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
8 8 import org.mapstruct.Mapper;
9 9 import org.mapstruct.factory.Mappers;
10 10  
... ... @@ -20,8 +20,6 @@ public interface InfApiAccessLogConvert {
20 20  
21 21 InfApiAccessLogConvert INSTANCE = Mappers.getMapper(InfApiAccessLogConvert.class);
22 22  
23   - InfApiAccessLogDO convert(ApiAccessLogCreateDTO bean);
24   -
25 23 InfApiAccessLogRespVO convert(InfApiAccessLogDO bean);
26 24  
27 25 List<InfApiAccessLogRespVO> convertList(List<InfApiAccessLogDO> list);
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/convert/logger/InfApiErrorLogConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.convert.logger;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO;
5 5 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExcelVO;
6 6 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO;
7   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
8 7 import org.mapstruct.Mapper;
9 8 import org.mapstruct.factory.Mappers;
10 9  
... ... @@ -20,8 +19,6 @@ public interface InfApiErrorLogConvert {
20 19  
21 20 InfApiErrorLogConvert INSTANCE = Mappers.getMapper(InfApiErrorLogConvert.class);
22 21  
23   - InfApiErrorLogDO convert(ApiErrorLogCreateDTO bean);
24   -
25 22 InfApiErrorLogRespVO convert(InfApiErrorLogDO bean);
26 23  
27 24 PageResult<InfApiErrorLogRespVO> convertPage(PageResult<InfApiErrorLogDO> page);
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/config/InfConfigDO.java deleted
1   -package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4   -import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum;
5   -import com.baomidou.mybatisplus.annotation.TableField;
6   -import com.baomidou.mybatisplus.annotation.TableId;
7   -import com.baomidou.mybatisplus.annotation.TableName;
8   -import lombok.Data;
9   -import lombok.EqualsAndHashCode;
10   -import lombok.ToString;
11   -
12   -/**
13   - * 参数配置表
14   - *
15   - * @author ruoyi
16   - */
17   -@TableName("inf_config")
18   -@Data
19   -@EqualsAndHashCode(callSuper = true)
20   -@ToString(callSuper = true)
21   -public class InfConfigDO extends BaseDO {
22   -
23   - /**
24   - * 参数主键
25   - */
26   - @TableId
27   - private Long id;
28   - /**
29   - * 参数分组
30   - */
31   - @TableField("`group`")
32   - private String group;
33   - /**
34   - * 参数名称
35   - */
36   - private String name;
37   - /**
38   - * 参数键名
39   - */
40   - @TableField("`key`")
41   - private String key;
42   - /**
43   - * 参数键值
44   - */
45   - private String value;
46   - /**
47   - * 参数类型
48   - *
49   - * 枚举 {@link InfConfigTypeEnum}
50   - */
51   - @TableField("`type`")
52   - private Integer type;
53   - /**
54   - * 是否敏感
55   - *
56   - * 对于敏感配置,需要管理权限才能查看
57   - */
58   - @TableField("`sensitive`")
59   - private Boolean sensitive;
60   - /**
61   - * 备注
62   - */
63   - private String remark;
64   -
65   -}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java deleted
1   -package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.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.adminserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum;
6   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
7   -import com.baomidou.mybatisplus.annotation.TableName;
8   -import lombok.*;
9   -
10   -import java.util.Date;
11   -
12   -/**
13   - * API 异常数据
14   - *
15   - * @author 芋道源码
16   - */
17   -@TableName("inf_api_error_log")
18   -@Data
19   -@EqualsAndHashCode(callSuper = true)
20   -@ToString(callSuper = true)
21   -@Builder
22   -@NoArgsConstructor
23   -@AllArgsConstructor
24   -public class InfApiErrorLogDO extends BaseDO {
25   -
26   - /**
27   - * 编号
28   - */
29   - private Long id;
30   - /**
31   - * 用户编号
32   - */
33   - private Long userId;
34   - /**
35   - * 链路追踪编号
36   - *
37   - * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。
38   - */
39   - private String traceId;
40   - /**
41   - * 用户类型
42   - *
43   - * 枚举 {@link UserTypeEnum}
44   - */
45   - private Integer userType;
46   - /**
47   - * 应用名
48   - *
49   - * 目前读取 spring.application.name
50   - */
51   - private String applicationName;
52   -
53   - // ========== 请求相关字段 ==========
54   -
55   - /**
56   - * 请求方法名
57   - */
58   - private String requestMethod;
59   - /**
60   - * 访问地址
61   - */
62   - private String requestUrl;
63   - /**
64   - * 请求参数
65   - *
66   - * query: Query String
67   - * body: Quest Body
68   - */
69   - private String requestParams;
70   - /**
71   - * 用户 IP
72   - */
73   - private String userIp;
74   - /**
75   - * 浏览器 UA
76   - */
77   - private String userAgent;
78   -
79   - // ========== 异常相关字段 ==========
80   -
81   - /**
82   - * 异常发生时间
83   - */
84   - private Date exceptionTime;
85   - /**
86   - * 异常名
87   - *
88   - * {@link Throwable#getClass()} 的类全名
89   - */
90   - private String exceptionName;
91   - /**
92   - * 异常导致的消息
93   - *
94   - * {@link cn.hutool.core.exceptions.ExceptionUtil#getMessage(Throwable)}
95   - */
96   - private String exceptionMessage;
97   - /**
98   - * 异常导致的根消息
99   - *
100   - * {@link cn.hutool.core.exceptions.ExceptionUtil#getRootCauseMessage(Throwable)}
101   - */
102   - private String exceptionRootCauseMessage;
103   - /**
104   - * 异常的栈轨迹
105   - *
106   - * {@link org.apache.commons.lang3.exception.ExceptionUtils#getStackTrace(Throwable)}
107   - */
108   - private String exceptionStackTrace;
109   - /**
110   - * 异常发生的类全名
111   - *
112   - * {@link StackTraceElement#getClassName()}
113   - */
114   - private String exceptionClassName;
115   - /**
116   - * 异常发生的类文件
117   - *
118   - * {@link StackTraceElement#getFileName()}
119   - */
120   - private String exceptionFileName;
121   - /**
122   - * 异常发生的方法名
123   - *
124   - * {@link StackTraceElement#getMethodName()}
125   - */
126   - private String exceptionMethodName;
127   - /**
128   - * 异常发生的方法所在行
129   - *
130   - * {@link StackTraceElement#getLineNumber()}
131   - */
132   - private Integer exceptionLineNumber;
133   -
134   - // ========== 处理相关字段 ==========
135   -
136   - /**
137   - * 处理状态
138   - *
139   - * 枚举 {@link InfApiErrorLogProcessStatusEnum}
140   - */
141   - private Integer processStatus;
142   - /**
143   - * 处理时间
144   - */
145   - private Date processTime;
146   - /**
147   - * 处理用户编号
148   - *
149   - * 关联 {@link SysUserDO#getId()}
150   - */
151   - private Long processUserId;
152   -
153   -}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO;
7 8 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO;
9 9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 10 import org.apache.ibatis.annotations.Mapper;
11 11  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/file/InfFileMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9 9  
10 10 @Mapper
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger;
2 2  
  3 +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO;
  4 +import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
3 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 7 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 8 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6   -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
9 9 import org.apache.ibatis.annotations.Mapper;
10 10  
11 11 import java.util.List;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO;
7 8 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
9 9 import org.apache.ibatis.annotations.Mapper;
10 10  
11 11 import java.util.List;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigService.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.service.config;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO;
5 6 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO;
7 8 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO;
9 9  
10 10 import javax.validation.Valid;
11 11 import java.util.List;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/impl/InfConfigServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.service.config.impl;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
3 4 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO;
... ... @@ -8,7 +9,6 @@ import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfig
8 9 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO;
9 10 import cn.iocoder.yudao.adminserver.modules.infra.convert.config.InfConfigConvert;
10 11 import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigMapper;
11   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO;
12 12 import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum;
13 13 import cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config.InfConfigProducer;
14 14 import cn.iocoder.yudao.adminserver.modules.infra.service.config.InfConfigService;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileService.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.service.file;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
5   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO;
6 6  
7 7 /**
8 8 * 文件 Service 接口
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/impl/InfFileServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.service.file.impl;
2 2  
3 3 import cn.hutool.core.io.FileTypeUtil;
  4 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.adminserver.modules.infra.framework.file.config.FileProperties;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO;
8 8 import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file.InfFileMapper;
9 9 import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService;
10 10 import org.springframework.stereotype.Service;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogService.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.service.logger;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService;
5 3 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO;
6 4 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 7  
9 8 import java.util.List;
10 9  
... ... @@ -13,7 +12,7 @@ import java.util.List;
13 12 *
14 13 * @author 芋道源码
15 14 */
16   -public interface InfApiAccessLogService extends ApiAccessLogFrameworkService {
  15 +public interface InfApiAccessLogService {
17 16  
18 17 /**
19 18 * 获得 API 访问日志分页
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogService.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.service.logger;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
5 3 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO;
6 4 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 7  
9 8 import java.util.List;
10 9  
... ... @@ -13,7 +12,7 @@ import java.util.List;
13 12 *
14 13 * @author 芋道源码
15 14 */
16   -public interface InfApiErrorLogService extends ApiErrorLogFrameworkService {
  15 +public interface InfApiErrorLogService {
17 16  
18 17 /**
19 18 * 获得 API 错误日志分页
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO;
5 3 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO;
6 4 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiAccessLogConvert;
8   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
9 5 import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiAccessLogMapper;
10 6 import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiAccessLogService;
11   -import org.springframework.scheduling.annotation.Async;
12   -import org.springframework.scheduling.annotation.AsyncResult;
  7 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
13 9 import org.springframework.stereotype.Service;
14 10 import org.springframework.validation.annotation.Validated;
15 11  
16 12 import javax.annotation.Resource;
17 13 import java.util.List;
18   -import java.util.concurrent.Future;
19 14  
20 15 /**
21 16 * API 访问日志 Service 实现类
... ... @@ -30,14 +25,6 @@ public class InfApiAccessLogServiceImpl implements InfApiAccessLogService {
30 25 private InfApiAccessLogMapper apiAccessLogMapper;
31 26  
32 27 @Override
33   - @Async
34   - public Future<Boolean> createApiAccessLogAsync(ApiAccessLogCreateDTO createDTO) {
35   - InfApiAccessLogDO apiAccessLog = InfApiAccessLogConvert.INSTANCE.convert(createDTO);
36   - int insert = apiAccessLogMapper.insert(apiAccessLog);
37   - return new AsyncResult<>(insert > 1);
38   - }
39   -
40   - @Override
41 28 public PageResult<InfApiAccessLogDO> getApiAccessLogPage(InfApiAccessLogPageReqVO pageReqVO) {
42 29 return apiAccessLogMapper.selectPage(pageReqVO);
43 30 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO;
5 3 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO;
6 4 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiErrorLogConvert;
8   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
9 5 import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiErrorLogMapper;
10 6 import cn.iocoder.yudao.adminserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum;
11 7 import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiErrorLogService;
12   -import org.springframework.scheduling.annotation.Async;
13   -import org.springframework.scheduling.annotation.AsyncResult;
  8 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
  9 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
14 10 import org.springframework.stereotype.Service;
15 11 import org.springframework.validation.annotation.Validated;
16 12  
17 13 import javax.annotation.Resource;
18 14 import java.util.Date;
19 15 import java.util.List;
20   -import java.util.concurrent.Future;
21 16  
22   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
23 17 import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_NOT_FOUND;
24 18 import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.API_ERROR_LOG_PROCESSED;
  19 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
25 20  
26 21 /**
27 22 * API 错误日志 Service 实现类
... ... @@ -36,15 +31,6 @@ public class InfApiErrorLogServiceImpl implements InfApiErrorLogService {
36 31 private InfApiErrorLogMapper apiErrorLogMapper;
37 32  
38 33 @Override
39   - @Async
40   - public Future<Boolean> createApiErrorLogAsync(ApiErrorLogCreateDTO createDTO) {
41   - InfApiErrorLogDO apiErrorLog = InfApiErrorLogConvert.INSTANCE.convert(createDTO);
42   - apiErrorLog.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus());
43   - int insert = apiErrorLogMapper.insert(apiErrorLog);
44   - return new AsyncResult<>(insert == 1);
45   - }
46   -
47   - @Override
48 34 public PageResult<InfApiErrorLogDO> getApiErrorLogPage(InfApiErrorLogPageReqVO pageReqVO) {
49 35 return apiErrorLogMapper.selectPage(pageReqVO);
50 36 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java
... ... @@ -4,13 +4,13 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.*;
4 4 import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert;
5 5 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO;
6 6 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
7   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
8 7 import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum;
9 8 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService;
10 9 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
11 10 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
12 11 import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
13   -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  12 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  13 +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
14 14 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
15 15 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
16 16 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
... ... @@ -43,7 +43,7 @@ public class SysAuthController {
43 43 @Resource
44 44 private SysAuthService authService;
45 45 @Resource
46   - private SysUserService userService;
  46 + private SysUserCoreService userCoreService;
47 47 @Resource
48 48 private SysRoleService roleService;
49 49 @Resource
... ... @@ -64,7 +64,7 @@ public class SysAuthController {
64 64 @ApiOperation("获取登录用户的权限信息")
65 65 public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() {
66 66 // 获得用户信息
67   - SysUserDO user = userService.getUser(getLoginUserId());
  67 + SysUserDO user = userCoreService.getUser(getLoginUserId());
68 68 if (user == null) {
69 69 return null;
70 70 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.controller.auth;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 3 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO;
6 4 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
7 5 import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysUserSessionConvert;
8   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO;
9 6 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
10   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
11 7 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
12 8 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
13 9 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  10 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
  11 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  12 +import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
  13 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  14 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
14 15 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
15 16 import io.swagger.annotations.Api;
16 17 import io.swagger.annotations.ApiImplicitParam;
... ... @@ -35,6 +36,8 @@ public class SysUserSessionController {
35 36 @Resource
36 37 private SysUserSessionService userSessionService;
37 38 @Resource
  39 + private SysUserSessionCoreService userSessionCoreService;
  40 + @Resource
38 41 private SysUserService userService;
39 42 @Resource
40 43 private SysDeptService deptService;
... ... @@ -72,7 +75,7 @@ public class SysUserSessionController {
72 75 example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7")
73 76 @PreAuthorize("@ss.hasPermission('system:user-session:delete')")
74 77 public CommonResult<Boolean> deleteUserSession(@RequestParam("id") String id) {
75   - userSessionService.deleteUserSession(id);
  78 + userSessionCoreService.deleteUserSession(id);
76 79 return success(true);
77 80 }
78 81  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/dict/SysDictDataController.java
1 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 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 7 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7 8 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.*;
8 9 import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert;
9   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO;
10 10 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService;
11 11 import io.swagger.annotations.Api;
12 12 import io.swagger.annotations.ApiImplicitParam;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysLoginLogController.java
1 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 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 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 10 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
10 11 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogRespVO;
11 12 import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysLoginLogConvert;
12   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO;
13 13 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
14 14 import io.swagger.annotations.Api;
15 15 import io.swagger.annotations.ApiOperation;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.controller.logger;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6   -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7 3 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO;
8 4 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO;
9 5 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO;
10 6 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO;
11 7 import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysOperateLogConvert;
12 8 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO;
13   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
14 9 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysOperateLogService;
15 10 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  11 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  12 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  13 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
16 14 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
17 15 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  16 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  17 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
18 18 import io.swagger.annotations.Api;
19 19 import io.swagger.annotations.ApiOperation;
20 20 import org.springframework.security.access.prepost.PreAuthorize;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/vo/loginlog/SysLoginLogCreateReqVO.java deleted
1   -package cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog;
2   -
3   -import io.swagger.annotations.ApiModel;
4   -import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7   -
8   -@ApiModel(value = "登录日志创建 Request VO",
9   - description = "暂时提供给前端,仅仅后端记录登录日志时,进行使用")
10   -@Data
11   -@EqualsAndHashCode(callSuper = true)
12   -@ToString(callSuper = true)
13   -public class SysLoginLogCreateReqVO extends SysLoginLogBaseVO {
14   -}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java
... ... @@ -2,10 +2,10 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.sms;
2 2  
3 3 import cn.hutool.core.util.URLUtil;
4 4 import cn.hutool.extra.servlet.ServletUtil;
  5 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
5 6 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 7 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7 8 import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum;
8   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService;
9 9 import io.swagger.annotations.Api;
10 10 import io.swagger.annotations.ApiImplicitParam;
11 11 import io.swagger.annotations.ApiOperation;
... ... @@ -25,7 +25,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
25 25 public class SmsCallbackController {
26 26  
27 27 @Resource
28   - private SysSmsService smsService;
  28 + private SysSmsCoreService smsCoreService;
29 29  
30 30 @PostMapping("/sms/yunpian")
31 31 @ApiOperation(value = "云片短信的回调", notes = "参见 https://www.yunpian.com/official/document/sms/zh_cn/domestic_push_report 文档")
... ... @@ -33,7 +33,7 @@ public class SmsCallbackController {
33 33 @OperateLog(enable = false)
34 34 public String receiveYunpianSmsStatus(@RequestParam("sms_status") String smsStatus) throws Throwable {
35 35 String text = URLUtil.decode(smsStatus); // decode 解码参数,因为它被 encode
36   - smsService.receiveSmsStatus(SmsChannelEnum.YUN_PIAN.getCode(), text);
  36 + smsCoreService.receiveSmsStatus(SmsChannelEnum.YUN_PIAN.getCode(), text);
37 37 return "SUCCESS"; // 约定返回 SUCCESS 为成功
38 38 }
39 39  
... ... @@ -42,7 +42,7 @@ public class SmsCallbackController {
42 42 @OperateLog(enable = false)
43 43 public CommonResult<Boolean> receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable {
44 44 String text = ServletUtil.getBody(request);
45   - smsService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text);
  45 + smsCoreService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text);
46 46 return success(true);
47 47 }
48 48  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.controller.sms;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 3 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.*;
6 4 import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsChannelConvert;
7   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
8 5 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService;
  6 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
  7 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 9 import io.swagger.annotations.Api;
10 10 import io.swagger.annotations.ApiImplicitParam;
11 11 import io.swagger.annotations.ApiOperation;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.controller.sms;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6   -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7 3 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExcelVO;
8 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
9 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
10 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogRespVO;
11 7 import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsLogConvert;
12   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
13 8 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService;
  9 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
  10 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  11 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  12 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  13 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
14 14 import io.swagger.annotations.Api;
15 15 import io.swagger.annotations.ApiOperation;
16 16 import org.springframework.security.access.prepost.PreAuthorize;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.controller.sms;
2 2  
  3 +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.*;
  4 +import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert;
  5 +import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
  6 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  7 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
3 8 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 10 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 11 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7   -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.*;
8   -import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert;
9   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
10   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService;
11   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
12 12 import io.swagger.annotations.Api;
13 13 import io.swagger.annotations.ApiImplicitParam;
14 14 import io.swagger.annotations.ApiOperation;
... ... @@ -32,7 +32,7 @@ public class SysSmsTemplateController {
32 32 @Resource
33 33 private SysSmsTemplateService smsTemplateService;
34 34 @Resource
35   - private SysSmsService smsService;
  35 + private SysSmsCoreService smsCoreService;
36 36  
37 37 @PostMapping("/create")
38 38 @ApiOperation("创建短信模板")
... ... @@ -91,7 +91,7 @@ public class SysSmsTemplateController {
91 91 @ApiOperation("发送短信")
92 92 @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')")
93 93 public CommonResult<Long> sendSms(@Valid @RequestBody SysSmsTemplateSendReqVO sendReqVO) {
94   - return success(smsService.sendSingleSms(sendReqVO.getMobile(), null, null,
  94 + return success(smsCoreService.sendSingleSms(sendReqVO.getMobile(), null, null,
95 95 sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams()));
96 96 }
97 97  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.controller.user;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
7   -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
8   -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
9 4 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
10 5 import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert;
11 6 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
12   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
13   -import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
14 7 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
15 8 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  9 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  10 +import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
  11 +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
  12 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  13 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  14 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
16 15 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
17 16 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  17 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  18 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
18 19 import io.swagger.annotations.Api;
19 20 import io.swagger.annotations.ApiImplicitParam;
20 21 import io.swagger.annotations.ApiImplicitParams;
... ... @@ -42,6 +43,8 @@ public class SysUserController {
42 43 @Resource
43 44 private SysUserService userService;
44 45 @Resource
  46 + private SysUserCoreService userCoreService;
  47 + @Resource
45 48 private SysDeptService deptService;
46 49  
47 50 @PostMapping("/create")
... ... @@ -113,7 +116,7 @@ public class SysUserController {
113 116 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
114 117 @PreAuthorize("@ss.hasPermission('system:user:query')")
115 118 public CommonResult<SysUserRespVO> getInfo(@RequestParam("id") Long id) {
116   - return success(SysUserConvert.INSTANCE.convert(userService.getUser(id)));
  119 + return success(SysUserConvert.INSTANCE.convert(userCoreService.getUser(id)));
117 120 }
118 121  
119 122 @GetMapping("/export")
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.controller.user;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
5   -import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
6   -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
7   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
8 4 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileRespVO;
9 5 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
10 6 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
... ... @@ -12,12 +8,17 @@ import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert;
12 8 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
13 9 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
14 10 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
15   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
  11 +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
16 12 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
17 13 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
18 14 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
19 15 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
  16 +import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
20 17 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  18 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  19 +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
  20 +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
  21 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
21 22 import io.swagger.annotations.Api;
22 23 import io.swagger.annotations.ApiOperation;
23 24 import lombok.extern.slf4j.Slf4j;
... ... @@ -30,13 +31,10 @@ import javax.validation.Valid;
30 31 import java.io.IOException;
31 32 import java.util.List;
32 33  
  34 +import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY;
33 35 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
34 36 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
35   -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY;
36 37  
37   -/**
38   - * @author niudehua
39   - */
40 38 @Api(tags = "用户个人中心")
41 39 @RestController
42 40 @RequestMapping("/system/user/profile")
... ... @@ -47,6 +45,8 @@ public class SysUserProfileController {
47 45 @Resource
48 46 private SysUserService userService;
49 47 @Resource
  48 + private SysUserCoreService userCoreService;
  49 + @Resource
50 50 private SysDeptService deptService;
51 51 @Resource
52 52 private SysPostService postService;
... ... @@ -61,7 +61,7 @@ public class SysUserProfileController {
61 61 @ApiOperation("获得登录用户信息")
62 62 public CommonResult<SysUserProfileRespVO> profile() {
63 63 // 获得用户基本信息
64   - SysUserDO user = userService.getUser(getLoginUserId());
  64 + SysUserDO user = userCoreService.getUser(getLoginUserId());
65 65 SysUserProfileRespVO resp = SysUserConvert.INSTANCE.convert03(user);
66 66 // 获得用户角色
67 67 List<SysRoleDO> userRoles = roleService.getRolesFromCache(permissionService.listUserRoleIs(user.getId()));
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java
... ... @@ -8,6 +8,7 @@ import lombok.AllArgsConstructor;
8 8 import lombok.Builder;
9 9 import lombok.Data;
10 10 import lombok.NoArgsConstructor;
  11 +import lombok.experimental.Accessors;
11 12  
12 13 /**
13 14 * 用户 Excel 导入 VO
... ... @@ -16,6 +17,7 @@ import lombok.NoArgsConstructor;
16 17 @Builder
17 18 @AllArgsConstructor
18 19 @NoArgsConstructor
  20 +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
19 21 public class SysUserImportExcelVO {
20 22  
21 23 @ExcelProperty("登录名称")
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java
... ... @@ -2,17 +2,13 @@ package cn.iocoder.yudao.adminserver.modules.system.convert.auth;
2 2  
3 3 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO;
4 4 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO;
5   -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLogin2ReqVO;
6   -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
9 5 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO;
10 6 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
11   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
12 7 import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuIdEnum;
  8 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  9 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
13 10 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
14 11 import cn.iocoder.yudao.framework.security.core.LoginUser;
15   -import me.zhyd.oauth.model.AuthCallback;
16 12 import org.mapstruct.Mapper;
17 13 import org.mapstruct.Mapping;
18 14 import org.mapstruct.factory.Mappers;
... ... @@ -25,9 +21,13 @@ public interface SysAuthConvert {
25 21  
26 22 SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class);
27 23  
28   - @Mapping(source = "updateTime", target = "updateTime", ignore = true)
29   - // 字段相同,但是含义不同,忽略
30   - LoginUser convert(SysUserDO bean);
  24 + @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略
  25 + LoginUser convert0(SysUserDO bean);
  26 +
  27 + default LoginUser convert(SysUserDO bean) {
  28 + // 目的,为了设置 UserTypeEnum.ADMIN.getValue()
  29 + return convert0(bean).setUserType(UserTypeEnum.ADMIN.getValue());
  30 + }
31 31  
32 32 default SysAuthPermissionInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) {
33 33 return SysAuthPermissionInfoRespVO.builder()
... ... @@ -39,10 +39,6 @@ public interface SysAuthConvert {
39 39  
40 40 SysAuthMenuRespVO convertTreeNode(SysMenuDO menu);
41 41  
42   - LoginUser convert(SysUserProfileUpdateReqVO reqVO);
43   -
44   - LoginUser convert(SysUserProfileUpdatePasswordReqVO reqVO);
45   -
46 42 /**
47 43 * 将菜单列表,构建成菜单树
48 44 *
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysUserSessionConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.convert.auth;
2 2  
3 3 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO;
4   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
5 5 import org.mapstruct.Mapper;
6 6 import org.mapstruct.factory.Mappers;
7 7  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/dict/SysDictDataConvert.java
1 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 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 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 7 import org.mapstruct.Mapper;
8 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 1 package cn.iocoder.yudao.adminserver.modules.system.convert.logger;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO;
5 3 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO;
6 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 7 import org.mapstruct.Mapper;
9 8 import org.mapstruct.factory.Mappers;
10 9  
... ... @@ -15,8 +14,6 @@ public interface SysLoginLogConvert {
15 14  
16 15 SysLoginLogConvert INSTANCE = Mappers.getMapper(SysLoginLogConvert.class);
17 16  
18   - SysLoginLogDO convert(SysLoginLogCreateReqVO bean);
19   -
20 17 PageResult<SysLoginLogRespVO> convertPage(PageResult<SysLoginLogDO> page);
21 18  
22 19 List<SysLoginLogExcelVO> convertList(List<SysLoginLogDO> list);
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.convert.logger;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
5 3 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO;
6 4 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO;
7 5 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO;
8   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
  6 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 8 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  9 +import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
10 10 import org.mapstruct.Mapper;
11 11 import org.mapstruct.factory.Mappers;
12 12  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.convert.sms;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties;
5 3 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
6 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelRespVO;
7 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelSimpleRespVO;
8 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
9   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
  7 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  9 +import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties;
10 10 import org.mapstruct.Mapper;
11 11 import org.mapstruct.factory.Mappers;
12 12  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.convert.sms;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 3 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExcelVO;
5 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogRespVO;
6   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 7 import org.mapstruct.Mapper;
8 8 import org.mapstruct.factory.Mappers;
9 9  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.convert.sms;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 3 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
5 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExcelVO;
6 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateRespVO;
7 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  7 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 9 import org.mapstruct.Mapper;
10 10 import org.mapstruct.factory.Mappers;
11 11  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java
... ... @@ -8,7 +8,7 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO
8 8 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
9 9 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
10 10 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
11   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
  11 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
12 12 import org.mapstruct.Mapper;
13 13 import org.mapstruct.factory.Mappers;
14 14  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
5 6 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
7 7 import com.baomidou.mybatisplus.annotation.TableField;
8 8 import com.baomidou.mybatisplus.annotation.TableId;
9 9 import com.baomidou.mybatisplus.annotation.TableName;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/social/SysSocialUserDO.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social;
2 2  
3   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
4 4 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
5 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 6 import com.baomidou.mybatisplus.annotation.TableId;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/auth/SysUserSessionMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth;
2 2  
  3 +import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
3 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 7 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6   -import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9 9  
10 10 import java.util.Collection;
... ... @@ -23,4 +23,5 @@ public interface SysUserSessionMapper extends BaseMapperX&lt;SysUserSessionDO&gt; {
23 23 default List<SysUserSessionDO> selectListBySessionTimoutLt() {
24 24 return selectList(new QueryWrapperX<SysUserSessionDO>().lt("session_timeout",new Date()));
25 25 }
  26 +
26 27 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/dict/SysDictDataMapper.java
1 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 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 7 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 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 9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 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 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 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 7 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
7 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 9 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
10 10 import org.apache.ibatis.annotations.Mapper;
11 11  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms;
2 2  
  3 +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
3 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 7 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6   -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9 9 import org.apache.ibatis.annotations.Select;
10 10  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms;
2 2  
  3 +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
  4 +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
3 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 7 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 8 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6   -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
9 9 import org.apache.ibatis.annotations.Mapper;
10 10  
11 11 import java.util.List;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms;
2 2  
  3 +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
  4 +import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
3 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 7 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 8 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6   -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
9 9 import org.apache.ibatis.annotations.Mapper;
10   -import org.apache.ibatis.annotations.Select;
11 10  
12   -import java.util.Date;
13 11 import java.util.List;
14 12  
15 13 @Mapper
... ... @@ -47,7 +45,4 @@ public interface SysSmsTemplateMapper extends BaseMapperX&lt;SysSmsTemplateDO&gt; {
47 45 return selectCount("channel_id", channelId);
48 46 }
49 47  
50   - @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1")
51   - Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
52   -
53 48 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 7 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserExportReqVO;
7 8 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
9 9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 10 import org.apache.ibatis.annotations.Mapper;
11 11  
... ... @@ -19,14 +19,14 @@ public interface SysUserMapper extends BaseMapperX&lt;SysUserDO&gt; {
19 19 return selectOne(new QueryWrapper<SysUserDO>().eq("username", username));
20 20 }
21 21  
22   - default SysUserDO selectByMobile(String mobile) {
23   - return selectOne(new QueryWrapper<SysUserDO>().eq("mobile", mobile));
24   - }
25   -
26 22 default SysUserDO selectByEmail(String email) {
27 23 return selectOne(new QueryWrapper<SysUserDO>().eq("email", email));
28 24 }
29 25  
  26 + default SysUserDO selectByMobile(String mobile) {
  27 + return selectOne(new QueryWrapper<SysUserDO>().eq("mobile", mobile));
  28 + }
  29 +
30 30 default PageResult<SysUserDO> selectPage(SysUserPageReqVO reqVO, Collection<Long> deptIds) {
31 31 return selectPage(reqVO, new QueryWrapperX<SysUserDO>()
32 32 .likeIfPresent("username", reqVO.getUsername())
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/RedisKeyConstants.java deleted
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java
... ... @@ -15,10 +15,6 @@ import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.S
15 15 */
16 16 public interface SysRedisKeyConstants {
17 17  
18   - RedisKeyDefine LOGIN_USER = new RedisKeyDefine("登录用户的缓存",
19   - "login_user:%s", // 参数为 sessionId
20   - STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC);
21   -
22 18 RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存",
23 19 "captcha_code:%s", // 参数为 uuid
24 20 STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC);
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.enums;
2 2  
3   -import cn.iocoder.yudao.adminserver.modules.tool.framework.errorcode.config.ErrorCodeConfiguration;
4 3 import cn.iocoder.yudao.framework.common.exception.ErrorCode;
5   -import org.springframework.validation.Errors;
  4 +import javafx.beans.binding.MapExpression;
6 5  
7 6 /**
8 7 * System 错误码枚举类
... ... @@ -14,14 +13,11 @@ public interface SysErrorCodeConstants {
14 13 // ========== AUTH 模块 1002000000 ==========
15 14 ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1002000000, "登录失败,账号密码不正确");
16 15 ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1002000001, "登录失败,账号被禁用");
17   - ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1002000002, "登录失败"); // 登录失败的兜底,位置原因
  16 + ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1002000002, "登录失败"); // 登录失败的兜底,未知原因
18 17 ErrorCode AUTH_LOGIN_CAPTCHA_NOT_FOUND = new ErrorCode(1002000003, "验证码不存在");
19 18 ErrorCode AUTH_LOGIN_CAPTCHA_CODE_ERROR = new ErrorCode(1002000004, "验证码不正确");
20 19 ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1002000005, "未绑定账号,需要进行绑定");
21   -
22   - // ========== TOKEN 模块 1002001000 ==========
23   - ErrorCode TOKEN_EXPIRED = new ErrorCode(1002001000, "Token 已经过期");
24   - ErrorCode TOKEN_PARSE_FAIL = new ErrorCode(1002001001, "Token 解析失败");
  20 + ErrorCode AUTH_TOKEN_EXPIRED = new ErrorCode(1002000006, "Token 已经过期");
25 21  
26 22 // ========== 菜单模块 1002002000 ==========
27 23 ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1002002000, "已经存在该名字的菜单");
... ... @@ -90,10 +86,6 @@ public interface SysErrorCodeConstants {
90 86 ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1002011000, "短信模板不存在");
91 87 ErrorCode SMS_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1002011001, "已经存在编码为【{}】的短信模板");
92 88  
93   - // ========== 短信发送 1002012000 ==========
94   - ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002012000, "手机号不存在");
95   - ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002012001, "模板参数({})缺失");
96   -
97 89 // ========== 错误码模块 1002013000 ==========
98 90 ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002013000, "错误码不存在");
99 91 ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002013001, "已经存在编码为【{}】的错误码");
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginLogTypeEnum.java
... ... @@ -13,6 +13,8 @@ public enum SysLoginLogTypeEnum {
13 13 LOGIN_USERNAME(100), // 使用账号登录
14 14 LOGIN_SOCIAL(101), // 使用社交登录
15 15 LOGIN_MOCK(102), // 使用 Mock 登录
  16 + LOGIN_MOBILE(103), // 使用手机登陆
  17 + LOGIN_SMS(104), // 使用短信登陆
16 18  
17 19 LOGOUT_SELF(200), // 自己主动登出
18 20 LOGOUT_TIMEOUT(201), // 超时登出
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/logger/SysLoginResultEnum.java
... ... @@ -13,8 +13,8 @@ public enum SysLoginResultEnum {
13 13 SUCCESS(0), // 成功
14 14 BAD_CREDENTIALS(10), // 账号或密码不正确
15 15 USER_DISABLED(20), // 用户被禁用
16   - CAPTCHA_NOT_FOUND(30), // 验证码不存在
17   - CAPTCHA_CODE_ERROR(31), // 验证码不正确
  16 + CAPTCHA_NOT_FOUND(30), // 图片验证码不存在
  17 + CAPTCHA_CODE_ERROR(31), // 图片验证码不正确
18 18  
19 19 UNKNOWN_ERROR(100), // 未知异常
20 20 ;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/dict/SysDictDataRefreshConsumer.java
1 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 4 import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 5 import cn.iocoder.yudao.adminserver.modules.system.mq.message.dict.SysDictDataRefreshMessage;
5 6 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService;
... ... @@ -18,12 +19,12 @@ import javax.annotation.Resource;
18 19 public class SysDictDataRefreshConsumer extends AbstractChannelMessageListener<SysDictDataRefreshMessage> {
19 20  
20 21 @Resource
21   - private SysDictDataService dictDataService;
  22 + private SysDictDataCoreService dictDataCoreService;
22 23  
23 24 @Override
24 25 public void onMessage(SysDictDataRefreshMessage message) {
25 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/mq/consumer/sms/SysSmsSendConsumer.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
  4 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
3 5 import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
4   -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
5   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService;
6 6 import lombok.extern.slf4j.Slf4j;
7 7 import org.springframework.stereotype.Component;
8 8  
... ... @@ -19,12 +19,12 @@ import javax.annotation.Resource;
19 19 public class SysSmsSendConsumer extends AbstractStreamMessageListener<SysSmsSendMessage> {
20 20  
21 21 @Resource
22   - private SysSmsService smsService;
  22 + private SysSmsCoreService smsCoreService;
23 23  
24 24 @Override
25 25 public void onMessage(SysSmsSendMessage message) {
26 26 log.info("[onMessage][消息内容({})]", message);
27   - smsService.doSendSms(message);
  27 + smsCoreService.doSendSms(message);
28 28 }
29 29  
30 30 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms;
2 2  
3   -import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
4 3 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage;
5   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
  4 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService;
  5 +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
6 6 import lombok.extern.slf4j.Slf4j;
7 7 import org.springframework.stereotype.Component;
8 8  
... ... @@ -18,12 +18,12 @@ import javax.annotation.Resource;
18 18 public class SysSmsTemplateRefreshConsumer extends AbstractChannelMessageListener<SysSmsTemplateRefreshMessage> {
19 19  
20 20 @Resource
21   - private SysSmsTemplateService smsTemplateService;
  21 + private SysSmsTemplateCoreService smsTemplateCoreService;
22 22  
23 23 @Override
24 24 public void onMessage(SysSmsTemplateRefreshMessage message) {
25 25 log.info("[onMessage][收到 SmsTemplate 刷新消息]");
26   - smsTemplateService.initLocalCache();
  26 + smsTemplateCoreService.initLocalCache();
27 27 }
28 28  
29 29 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms;
3 3 import cn.iocoder.yudao.framework.common.core.KeyValue;
4 4 import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
5 5 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage;
6   -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
7 6 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage;
8 7 import lombok.extern.slf4j.Slf4j;
9 8 import org.springframework.data.redis.core.StringRedisTemplate;
... ... @@ -26,22 +25,6 @@ public class SysSmsProducer {
26 25 private StringRedisTemplate stringRedisTemplate;
27 26  
28 27 /**
29   - * 发送 {@link SysSmsSendMessage} 消息
30   - *
31   - * @param logId 短信日志编号
32   - * @param mobile 手机号
33   - * @param channelId 渠道编号
34   - * @param apiTemplateId 短信模板编号
35   - * @param templateParams 短信模板参数
36   - */
37   - public void sendSmsSendMessage(Long logId, String mobile,
38   - Long channelId, String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
39   - SysSmsSendMessage message = new SysSmsSendMessage().setLogId(logId).setMobile(mobile);
40   - message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams);
41   - RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message);
42   - }
43   -
44   - /**
45 28 * 发送 {@link SysSmsChannelRefreshMessage} 消息
46 29 */
47 30 public void sendSmsChannelRefreshMessage() {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthService.java
... ... @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkSer
6 6 import javax.validation.Valid;
7 7  
8 8 /**
9   - * 认证 Service 接口
  9 + * 管理后台的认证 Service 接口
10 10 *
11 11 * 提供用户的账号密码登录、token 的校验等认证相关的功能
12 12 *
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionService.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.auth;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.security.core.LoginUser;
5 3 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
6   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 6  
8 7 /**
9 8 * 在线用户 Session Service 接口
... ... @@ -13,53 +12,6 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSe
13 12 public interface SysUserSessionService {
14 13  
15 14 /**
16   - * 创建在线用户 Session
17   - *
18   - * @param loginUser 登录用户
19   - * @param userIp 用户 IP
20   - * @param userAgent 用户 UA
21   - * @return Session 编号
22   - */
23   - String createUserSession(LoginUser loginUser, String userIp, String userAgent);
24   -
25   - /**
26   - * 刷新在线用户 Session 的更新时间
27   - *
28   - * @param sessionId Session 编号
29   - * @param loginUser 登录用户
30   - */
31   - void refreshUserSession(String sessionId, LoginUser loginUser);
32   -
33   - /**
34   - * 删除在线用户 Session
35   - *
36   - * @param sessionId Session 编号
37   - */
38   - void deleteUserSession(String sessionId);
39   -
40   - /**
41   - * 获得 Session 编号对应的在线用户
42   - *
43   - * @param sessionId Session 编号
44   - * @return 在线用户
45   - */
46   - LoginUser getLoginUser(String sessionId);
47   -
48   - /**
49   - * 获取当前登录用户信息
50   - * @param username 用户名称
51   - * @return 在线用户
52   - */
53   - String getSessionId(String username);
54   -
55   - /**
56   - * 获得 Session 超时时间,单位:毫秒
57   - *
58   - * @return 超时时间
59   - */
60   - Long getSessionTimeoutMillis();
61   -
62   - /**
63 15 * 获得在线用户分页列表
64 16 *
65 17 * @param reqVO 分页条件
... ... @@ -73,4 +25,5 @@ public interface SysUserSessionService {
73 25 * @return {@link Long } 移出的超时用户数量
74 26 **/
75 27 long clearSessionTimeout();
  28 +
76 29 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
... ... @@ -5,20 +5,22 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAu
5 5 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialBindReqVO;
6 6 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLogin2ReqVO;
7 7 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO;
9 8 import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert;
10 9 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
11   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
12 10 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
13 11 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
14 12 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService;
15   -import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
16 13 import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService;
17   -import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
18 14 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
19 15 import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
20 16 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  17 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  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.coreservice.modules.system.service.user.SysUserCoreService;
21 22 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  23 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
22 24 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
23 25 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
24 26 import cn.iocoder.yudao.framework.security.core.LoginUser;
... ... @@ -38,6 +40,7 @@ import org.springframework.util.Assert;
38 40  
39 41 import javax.annotation.Resource;
40 42 import java.util.List;
  43 +import java.util.Objects;
41 44 import java.util.Set;
42 45  
43 46 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
... ... @@ -60,13 +63,15 @@ public class SysAuthServiceImpl implements SysAuthService {
60 63 @Resource
61 64 private SysUserService userService;
62 65 @Resource
  66 + private SysUserCoreService userCoreService;
  67 + @Resource
63 68 private SysPermissionService permissionService;
64 69 @Resource
65 70 private SysCaptchaService captchaService;
66 71 @Resource
67   - private SysLoginLogService loginLogService;
  72 + private SysLoginLogCoreService loginLogCoreService;
68 73 @Resource
69   - private SysUserSessionService userSessionService;
  74 + private SysUserSessionCoreService userSessionCoreService;
70 75 @Resource
71 76 private SysSocialService socialService;
72 77  
... ... @@ -84,7 +89,7 @@ public class SysAuthServiceImpl implements SysAuthService {
84 89 @Override
85 90 public LoginUser mockLogin(Long userId) {
86 91 // 获取用户编号对应的 SysUserDO
87   - SysUserDO user = userService.getUser(userId);
  92 + SysUserDO user = userCoreService.getUser(userId);
88 93 if (user == null) {
89 94 throw new UsernameNotFoundException(String.valueOf(userId));
90 95 }
... ... @@ -106,7 +111,7 @@ public class SysAuthServiceImpl implements SysAuthService {
106 111 loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表
107 112  
108 113 // 缓存登录用户到 Redis 中,返回 sessionId 编号
109   - return userSessionService.createUserSession(loginUser, userIp, userAgent);
  114 + return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
110 115 }
111 116  
112 117 private void verifyCaptcha(String username, String captchaUUID, String captchaCode) {
... ... @@ -154,14 +159,25 @@ public class SysAuthServiceImpl implements SysAuthService {
154 159 }
155 160  
156 161 private void createLoginLog(String username, SysLoginLogTypeEnum logTypeEnum, SysLoginResultEnum loginResult) {
157   - SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO();
158   - reqVO.setLogType(logTypeEnum.getType());
159   - reqVO.setTraceId(TracerUtils.getTraceId());
160   - reqVO.setUsername(username);
161   - reqVO.setUserAgent(ServletUtils.getUserAgent());
162   - reqVO.setUserIp(ServletUtils.getClientIP());
163   - reqVO.setResult(loginResult.getResult());
164   - loginLogService.createLoginLog(reqVO);
  162 + // 获得用户
  163 + SysUserDO user = userService.getUserByUsername(username);
  164 + // 插入登录日志
  165 + SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO();
  166 + reqDTO.setLogType(logTypeEnum.getType());
  167 + reqDTO.setTraceId(TracerUtils.getTraceId());
  168 + if (user != null) {
  169 + reqDTO.setUserId(user.getId());
  170 + }
  171 + reqDTO.setUserType(UserTypeEnum.ADMIN.getValue());
  172 + reqDTO.setUsername(username);
  173 + reqDTO.setUserAgent(ServletUtils.getUserAgent());
  174 + reqDTO.setUserIp(ServletUtils.getClientIP());
  175 + reqDTO.setResult(loginResult.getResult());
  176 + loginLogCoreService.createLoginLog(reqDTO);
  177 + // 更新最后登录时间
  178 + if (user != null && Objects.equals(SysLoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
  179 + userService.updateUserLogin(user.getId(), ServletUtils.getClientIP());
  180 + }
165 181 }
166 182  
167 183 /**
... ... @@ -188,7 +204,7 @@ public class SysAuthServiceImpl implements SysAuthService {
188 204 }
189 205  
190 206 // 自动登录
191   - SysUserDO user = userService.getUser(socialUsers.get(0).getUserId());
  207 + SysUserDO user = userCoreService.getUser(socialUsers.get(0).getUserId());
192 208 if (user == null) {
193 209 throw exception(USER_NOT_EXISTS);
194 210 }
... ... @@ -203,7 +219,7 @@ public class SysAuthServiceImpl implements SysAuthService {
203 219 socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser);
204 220  
205 221 // 缓存登录用户到 Redis 中,返回 sessionId 编号
206   - return userSessionService.createUserSession(loginUser, userIp, userAgent);
  222 + return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
207 223 }
208 224  
209 225 @Override
... ... @@ -220,7 +236,7 @@ public class SysAuthServiceImpl implements SysAuthService {
220 236 socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser);
221 237  
222 238 // 缓存登录用户到 Redis 中,返回 sessionId 编号
223   - return userSessionService.createUserSession(loginUser, userIp, userAgent);
  239 + return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
224 240 }
225 241  
226 242 @Override
... ... @@ -236,31 +252,33 @@ public class SysAuthServiceImpl implements SysAuthService {
236 252 @Override
237 253 public void logout(String token) {
238 254 // 查询用户信息
239   - LoginUser loginUser = userSessionService.getLoginUser(token);
  255 + LoginUser loginUser = userSessionCoreService.getLoginUser(token);
240 256 if (loginUser == null) {
241 257 return;
242 258 }
243 259 // 删除 session
244   - userSessionService.deleteUserSession(token);
245   - // 记录登出日子和
246   - this.createLogoutLog(loginUser.getUsername());
  260 + userSessionCoreService.deleteUserSession(token);
  261 + // 记录登出日志
  262 + this.createLogoutLog(loginUser.getId(), loginUser.getUsername());
247 263 }
248 264  
249   - private void createLogoutLog(String username) {
250   - SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO();
251   - reqVO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType());
252   - reqVO.setTraceId(TracerUtils.getTraceId());
253   - reqVO.setUsername(username);
254   - reqVO.setUserAgent(ServletUtils.getUserAgent());
255   - reqVO.setUserIp(ServletUtils.getClientIP());
256   - reqVO.setResult(SysLoginResultEnum.SUCCESS.getResult());
257   - loginLogService.createLoginLog(reqVO);
  265 + private void createLogoutLog(Long userId, String username) {
  266 + SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO();
  267 + reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType());
  268 + reqDTO.setTraceId(TracerUtils.getTraceId());
  269 + reqDTO.setUserId(userId);
  270 + reqDTO.setUserType(UserTypeEnum.ADMIN.getValue());
  271 + reqDTO.setUsername(username);
  272 + reqDTO.setUserAgent(ServletUtils.getUserAgent());
  273 + reqDTO.setUserIp(ServletUtils.getClientIP());
  274 + reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult());
  275 + loginLogCoreService.createLoginLog(reqDTO);
258 276 }
259 277  
260 278 @Override
261 279 public LoginUser verifyTokenAndRefresh(String token) {
262 280 // 获得 LoginUser
263   - LoginUser loginUser = userSessionService.getLoginUser(token);
  281 + LoginUser loginUser = userSessionCoreService.getLoginUser(token);
264 282 if (loginUser == null) {
265 283 return null;
266 284 }
... ... @@ -272,20 +290,20 @@ public class SysAuthServiceImpl implements SysAuthService {
272 290 private void refreshLoginUserCache(String token, LoginUser loginUser) {
273 291 // 每 1/3 的 Session 超时时间,刷新 LoginUser 缓存
274 292 if (System.currentTimeMillis() - loginUser.getUpdateTime().getTime() <
275   - userSessionService.getSessionTimeoutMillis() / 3) {
  293 + userSessionCoreService.getSessionTimeoutMillis() / 3) {
276 294 return;
277 295 }
278 296  
279 297 // 重新加载 SysUserDO 信息
280   - SysUserDO user = userService.getUser(loginUser.getId());
  298 + SysUserDO user = userCoreService.getUser(loginUser.getId());
281 299 if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) {
282   - throw exception(TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面
  300 + throw exception(AUTH_TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面
283 301 }
284 302  
285 303 // 刷新 LoginUser 缓存
286 304 loginUser.setDeptId(user.getDeptId());
287 305 loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId()));
288   - userSessionService.refreshUserSession(token, loginUser);
  306 + userSessionCoreService.refreshUserSession(token, loginUser);
289 307 }
290 308  
291 309 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.auth.impl;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.util.IdUtil;
5 4 import cn.hutool.core.util.StrUtil;
6   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
7   -import cn.iocoder.yudao.framework.security.config.SecurityProperties;
8   -import cn.iocoder.yudao.framework.security.core.LoginUser;
9   -import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
10 5 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
11   -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO;
12   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO;
13   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
14 6 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper;
15   -import cn.iocoder.yudao.adminserver.modules.system.dal.redis.auth.SysLoginUserRedisDAO;
16 7 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
17 8 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
18 9 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
19   -import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
20 10 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
21   -import com.baomidou.mybatisplus.core.conditions.Wrapper;
22   -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
23   -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  11 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
  12 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  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.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
  16 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  17 +import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
24 18 import com.google.common.collect.Lists;
25 19 import lombok.extern.slf4j.Slf4j;
26 20 import org.springframework.stereotype.Service;
27 21  
28 22 import javax.annotation.Resource;
29   -import java.time.Duration;
30   -import java.util.*;
  23 +import java.util.ArrayList;
  24 +import java.util.Collection;
  25 +import java.util.List;
  26 +import java.util.Map;
31 27 import java.util.stream.Collectors;
32 28  
33 29 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
34   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
35 30  
36 31 /**
37 32 * 在线用户 Session Service 实现类
... ... @@ -43,72 +38,14 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
43 38 public class SysUserSessionServiceImpl implements SysUserSessionService {
44 39  
45 40 @Resource
46   - private SecurityProperties securityProperties;
47   - @Resource
48   - private SysLoginUserRedisDAO loginUserRedisDAO;
49   - @Resource
50 41 private SysUserSessionMapper userSessionMapper;
51 42 @Resource
52 43 private SysUserService userService;
53 44 @Resource
54   - private SysLoginLogService loginLogService;
55   -
56   - @Override
57   - public String createUserSession(LoginUser loginUser, String userIp, String userAgent) {
58   - // 生成 Session 编号
59   - String sessionId = generateSessionId();
60   - // 写入 Redis 缓存
61   - loginUser.setUpdateTime(new Date());
62   - loginUserRedisDAO.set(sessionId, loginUser);
63   - // 写入 DB 中
64   - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
65   - .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(loginUser.getUsername())
66   - .sessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis())))
67   - .build();
68   - userSessionMapper.insert(userSession);
69   - // 返回 Session 编号
70   - return sessionId;
71   - }
72   -
73   - @Override
74   - public void refreshUserSession(String sessionId, LoginUser loginUser) {
75   - // 写入 Redis 缓存
76   - loginUser.setUpdateTime(new Date());
77   - loginUserRedisDAO.set(sessionId, loginUser);
78   - // 更新 DB 中
79   - SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build();
80   - updateObj.setUsername(loginUser.getUsername());
81   - updateObj.setUpdateTime(new Date());
82   - updateObj.setSessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis())));
83   - userSessionMapper.updateById(updateObj);
84   - }
85   -
86   - @Override
87   - public void deleteUserSession(String sessionId) {
88   - // 删除 Redis 缓存
89   - loginUserRedisDAO.delete(sessionId);
90   - // 删除 DB 记录
91   - userSessionMapper.deleteById(sessionId);
92   - }
  45 + private SysLoginLogCoreService loginLogCoreService;
93 46  
94   - @Override
95   - public LoginUser getLoginUser(String sessionId) {
96   - return loginUserRedisDAO.get(sessionId);
97   - }
98   -
99   - @Override
100   - public String getSessionId(String username) {
101   - QueryWrapper<SysUserSessionDO> wrapper = new QueryWrapper<>();
102   - wrapper.eq("username", username);
103   - wrapper.orderByDesc("create_time");
104   - SysUserSessionDO sysUserSessionDO = userSessionMapper.selectOne(wrapper);
105   - return sysUserSessionDO.getId();
106   - }
107   -
108   - @Override
109   - public Long getSessionTimeoutMillis() {
110   - return securityProperties.getSessionTimeout().toMillis();
111   - }
  47 + @Resource
  48 + private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO;
112 49  
113 50 @Override
114 51 public PageResult<SysUserSessionDO> getUserSessionPage(SysUserSessionPageReqVO reqVO) {
... ... @@ -123,18 +60,20 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
123 60 return userSessionMapper.selectPage(reqVO, userIds);
124 61 }
125 62  
  63 + // TODO @芋艿:优化下该方法
126 64 @Override
127 65 public long clearSessionTimeout() {
128 66 // 获取db里已经超时的用户列表
129 67 List<SysUserSessionDO> sessionTimeoutDOS = userSessionMapper.selectListBySessionTimoutLt();
130 68 Map<String, SysUserSessionDO> timeoutSessionDOMap = sessionTimeoutDOS
131 69 .stream()
132   - .filter(sessionDO -> loginUserRedisDAO.get(sessionDO.getId()) == null)
  70 + .filter(sessionDO -> loginUserCoreRedisDAO.get(sessionDO.getId()) == null)
133 71 .collect(Collectors.toMap(SysUserSessionDO::getId, o -> o));
134 72 // 确认已经超时,按批次移出在线用户列表
135 73 if (CollUtil.isNotEmpty(timeoutSessionDOMap)) {
136   - Lists.partition(new ArrayList<>(timeoutSessionDOMap.keySet()), 100).forEach(userSessionMapper::deleteBatchIds);
137   - //记录用户超时退出日志
  74 + Lists.partition(new ArrayList<>(timeoutSessionDOMap.keySet()), 100)
  75 + .forEach(userSessionMapper::deleteBatchIds);
  76 + // 记录用户超时退出日志
138 77 createTimeoutLogoutLog(timeoutSessionDOMap.values());
139 78 }
140 79 return timeoutSessionDOMap.size();
... ... @@ -142,24 +81,17 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
142 81  
143 82 private void createTimeoutLogoutLog(Collection<SysUserSessionDO> timeoutSessionDOS) {
144 83 for (SysUserSessionDO timeoutSessionDO : timeoutSessionDOS) {
145   - SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO();
146   - reqVO.setLogType(SysLoginLogTypeEnum.LOGOUT_TIMEOUT.getType());
147   - reqVO.setTraceId(TracerUtils.getTraceId());
148   - reqVO.setUsername(timeoutSessionDO.getUsername());
149   - reqVO.setUserAgent(timeoutSessionDO.getUserAgent());
150   - reqVO.setUserIp(timeoutSessionDO.getUserIp());
151   - reqVO.setResult(SysLoginResultEnum.SUCCESS.getResult());
152   - loginLogService.createLoginLog(reqVO);
  84 + SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO();
  85 + reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_TIMEOUT.getType());
  86 + reqDTO.setTraceId(TracerUtils.getTraceId());
  87 + reqDTO.setUserId(timeoutSessionDO.getUserId());
  88 + reqDTO.setUserType(timeoutSessionDO.getUserType());
  89 + reqDTO.setUsername(timeoutSessionDO.getUsername());
  90 + reqDTO.setUserAgent(timeoutSessionDO.getUserAgent());
  91 + reqDTO.setUserIp(timeoutSessionDO.getUserIp());
  92 + reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult());
  93 + loginLogCoreService.createLoginLog(reqDTO);
153 94 }
154 95 }
155 96  
156   - /**
157   - * 生成 Session 编号,目前采用 UUID 算法
158   - *
159   - * @return Session 编号
160   - */
161   - private static String generateSessionId() {
162   - return IdUtil.fastSimpleUUID();
163   - }
164   -
165 97 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataService.java
1 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 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService;
5 6 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO;
6 7 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO;
7 8 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO;
8 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 11 import java.util.List;
12 12  
... ... @@ -15,12 +15,7 @@ import java.util.List;
15 15 *
16 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 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 3 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO;
9 4 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO;
10 5 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO;
11 6 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataUpdateReqVO;
12 7 import cn.iocoder.yudao.adminserver.modules.system.convert.dict.SysDictDataConvert;
13   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictDataDO;
14 8 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO;
15 9 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper;
16 10 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer;
17 11 import cn.iocoder.yudao.adminserver.modules.system.service.dict.SysDictDataService;
18 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 16 import com.google.common.annotations.VisibleForTesting;
20   -import com.google.common.collect.ImmutableTable;
21 17 import lombok.extern.slf4j.Slf4j;
22   -import org.springframework.scheduling.annotation.Scheduled;
23 18 import org.springframework.stereotype.Service;
24 19  
25   -import javax.annotation.PostConstruct;
26 20 import javax.annotation.Resource;
27 21 import java.util.Comparator;
28 22 import java.util.Date;
29 23 import java.util.List;
30 24  
31   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
32 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 29 * 字典数据 Service 实现类
... ... @@ -47,31 +41,6 @@ public class SysDictDataServiceImpl implements SysDictDataService {
47 41 .comparing(SysDictDataDO::getDictType)
48 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 44 @Resource
76 45 private SysDictTypeService dictTypeService;
77 46  
... ... @@ -81,34 +50,6 @@ public class SysDictDataServiceImpl implements SysDictDataService {
81 50 @Resource
82 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 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 1 package cn.iocoder.yudao.adminserver.modules.system.service.logger;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO;
5 3 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
6 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 8 import java.util.List;
10 9  
... ... @@ -14,13 +13,6 @@ import java.util.List;
14 13 public interface SysLoginLogService {
15 14  
16 15 /**
17   - * 创建登录日志
18   - *
19   - * @param reqVO 日志信息
20   - */
21   - void createLoginLog(SysLoginLogCreateReqVO reqVO);
22   -
23   - /**
24 16 * 获得登录日志分页
25 17 *
26 18 * @param reqVO 分页条件
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysLoginLogServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.logger.impl;
2 2  
3   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
4   -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
5   -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
6   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
7   -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO;
8 3 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
9 4 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
10   -import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysLoginLogConvert;
11   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO;
12 5 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper;
13 6 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
  7 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
14 9 import org.springframework.stereotype.Service;
15 10  
16 11 import javax.annotation.Resource;
... ... @@ -24,21 +19,6 @@ public class SysLoginLogServiceImpl implements SysLoginLogService {
24 19  
25 20 @Resource
26 21 private SysLoginLogMapper loginLogMapper;
27   - @Resource
28   - private SysUserService userService;
29   -
30   - @Override
31   - public void createLoginLog(SysLoginLogCreateReqVO reqVO) {
32   - SysLoginLogDO loginLog = SysLoginLogConvert.INSTANCE.convert(reqVO);
33   - // 获得用户
34   - SysUserDO user = userService.getUserByUsername(reqVO.getUsername());
35   - if (user != null) {
36   - loginLog.setUserId(user.getId());
37   - }
38   - loginLog.setUserType(UserTypeEnum.ADMIN.getValue());
39   - // 插入
40   - loginLogMapper.insert(loginLog);
41   - }
42 22  
43 23 @Override
44 24 public PageResult<SysLoginLogDO> getLoginLogPage(SysLoginLogPageReqVO reqVO) {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java
... ... @@ -2,17 +2,17 @@ package cn.iocoder.yudao.adminserver.modules.system.service.logger.impl;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.StrUtil;
5   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
7 5 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO;
8 6 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO;
9 7 import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysOperateLogConvert;
10 8 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO;
11   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
12 9 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysOperateLogMapper;
13 10 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysOperateLogService;
14 11 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  12 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  13 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
15 14 import cn.iocoder.yudao.framework.common.util.string.StrUtils;
  15 +import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
16 16 import lombok.extern.slf4j.Slf4j;
17 17 import org.springframework.scheduling.annotation.Async;
18 18 import org.springframework.scheduling.annotation.AsyncResult;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.sms;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
5 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
6 7 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
8 8  
9 9 import javax.validation.Valid;
10 10 import java.util.Collection;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.sms;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 3 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
5 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
6   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
7   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 7  
9   -import java.util.Date;
10 8 import java.util.List;
11   -import java.util.Map;
12 9  
13 10 /**
14   - * 短信日志 Service 实现类
  11 + * 短信日志 Service 接口
15 12 *
16 13 * @author zzf
17 14 * @date 13:48 2021/3/2
... ... @@ -19,46 +16,6 @@ import java.util.Map;
19 16 public interface SysSmsLogService {
20 17  
21 18 /**
22   - * 创建短信日志
23   - *
24   - * @param mobile 手机号
25   - * @param userId 用户编号
26   - * @param userType 用户类型
27   - * @param isSend 是否发送
28   - * @param template 短信模板
29   - * @param templateContent 短信内容
30   - * @param templateParams 短信参数
31   - * @return 发送日志编号
32   - */
33   - Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
34   - SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams);
35   -
36   - /**
37   - * 更新日志的发送结果
38   - *
39   - * @param id 日志编号
40   - * @param sendCode 发送结果的编码
41   - * @param sendMsg 发送结果的提示
42   - * @param apiSendCode 短信 API 发送结果的编码
43   - * @param apiSendMsg 短信 API 发送失败的提示
44   - * @param apiRequestId 短信 API 发送返回的唯一请求 ID
45   - * @param apiSerialNo 短信 API 发送返回的序号
46   - */
47   - void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
48   - String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo);
49   -
50   - /**
51   - * 更新日志的接收结果
52   - *
53   - * @param id 日志编号
54   - * @param success 是否接收成功
55   - * @param receiveTime 用户接收时间
56   - * @param apiReceiveCode API 接收结果的编码
57   - * @param apiReceiveMsg API 接收结果的说明
58   - */
59   - void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg);
60   -
61   - /**
62 19 * 获得短信日志分页
63 20 *
64 21 * @param pageReqVO 分页查询
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.sms;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 3 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
5 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
6 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
7 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  7 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 9  
10 10 import javax.validation.Valid;
11 11 import java.util.Collection;
12 12 import java.util.List;
13   -import java.util.Map;
14 13  
15 14 /**
16 15 * 短信模板 Service 接口
... ... @@ -21,11 +20,6 @@ import java.util.Map;
21 20 public interface SysSmsTemplateService {
22 21  
23 22 /**
24   - * 初始化短信模板的本地缓存
25   - */
26   - void initLocalCache();
27   -
28   - /**
29 23 * 获得短信模板
30 24 *
31 25 * @param code 模板编码
... ... @@ -34,23 +28,6 @@ public interface SysSmsTemplateService {
34 28 SysSmsTemplateDO getSmsTemplateByCode(String code);
35 29  
36 30 /**
37   - * 获得短信模板,从缓存中
38   - *
39   - * @param code 模板编码
40   - * @return 短信模板
41   - */
42   - SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code);
43   -
44   - /**
45   - * 格式化短信内容
46   - *
47   - * @param content 短信模板的内容
48   - * @param params 内容的参数
49   - * @return 格式化后的内容
50   - */
51   - String formatSmsTemplateContent(String content, Map<String, Object> params);
52   -
53   - /**
54 31 * 创建短信模板
55 32 *
56 33 * @param createReqVO 创建信息
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6   -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
7   -import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties;
8 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
9 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
10 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
11 7 import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsChannelConvert;
12   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
13 8 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsChannelMapper;
14 9 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
15 10 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService;
16 11 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
  12 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
  13 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  14 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  15 +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
  16 +import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties;
17 17 import lombok.extern.slf4j.Slf4j;
18 18 import org.springframework.scheduling.annotation.Scheduled;
19 19 import org.springframework.stereotype.Service;
... ... @@ -25,9 +25,9 @@ import java.util.Comparator;
25 25 import java.util.Date;
26 26 import java.util.List;
27 27  
28   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
29 28 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN;
30 29 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS;
  30 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
31 31  
32 32 /**
33 33 * 短信渠道Service实现类
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 3 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
6 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
8   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
9 5 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsLogMapper;
10   -import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsReceiveStatusEnum;
11   -import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsSendStatusEnum;
12 6 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService;
  7 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
13 9 import lombok.extern.slf4j.Slf4j;
14 10 import org.springframework.stereotype.Service;
15 11  
16 12 import javax.annotation.Resource;
17   -import java.util.Date;
18 13 import java.util.List;
19   -import java.util.Map;
20   -import java.util.Objects;
21 14  
22 15 /**
23 16 * 短信日志 Service 实现类
... ... @@ -33,47 +26,6 @@ public class SysSmsLogServiceImpl implements SysSmsLogService {
33 26 private SysSmsLogMapper smsLogMapper;
34 27  
35 28 @Override
36   - public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
37   - SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams) {
38   - SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder();
39   - // 根据是否要发送,设置状态
40   - logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus()
41   - : SysSmsSendStatusEnum.IGNORE.getStatus());
42   - // 设置手机相关字段
43   - logBuilder.mobile(mobile).userId(userId).userType(userType);
44   - // 设置模板相关字段
45   - logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType());
46   - logBuilder.templateContent(templateContent).templateParams(templateParams).apiTemplateId(template.getApiTemplateId());
47   - // 设置渠道相关字段
48   - logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode());
49   - // 设置接收相关字段
50   - logBuilder.receiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus());
51   -
52   - // 插入数据库
53   - SysSmsLogDO logDO = logBuilder.build();
54   - smsLogMapper.insert(logDO);
55   - return logDO.getId();
56   - }
57   -
58   - @Override
59   - public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
60   - String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) {
61   - SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS
62   - : SysSmsSendStatusEnum.FAILURE;
63   - smsLogMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()).sendTime(new Date())
64   - .sendCode(sendCode).sendMsg(sendMsg).apiSendCode(apiSendCode).apiSendMsg(apiSendMsg)
65   - .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build());
66   - }
67   -
68   - @Override
69   - public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg) {
70   - SysSmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? SysSmsReceiveStatusEnum.SUCCESS
71   - : SysSmsReceiveStatusEnum.FAILURE;
72   - smsLogMapper.updateById(SysSmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()).receiveTime(receiveTime)
73   - .apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
74   - }
75   -
76   - @Override
77 29 public PageResult<SysSmsLogDO> getSmsLogPage(SysSmsLogPageReqVO pageReqVO) {
78 30 return smsLogMapper.selectPage(pageReqVO);
79 31 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl;
2 2  
3   -import cn.hutool.core.collection.CollUtil;
4 3 import cn.hutool.core.util.ReUtil;
5   -import cn.hutool.core.util.StrUtil;
6   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
8   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
9   -import cn.iocoder.yudao.framework.sms.core.client.SmsClient;
10   -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
11   -import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
12   -import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO;
13 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
14 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
15 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
16 7 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
17 8 import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert;
18   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
19   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
20 9 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsTemplateMapper;
21 10 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
22 11 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService;
23 12 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
  13 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
  14 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  15 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  16 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  17 +import cn.iocoder.yudao.framework.sms.core.client.SmsClient;
  18 +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
  19 +import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
  20 +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO;
24 21 import com.google.common.annotations.VisibleForTesting;
25   -import com.google.common.collect.ImmutableMap;
26 22 import lombok.extern.slf4j.Slf4j;
27   -import org.springframework.scheduling.annotation.Scheduled;
28 23 import org.springframework.stereotype.Service;
29 24 import org.springframework.util.Assert;
30 25  
31   -import javax.annotation.PostConstruct;
32 26 import javax.annotation.Resource;
33   -import java.util.*;
  27 +import java.util.Collection;
  28 +import java.util.List;
  29 +import java.util.Objects;
34 30 import java.util.regex.Pattern;
35 31  
36   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
37 32 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
  33 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
38 34  
39 35 /**
40 36 * 短信模板Service实现类
... ... @@ -51,24 +47,6 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService {
51 47 */
52 48 private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}");
53 49  
54   - /**
55   - * 定时执行 {@link #schedulePeriodicRefresh()} 的周期
56   - * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高
57   - */
58   - private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L;
59   -
60   - /**
61   - * 短信模板缓存
62   - * key:短信模板编码 {@link SysSmsTemplateDO#getCode()}
63   - *
64   - * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向
65   - */
66   - private volatile Map<String, SysSmsTemplateDO> smsTemplateCache;
67   - /**
68   - * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新
69   - */
70   - private volatile Date maxUpdateTime;
71   -
72 50 @Resource
73 51 private SysSmsTemplateMapper smsTemplateMapper;
74 52  
... ... @@ -81,68 +59,11 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService {
81 59 @Resource
82 60 private SysSmsProducer smsProducer;
83 61  
84   - /**
85   - * 初始化 {@link #smsTemplateCache} 缓存
86   - */
87   - @Override
88   - @PostConstruct
89   - public void initLocalCache() {
90   - // 获取短信模板列表,如果有更新
91   - List<SysSmsTemplateDO> smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime);
92   - if (CollUtil.isEmpty(smsTemplateList)) {
93   - return;
94   - }
95   -
96   - // 写入缓存
97   - ImmutableMap.Builder<String, SysSmsTemplateDO> builder = ImmutableMap.builder();
98   - smsTemplateList.forEach(sysSmsTemplateDO -> builder.put(sysSmsTemplateDO.getCode(), sysSmsTemplateDO));
99   - smsTemplateCache = builder.build();
100   - assert smsTemplateList.size() > 0; // 断言,避免告警
101   - maxUpdateTime = smsTemplateList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime();
102   - log.info("[initLocalCache][初始化 SmsTemplate 数量为 {}]", smsTemplateList.size());
103   - }
104   -
105   - @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD)
106   - public void schedulePeriodicRefresh() {
107   - initLocalCache();
108   - }
109   -
110   - /**
111   - * 如果短信模板发生变化,从数据库中获取最新的全量短信模板。
112   - * 如果未发生变化,则返回空
113   - *
114   - * @param maxUpdateTime 当前短信模板的最大更新时间
115   - * @return 短信模板列表
116   - */
117   - private List<SysSmsTemplateDO> loadSmsTemplateIfUpdate(Date maxUpdateTime) {
118   - // 第一步,判断是否要更新。
119   - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
120   - log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]");
121   - } else { // 判断数据库中是否有更新的短信模板
122   - if (smsTemplateMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) {
123   - return null;
124   - }
125   - log.info("[loadSmsTemplateIfUpdate][增量加载全量短信模板]");
126   - }
127   - // 第二步,如果有更新,则从数据库加载所有短信模板
128   - return smsTemplateMapper.selectList();
129   - }
130   -
131 62 @Override
132 63 public SysSmsTemplateDO getSmsTemplateByCode(String code) {
133 64 return smsTemplateMapper.selectByCode(code);
134 65 }
135 66  
136   - @Override
137   - public SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code) {
138   - return smsTemplateCache.get(code);
139   - }
140   -
141   - @Override
142   - public String formatSmsTemplateContent(String content, Map<String, Object> params) {
143   - return StrUtil.format(content, params);
144   - }
145   -
146 67 @VisibleForTesting
147 68 public List<String> parseTemplateContentParams(String content) {
148 69 return ReUtil.findAllGroup1(PATTERN_PARAMS, content);
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.user;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 4 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
6 5 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserCreateReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserExportReqVO;
9   -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserImportExcelVO;
10   -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserImportRespVO;
11   -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO;
12   -import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
13   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
  6 +import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
  7 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  8 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
14 9 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
15 10  
16 11 import java.io.InputStream;
... ... @@ -20,7 +15,7 @@ import java.util.List;
20 15 import java.util.Map;
21 16  
22 17 /**
23   - * 用户 Service 接口
  18 + * 后台用户 Service 接口
24 19 *
25 20 * @author 芋道源码
26 21 */
... ... @@ -42,6 +37,14 @@ public interface SysUserService {
42 37 void updateUser(SysUserUpdateReqVO reqVO);
43 38  
44 39 /**
  40 + * 更新用户的最后登陆信息
  41 + *
  42 + * @param id 用户编号
  43 + * @param loginIp 登陆 IP
  44 + */
  45 + void updateUserLogin(Long id, String loginIp);
  46 +
  47 + /**
45 48 * 修改用户个人信息
46 49 *
47 50 * @param id 用户编号
... ... @@ -97,14 +100,6 @@ public interface SysUserService {
97 100 SysUserDO getUserByUsername(String username);
98 101  
99 102 /**
100   - * 通过用户 ID 查询用户
101   - *
102   - * @param id 用户ID
103   - * @return 用户对象信息
104   - */
105   - SysUserDO getUser(Long id);
106   -
107   - /**
108 103 * 获得用户分页列表
109 104 *
110 105 * @param reqVO 分页条件
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java
... ... @@ -11,12 +11,12 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
11 11 import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert;
12 12 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
13 13 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
14   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
15 14 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper;
16 15 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
17 16 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
18 17 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
19 18 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  19 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
20 20 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
21 21 import cn.iocoder.yudao.framework.common.exception.ServiceException;
22 22 import cn.iocoder.yudao.framework.common.pojo.PageResult;
... ... @@ -85,6 +85,11 @@ public class SysUserServiceImpl implements SysUserService {
85 85 }
86 86  
87 87 @Override
  88 + public void updateUserLogin(Long id, String loginIp) {
  89 + userMapper.updateById(new SysUserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date()));
  90 + }
  91 +
  92 + @Override
88 93 public void updateUserProfile(Long id, SysUserProfileUpdateReqVO reqVO) {
89 94 // 校验正确性
90 95 this.checkUserExists(id);
... ... @@ -155,11 +160,6 @@ public class SysUserServiceImpl implements SysUserService {
155 160 }
156 161  
157 162 @Override
158   - public SysUserDO getUser(Long id) {
159   - return userMapper.selectById(id);
160   - }
161   -
162   - @Override
163 163 public PageResult<SysUserDO> getUserPage(SysUserPageReqVO reqVO) {
164 164 return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId()));
165 165 }
... ...
yudao-admin-server/src/main/resources/application-dev.yaml
... ... @@ -99,7 +99,7 @@ apollo:
99 99 eagerLoad:
100 100 enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置
101 101 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址
102   - dao: cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigDAOImpl
  102 + dao: cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.config.InfConfigCoreDAOImpl
103 103 url: ${spring.datasource.dynamic.datasource.master.url}
104 104 username: ${spring.datasource.dynamic.datasource.master.username}
105 105 password: ${spring.datasource.dynamic.datasource.master.password}
... ...
yudao-admin-server/src/main/resources/application-local.yaml
... ... @@ -99,7 +99,7 @@ apollo:
99 99 eagerLoad:
100 100 enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置
101 101 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址
102   - dao: cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigDAOImpl
  102 + dao: cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.config.InfConfigCoreDAOImpl
103 103 url: ${spring.datasource.dynamic.datasource.master.url}
104 104 username: ${spring.datasource.dynamic.datasource.master.username}
105 105 password: ${spring.datasource.dynamic.datasource.master.password}
... ...
yudao-admin-server/src/main/resources/application.yaml
... ... @@ -31,7 +31,7 @@ mybatis-plus:
31 31 logic-delete-value: 1 # 逻辑已删除值(默认为 1)
32 32 logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
33 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 39 info:
40 40 version: 1.0.0
41 41 base-package: cn.iocoder.yudao.adminserver
  42 + core-service:
  43 + base-package: cn.iocoder.yudao.coreservice
42 44 web:
43 45 api-prefix: /api
44 46 controller-package: ${yudao.info.base-package}
... ...
yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/framework/redis/core/stream/RedisStreamTest.java
... ... @@ -5,7 +5,7 @@ import cn.iocoder.yudao.adminserver.BaseRedisIntegrationTest;
5 5 import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.mail.SysMailSendConsumer;
6 6 import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms.SysSmsSendConsumer;
7 7 import cn.iocoder.yudao.adminserver.modules.system.mq.message.mail.SysMailSendMessage;
8   -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
  8 +import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
9 9 import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
10 10 import org.junit.jupiter.api.Disabled;
11 11 import org.junit.jupiter.api.Test;
... ...
yudao-admin-server/src/test-integration/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceIntegrationTest.java
... ... @@ -7,9 +7,9 @@ import cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms.SysSmsSendCon
7 7 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
8 8 import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsChannelServiceImpl;
9 9 import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsLogServiceImpl;
10   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsServiceImpl;
11 10 import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsTemplateServiceImpl;
12 11 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  12 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsCoreServiceImpl;
13 13 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
14 14 import cn.iocoder.yudao.framework.sms.config.YudaoSmsAutoConfiguration;
15 15 import org.junit.jupiter.api.Test;
... ... @@ -20,13 +20,14 @@ import javax.annotation.Resource;
20 20 import java.util.Map;
21 21 import java.util.concurrent.TimeUnit;
22 22  
  23 +// TODO @芋艿:需要迁移
23 24 @Import({YudaoSmsAutoConfiguration.class,
24   - SysSmsChannelServiceImpl.class, SysSmsServiceImpl.class, SysSmsTemplateServiceImpl.class, SysSmsLogServiceImpl.class,
  25 + SysSmsChannelServiceImpl.class, SysSmsCoreServiceImpl.class, SysSmsTemplateServiceImpl.class, SysSmsLogServiceImpl.class,
25 26 SysSmsProducer.class, SysSmsSendConsumer.class})
26 27 public class SysSmsServiceIntegrationTest extends BaseDbAndRedisIntegrationTest {
27 28  
28 29 @Resource
29   - private SysSmsServiceImpl smsService;
  30 + private SysSmsCoreServiceImpl smsService;
30 31 @Resource
31 32 private SysSmsChannelServiceImpl smsChannelService;
32 33  
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/BaseRedisUnitTest.java
... ... @@ -24,7 +24,7 @@ public class BaseRedisUnitTest {
24 24 // Redis 配置类
25 25 RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer
26 26 RedisAutoConfiguration.class, // Spring Redis 自动配置类
27   - YudaoTracerAutoConfiguration.class, // 自己的 Redis 配置类
  27 + YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
28 28 RedissonAutoConfiguration.class, // Redisson 自动高配置类
29 29 })
30 30 public static class Application {
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/config/InfConfigServiceTest.java
1 1 package cn.iocoder.yudao.adminserver.modules.infra.service.config;
2 2  
3 3 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO;
7 8 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO;
8 9 import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO;
9   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.config.InfConfigDO;
10 10 import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigMapper;
11 11 import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum;
12 12 import cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config.InfConfigProducer;
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/file/InfFileServiceTest.java
... ... @@ -2,14 +2,15 @@ package cn.iocoder.yudao.adminserver.modules.infra.service.file;
2 2  
3 3 import cn.hutool.core.io.resource.ResourceUtil;
4 4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.adminserver.modules.infra.framework.file.config.FileProperties;
7 8 import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
8   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file.InfFileDO;
9 9 import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file.InfFileMapper;
10 10 import cn.iocoder.yudao.adminserver.modules.infra.service.file.impl.InfFileServiceImpl;
11 11 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
12 12 import org.junit.jupiter.api.Test;
  13 +import org.springframework.boot.test.mock.mockito.MockBean;
13 14 import org.springframework.context.annotation.Import;
14 15  
15 16 import javax.annotation.Resource;
... ... @@ -29,8 +30,9 @@ public class InfFileServiceTest extends BaseDbUnitTest {
29 30 @Resource
30 31 private InfFileServiceImpl fileService;
31 32  
32   - @Resource
  33 + @MockBean
33 34 private FileProperties fileProperties;
  35 +
34 36 @Resource
35 37 private InfFileMapper fileMapper;
36 38  
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java
... ... @@ -2,13 +2,13 @@ package cn.iocoder.yudao.adminserver.modules.infra.service.logger;
2 2  
3 3 import cn.hutool.core.util.RandomUtil;
4 4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
5 6 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
6 7 import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
7 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 9 import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO;
9 10 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO;
10 11 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO;
11   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
12 12 import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiAccessLogMapper;
13 13 import cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl.InfApiAccessLogServiceImpl;
14 14 import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
... ... @@ -39,26 +39,6 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest {
39 39 private InfApiAccessLogMapper infApiAccessLogMapper;
40 40  
41 41 @Test
42   - public void testCreateApiAccessLogAsync() throws Exception {
43   - ApiAccessLogCreateDTO createDTO = RandomUtils.randomPojo(
44   - ApiAccessLogCreateDTO.class,
45   - dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue())
46   - );
47   -
48   - // 执行service方法
49   - Future<Boolean> future = infApiAccessLogServiceImpl.createApiAccessLogAsync(createDTO);
50   -
51   - // 等异步执行完
52   - future.get();
53   -
54   - InfApiAccessLogDO infApiAccessLogDO = infApiAccessLogMapper.selectOne(null);
55   - // 断言
56   - assertNotNull(infApiAccessLogDO);
57   - // 断言,忽略基本字段
58   - assertPojoEquals(createDTO, infApiAccessLogDO);
59   - }
60   -
61   - @Test
62 42 public void testGetApiAccessLogPage() {
63 43 // 构造测试数据
64 44 long userId = 2233L;
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java
... ... @@ -2,12 +2,12 @@ package cn.iocoder.yudao.adminserver.modules.infra.service.logger;
2 2  
3 3 import cn.hutool.core.util.RandomUtil;
4 4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
5 6 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
6 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 8 import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO;
8 9 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO;
9 10 import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO;
10   -import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
11 11 import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger.InfApiErrorLogMapper;
12 12 import cn.iocoder.yudao.adminserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum;
13 13 import cn.iocoder.yudao.adminserver.modules.infra.service.logger.impl.InfApiErrorLogServiceImpl;
... ... @@ -41,28 +41,6 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest {
41 41 @Resource
42 42 private InfApiErrorLogMapper infApiErrorLogMapper;
43 43  
44   -
45   - @Test
46   - public void testCreateApiErrorLogAsync() throws Exception {
47   - ApiErrorLogCreateDTO createDTO = RandomUtils.randomPojo(
48   - ApiErrorLogCreateDTO.class,
49   - dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue())
50   - );
51   -
52   - // 执行service方法
53   - Future<Boolean> future = infApiErrorLogServiceImpl.createApiErrorLogAsync(createDTO);
54   -
55   - // 等异步执行完
56   - future.get();
57   -
58   - InfApiErrorLogDO infApiErrorLogDO = infApiErrorLogMapper.selectOne(null);
59   - // 断言
60   - assertNotNull(infApiErrorLogDO);
61   - // 断言,忽略基本字段
62   - assertPojoEquals(createDTO, infApiErrorLogDO);
63   - }
64   -
65   -
66 44 @Test
67 45 public void testGetApiErrorLogPage() {
68 46 // 构造测试数据
... ... @@ -204,4 +182,5 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest {
204 182 // 验证 progressUserId 是否修改成功
205 183 assertEquals(processUserId, secondSelect.getProcessUserId());
206 184 }
  185 +
207 186 }
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.auth;
2 2  
3 3 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
4   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5   -import cn.iocoder.yudao.framework.security.core.LoginUser;
6 4 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO;
7   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
8 5 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
9 6 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
10 7 import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl;
11 8 import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService;
12   -import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
13 9 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
  10 +import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
14 11 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  12 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  13 +import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
  14 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
  15 +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
  16 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  17 +import cn.iocoder.yudao.framework.security.core.LoginUser;
15 18 import cn.iocoder.yudao.framework.test.core.util.AssertUtils;
16 19 import org.junit.jupiter.api.Test;
17 20 import org.springframework.boot.test.mock.mockito.MockBean;
... ... @@ -49,6 +52,8 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
49 52 @MockBean
50 53 private SysUserService userService;
51 54 @MockBean
  55 + private SysUserCoreService userCoreService;
  56 + @MockBean
52 57 private SysPermissionService permissionService;
53 58 @MockBean
54 59 private AuthenticationManager authenticationManager;
... ... @@ -57,9 +62,11 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
57 62 @MockBean
58 63 private SysCaptchaService captchaService;
59 64 @MockBean
60   - private SysLoginLogService loginLogService;
  65 + private SysLoginLogCoreService loginLogCoreService;
  66 + @MockBean
  67 + private SysUserSessionCoreService userSessionCoreService;
61 68 @MockBean
62   - private SysUserSessionService userSessionService;
  69 + private SysSocialService socialService;
63 70  
64 71 @Test
65 72 public void testLoadUserByUsername_success() {
... ... @@ -94,7 +101,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
94 101 Long userId = randomLongId();
95 102 // mock 方法 01
96 103 SysUserDO user = randomPojo(SysUserDO.class, o -> o.setId(userId));
97   - when(userService.getUser(eq(userId))).thenReturn(user);
  104 + when(userCoreService.getUser(eq(userId))).thenReturn(user);
98 105 // mock 方法 02
99 106 Set<Long> roleIds = randomSet(Long.class);
100 107 when(permissionService.getUserRoleIds(eq(userId), eq(singleton(CommonStatusEnum.ENABLE.getStatus()))))
... ... @@ -128,7 +135,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
128 135 // 调用, 并断言异常
129 136 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_NOT_FOUND);
130 137 // 校验调用参数
131   - verify(loginLogService, times(1)).createLoginLog(
  138 + verify(loginLogCoreService, times(1)).createLoginLog(
132 139 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
133 140 && o.getResult().equals(SysLoginResultEnum.CAPTCHA_NOT_FOUND.getResult()))
134 141 );
... ... @@ -146,7 +153,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
146 153 // 调用, 并断言异常
147 154 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_CODE_ERROR);
148 155 // 校验调用参数
149   - verify(loginLogService, times(1)).createLoginLog(
  156 + verify(loginLogCoreService, times(1)).createLoginLog(
150 157 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
151 158 && o.getResult().equals(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))
152 159 );
... ... @@ -167,7 +174,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
167 174 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_BAD_CREDENTIALS);
168 175 // 校验调用参数
169 176 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
170   - verify(loginLogService, times(1)).createLoginLog(
  177 + verify(loginLogCoreService, times(1)).createLoginLog(
171 178 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
172 179 && o.getResult().equals(SysLoginResultEnum.BAD_CREDENTIALS.getResult()))
173 180 );
... ... @@ -188,7 +195,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
188 195 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_USER_DISABLED);
189 196 // 校验调用参数
190 197 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
191   - verify(loginLogService, times(1)).createLoginLog(
  198 + verify(loginLogCoreService, times(1)).createLoginLog(
192 199 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
193 200 && o.getResult().equals(SysLoginResultEnum.USER_DISABLED.getResult()))
194 201 );
... ... @@ -209,7 +216,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
209 216 assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_FAIL_UNKNOWN);
210 217 // 校验调用参数
211 218 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
212   - verify(loginLogService, times(1)).createLoginLog(
  219 + verify(loginLogCoreService, times(1)).createLoginLog(
213 220 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
214 221 && o.getResult().equals(SysLoginResultEnum.UNKNOWN_ERROR.getResult()))
215 222 );
... ... @@ -237,13 +244,13 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
237 244 // mock 获得 User 拥有的角色编号数组
238 245 when(permissionService.getUserRoleIds(userId, singleton(CommonStatusEnum.ENABLE.getStatus()))).thenReturn(userRoleIds);
239 246 // mock 缓存登录用户到 Redis
240   - when(userSessionService.createUserSession(loginUser, userIp, userAgent)).thenReturn(sessionId);
  247 + when(userSessionCoreService.createUserSession(loginUser, userIp, userAgent)).thenReturn(sessionId);
241 248 // 调用, 并断言异常
242 249 String login = authService.login(reqVO, userIp, userAgent);
243 250 assertEquals(sessionId, login);
244 251 // 校验调用参数
245 252 verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
246   - verify(loginLogService, times(1)).createLoginLog(
  253 + verify(loginLogCoreService, times(1)).createLoginLog(
247 254 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
248 255 && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult()))
249 256 );
... ... @@ -255,12 +262,12 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
255 262 String token = randomString();
256 263 LoginUser loginUser = randomPojo(LoginUser.class);
257 264 // mock
258   - when(userSessionService.getLoginUser(token)).thenReturn(loginUser);
  265 + when(userSessionCoreService.getLoginUser(token)).thenReturn(loginUser);
259 266 // 调用
260 267 authService.logout(token);
261 268 // 校验调用参数
262   - verify(userSessionService, times(1)).deleteUserSession(token);
263   - verify(loginLogService, times(1)).createLoginLog(
  269 + verify(userSessionCoreService, times(1)).deleteUserSession(token);
  270 + verify(loginLogCoreService, times(1)).createLoginLog(
264 271 argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGOUT_SELF.getType())
265 272 && o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult()))
266 273 );
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.auth;
2 2  
3   -import static cn.hutool.core.util.RandomUtil.randomEle;
4   -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
5   -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomDate;
6   -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
7   -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
8   -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
9   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
10   -import static org.junit.jupiter.api.Assertions.assertEquals;
11   -import static org.junit.jupiter.api.Assertions.assertNotEquals;
12   -import static org.junit.jupiter.api.Assertions.assertNotNull;
13   -import static org.junit.jupiter.api.Assertions.assertNull;
14   -import static org.mockito.Mockito.when;
15   -
16   -import java.time.Duration;
17   -import java.util.Date;
18   -import java.util.List;
19   -import java.util.stream.Collectors;
20   -import java.util.stream.Stream;
21   -
22   -import javax.annotation.Resource;
23   -
24   -import org.junit.jupiter.api.Test;
25   -import org.springframework.boot.test.mock.mockito.MockBean;
26   -import org.springframework.context.annotation.Import;
27   -
28 3 import cn.hutool.core.date.DateUtil;
29 4 import cn.iocoder.yudao.adminserver.BaseDbAndRedisUnitTest;
30   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
31   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
32   -import cn.iocoder.yudao.framework.security.config.SecurityProperties;
33   -import cn.iocoder.yudao.framework.security.core.LoginUser;
34 5 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
35   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth.SysUserSessionDO;
36   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
37 6 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper;
38   -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper;
39   -import cn.iocoder.yudao.adminserver.modules.system.dal.redis.auth.SysLoginUserRedisDAO;
40   -import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
41 7 import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysUserSessionServiceImpl;
42   -import cn.iocoder.yudao.adminserver.modules.system.service.dept.impl.SysDeptServiceImpl;
43   -import cn.iocoder.yudao.adminserver.modules.system.service.logger.impl.SysLoginLogServiceImpl;
44   -import cn.iocoder.yudao.adminserver.modules.system.service.user.impl.SysUserServiceImpl;
45   -import cn.iocoder.yudao.framework.test.core.util.AssertUtils;
46   -import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
  8 +import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
  9 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
  10 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  11 +import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO;
  12 +import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
  13 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
  14 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  15 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  16 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
47 17 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
  18 +import cn.iocoder.yudao.framework.test.core.util.AssertUtils;
  19 +import org.junit.jupiter.api.Test;
  20 +import org.springframework.boot.test.mock.mockito.MockBean;
  21 +import org.springframework.context.annotation.Import;
  22 +
  23 +import javax.annotation.Resource;
  24 +import java.util.Date;
  25 +import java.util.List;
  26 +import java.util.stream.Collectors;
  27 +import java.util.stream.Stream;
  28 +
  29 +import static cn.hutool.core.util.RandomUtil.randomEle;
  30 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  31 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  32 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
  33 +import static java.util.Collections.singletonList;
  34 +import static org.junit.jupiter.api.Assertions.assertEquals;
  35 +import static org.mockito.ArgumentMatchers.eq;
  36 +import static org.mockito.Mockito.when;
48 37  
49 38 /**
50   - * SysUserSessionServiceImpl Tester.
  39 + * {@link SysUserSessionServiceImpl} 的单元测试
51 40 *
52 41 * @author Lyon
53   - * @version 1.0
54   - * @since <pre>3月 8, 2021</pre>
55 42 */
56   -@Import({SysUserSessionServiceImpl.class, SysLoginUserRedisDAO.class})
  43 +@Import({SysUserSessionServiceImpl.class})
57 44 public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest {
58 45  
59 46 @Resource
60   - private SysUserSessionServiceImpl sysUserSessionService;
61   - @Resource
62   - private SysUserSessionMapper sysUserSessionMapper;
63   - @Resource
64   - private SysLoginUserRedisDAO sysLoginUserRedisDAO;
  47 + private SysUserSessionServiceImpl userSessionService;
  48 +
65 49 @Resource
66   - private SysUserMapper sysUserMapper;
  50 + private SysUserSessionMapper userSessionMapper;
67 51  
68 52 @MockBean
69   - private SecurityProperties securityProperties;
  53 + private SysUserService userService;
70 54 @MockBean
71   - private SysDeptServiceImpl sysDeptService;
  55 + private SysLoginLogCoreService loginLogCoreService;
72 56 @MockBean
73   - private SysUserServiceImpl sysUserService;
74   - @MockBean
75   - private SysLoginLogServiceImpl sysLoginLogService;
76   -
77   - @Test
78   - public void testCreateUserSession_success() {
79   - // 准备参数
80   - String userIp = randomString();
81   - String userAgent = randomString();
82   - LoginUser loginUser = randomPojo(LoginUser.class);
83   - // mock
84   - when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1));
85   - // 调用
86   - String sessionId = sysUserSessionService.createUserSession(loginUser, userIp, userAgent);
87   - // 校验记录的属性是否正确
88   - SysUserSessionDO sysUserSessionDO = sysUserSessionMapper.selectById(sessionId);
89   - assertEquals(sysUserSessionDO.getId(), sessionId);
90   - assertEquals(sysUserSessionDO.getUserId(), loginUser.getId());
91   - assertEquals(sysUserSessionDO.getUserIp(), userIp);
92   - assertEquals(sysUserSessionDO.getUserAgent(), userAgent);
93   - assertEquals(sysUserSessionDO.getUsername(), loginUser.getUsername());
94   - LoginUser redisLoginUser = sysLoginUserRedisDAO.get(sessionId);
95   - AssertUtils.assertPojoEquals(redisLoginUser, loginUser, "username","password");
96   - }
97   -
98   - @Test
99   - public void testCreateRefreshUserSession_success() {
100   - // 准备参数
101   - String sessionId = randomString();
102   - String userIp = randomString();
103   - String userAgent = randomString();
104   - Long timeLong = randomLongId();
105   - String userName = randomString();
106   - Date date = randomDate();
107   - LoginUser loginUser = randomPojo(LoginUser.class);
108   - // mock
109   - when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1));
110   - loginUser.setUpdateTime(date);
111   - sysLoginUserRedisDAO.set(sessionId, loginUser);
112   - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
113   - .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(userName)
114   - .sessionTimeout(addTime(Duration.ofMillis(timeLong)))
115   - .build();
116   - sysUserSessionMapper.insert(userSession);
117   - SysUserSessionDO insertDO = sysUserSessionMapper.selectById(sessionId);
118   - // 调用
119   - sysUserSessionService.refreshUserSession(sessionId, loginUser);
120   - // 校验记录 redis
121   - LoginUser redisLoginUser = sysLoginUserRedisDAO.get(sessionId);
122   - assertNotEquals(redisLoginUser.getUpdateTime(), date);
123   - // 校验记录 SysUserSessionDO
124   - SysUserSessionDO updateDO = sysUserSessionMapper.selectById(sessionId);
125   - assertEquals(updateDO.getUsername(), loginUser.getUsername());
126   - assertNotEquals(updateDO.getUpdateTime(), insertDO.getUpdateTime());
127   - assertNotEquals(updateDO.getSessionTimeout(), addTime(Duration.ofMillis(timeLong)));
128   - }
129   -
130   - @Test
131   - public void testDeleteUserSession_success() {
132   - // 准备参数
133   - String sessionId = randomString();
134   - String userIp = randomString();
135   - String userAgent = randomString();
136   - Long timeLong = randomLongId();
137   - LoginUser loginUser = randomPojo(LoginUser.class);
138   - // mock 存入 Redis
139   - when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1));
140   - sysLoginUserRedisDAO.set(sessionId, loginUser);
141   - // mock 存入 db
142   - SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
143   - .userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(loginUser.getUsername())
144   - .sessionTimeout(addTime(Duration.ofMillis(timeLong)))
145   - .build();
146   - sysUserSessionMapper.insert(userSession);
147   - // 校验数据存在
148   - assertNotNull(sysLoginUserRedisDAO.get(sessionId));
149   - assertNotNull(sysUserSessionMapper.selectById(sessionId));
150   - // 调用
151   - sysUserSessionService.deleteUserSession(sessionId);
152   - // 校验数据不存在了
153   - assertNull(sysLoginUserRedisDAO.get(sessionId));
154   - assertNull(sysUserSessionMapper.selectById(sessionId));
155   - }
  57 + private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO;
156 58  
157 59 @Test
158 60 public void testGetUserSessionPage_success() {
159 61 // mock 数据
160   - String userIp = randomString();
161   - SysUserDO dbUser1 = randomPojo(SysUserDO.class, o -> {
162   - o.setUsername("testUsername1");
163   - o.setSex(randomEle(SysSexEnum.values()).getSex());
164   - o.setStatus(CommonStatusEnum.ENABLE.getStatus());
165   - });
166   - SysUserDO dbUser2 = randomPojo(SysUserDO.class, o -> {
167   - o.setUsername("testUsername2");
  62 + SysUserDO dbUser = randomPojo(SysUserDO.class, o -> {
168 63 o.setSex(randomEle(SysSexEnum.values()).getSex());
169 64 o.setStatus(CommonStatusEnum.ENABLE.getStatus());
170 65 });
  66 + when(userService.getUsersByUsername(eq(dbUser.getUsername()))).thenReturn(singletonList(dbUser));
  67 + // 插入可被查询到的数据
  68 + String userIp = randomString();
171 69 SysUserSessionDO dbSession = randomPojo(SysUserSessionDO.class, o -> {
172   - o.setUserId(dbUser1.getId());
  70 + o.setUserId(dbUser.getId());
  71 + o.setUserType(randomEle(UserTypeEnum.values()).getValue());
173 72 o.setUserIp(userIp);
174 73 });
175   - sysUserMapper.insert(dbUser1);
176   - sysUserMapper.insert(dbUser2);
177   - sysUserSessionMapper.insert(dbSession);
178   - sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> {
  74 + userSessionMapper.insert(dbSession);
  75 + // 测试 username 不匹配
  76 + userSessionMapper.insert(ObjectUtils.clone(dbSession, o -> {
179 77 o.setId(randomString());
180   - o.setUserId(dbUser2.getId());
181   - }));
182   - // 测试 userId 不匹配
183   - sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> {
184   - o.setId(randomString());
185   - o.setUserId(123456l);
  78 + o.setUserId(123456L);
186 79 }));
187 80 // 测试 userIp 不匹配
188   - sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> {
  81 + userSessionMapper.insert(ObjectUtils.clone(dbSession, o -> {
189 82 o.setId(randomString());
190 83 o.setUserIp("testUserIp");
191 84 }));
192 85 // 准备参数
193   - SysUserSessionPageReqVO reqVo = new SysUserSessionPageReqVO();
194   - reqVo.setUserIp(userIp);
  86 + SysUserSessionPageReqVO reqVO = new SysUserSessionPageReqVO();
  87 + reqVO.setUsername(dbUser.getUsername());
  88 + reqVO.setUserIp(userIp);
  89 +
195 90 // 调用
196   - PageResult<SysUserSessionDO> pageResult = sysUserSessionService.getUserSessionPage(reqVo);
  91 + PageResult<SysUserSessionDO> pageResult = userSessionService.getUserSessionPage(reqVO);
197 92 // 断言
198   - assertEquals(3, pageResult.getTotal());
199   - assertEquals(3, pageResult.getList().size());
  93 + assertEquals(1, pageResult.getTotal());
  94 + assertEquals(1, pageResult.getList().size());
200 95 assertPojoEquals(dbSession, pageResult.getList().get(0));
201 96 }
202 97  
  98 + // TODO 芋艿:单测写的有问题
203 99 @Test
204   - public void testClearSessionTimeout_success() throws Exception {
  100 + public void testClearSessionTimeout_success() {
205 101 // 准备超时数据 120 条, 在线用户 1 条
206 102 int expectedTimeoutCount = 120, expectedTotal = 1;
207 103  
... ... @@ -209,17 +105,23 @@ public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest {
209 105 List<SysUserSessionDO> prepareData = Stream
210 106 .iterate(0, i -> i)
211 107 .limit(expectedTimeoutCount)
212   - .map(i -> RandomUtils.randomPojo(SysUserSessionDO.class, o -> o.setSessionTimeout(DateUtil.offsetSecond(new Date(), -1))))
  108 + .map(i -> randomPojo(SysUserSessionDO.class, o -> {
  109 + o.setUserType(randomEle(UserTypeEnum.values()).getValue());
  110 + o.setSessionTimeout(DateUtil.offsetSecond(new Date(), -1));
  111 + }))
213 112 .collect(Collectors.toList());
214   - SysUserSessionDO sessionDO = RandomUtils.randomPojo(SysUserSessionDO.class, o -> o.setSessionTimeout(DateUtil.offsetMinute(new Date(), 30)));
  113 + SysUserSessionDO sessionDO = randomPojo(SysUserSessionDO.class, o -> {
  114 + o.setUserType(randomEle(UserTypeEnum.values()).getValue());
  115 + o.setSessionTimeout(DateUtil.offsetMinute(new Date(), 30));
  116 + });
215 117 prepareData.add(sessionDO);
216   - prepareData.forEach(sysUserSessionMapper::insert);
  118 + prepareData.forEach(userSessionMapper::insert);
217 119  
218   - //清空超时数据
219   - long actualTimeoutCount = sysUserSessionService.clearSessionTimeout();
220   - //校验
  120 + // 清空超时数据
  121 + long actualTimeoutCount = userSessionService.clearSessionTimeout();
  122 + // 校验
221 123 assertEquals(expectedTimeoutCount, actualTimeoutCount);
222   - List<SysUserSessionDO> userSessionDOS = sysUserSessionMapper.selectList();
  124 + List<SysUserSessionDO> userSessionDOS = userSessionMapper.selectList();
223 125 assertEquals(expectedTotal, userSessionDOS.size());
224 126 AssertUtils.assertPojoEquals(sessionDO, userSessionDOS.get(0), "updateTime");
225 127 }
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/dict/SysDictDataServiceTest.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.dict;
2 2  
3 3 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.dict.SysDictDataDO;
4 5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO;
7 8 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataExportReqVO;
8 9 import cn.iocoder.yudao.adminserver.modules.system.controller.dict.vo.data.SysDictDataPageReqVO;
9 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 11 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dict.SysDictTypeDO;
12 12 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.dict.SysDictDataMapper;
13 13 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.dict.SysDictDataProducer;
... ... @@ -51,37 +51,6 @@ public class SysDictDataServiceTest extends BaseDbUnitTest {
51 51 @MockBean
52 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 54 @Test
86 55 public void testGetDictDataPage() {
87 56 // mock 数据
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysLoginLogServiceImplTest.java
... ... @@ -2,12 +2,12 @@ package cn.iocoder.yudao.adminserver.modules.system.service.logger;
2 2  
3 3 import cn.hutool.core.util.RandomUtil;
4 4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
  6 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
5 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 8 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
7   -import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO;
8 9 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
9 10 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
10   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysLoginLogDO;
11 11 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysLoginLogMapper;
12 12 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
13 13 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
... ... @@ -34,34 +34,13 @@ public class SysLoginLogServiceImplTest extends BaseDbUnitTest {
34 34 private SysLoginLogMapper loginLogMapper;
35 35  
36 36 @Test
37   - public void testCreateLoginLog() {
38   - String traceId = TracerUtils.getTraceId();
39   - SysLoginLogCreateReqVO reqVO = RandomUtils.randomPojo(SysLoginLogCreateReqVO.class, vo -> {
40   - // 指定随机的范围,避免超出范围入库失败
41   - vo.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());
42   - vo.setResult(RandomUtil.randomEle(SysLoginResultEnum.values()).getResult());
43   - // 使用TracerUtils生成的TraceId
44   - vo.setTraceId(traceId);
45   - });
46   -
47   - // 执行service方法
48   - sysLoginLogService.createLoginLog(reqVO);
49   -
50   - // 断言,忽略基本字段
51   - SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null);
52   - assertPojoEquals(reqVO, sysLoginLogDO);
53   - }
54   -
55   -
56   - @Test
57 37 public void testGetLoginLogPage() {
58   -
59 38 // 构造测试数据
60   -
61 39 // 登录成功的
62 40 SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> {
63 41 logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());
64 42 logDO.setTraceId(TracerUtils.getTraceId());
  43 + logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue());
65 44  
66 45 logDO.setUserIp("192.168.199.16");
67 46 logDO.setUsername("wangkai");
... ... @@ -100,13 +79,13 @@ public class SysLoginLogServiceImplTest extends BaseDbUnitTest {
100 79  
101 80 @Test
102 81 public void testGetLoginLogList() {
103   -
104 82 // 构造测试数据
105 83  
106 84 // 登录成功的
107 85 SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> {
108 86 logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());
109 87 logDO.setTraceId(TracerUtils.getTraceId());
  88 + logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue());
110 89  
111 90 logDO.setUserIp("192.168.111.16");
112 91 logDO.setUsername("wangxiaokai");
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java
... ... @@ -2,34 +2,35 @@ package cn.iocoder.yudao.adminserver.modules.system.service.logger;
2 2  
3 3 import cn.hutool.core.map.MapUtil;
4 4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
5   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6   -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
7   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
8   -import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
9   -import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
10   -import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
11 5 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO;
12 6 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO;
13 7 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO;
14   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
15 8 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysOperateLogMapper;
16   -import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
17 9 import cn.iocoder.yudao.adminserver.modules.system.service.logger.impl.SysOperateLogServiceImpl;
18 10 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
19   -import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
  11 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  12 +import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
  13 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  14 +import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
  15 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  16 +import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
20 17 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
  18 +import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
  19 +import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
  20 +import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
21 21 import org.junit.jupiter.api.Test;
22 22 import org.springframework.boot.test.mock.mockito.MockBean;
23 23 import org.springframework.context.annotation.Import;
24 24  
25 25 import javax.annotation.Resource;
26   -import java.util.*;
  26 +import java.util.Collections;
  27 +import java.util.List;
27 28 import java.util.concurrent.ExecutionException;
28 29 import java.util.concurrent.Future;
29 30  
  31 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
30 32 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
31 33 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
32   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
33 34 import static org.junit.jupiter.api.Assertions.assertEquals;
34 35 import static org.mockito.Mockito.when;
35 36  
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java
... ... @@ -2,18 +2,18 @@ package cn.iocoder.yudao.adminserver.modules.system.service.sms;
2 2  
3 3 import cn.hutool.core.bean.BeanUtil;
4 4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
5   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
7   -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
8 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
9 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
10 7 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
11   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
12 8 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsChannelMapper;
13 9 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
14 10 import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsChannelServiceImpl;
  11 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
  12 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  13 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
15 14 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
16 15 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
  16 +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
17 17 import org.junit.jupiter.api.Test;
18 18 import org.springframework.boot.test.mock.mockito.MockBean;
19 19 import org.springframework.context.annotation.Import;
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java
... ... @@ -2,35 +2,32 @@ package cn.iocoder.yudao.adminserver.modules.system.service.sms;
2 2  
3 3 import cn.hutool.core.map.MapUtil;
4 4 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
5   -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
6   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
7   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
9 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
10   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
11   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
12 7 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsLogMapper;
13   -import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsReceiveStatusEnum;
14   -import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsSendStatusEnum;
15   -import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsTemplateTypeEnum;
16 8 import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsLogServiceImpl;
  9 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
  10 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum;
  11 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum;
  12 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
  13 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  14 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
17 15 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
18 16 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
19 17 import org.junit.jupiter.api.Test;
20 18 import org.springframework.context.annotation.Import;
21 19  
22 20 import javax.annotation.Resource;
23   -import java.util.Date;
24 21 import java.util.List;
25 22 import java.util.Map;
26 23 import java.util.function.Consumer;
27 24  
28   -import static cn.hutool.core.util.RandomUtil.randomBoolean;
29 25 import static cn.hutool.core.util.RandomUtil.randomEle;
30   -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
31 26 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
32   -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
33   -import static org.junit.jupiter.api.Assertions.*;
  27 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  28 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  29 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
  30 +import static org.junit.jupiter.api.Assertions.assertEquals;
34 31  
35 32 /**
36 33 * {@link SysSmsLogServiceImpl} 的单元测试类
... ... @@ -47,93 +44,6 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest {
47 44 private SysSmsLogMapper smsLogMapper;
48 45  
49 46 @Test
50   - public void testCreateSmsLog() {
51   - // 准备参数
52   - String mobile = randomString();
53   - Long userId = randomLongId();
54   - Integer userType = randomEle(UserTypeEnum.values()).getValue();
55   - Boolean isSend = randomBoolean();
56   - SysSmsTemplateDO templateDO = randomPojo(SysSmsTemplateDO.class,
57   - o -> o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()));
58   - String templateContent = randomString();
59   - Map<String, Object> templateParams = randomTemplateParams();
60   - // mock 方法
61   -
62   - // 调用
63   - Long logId = smsLogService.createSmsLog(mobile, userId, userType, isSend,
64   - templateDO, templateContent, templateParams);
65   - // 断言
66   - SysSmsLogDO logDO = smsLogMapper.selectById(logId);
67   - assertEquals(isSend ? SysSmsSendStatusEnum.INIT.getStatus() : SysSmsSendStatusEnum.IGNORE.getStatus(),
68   - logDO.getSendStatus());
69   - assertEquals(mobile, logDO.getMobile());
70   - assertEquals(userType, logDO.getUserType());
71   - assertEquals(userId, logDO.getUserId());
72   - assertEquals(templateDO.getId(), logDO.getTemplateId());
73   - assertEquals(templateDO.getCode(), logDO.getTemplateCode());
74   - assertEquals(templateDO.getType(), logDO.getTemplateType());
75   - assertEquals(templateDO.getChannelId(), logDO.getChannelId());
76   - assertEquals(templateDO.getChannelCode(), logDO.getChannelCode());
77   - assertEquals(templateContent, logDO.getTemplateContent());
78   - assertEquals(templateParams, logDO.getTemplateParams());
79   - assertEquals(SysSmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus());
80   - }
81   -
82   - @Test
83   - public void testUpdateSmsSendResult() {
84   - // mock 数据
85   - SysSmsLogDO dbSmsLog = randomSmsLogDO(
86   - o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()));
87   - smsLogMapper.insert(dbSmsLog);
88   - // 准备参数
89   - Long id = dbSmsLog.getId();
90   - Integer sendCode = randomInteger();
91   - String sendMsg = randomString();
92   - String apiSendCode = randomString();
93   - String apiSendMsg = randomString();
94   - String apiRequestId = randomString();
95   - String apiSerialNo = randomString();
96   -
97   - // 调用
98   - smsLogService.updateSmsSendResult(id, sendCode, sendMsg,
99   - apiSendCode, apiSendMsg, apiRequestId, apiSerialNo);
100   - // 断言
101   - dbSmsLog = smsLogMapper.selectById(id);
102   - assertEquals(CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS.getStatus()
103   - : SysSmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus());
104   - assertNotNull(dbSmsLog.getSendTime());
105   - assertEquals(sendMsg, dbSmsLog.getSendMsg());
106   - assertEquals(apiSendCode, dbSmsLog.getApiSendCode());
107   - assertEquals(apiSendMsg, dbSmsLog.getApiSendMsg());
108   - assertEquals(apiRequestId, dbSmsLog.getApiRequestId());
109   - assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo());
110   - }
111   -
112   - @Test
113   - public void testUpdateSmsReceiveResult() {
114   - // mock 数据
115   - SysSmsLogDO dbSmsLog = randomSmsLogDO(
116   - o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()));
117   - smsLogMapper.insert(dbSmsLog);
118   - // 准备参数
119   - Long id = dbSmsLog.getId();
120   - Boolean success = randomBoolean();
121   - Date receiveTime = randomDate();
122   - String apiReceiveCode = randomString();
123   - String apiReceiveMsg = randomString();
124   -
125   - // 调用
126   - smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg);
127   - // 断言
128   - dbSmsLog = smsLogMapper.selectById(id);
129   - assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus()
130   - : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus());
131   - assertEquals(receiveTime, dbSmsLog.getReceiveTime());
132   - assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode());
133   - assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg());
134   - }
135   -
136   - @Test
137 47 public void testGetSmsLogPage() {
138 48 // mock 数据
139 49 SysSmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java
1 1 package cn.iocoder.yudao.adminserver.modules.system.service.sms;
2 2  
3 3 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
4   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5   -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
6   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
7   -import cn.iocoder.yudao.framework.sms.core.client.SmsClient;
8   -import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
9   -import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
10   -import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO;
11 4 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
12 5 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
13 6 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
14 7 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
15   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
16   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
17 8 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsTemplateMapper;
18   -import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsTemplateTypeEnum;
19 9 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
20 10 import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsTemplateServiceImpl;
  11 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
  12 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  13 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
  14 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  15 +import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
  16 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
21 17 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
22 18 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
  19 +import cn.iocoder.yudao.framework.sms.core.client.SmsClient;
  20 +import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
  21 +import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
  22 +import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO;
23 23 import com.google.common.collect.Lists;
24 24 import org.junit.jupiter.api.Test;
25 25 import org.springframework.boot.test.mock.mockito.MockBean;
26 26 import org.springframework.context.annotation.Import;
27 27  
28 28 import javax.annotation.Resource;
29   -import java.util.Date;
30 29 import java.util.List;
31   -import java.util.Map;
32 30 import java.util.function.Consumer;
33 31  
34   -import static cn.hutool.core.bean.BeanUtil.getFieldValue;
35 32 import static cn.hutool.core.util.RandomUtil.randomEle;
36 33 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
  34 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
37 35 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
38 36 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
39   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
40   -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max;
41 37 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
42 38 import static org.junit.jupiter.api.Assertions.*;
43 39 import static org.mockito.ArgumentMatchers.eq;
... ... @@ -67,27 +63,6 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
67 63 private SysSmsProducer smsProducer;
68 64  
69 65 @Test
70   - @SuppressWarnings("unchecked")
71   - void testInitLocalCache() {
72   - // mock 数据
73   - SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO();
74   - smsTemplateMapper.insert(smsTemplate01);
75   - SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO();
76   - smsTemplateMapper.insert(smsTemplate02);
77   -
78   - // 调用
79   - smsTemplateService.initLocalCache();
80   - // 断言 deptCache 缓存
81   - Map<String, SysSmsTemplateDO> smsTemplateCache = (Map<String, SysSmsTemplateDO>) getFieldValue(smsTemplateService, "smsTemplateCache");
82   - assertEquals(2, smsTemplateCache.size());
83   - assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode()));
84   - assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode()));
85   - // 断言 maxUpdateTime 缓存
86   - Date maxUpdateTime = (Date) getFieldValue(smsTemplateService, "maxUpdateTime");
87   - assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime);
88   - }
89   -
90   - @Test
91 66 public void testParseTemplateContentParams() {
92 67 // 准备参数
93 68 String content = "正在进行登录操作{operation},您的验证码是{code}";
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java
... ... @@ -3,21 +3,21 @@ package cn.iocoder.yudao.adminserver.modules.system.service.user;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.RandomUtil;
5 5 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
6   -import cn.iocoder.yudao.adminserver.modules.system.service.user.impl.SysUserServiceImpl;
7   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
8   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 6 import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService;
10 7 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
11 8 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
12 9 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
13 10 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
14 11 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
15   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
16 12 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper;
17   -import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
18 13 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
19 14 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
20 15 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
  16 +import cn.iocoder.yudao.adminserver.modules.system.service.user.impl.SysUserServiceImpl;
  17 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  18 +import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
  19 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  20 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
21 21 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
22 22 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
23 23 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
... ... @@ -36,9 +36,9 @@ import java.util.function.Consumer;
36 36 import static cn.hutool.core.util.RandomUtil.randomBytes;
37 37 import static cn.hutool.core.util.RandomUtil.randomEle;
38 38 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
  39 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
39 40 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
40 41 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
41   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
42 42 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
43 43 import static org.assertj.core.util.Lists.newArrayList;
44 44 import static org.junit.jupiter.api.Assertions.assertEquals;
... ... @@ -243,7 +243,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest {
243 243 // 调用数据
244 244 userService.deleteUser(userId);
245 245 // 校验结果
246   - assertNull(userService.getUser(userId));
  246 + assertNull(userMapper.selectById(userId));
247 247 // 校验调用次数
248 248 verify(permissionService, times(1)).processUserDeleted(eq(userId));
249 249 }
... ...
yudao-admin-server/src/test/resources/application-unit-test.yaml
... ... @@ -36,34 +36,9 @@ mybatis:
36 36 # Lock4j 配置项(单元测试,禁用 Lock4j)
37 37  
38 38 # Resilience4j 配置项
39   -resilience4j:
40   - ratelimiter:
41   - instances:
42   - backendA:
43   - limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50
44   - limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500
45   - timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s
46   - register-health-indicator: true # 是否注册到健康监测
47 39  
48 40 --- #################### 监控相关配置 ####################
49 41  
50 42 --- #################### 芋道相关配置 ####################
51 43  
52 44 # 芋道配置项,设置当前项目所有自定义的配置
53   -yudao:
54   - security:
55   - token-header: Authorization
56   - token-secret: abcdefghijklmnopqrstuvwxyz
57   - token-timeout: 1d
58   - session-timeout: 30m
59   - mock-enable: true
60   - mock-secret: test
61   - swagger:
62   - enable: false # 单元测试,禁用 Swagger
63   - file:
64   - base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/
65   - xss:
66   - enable: false
67   - exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
68   - - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
69   - - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
... ...
yudao-admin-server/src/test/resources/sql/create_tables.sql
... ... @@ -179,6 +179,7 @@ CREATE TABLE IF NOT EXISTS &quot;sys_dict_type&quot; (
179 179 CREATE TABLE IF NOT EXISTS `sys_user_session` (
180 180 `id` varchar(32) NOT NULL,
181 181 `user_id` bigint DEFAULT NULL,
  182 + "user_type" tinyint NOT NULL,
182 183 `username` varchar(50) NOT NULL DEFAULT '',
183 184 `user_ip` varchar(50) DEFAULT NULL,
184 185 `user_agent` varchar(512) DEFAULT NULL,
... ... @@ -223,6 +224,8 @@ CREATE TABLE IF NOT EXISTS &quot;sys_notice&quot; (
223 224 CREATE TABLE IF NOT EXISTS `sys_login_log` (
224 225 `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
225 226 `log_type` bigint(4) NOT NULL,
  227 + "user_id" bigint not null default '0',
  228 + "user_type" tinyint NOT NULL,
226 229 `trace_id` varchar(64) NOT NULL DEFAULT '',
227 230 `username` varchar(50) NOT NULL DEFAULT '',
228 231 `result` tinyint(4) NOT NULL,
... ...
yudao-core-service/pom.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0"
  3 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5 + <parent>
  6 + <artifactId>yudao</artifactId>
  7 + <groupId>cn.iocoder.boot</groupId>
  8 + <version>1.1.0-snapshot</version>
  9 + </parent>
  10 + <modelVersion>4.0.0</modelVersion>
  11 +
  12 + <artifactId>yudao-core-service</artifactId>
  13 + <packaging>jar</packaging>
  14 +
  15 + <name>yudao-admin-server</name>
  16 + <description>
  17 + 公共服务,通过 jar 包的方式,被 yudao-admin-server、yudao-user-service 使用。例如说:
  18 + 1. 日志相关:访问日志、登录日志、异常日志等等
  19 + 2. 认证相关:在线 Session
  20 + 3. 短信相关:短信模板、短信日志
  21 + 等等
  22 + </description>
  23 + <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
  24 +
  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 +
  36 + <!-- Web 相关 -->
  37 + <dependency>
  38 + <groupId>cn.iocoder.boot</groupId>
  39 + <artifactId>yudao-spring-boot-starter-web</artifactId>
  40 + </dependency>
  41 + <!-- spring boot 配置所需依赖 -->
  42 + <dependency>
  43 + <groupId>org.springframework.boot</groupId>
  44 + <artifactId>spring-boot-configuration-processor</artifactId>
  45 + <optional>true</optional>
  46 + </dependency>
  47 +
  48 + <dependency>
  49 + <groupId>cn.iocoder.boot</groupId>
  50 + <artifactId>yudao-spring-boot-starter-security</artifactId>
  51 + </dependency>
  52 +
  53 + <!-- DB 相关 -->
  54 + <dependency>
  55 + <groupId>cn.iocoder.boot</groupId>
  56 + <artifactId>yudao-spring-boot-starter-mybatis</artifactId>
  57 + </dependency>
  58 +
  59 + <dependency>
  60 + <groupId>cn.iocoder.boot</groupId>
  61 + <artifactId>yudao-spring-boot-starter-redis</artifactId>
  62 + </dependency>
  63 +
  64 + <!-- Config 配置中心相关 -->
  65 + <dependency>
  66 + <groupId>cn.iocoder.boot</groupId>
  67 + <artifactId>yudao-spring-boot-starter-config</artifactId>
  68 + </dependency>
  69 +
  70 + <!-- 消息队列相关 -->
  71 + <dependency>
  72 + <groupId>cn.iocoder.boot</groupId>
  73 + <artifactId>yudao-spring-boot-starter-mq</artifactId>
  74 + </dependency>
  75 +
  76 + <!-- Test 测试相关 -->
  77 + <dependency>
  78 + <groupId>cn.iocoder.boot</groupId>
  79 + <artifactId>yudao-spring-boot-starter-test</artifactId>
  80 + <scope>test</scope>
  81 + </dependency>
  82 +
  83 + <!-- 工具类相关 -->
  84 + <dependency>
  85 + <groupId>com.google.guava</groupId>
  86 + <artifactId>guava</artifactId>
  87 + </dependency>
  88 + </dependencies>
  89 +
  90 +</project>
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/logger/InfApiAccessLogCoreConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.infra.convert.logger;
  2 +
  3 +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO;
  4 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.factory.Mappers;
  7 +
  8 +@Mapper
  9 +public interface InfApiAccessLogCoreConvert {
  10 +
  11 + InfApiAccessLogCoreConvert INSTANCE = Mappers.getMapper(InfApiAccessLogCoreConvert.class);
  12 +
  13 + InfApiAccessLogDO convert(ApiAccessLogCreateDTO bean);
  14 +
  15 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/logger/InfApiErrorLogCoreConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.infra.convert.logger;
  2 +
  3 +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO;
  4 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.factory.Mappers;
  7 +
  8 +@Mapper
  9 +public interface InfApiErrorLogCoreConvert {
  10 +
  11 + InfApiErrorLogCoreConvert INSTANCE = Mappers.getMapper(InfApiErrorLogCoreConvert.class);
  12 +
  13 + InfApiErrorLogDO convert(ApiErrorLogCreateDTO bean);
  14 +
  15 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/convert/package-info.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/package-info.java
... ... @@ -3,4 +3,4 @@
3 3 *
4 4 * 目前使用 MapStruct 框架
5 5 */
6   -package cn.iocoder.yudao.userserver.modules.infra.convert;
  6 +package cn.iocoder.yudao.coreservice.modules.infra.convert;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/dal/dataobject/config/InfConfigDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/config/InfConfigDO.java
1   -package cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.config;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.TableField;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/file/InfFileDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/file/InfFileDO.java
1   -package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.file;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.IdType;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java
1   -package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.logger;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java
1   -package cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.logger;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5   -import cn.iocoder.yudao.userserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
7 7 import lombok.*;
8 8  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/infra/dal/mysql/config/InfConfigDAOImpl.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/config/InfConfigCoreDAOImpl.java
1   -package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.config;
2 2  
3 3 import cn.iocoder.yudao.framework.apollo.internals.ConfigFrameworkDAO;
4 4 import cn.iocoder.yudao.framework.apollo.internals.dto.ConfigRespDTO;
... ... @@ -12,15 +12,15 @@ import java.util.Date;
12 12 import java.util.List;
13 13  
14 14 /**
15   - * ConfigFrameworkDAO 实现类
  15 + * ConfigFrameworkDAO Core 实现类
16 16 *
17 17 * @author 芋道源码
18 18 */
19   -public class InfConfigDAOImpl implements ConfigFrameworkDAO {
  19 +public class InfConfigCoreDAOImpl implements ConfigFrameworkDAO {
20 20  
21 21 private final JdbcTemplate jdbcTemplate;
22 22  
23   - public InfConfigDAOImpl(String jdbcUrl, String username, String password) {
  23 + public InfConfigCoreDAOImpl(String jdbcUrl, String username, String password) {
24 24 DataSource dataSource = new DriverManagerDataSource(jdbcUrl, username, password);
25 25 this.jdbcTemplate = new JdbcTemplate(dataSource);
26 26 }
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/dal/mysql/file/InfFileMapper.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/file/InfFileCoreMapper.java
1   -package cn.iocoder.yudao.userserver.modules.infra.dal.mysql.file;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.file;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4   -import cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.file.InfFileDO;
  4 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
5 5 import org.apache.ibatis.annotations.Mapper;
6 6  
7 7 @Mapper
8   -public interface InfFileMapper extends BaseMapperX<InfFileDO> {
  8 +public interface InfFileCoreMapper extends BaseMapperX<InfFileDO> {
9 9  
10 10 }
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/dal/mysql/logger/InfApiAccessLogMapper.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/logger/InfApiAccessLogCoreMapper.java
1   -package cn.iocoder.yudao.userserver.modules.infra.dal.mysql.logger;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4   -import cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
  4 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
5 5 import org.apache.ibatis.annotations.Mapper;
6 6  
7   -import java.util.List;
8   -
9 7 /**
10 8 * API 访问日志 Mapper
11 9 *
12 10 * @author 芋道源码
13 11 */
14 12 @Mapper
15   -public interface InfApiAccessLogMapper extends BaseMapperX<InfApiAccessLogDO> {
  13 +public interface InfApiAccessLogCoreMapper extends BaseMapperX<InfApiAccessLogDO> {
16 14 }
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/mysql/logger/InfApiErrorLogCoreMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +@Mapper
  8 +public interface InfApiErrorLogCoreMapper extends BaseMapperX<InfApiErrorLogDO> {
  9 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/logger/InfApiErrorLogProcessStatusEnum.java
1   -package cn.iocoder.yudao.userserver.modules.infra.enums.logger;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.enums.logger;
2 2  
3 3 import lombok.AllArgsConstructor;
4 4 import lombok.Getter;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/enums/package-info.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/enums/package-info.java
1 1 /**
2 2 * 占位类,可以无视
3 3 */
4   -package cn.iocoder.yudao.userserver.modules.infra.enums;
  4 +package cn.iocoder.yudao.coreservice.modules.infra.enums;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/package-info.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/package-info.java
... ... @@ -4,4 +4,4 @@
4 4 *
5 5 * 缩写:inf
6 6 */
7   -package cn.iocoder.yudao.userserver.modules.infra;
  7 +package cn.iocoder.yudao.coreservice.modules.infra;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/service/logger/InfApiAccessLogService.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiAccessLogCoreService.java
1   -package cn.iocoder.yudao.userserver.modules.infra.service.logger;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.service.logger;
2 2  
3 3 import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService;
4 4  
... ... @@ -7,6 +7,6 @@ import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkServi
7 7 *
8 8 * @author 芋道源码
9 9 */
10   -public interface InfApiAccessLogService extends ApiAccessLogFrameworkService {
  10 +public interface InfApiAccessLogCoreService extends ApiAccessLogFrameworkService {
11 11  
12 12 }
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/service/logger/InfApiErrorLogService.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiErrorLogCoreService.java
1   -package cn.iocoder.yudao.userserver.modules.infra.service.logger;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.service.logger;
2 2  
3 3 import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
4 4  
... ... @@ -7,6 +7,6 @@ import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkServic
7 7 *
8 8 * @author 芋道源码
9 9 */
10   -public interface InfApiErrorLogService extends ApiErrorLogFrameworkService {
  10 +public interface InfApiErrorLogCoreService extends ApiErrorLogFrameworkService {
11 11  
12 12 }
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/service/logger/impl/InfApiAccessLogServiceImpl.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/impl/InfApiAccessLogCoreServiceImpl.java
1   -package cn.iocoder.yudao.userserver.modules.infra.service.logger.impl;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.service.logger.impl;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.convert.logger.InfApiAccessLogCoreConvert;
3 4 import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO;
4   -import cn.iocoder.yudao.userserver.modules.infra.convert.logger.InfApiAccessLogConvert;
5   -import cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
6   -import cn.iocoder.yudao.userserver.modules.infra.dal.mysql.logger.InfApiAccessLogMapper;
7   -import cn.iocoder.yudao.userserver.modules.infra.service.logger.InfApiAccessLogService;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
  6 +import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger.InfApiAccessLogCoreMapper;
  7 +import cn.iocoder.yudao.coreservice.modules.infra.service.logger.InfApiAccessLogCoreService;
8 8 import lombok.extern.slf4j.Slf4j;
  9 +import org.springframework.scheduling.annotation.Async;
9 10 import org.springframework.scheduling.annotation.AsyncResult;
10 11 import org.springframework.stereotype.Service;
11 12 import org.springframework.validation.annotation.Validated;
... ... @@ -21,16 +22,16 @@ import java.util.concurrent.Future;
21 22 @Service
22 23 @Validated
23 24 @Slf4j
24   -public class InfApiAccessLogServiceImpl implements InfApiAccessLogService {
  25 +public class InfApiAccessLogCoreServiceImpl implements InfApiAccessLogCoreService {
25 26  
26 27 @Resource
27   - private InfApiAccessLogMapper apiAccessLogMapper;
  28 + private InfApiAccessLogCoreMapper apiAccessLogMapper;
28 29  
29 30 @Override
30   - public Future<Boolean> createApiAccessLogAsync(ApiAccessLogCreateDTO createDTO) {
31   - InfApiAccessLogDO apiAccessLog = InfApiAccessLogConvert.INSTANCE.convert(createDTO);
32   - int insert = apiAccessLogMapper.insert(apiAccessLog);
33   - return new AsyncResult<>(insert > 1);
  31 + @Async
  32 + public void createApiAccessLogAsync(ApiAccessLogCreateDTO createDTO) {
  33 + InfApiAccessLogDO apiAccessLog = InfApiAccessLogCoreConvert.INSTANCE.convert(createDTO);
  34 + apiAccessLogMapper.insert(apiAccessLog);
34 35 }
35 36  
36 37 }
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/service/logger/impl/InfApiErrorLogServiceImpl.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/impl/InfApiErrorLogCoreServiceImpl.java
1   -package cn.iocoder.yudao.userserver.modules.infra.service.logger.impl;
  1 +package cn.iocoder.yudao.coreservice.modules.infra.service.logger.impl;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.infra.convert.logger.InfApiErrorLogCoreConvert;
  4 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger.InfApiErrorLogCoreMapper;
  6 +import cn.iocoder.yudao.coreservice.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum;
  7 +import cn.iocoder.yudao.coreservice.modules.infra.service.logger.InfApiErrorLogCoreService;
3 8 import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO;
4   -import cn.iocoder.yudao.userserver.modules.infra.convert.logger.InfApiErrorLogConvert;
5   -import cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
6   -import cn.iocoder.yudao.userserver.modules.infra.dal.mysql.logger.InfApiErrorLogMapper;
7   -import cn.iocoder.yudao.userserver.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum;
8   -import cn.iocoder.yudao.userserver.modules.infra.service.logger.InfApiErrorLogService;
9 9 import lombok.extern.slf4j.Slf4j;
  10 +import org.springframework.scheduling.annotation.Async;
10 11 import org.springframework.scheduling.annotation.AsyncResult;
11 12 import org.springframework.stereotype.Service;
12 13 import org.springframework.validation.annotation.Validated;
... ... @@ -22,17 +23,17 @@ import java.util.concurrent.Future;
22 23 @Service
23 24 @Validated
24 25 @Slf4j
25   -public class InfApiErrorLogServiceImpl implements InfApiErrorLogService {
  26 +public class InfApiErrorLogCoreServiceImpl implements InfApiErrorLogCoreService {
26 27  
27 28 @Resource
28   - private InfApiErrorLogMapper apiErrorLogMapper;
  29 + private InfApiErrorLogCoreMapper apiErrorLogMapper;
29 30  
30 31 @Override
31   - public Future<Boolean> createApiErrorLogAsync(ApiErrorLogCreateDTO createDTO) {
32   - InfApiErrorLogDO apiErrorLog = InfApiErrorLogConvert.INSTANCE.convert(createDTO);
  32 + @Async
  33 + public void createApiErrorLogAsync(ApiErrorLogCreateDTO createDTO) {
  34 + InfApiErrorLogDO apiErrorLog = InfApiErrorLogCoreConvert.INSTANCE.convert(createDTO);
33 35 apiErrorLog.setProcessStatus(InfApiErrorLogProcessStatusEnum.INIT.getStatus());
34   - int insert = apiErrorLogMapper.insert(apiErrorLog);
35   - return new AsyncResult<>(insert == 1);
  36 + apiErrorLogMapper.insert(apiErrorLog);
36 37 }
37 38  
38 39 }
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/convert/package-info.java 0 → 100644
  1 +/**
  2 + * 提供 POJO 类的实体转换
  3 + *
  4 + * 目前使用 MapStruct 框架
  5 + */
  6 +package cn.iocoder.yudao.coreservice.modules.member.convert;
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md 0 → 100644
  1 +<http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao>
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/dal/mysql/user/MbrUserDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/dataobject/user/MbrUserDO.java
1   -package cn.iocoder.yudao.userserver.modules.member.dal.mysql.user;
  1 +package cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/mysql/user/MbrUserCoreMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.member.dal.mysql.user;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +@Mapper
  8 +public interface MbrUserCoreMapper extends BaseMapperX<MbrUserDO> {
  9 +
  10 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/package-info.java 0 → 100644
  1 +/**
  2 + * member 包下,我们放会员业务.
  3 + * 例如说:会员中心等等
  4 + *
  5 + * 缩写:mbr
  6 + */
  7 +package cn.iocoder.yudao.coreservice.modules.member;
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/MbrUserCoreService.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.member.service.user;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
  4 +
  5 +/**
  6 + * 前台用户 Core Service 接口
  7 + *
  8 + * @author 芋道源码
  9 + */
  10 +public interface MbrUserCoreService {
  11 + /**
  12 + * 通过用户 ID 查询用户
  13 + *
  14 + * @param id 用户ID
  15 + * @return 用户对象信息
  16 + */
  17 + MbrUserDO getUser(Long id);
  18 +
  19 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/service/user/impl/MbrUserCoreServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.member.service.user.impl;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
  4 +import cn.iocoder.yudao.coreservice.modules.member.dal.mysql.user.MbrUserCoreMapper;
  5 +import cn.iocoder.yudao.coreservice.modules.member.service.user.MbrUserCoreService;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +import org.springframework.stereotype.Service;
  8 +
  9 +import javax.annotation.Resource;
  10 +
  11 +/**
  12 + * User Core Service 实现类
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +@Service
  17 +@Slf4j
  18 +public class MbrUserCoreServiceImpl implements MbrUserCoreService {
  19 +
  20 + @Resource
  21 + private MbrUserCoreMapper userCoreMapper;
  22 +
  23 + @Override
  24 + public MbrUserDO getUser(Long id) {
  25 + return userCoreMapper.selectById(id);
  26 + }
  27 +
  28 +}
... ...
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 4 import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO;
4   -import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.dict.SysDictDataDO;
5 5 import org.mapstruct.Mapper;
6 6 import org.mapstruct.factory.Mappers;
7 7  
... ... @@ -9,9 +9,9 @@ import java.util.Collection;
9 9 import java.util.List;
10 10  
11 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 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/auth/SysUserSessionDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/auth/SysUserSessionDO.java
1   -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.auth;
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth;
2 2  
  3 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
3 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 5 import cn.iocoder.yudao.framework.security.core.LoginUser;
5   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
6 6 import com.baomidou.mybatisplus.annotation.IdType;
7 7 import com.baomidou.mybatisplus.annotation.TableId;
8 8 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -35,9 +35,15 @@ public class SysUserSessionDO extends BaseDO {
35 35 /**
36 36 * 用户编号
37 37 *
38   - * 关联 {@link SysUserDO#getId()}
  38 + * 关联 SysUserDO.id 或者 MbrUserDO.id
39 39 */
40 40 private Long userId;
  41 + /**
  42 + * 用户类型
  43 + *
  44 + * 枚举 {@link UserTypeEnum}
  45 + */
  46 + private Integer userType;
41 47  
42 48 /**
43 49 * 用户账号
... ...
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 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 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 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 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 7 import com.baomidou.mybatisplus.annotation.TableName;
8 8 import lombok.Data;
9 9 import lombok.EqualsAndHashCode;
... ... @@ -14,7 +14,7 @@ import lombok.ToString;
14 14 *
15 15 * 注意,包括登录和登出两种行为
16 16 *
17   - * @author ruoyi
  17 + * @author 芋道源码
18 18 */
19 19 @TableName("sys_login_log")
20 20 @Data
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsChannelDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsChannelDO.java
1   -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms;
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsLogDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsLogDO.java
1   -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms;
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum;
  4 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum;
3 5 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 6 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 7 import cn.iocoder.yudao.framework.sms.core.enums.SmsFrameworkErrorCodeConstants;
6   -import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsReceiveStatusEnum;
7   -import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsSendStatusEnum;
8 8 import com.baomidou.mybatisplus.annotation.TableField;
9 9 import com.baomidou.mybatisplus.annotation.TableName;
10 10 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java
1   -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms;
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
3 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5   -import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsTemplateTypeEnum;
6 6 import com.baomidou.mybatisplus.annotation.TableField;
7 7 import com.baomidou.mybatisplus.annotation.TableName;
8 8 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/user/SysUserDO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/user/SysUserDO.java
1   -package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user;
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
3 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 6 import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler;
6   -import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
7 7 import com.baomidou.mybatisplus.annotation.TableField;
8 8 import com.baomidou.mybatisplus.annotation.TableId;
9 9 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -16,7 +16,7 @@ import java.util.Set;
16 16 /**
17 17 * 管理后台的用户 DO
18 18 *
19   - * @author ruoyi
  19 + * @author 芋道源码
20 20 */
21 21 @TableName(value = "sys_user", autoResultMap = true)
22 22 @Data
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/auth/SysUserSessionCoreMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.auth;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +@Mapper
  8 +public interface SysUserSessionCoreMapper extends BaseMapperX<SysUserSessionDO> {
  9 +
  10 +}
... ...
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 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 6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
7 7 import org.apache.ibatis.annotations.Mapper;
8 8  
9 9 import java.util.Date;
10 10  
11 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 14 default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) {
24 15 return selectOne(new QueryWrapper<SysDictDataDO>().select("id")
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/logger/SysLoginLogCoreMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.logger;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +@Mapper
  8 +public interface SysLoginLogCoreMapper extends BaseMapperX<SysLoginLogDO> {
  9 +
  10 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql;
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsLogCoreMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  6 +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
  7 +import org.apache.ibatis.annotations.Mapper;
  8 +
  9 +import java.util.List;
  10 +
  11 +@Mapper
  12 +public interface SysSmsLogCoreMapper extends BaseMapperX<SysSmsLogDO> {
  13 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsTemplateCoreMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +import org.apache.ibatis.annotations.Select;
  7 +
  8 +import java.util.Date;
  9 +
  10 +@Mapper
  11 +public interface SysSmsTemplateCoreMapper extends BaseMapperX<SysSmsTemplateDO> {
  12 +
  13 + @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1")
  14 + Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
  15 +
  16 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.user;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6 +import org.apache.ibatis.annotations.Mapper;
  7 +
  8 +@Mapper
  9 +public interface SysUserCoreMapper extends BaseMapperX<SysUserDO> {
  10 +
  11 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.redis;
  2 +
  3 +import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
  4 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  5 +
  6 +import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING;
  7 +
  8 +/**
  9 + * System Redis Key 枚举类
  10 + *
  11 + * @author 芋道源码
  12 + */
  13 +public interface SysRedisKeyCoreConstants {
  14 +
  15 + RedisKeyDefine LOGIN_USER = new RedisKeyDefine("登录用户的缓存",
  16 + "login_user:%s", // 参数为 sessionId
  17 + STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC);
  18 +
  19 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/auth/SysLoginUserRedisDAO.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/auth/SysLoginUserCoreRedisDAO.java
1   -package cn.iocoder.yudao.adminserver.modules.system.dal.redis.auth;
  1 +package cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth;
2 2  
3   -import cn.iocoder.yudao.framework.security.core.LoginUser;
4   -import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
5 3 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  4 +import cn.iocoder.yudao.framework.security.config.SecurityProperties;
  5 +import cn.iocoder.yudao.framework.security.core.LoginUser;
6 6 import org.springframework.data.redis.core.StringRedisTemplate;
7 7 import org.springframework.stereotype.Repository;
8 8  
9 9 import javax.annotation.Resource;
10   -import java.time.Duration;
11 10  
12   -import static cn.iocoder.yudao.adminserver.modules.system.dal.redis.SysRedisKeyConstants.LOGIN_USER;
  11 +import static cn.iocoder.yudao.coreservice.modules.system.dal.redis.SysRedisKeyCoreConstants.LOGIN_USER;
13 12  
14 13 /**
15 14 * {@link LoginUser} 的 RedisDAO
... ... @@ -17,12 +16,13 @@ import static cn.iocoder.yudao.adminserver.modules.system.dal.redis.SysRedisKeyC
17 16 * @author 芋道源码
18 17 */
19 18 @Repository
20   -public class SysLoginUserRedisDAO {
  19 +public class SysLoginUserCoreRedisDAO {
21 20  
22 21 @Resource
23 22 private StringRedisTemplate stringRedisTemplate;
  23 +
24 24 @Resource
25   - private SysUserSessionService sysUserSessionService; // TODO 芋艿:得看看怎么拿出去
  25 + private SecurityProperties securityProperties;
26 26  
27 27 public LoginUser get(String sessionId) {
28 28 String redisKey = formatKey(sessionId);
... ... @@ -32,7 +32,7 @@ public class SysLoginUserRedisDAO {
32 32 public void set(String sessionId, LoginUser loginUser) {
33 33 String redisKey = formatKey(sessionId);
34 34 stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(loginUser),
35   - Duration.ofMillis(sysUserSessionService.getSessionTimeoutMillis()));
  35 + securityProperties.getSessionTimeout());
36 36 }
37 37  
38 38 public void delete(String sessionId) {
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.enums;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ErrorCode;
  4 +
  5 +/**
  6 + * System 错误码枚举类
  7 + *
  8 + * system 系统,使用 1-006-000-000 段
  9 + */
  10 +public interface SysErrorCodeConstants {
  11 +
  12 + // ========== 短信发送 1006000000 ==========
  13 + ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1006000000, "手机号不存在");
  14 + ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1006000001, "模板参数({})缺失");
  15 + ErrorCode SMS_SEND_TEMPLATE_NOT_EXISTS = new ErrorCode(1006000000, "短信模板不存在");
  16 +
  17 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/common/SysSexEnum.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/common/SysSexEnum.java
1   -package cn.iocoder.yudao.adminserver.modules.system.enums.common;
  1 +package cn.iocoder.yudao.coreservice.modules.system.enums.common;
2 2  
3 3 import lombok.AllArgsConstructor;
4 4 import lombok.Getter;
... ... @@ -11,12 +11,14 @@ import lombok.Getter;
11 11 @Getter
12 12 @AllArgsConstructor
13 13 public enum SysSexEnum {
  14 +
14 15 /** 男 */
15 16 MALE(1),
16 17 /** 女 */
17 18 FEMALE(2),
18 19 /* 未知 */
19 20 UNKNOWN(3);
  21 +
20 22 /**
21 23 * 性别
22 24 */
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginLogTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.enums.logger;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 登录日志的类型枚举
  8 + */
  9 +@Getter
  10 +@AllArgsConstructor
  11 +public enum SysLoginLogTypeEnum {
  12 +
  13 + LOGIN_USERNAME(100), // 使用账号登录
  14 + LOGIN_SOCIAL(101), // 使用社交登录
  15 + LOGIN_MOCK(102), // 使用 Mock 登录
  16 + LOGIN_MOBILE(103), // 使用手机登陆
  17 + LOGIN_SMS(104), // 使用短信登陆
  18 +
  19 + LOGOUT_SELF(200), // 自己主动登出
  20 + LOGOUT_TIMEOUT(201), // 超时登出
  21 + LOGOUT_DELETE(202), // 强制退出
  22 + ;
  23 +
  24 + /**
  25 + * 日志类型
  26 + */
  27 + private final Integer type;
  28 +
  29 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/logger/SysLoginResultEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.enums.logger;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 登录结果的枚举类
  8 + */
  9 +@Getter
  10 +@AllArgsConstructor
  11 +public enum SysLoginResultEnum {
  12 +
  13 + SUCCESS(0), // 成功
  14 + BAD_CREDENTIALS(10), // 账号或密码不正确
  15 + USER_DISABLED(20), // 用户被禁用
  16 + CAPTCHA_NOT_FOUND(30), // 图片验证码不存在
  17 + CAPTCHA_CODE_ERROR(31), // 图片验证码不正确
  18 +
  19 + UNKNOWN_ERROR(100), // 未知异常
  20 + ;
  21 +
  22 + /**
  23 + * 结果
  24 + */
  25 + private final Integer result;
  26 +
  27 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsReceiveStatusEnum.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsReceiveStatusEnum.java
1   -package cn.iocoder.yudao.adminserver.modules.system.enums.sms;
  1 +package cn.iocoder.yudao.coreservice.modules.system.enums.sms;
2 2  
3 3 import lombok.AllArgsConstructor;
4 4 import lombok.Getter;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsSendStatusEnum.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsSendStatusEnum.java
1   -package cn.iocoder.yudao.adminserver.modules.system.enums.sms;
  1 +package cn.iocoder.yudao.coreservice.modules.system.enums.sms;
2 2  
3 3 import lombok.AllArgsConstructor;
4 4 import lombok.Getter;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsTemplateTypeEnum.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsTemplateTypeEnum.java
1   -package cn.iocoder.yudao.adminserver.modules.system.enums.sms;
  1 +package cn.iocoder.yudao.coreservice.modules.system.enums.sms;
2 2  
3 3 import lombok.AllArgsConstructor;
4 4 import lombok.Getter;
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/package-info.java 0 → 100644
  1 +/**
  2 + * 占位
  3 + */
  4 +package cn.iocoder.yudao.coreservice.modules.system.mq.message;
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsSendMessage.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/sms/SysSmsSendMessage.java
1   -package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms;
  1 +package cn.iocoder.yudao.coreservice.modules.system.mq.message.sms;
2 2  
3 3 import cn.iocoder.yudao.framework.common.core.KeyValue;
4 4 import cn.iocoder.yudao.framework.mq.core.stream.StreamMessage;
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/package-info.java 0 → 100644
  1 +/**
  2 + * 占位
  3 + */
  4 +package cn.iocoder.yudao.coreservice.modules.system.mq.producer;
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/sms/SysSmsCoreProducer.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
  4 +import cn.iocoder.yudao.framework.common.core.KeyValue;
  5 +import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +import org.springframework.data.redis.core.StringRedisTemplate;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +import javax.annotation.Resource;
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * Sms 短信相关消息的 Core Producer
  15 + *
  16 + * @author zzf
  17 + * @date 2021/3/9 16:35
  18 + */
  19 +@Slf4j
  20 +@Component
  21 +public class SysSmsCoreProducer {
  22 +
  23 + @Resource
  24 + private StringRedisTemplate stringRedisTemplate;
  25 +
  26 + /**
  27 + * 发送 {@link SysSmsSendMessage} 消息
  28 + *
  29 + * @param logId 短信日志编号
  30 + * @param mobile 手机号
  31 + * @param channelId 渠道编号
  32 + * @param apiTemplateId 短信模板编号
  33 + * @param templateParams 短信模板参数
  34 + */
  35 + public void sendSmsSendMessage(Long logId, String mobile,
  36 + Long channelId, String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
  37 + SysSmsSendMessage message = new SysSmsSendMessage().setLogId(logId).setMobile(mobile);
  38 + message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams);
  39 + RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message);
  40 + }
  41 +
  42 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/package-info.java 0 → 100644
  1 +/**
  2 + * system 包下,我们放通用业务,支撑上层的核心业务。
  3 + * 例如说:用户、部门、权限、数据字典等等
  4 + *
  5 + * 缩写:sys
  6 + */
  7 +package cn.iocoder.yudao.coreservice.modules.system;
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreService.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.auth;
  2 +
  3 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  4 +
  5 +/**
  6 + * 在线用户 Session Core Service 接口
  7 + *
  8 + * @author 芋道源码
  9 + */
  10 +public interface SysUserSessionCoreService {
  11 +
  12 + /**
  13 + * 创建在线用户 Session
  14 + *
  15 + * @param loginUser 登录用户
  16 + * @param userIp 用户 IP
  17 + * @param userAgent 用户 UA
  18 + * @return Session 编号
  19 + */
  20 + String createUserSession(LoginUser loginUser, String userIp, String userAgent);
  21 +
  22 + /**
  23 + * 刷新在线用户 Session 的更新时间
  24 + *
  25 + * @param sessionId Session 编号
  26 + * @param loginUser 登录用户
  27 + */
  28 + void refreshUserSession(String sessionId, LoginUser loginUser);
  29 +
  30 + /**
  31 + * 删除在线用户 Session
  32 + *
  33 + * @param sessionId Session 编号
  34 + */
  35 + void deleteUserSession(String sessionId);
  36 +
  37 + /**
  38 + * 获得 Session 编号对应的在线用户
  39 + *
  40 + * @param sessionId Session 编号
  41 + * @return 在线用户
  42 + */
  43 + LoginUser getLoginUser(String sessionId);
  44 +
  45 + /**
  46 + * 获得 Session 超时时间,单位:毫秒
  47 + *
  48 + * @return 超时时间
  49 + */
  50 + Long getSessionTimeoutMillis();
  51 +
  52 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/impl/SysUserSessionCoreServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.auth.impl;
  2 +
  3 +import cn.hutool.core.util.IdUtil;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.auth.SysUserSessionCoreMapper;
  6 +import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO;
  7 +import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
  8 +import cn.iocoder.yudao.framework.security.config.SecurityProperties;
  9 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  10 +import org.springframework.stereotype.Service;
  11 +
  12 +import javax.annotation.Resource;
  13 +import java.time.Duration;
  14 +import java.util.Date;
  15 +
  16 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
  17 +
  18 +/**
  19 + * 在线用户 Session Core Service 实现类
  20 + *
  21 + * @author 芋道源码
  22 + */
  23 +@Service
  24 +public class SysUserSessionCoreServiceImpl implements SysUserSessionCoreService {
  25 +
  26 + @Resource
  27 + private SysUserSessionCoreMapper userSessionCoreMapper;
  28 +
  29 + @Resource
  30 + private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO;
  31 +
  32 + @Resource
  33 + private SecurityProperties securityProperties;
  34 +
  35 + @Override
  36 + public String createUserSession(LoginUser loginUser, String userIp, String userAgent) {
  37 + // 生成 Session 编号
  38 + String sessionId = generateSessionId();
  39 + // 写入 Redis 缓存
  40 + loginUser.setUpdateTime(new Date());
  41 + loginUserCoreRedisDAO.set(sessionId, loginUser);
  42 + // 写入 DB 中
  43 + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
  44 + .userId(loginUser.getId()).userType(loginUser.getUserType())
  45 + .userIp(userIp).userAgent(userAgent).username(loginUser.getUsername())
  46 + .sessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis())))
  47 + .build();
  48 + userSessionCoreMapper.insert(userSession);
  49 + // 返回 Session 编号
  50 + return sessionId;
  51 + }
  52 +
  53 + @Override
  54 + public void refreshUserSession(String sessionId, LoginUser loginUser) {
  55 + // 写入 Redis 缓存
  56 + loginUser.setUpdateTime(new Date());
  57 + loginUserCoreRedisDAO.set(sessionId, loginUser);
  58 + // 更新 DB 中
  59 + SysUserSessionDO updateObj = SysUserSessionDO.builder().id(sessionId).build();
  60 + updateObj.setUsername(loginUser.getUsername());
  61 + updateObj.setUpdateTime(new Date());
  62 + updateObj.setSessionTimeout(addTime(Duration.ofMillis(getSessionTimeoutMillis())));
  63 + userSessionCoreMapper.updateById(updateObj);
  64 + }
  65 +
  66 + @Override
  67 + public void deleteUserSession(String sessionId) {
  68 + // 删除 Redis 缓存
  69 + loginUserCoreRedisDAO.delete(sessionId);
  70 + // 删除 DB 记录
  71 + userSessionCoreMapper.deleteById(sessionId);
  72 + }
  73 +
  74 + @Override
  75 + public LoginUser getLoginUser(String sessionId) {
  76 + return loginUserCoreRedisDAO.get(sessionId);
  77 + }
  78 +
  79 + @Override
  80 + public Long getSessionTimeoutMillis() {
  81 + return securityProperties.getSessionTimeout().toMillis();
  82 + }
  83 +
  84 + /**
  85 + * 生成 Session 编号,目前采用 UUID 算法
  86 + *
  87 + * @return Session 编号
  88 + */
  89 + private static String generateSessionId() {
  90 + return IdUtil.fastSimpleUUID();
  91 + }
  92 +
  93 +}
... ...
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 3 import cn.iocoder.yudao.framework.dict.core.service.DictDataFrameworkService;
4 4  
5 5 /**
6 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 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 8 import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO;
5 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 10 import com.google.common.collect.ImmutableTable;
11 11 import lombok.extern.slf4j.Slf4j;
12 12 import org.springframework.scheduling.annotation.Scheduled;
... ... @@ -21,11 +21,11 @@ import java.util.List;
21 21 /**
22 22 * 字典数据 Service 实现类
23 23 *
24   - * @author ruoyi
  24 + * @author 芋道源码
25 25 */
26 26 @Service
27 27 @Slf4j
28   -public class SysDictDataServiceImpl implements SysDictDataService {
  28 +public class SysDictDataCoreServiceImpl implements SysDictDataCoreService {
29 29  
30 30 /**
31 31 * 定时执行 {@link #schedulePeriodicRefresh()} 的周期
... ... @@ -53,7 +53,7 @@ public class SysDictDataServiceImpl implements SysDictDataService {
53 53 private volatile Date maxUpdateTime;
54 54  
55 55 @Resource
56   - private SysDictDataMapper dictDataMapper;
  56 + private SysDictDataCoreMapper dictDataCoreMapper;
57 57  
58 58 @Override
59 59 @PostConstruct
... ... @@ -95,28 +95,28 @@ public class SysDictDataServiceImpl implements SysDictDataService {
95 95 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
96 96 log.info("[loadDictDataIfUpdate][首次加载全量字典数据]");
97 97 } else { // 判断数据库中是否有更新的字典数据
98   - if (!dictDataMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) {
  98 + if (!dictDataCoreMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) {
99 99 return null;
100 100 }
101 101 log.info("[loadDictDataIfUpdate][增量加载全量字典数据]");
102 102 }
103 103 // 第二步,如果有更新,则从数据库加载所有字典数据
104   - return dictDataMapper.selectList();
  104 + return dictDataCoreMapper.selectList();
105 105 }
106 106  
107 107 @Override
108 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 112 @Override
113 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 117 @Override
118 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-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogCoreService.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.logger;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
  4 +
  5 +/**
  6 + * 登录日志 Core Service 接口
  7 + */
  8 +public interface SysLoginLogCoreService {
  9 +
  10 + /**
  11 + * 创建登录日志
  12 + *
  13 + * @param reqDTO 日志信息
  14 + */
  15 + void createLoginLog(SysLoginLogCreateReqDTO reqDTO);
  16 +
  17 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/dto/SysLoginLogCreateReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.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 + @NotNull(message = "用户类型不能为空")
  37 + private Integer userType;
  38 + /**
  39 + * 用户账号
  40 + */
  41 + @NotBlank(message = "用户账号不能为空")
  42 + @Size(max = 30, message = "用户账号长度不能超过30个字符")
  43 + private String username;
  44 +
  45 + /**
  46 + * 登录结果
  47 + */
  48 + @NotNull(message = "登录结果不能为空")
  49 + private Integer result;
  50 +
  51 + /**
  52 + * 用户 IP
  53 + */
  54 + @NotEmpty(message = "用户 IP 不能为空")
  55 + private String userIp;
  56 + /**
  57 + * 浏览器 UserAgent
  58 + */
  59 + @NotEmpty(message = "浏览器 UserAgent 不能为空")
  60 + private String userAgent;
  61 +
  62 +}
... ...
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-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsService.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreService.java
1   -package cn.iocoder.yudao.adminserver.modules.system.service.sms;
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.sms;
2 2  
3   -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
  3 +import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
4 4  
5 5 import java.util.List;
6 6 import java.util.Map;
7 7  
8 8 /**
9   - * 短信Service接口
10   - * 只支持异步,因此没有返回值
  9 + * 短信 Service Core 接口
11 10 *
12   - * @author zzf
13   - * @date 2021/1/25 9:24
  11 + * 接入方,通过调用 send 开头的方法,创建发送短信的任务到 MQ 中
  12 + * 后续,yudao-admin-server 监听 MQ,执行真正的短信发送逻辑
  13 + *
  14 + * @author 芋道源码
14 15 */
15   -public interface SysSmsService {
  16 +public interface SysSmsCoreService {
16 17  
17 18 /**
18   - * 发送单条短信给用户(管理员)
  19 + * 发送单条短信给后台用户
19 20 *
20 21 * 在 mobile 为空时,使用 userId 加载对应管理员的手机号
21 22 *
... ... @@ -29,7 +30,7 @@ public interface SysSmsService {
29 30 String templateCode, Map<String, Object> templateParams);
30 31  
31 32 /**
32   - * 发送单条短信给用户(会员)
  33 + * 发送单条短信给前台用户
33 34 *
34 35 * 在 mobile 为空时,使用 userId 加载对应会员的手机号
35 36 *
... ... @@ -40,7 +41,7 @@ public interface SysSmsService {
40 41 * @return 发送日志编号
41 42 */
42 43 Long sendSingleSmsToMember(String mobile, Long userId,
43   - String templateCode, Map<String, Object> templateParams);
  44 + String templateCode, Map<String, Object> templateParams);
44 45  
45 46 Long sendSingleSms(String mobile, Long userId, Integer userType,
46 47 String templateCode, Map<String, Object> templateParams);
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreService.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.sms;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  4 +
  5 +import java.util.Date;
  6 +import java.util.Map;
  7 +
  8 +/**
  9 + * 短信日志 Core Service 接口
  10 + *
  11 + * @author zzf
  12 + * @date 13:48 2021/3/2
  13 + */
  14 +public interface SysSmsLogCoreService {
  15 +
  16 + /**
  17 + * 创建短信日志
  18 + *
  19 + * @param mobile 手机号
  20 + * @param userId 用户编号
  21 + * @param userType 用户类型
  22 + * @param isSend 是否发送
  23 + * @param template 短信模板
  24 + * @param templateContent 短信内容
  25 + * @param templateParams 短信参数
  26 + * @return 发送日志编号
  27 + */
  28 + Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
  29 + SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams);
  30 +
  31 + /**
  32 + * 更新日志的发送结果
  33 + *
  34 + * @param id 日志编号
  35 + * @param sendCode 发送结果的编码
  36 + * @param sendMsg 发送结果的提示
  37 + * @param apiSendCode 短信 API 发送结果的编码
  38 + * @param apiSendMsg 短信 API 发送失败的提示
  39 + * @param apiRequestId 短信 API 发送返回的唯一请求 ID
  40 + * @param apiSerialNo 短信 API 发送返回的序号
  41 + */
  42 + void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
  43 + String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo);
  44 +
  45 + /**
  46 + * 更新日志的接收结果
  47 + *
  48 + * @param id 日志编号
  49 + * @param success 是否接收成功
  50 + * @param receiveTime 用户接收时间
  51 + * @param apiReceiveCode API 接收结果的编码
  52 + * @param apiReceiveMsg API 接收结果的说明
  53 + */
  54 + void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg);
  55 +
  56 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateCoreService.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.sms;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  4 +
  5 +import java.util.Map;
  6 +
  7 +/**
  8 + * 短信模板 Core Service 接口
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +public interface SysSmsTemplateCoreService {
  13 +
  14 + /**
  15 + * 初始化短信模板的本地缓存
  16 + */
  17 + void initLocalCache();
  18 +
  19 + /**
  20 + * 获得短信模板,从缓存中
  21 + *
  22 + * @param code 模板编码
  23 + * @return 短信模板
  24 + */
  25 + SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code);
  26 +
  27 + /**
  28 + * 格式化短信内容
  29 + *
  30 + * @param content 短信模板的内容
  31 + * @param params 内容的参数
  32 + * @return 格式化后的内容
  33 + */
  34 + String formatSmsTemplateContent(String content, Map<String, Object> params);
  35 +
  36 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsServiceImpl.java renamed to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java
1   -package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl;
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
  6 +import cn.iocoder.yudao.coreservice.modules.member.service.user.MbrUserCoreService;
  7 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  8 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  9 +import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
  10 +import cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms.SysSmsCoreProducer;
  11 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
  12 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsLogCoreService;
  13 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService;
  14 +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
5 15 import cn.iocoder.yudao.framework.common.core.KeyValue;
6 16 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7 17 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
... ... @@ -10,16 +20,7 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
10 20 import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
11 21 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO;
12 22 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO;
13   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
14   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
15   -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
16   -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
17   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService;
18   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService;
19   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
20   -import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
21 23 import com.google.common.annotations.VisibleForTesting;
22   -import lombok.extern.slf4j.Slf4j;
23 24 import org.springframework.stereotype.Service;
24 25 import org.springframework.util.Assert;
25 26  
... ... @@ -28,36 +29,37 @@ import java.util.List;
28 29 import java.util.Map;
29 30 import java.util.stream.Collectors;
30 31  
  32 +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.*;
31 33 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
32   -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
33 34  
34 35 /**
35   - * 短信日志Service实现类
  36 + * 短信 Service Core 实现
36 37 *
37   - * @author zzf
38   - * @date 2021/1/25 9:25
  38 + * @author 芋道源码
39 39 */
40 40 @Service
41   -@Slf4j
42   -public class SysSmsServiceImpl implements SysSmsService {
  41 +public class SysSmsCoreServiceImpl implements SysSmsCoreService {
43 42  
44 43 @Resource
45   - private SysSmsTemplateService smsTemplateService;
  44 + private SysUserCoreService sysUserCoreService;
46 45 @Resource
47   - private SysSmsLogService smsLogService;
  46 + private MbrUserCoreService mbrUserCoreService;
48 47 @Resource
49   - private SysSmsProducer smsProducer;
  48 + private SysSmsTemplateCoreService smsTemplateCoreService;
  49 + @Resource
  50 + private SysSmsLogCoreService smsLogCoreService;
  51 +
50 52 @Resource
51 53 private SmsClientFactory smsClientFactory;
52 54  
53 55 @Resource
54   - private SysUserService userService;
  56 + private SysSmsCoreProducer smsCoreProducer;
55 57  
56 58 @Override
57 59 public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map<String, Object> templateParams) {
58 60 // 如果 mobile 为空,则加载用户编号对应的手机号
59 61 if (StrUtil.isEmpty(mobile)) {
60   - SysUserDO user = userService.getUser(userId);
  62 + SysUserDO user = sysUserCoreService.getUser(userId);
61 63 if (user != null) {
62 64 mobile = user.getMobile();
63 65 }
... ... @@ -68,7 +70,15 @@ public class SysSmsServiceImpl implements SysSmsService {
68 70  
69 71 @Override
70 72 public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map<String, Object> templateParams) {
71   - throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!");
  73 + // 如果 mobile 为空,则加载用户编号对应的手机号
  74 + if (StrUtil.isEmpty(mobile)) {
  75 + MbrUserDO user = mbrUserCoreService.getUser(userId);
  76 + if (user != null) {
  77 + mobile = user.getMobile();
  78 + }
  79 + }
  80 + // 执行发送
  81 + return this.sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams);
72 82 }
73 83  
74 84 @Override
... ... @@ -83,12 +93,13 @@ public class SysSmsServiceImpl implements SysSmsService {
83 93  
84 94 // 创建发送日志
85 95 Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志
86   - String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams);
87   - Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams);
  96 + String content = smsTemplateCoreService.formatSmsTemplateContent(template.getContent(), templateParams);
  97 + Long sendLogId = smsLogCoreService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams);
88 98  
89 99 // 发送 MQ 消息,异步执行发送短信
90 100 if (isSend) {
91   - smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), template.getApiTemplateId(), newTemplateParams);
  101 + smsCoreProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(),
  102 + template.getApiTemplateId(), newTemplateParams);
92 103 }
93 104 return sendLogId;
94 105 }
... ... @@ -102,10 +113,10 @@ public class SysSmsServiceImpl implements SysSmsService {
102 113 @VisibleForTesting
103 114 public SysSmsTemplateDO checkSmsTemplateValid(String templateCode) {
104 115 // 获得短信模板。考虑到效率,从缓存中获取
105   - SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode);
  116 + SysSmsTemplateDO template = smsTemplateCoreService.getSmsTemplateByCodeFromCache(templateCode);
106 117 // 短信模板不存在
107 118 if (template == null) {
108   - throw exception(SMS_TEMPLATE_NOT_EXISTS);
  119 + throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS);
109 120 }
110 121 return template;
111 122 }
... ... @@ -138,6 +149,7 @@ public class SysSmsServiceImpl implements SysSmsService {
138 149 return mobile;
139 150 }
140 151  
  152 +
141 153 @Override
142 154 public void doSendSms(SysSmsSendMessage message) {
143 155 // 获得渠道对应的 SmsClient 客户端
... ... @@ -146,7 +158,7 @@ public class SysSmsServiceImpl implements SysSmsService {
146 158 // 发送短信
147 159 SmsCommonResult<SmsSendRespDTO> sendResult = smsClient.sendSms(message.getLogId(), message.getMobile(),
148 160 message.getApiTemplateId(), message.getTemplateParams());
149   - smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(),
  161 + smsLogCoreService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(),
150 162 sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(),
151 163 sendResult.getData() != null ? sendResult.getData().getSerialNo() : null);
152 164 }
... ... @@ -161,11 +173,9 @@ public class SysSmsServiceImpl implements SysSmsService {
161 173 if (CollUtil.isEmpty(receiveResults)) {
162 174 return;
163 175 }
164   - // 更新短信日志的接收结果. 因为量一般不打,所以先使用 for 循环更新
165   - receiveResults.forEach(result -> {
166   - smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSuccess(), result.getReceiveTime(),
167   - result.getErrorCode(), result.getErrorCode());
168   - });
  176 + // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新
  177 + receiveResults.forEach(result -> smsLogCoreService.updateSmsReceiveResult(result.getLogId(),
  178 + result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorCode()));
169 179 }
170 180  
171 181 }
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsLogCoreServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsLogCoreMapper;
  6 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum;
  7 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum;
  8 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsLogCoreService;
  9 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  10 +import lombok.extern.slf4j.Slf4j;
  11 +import org.springframework.stereotype.Service;
  12 +
  13 +import javax.annotation.Resource;
  14 +import java.util.Date;
  15 +import java.util.Map;
  16 +import java.util.Objects;
  17 +
  18 +/**
  19 + * 短信日志 Core Service 实现类
  20 + *
  21 + * @author zzf
  22 + * @date 2021/1/25 9:25
  23 + */
  24 +@Slf4j
  25 +@Service
  26 +public class SysSmsLogCoreServiceImpl implements SysSmsLogCoreService {
  27 +
  28 + @Resource
  29 + private SysSmsLogCoreMapper smsLogCoreMapper;
  30 +
  31 + @Override
  32 + public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
  33 + SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams) {
  34 + SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder();
  35 + // 根据是否要发送,设置状态
  36 + logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus()
  37 + : SysSmsSendStatusEnum.IGNORE.getStatus());
  38 + // 设置手机相关字段
  39 + logBuilder.mobile(mobile).userId(userId).userType(userType);
  40 + // 设置模板相关字段
  41 + logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType());
  42 + logBuilder.templateContent(templateContent).templateParams(templateParams).apiTemplateId(template.getApiTemplateId());
  43 + // 设置渠道相关字段
  44 + logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode());
  45 + // 设置接收相关字段
  46 + logBuilder.receiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus());
  47 +
  48 + // 插入数据库
  49 + SysSmsLogDO logDO = logBuilder.build();
  50 + smsLogCoreMapper.insert(logDO);
  51 + return logDO.getId();
  52 + }
  53 +
  54 + @Override
  55 + public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
  56 + String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) {
  57 + SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS
  58 + : SysSmsSendStatusEnum.FAILURE;
  59 + smsLogCoreMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()).sendTime(new Date())
  60 + .sendCode(sendCode).sendMsg(sendMsg).apiSendCode(apiSendCode).apiSendMsg(apiSendMsg)
  61 + .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build());
  62 + }
  63 +
  64 + @Override
  65 + public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg) {
  66 + SysSmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? SysSmsReceiveStatusEnum.SUCCESS
  67 + : SysSmsReceiveStatusEnum.FAILURE;
  68 + smsLogCoreMapper.updateById(SysSmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()).receiveTime(receiveTime)
  69 + .apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
  70 + }
  71 +
  72 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsTemplateCoreServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  6 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsTemplateCoreMapper;
  7 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService;
  8 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  9 +import com.google.common.collect.ImmutableMap;
  10 +import lombok.extern.slf4j.Slf4j;
  11 +import org.springframework.scheduling.annotation.Scheduled;
  12 +import org.springframework.stereotype.Service;
  13 +
  14 +import javax.annotation.PostConstruct;
  15 +import javax.annotation.Resource;
  16 +import java.util.Comparator;
  17 +import java.util.Date;
  18 +import java.util.List;
  19 +import java.util.Map;
  20 +
  21 +/**
  22 + * 短信模板 Core Service 接口
  23 + *
  24 + * @author 芋道源码
  25 + */
  26 +@Service
  27 +@Slf4j
  28 +public class SysSmsTemplateCoreServiceImpl implements SysSmsTemplateCoreService {
  29 +
  30 + /**
  31 + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期
  32 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高
  33 + */
  34 + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L;
  35 +
  36 + /**
  37 + * 短信模板缓存
  38 + * key:短信模板编码 {@link SysSmsTemplateDO#getCode()}
  39 + *
  40 + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向
  41 + */
  42 + private volatile Map<String, SysSmsTemplateDO> smsTemplateCache;
  43 + /**
  44 + * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新
  45 + */
  46 + private volatile Date maxUpdateTime;
  47 +
  48 + @Resource
  49 + private SysSmsTemplateCoreMapper smsTemplateCoreMapper;
  50 +
  51 + @Override
  52 + @PostConstruct
  53 + public void initLocalCache() {
  54 + // 获取短信模板列表,如果有更新
  55 + List<SysSmsTemplateDO> smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime);
  56 + if (CollUtil.isEmpty(smsTemplateList)) {
  57 + return;
  58 + }
  59 +
  60 + // 写入缓存
  61 + ImmutableMap.Builder<String, SysSmsTemplateDO> builder = ImmutableMap.builder();
  62 + smsTemplateList.forEach(sysSmsTemplateDO -> builder.put(sysSmsTemplateDO.getCode(), sysSmsTemplateDO));
  63 + smsTemplateCache = builder.build();
  64 + assert smsTemplateList.size() > 0; // 断言,避免告警
  65 + maxUpdateTime = smsTemplateList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime();
  66 + log.info("[initLocalCache][初始化 SmsTemplate 数量为 {}]", smsTemplateList.size());
  67 + }
  68 +
  69 + /**
  70 + * 如果短信模板发生变化,从数据库中获取最新的全量短信模板。
  71 + * 如果未发生变化,则返回空
  72 + *
  73 + * @param maxUpdateTime 当前短信模板的最大更新时间
  74 + * @return 短信模板列表
  75 + */
  76 + private List<SysSmsTemplateDO> loadSmsTemplateIfUpdate(Date maxUpdateTime) {
  77 + // 第一步,判断是否要更新。
  78 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
  79 + log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]");
  80 + } else { // 判断数据库中是否有更新的短信模板
  81 + if (smsTemplateCoreMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) {
  82 + return null;
  83 + }
  84 + log.info("[loadSmsTemplateIfUpdate][增量加载全量短信模板]");
  85 + }
  86 + // 第二步,如果有更新,则从数据库加载所有短信模板
  87 + return smsTemplateCoreMapper.selectList();
  88 + }
  89 +
  90 + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD)
  91 + public void schedulePeriodicRefresh() {
  92 + initLocalCache();
  93 + }
  94 +
  95 + @Override
  96 + public SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code) {
  97 + return smsTemplateCache.get(code);
  98 + }
  99 +
  100 + @Override
  101 + public String formatSmsTemplateContent(String content, Map<String, Object> params) {
  102 + return StrUtil.format(content, params);
  103 + }
  104 +
  105 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.user;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  4 +
  5 +/**
  6 + * 后台用户 Service Core 接口
  7 + *
  8 + * @author 芋道源码
  9 + */
  10 +public interface SysUserCoreService {
  11 +
  12 + /**
  13 + * 通过用户 ID 查询用户
  14 + *
  15 + * @param id 用户ID
  16 + * @return 用户对象信息
  17 + */
  18 + SysUserDO getUser(Long id);
  19 +
  20 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.user.impl;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.user.SysUserCoreMapper;
  5 +import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
  6 +import org.springframework.stereotype.Service;
  7 +
  8 +import javax.annotation.Resource;
  9 +
  10 +/**
  11 + * 后台用户 Service Core 实现
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Service
  16 +public class SysUserCoreServiceImpl implements SysUserCoreService {
  17 +
  18 + @Resource
  19 + private SysUserCoreMapper userCoreMapper;
  20 +
  21 + @Override
  22 + public SysUserDO getUser(Long id) {
  23 + return userCoreMapper.selectById(id);
  24 + }
  25 +
  26 +}
... ...
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/tool/package-info.java 0 → 100644
  1 +/**
  2 + * tool 包下,我们放研发工具,提升研发效率与质量。
  3 + * 例如说:代码生成器、接口文档等等
  4 + *
  5 + * 缩写:tool
  6 + */
  7 +package cn.iocoder.yudao.coreservice.modules.tool;
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbAndRedisUnitTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice;
  2 +
  3 +import cn.iocoder.yudao.coreservice.config.RedisTestConfiguration;
  4 +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
  5 +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
  6 +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
  7 +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
  8 +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
  9 +import org.redisson.spring.starter.RedissonAutoConfiguration;
  10 +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
  11 +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  12 +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
  13 +import org.springframework.boot.test.context.SpringBootTest;
  14 +import org.springframework.context.annotation.Import;
  15 +import org.springframework.test.context.ActiveProfiles;
  16 +import org.springframework.test.context.jdbc.Sql;
  17 +
  18 +/**
  19 + * 依赖内存 DB + Redis 的单元测试
  20 + *
  21 + * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis
  22 + *
  23 + * @author 芋道源码
  24 + */
  25 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class)
  26 +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
  27 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
  28 +public class BaseDbAndRedisUnitTest {
  29 +
  30 + @Import({
  31 + // DB 配置类
  32 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类
  33 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类
  34 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
  35 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类
  36 + // MyBatis 配置类
  37 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
  38 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
  39 + // Redis 配置类
  40 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer
  41 + RedisAutoConfiguration.class, // Spring Redis 自动配置类
  42 + YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
  43 + RedissonAutoConfiguration.class, // Redisson 自动高配置类
  44 + })
  45 + public static class Application {
  46 + }
  47 +
  48 +}
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseDbUnitTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice;
  2 +
  3 +import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
  4 +import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
  5 +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
  6 +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
  7 +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  8 +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
  9 +import org.springframework.boot.test.context.SpringBootTest;
  10 +import org.springframework.context.annotation.Import;
  11 +import org.springframework.test.context.ActiveProfiles;
  12 +import org.springframework.test.context.jdbc.Sql;
  13 +
  14 +/**
  15 + * 依赖内存 DB 的单元测试
  16 + *
  17 + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法
  18 + *
  19 + * @author 芋道源码
  20 + */
  21 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class)
  22 +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
  23 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
  24 +public class BaseDbUnitTest {
  25 +
  26 + @Import({
  27 + // DB 配置类
  28 + YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类
  29 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类
  30 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
  31 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类
  32 + // MyBatis 配置类
  33 + YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
  34 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
  35 + })
  36 + public static class Application {
  37 + }
  38 +
  39 +}
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/BaseRedisUnitTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice;
  2 +
  3 +import cn.iocoder.yudao.coreservice.config.RedisTestConfiguration;
  4 +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
  5 +import org.redisson.spring.starter.RedissonAutoConfiguration;
  6 +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
  7 +import org.springframework.boot.test.context.SpringBootTest;
  8 +import org.springframework.context.annotation.Import;
  9 +import org.springframework.test.context.ActiveProfiles;
  10 +
  11 +/**
  12 + * 依赖内存 Redis 的单元测试
  13 + *
  14 + * 相比 {@link BaseDbUnitTest} 来说,从内存 DB 改成了内存 Redis
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisUnitTest.Application.class)
  19 +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
  20 +public class BaseRedisUnitTest {
  21 +
  22 + @Import({
  23 + // Redis 配置类
  24 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer
  25 + RedisAutoConfiguration.class, // Spring Redis 自动配置类
  26 + YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
  27 + RedissonAutoConfiguration.class, // Redisson 自动高配置类
  28 + })
  29 + public static class Application {
  30 + }
  31 +
  32 +}
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/config/RedisTestConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.config;
  2 +
  3 +import com.github.fppt.jedismock.RedisServer;
  4 +import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
  5 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  6 +import org.springframework.context.annotation.Bean;
  7 +import org.springframework.context.annotation.Configuration;
  8 +import org.springframework.context.annotation.Lazy;
  9 +
  10 +import java.io.IOException;
  11 +
  12 +@Configuration(proxyBeanMethods = false)
  13 +@Lazy(false) // 禁止延迟加载
  14 +@EnableConfigurationProperties(RedisProperties.class)
  15 +public class RedisTestConfiguration {
  16 +
  17 + /**
  18 + * 创建模拟的 Redis Server 服务器
  19 + */
  20 + @Bean
  21 + public RedisServer redisServer(RedisProperties properties) throws IOException {
  22 + RedisServer redisServer = new RedisServer(properties.getPort());
  23 + // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。
  24 + try {
  25 + redisServer.start();
  26 + } catch (Exception ignore) {}
  27 + return redisServer;
  28 + }
  29 +
  30 +}
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiAccessLogCoreServiceTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.infra.service.logger;
  2 +
  3 +import cn.hutool.core.util.RandomUtil;
  4 +import cn.iocoder.yudao.coreservice.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
  6 +import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger.InfApiAccessLogCoreMapper;
  7 +import cn.iocoder.yudao.coreservice.modules.infra.service.logger.impl.InfApiAccessLogCoreServiceImpl;
  8 +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO;
  9 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  10 +import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
  11 +import org.junit.jupiter.api.Test;
  12 +import org.springframework.context.annotation.Import;
  13 +
  14 +import javax.annotation.Resource;
  15 +import java.util.concurrent.Future;
  16 +
  17 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  18 +import static org.junit.jupiter.api.Assertions.assertNotNull;
  19 +
  20 +/**
  21 + * {@link InfApiAccessLogCoreServiceImpl} 单元测试
  22 + */
  23 +@Import(InfApiAccessLogCoreServiceImpl.class)
  24 +public class InfApiAccessLogCoreServiceTest extends BaseDbUnitTest {
  25 +
  26 + @Resource
  27 + private InfApiAccessLogCoreService apiAccessLogCoreService;
  28 +
  29 + @Resource
  30 + private InfApiAccessLogCoreMapper apiAccessLogCoreMapper;
  31 +
  32 + @Test
  33 + public void testCreateApiAccessLogAsync() {
  34 + // 准备参数
  35 + ApiAccessLogCreateDTO createDTO = RandomUtils.randomPojo(ApiAccessLogCreateDTO.class,
  36 + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()));
  37 +
  38 + // 调用
  39 + apiAccessLogCoreService.createApiAccessLogAsync(createDTO);
  40 + // 断言
  41 + InfApiAccessLogDO infApiAccessLogDO = apiAccessLogCoreMapper.selectOne(null);
  42 + assertNotNull(infApiAccessLogDO);
  43 + assertPojoEquals(createDTO, infApiAccessLogDO);
  44 + }
  45 +
  46 +}
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/logger/InfApiErrorLogCoreServiceTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.infra.service.logger;
  2 +
  3 +import cn.hutool.core.util.RandomUtil;
  4 +import cn.iocoder.yudao.coreservice.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
  6 +import cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.logger.InfApiErrorLogCoreMapper;
  7 +import cn.iocoder.yudao.coreservice.modules.infra.service.logger.impl.InfApiErrorLogCoreServiceImpl;
  8 +import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO;
  9 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  10 +import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
  11 +import org.junit.jupiter.api.Test;
  12 +import org.springframework.context.annotation.Import;
  13 +
  14 +import javax.annotation.Resource;
  15 +
  16 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  17 +import static org.junit.jupiter.api.Assertions.assertNotNull;
  18 +
  19 +/**
  20 + * {@link InfApiErrorLogCoreServiceImpl} 单元测试
  21 + */
  22 +@Import(InfApiErrorLogCoreServiceImpl.class)
  23 +public class InfApiErrorLogCoreServiceTest extends BaseDbUnitTest {
  24 +
  25 + @Resource
  26 + private InfApiErrorLogCoreService apiErrorLogCoreService;
  27 +
  28 + @Resource
  29 + private InfApiErrorLogCoreMapper infApiErrorLogCoreMapper;
  30 +
  31 + @Test
  32 + public void testCreateApiErrorLogAsync() {
  33 + // 准备参数
  34 + ApiErrorLogCreateDTO createDTO = RandomUtils.randomPojo(ApiErrorLogCreateDTO.class,
  35 + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()));
  36 +
  37 + // 调用
  38 + apiErrorLogCoreService.createApiErrorLogAsync(createDTO);
  39 + // 断言
  40 + InfApiErrorLogDO infApiErrorLogDO = infApiErrorLogCoreMapper.selectOne(null);
  41 + assertNotNull(infApiErrorLogDO);
  42 + assertPojoEquals(createDTO, infApiErrorLogDO);
  43 + }
  44 +
  45 +}
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/infra/service/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.infra.service;
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/auth/SysUserSessionCoreServiceTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.auth;
  2 +
  3 +import cn.iocoder.yudao.coreservice.BaseDbAndRedisUnitTest;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.auth.SysUserSessionCoreMapper;
  6 +import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO;
  7 +import cn.iocoder.yudao.coreservice.modules.system.service.auth.impl.SysUserSessionCoreServiceImpl;
  8 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  9 +import cn.iocoder.yudao.framework.security.config.SecurityProperties;
  10 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  11 +import org.junit.jupiter.api.Test;
  12 +import org.springframework.boot.test.mock.mockito.MockBean;
  13 +import org.springframework.context.annotation.Import;
  14 +
  15 +import javax.annotation.Resource;
  16 +import java.time.Duration;
  17 +import java.util.Date;
  18 +
  19 +import static cn.hutool.core.util.RandomUtil.randomEle;
  20 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
  21 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  22 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
  23 +import static org.junit.jupiter.api.Assertions.*;
  24 +import static org.mockito.Mockito.when;
  25 +
  26 +@Import({SysUserSessionCoreServiceImpl.class, SysLoginUserCoreRedisDAO.class})
  27 +public class SysUserSessionCoreServiceTest extends BaseDbAndRedisUnitTest {
  28 +
  29 + @Resource
  30 + private SysUserSessionCoreServiceImpl userSessionCoreService;
  31 +
  32 + @Resource
  33 + private SysUserSessionCoreMapper userSessionCoreMapper;
  34 + @Resource
  35 + private SysLoginUserCoreRedisDAO loginUserCoreRedisDAO;
  36 +
  37 + @MockBean
  38 + private SecurityProperties securityProperties;
  39 +
  40 + @Test
  41 + public void testCreateUserSession_success() {
  42 + // 准备参数
  43 + String userIp = randomString();
  44 + String userAgent = randomString();
  45 + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setUserType(randomEle(UserTypeEnum.values()).getValue()));
  46 + // mock 方法
  47 + when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1));
  48 +
  49 + // 调用
  50 + String sessionId = userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
  51 + // 校验 SysUserSessionDO 记录
  52 + SysUserSessionDO userSessionDO = userSessionCoreMapper.selectById(sessionId);
  53 + assertPojoEquals(loginUser, userSessionDO, "id", "updateTime");
  54 + assertEquals(sessionId, userSessionDO.getId());
  55 + assertEquals(userIp, userSessionDO.getUserIp());
  56 + assertEquals(userAgent, userSessionDO.getUserAgent());
  57 + // 校验 LoginUser 缓存
  58 + LoginUser redisLoginUser = loginUserCoreRedisDAO.get(sessionId);
  59 + assertPojoEquals(loginUser, redisLoginUser, "username", "password");
  60 + }
  61 +
  62 + @Test
  63 + public void testCreateRefreshUserSession_success() {
  64 + // 准备参数
  65 + String sessionId = randomString();
  66 + String userIp = randomString();
  67 + String userAgent = randomString();
  68 + long timeLong = randomLongId();
  69 + String userName = randomString();
  70 + Date date = randomDate();
  71 + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setUserType(randomEle(UserTypeEnum.values()).getValue()));
  72 + // mock 方法
  73 + when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1));
  74 + // mock 数据
  75 + loginUser.setUpdateTime(date);
  76 + loginUserCoreRedisDAO.set(sessionId, loginUser);
  77 + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
  78 + .userId(loginUser.getId()).userType(loginUser.getUserType())
  79 + .userIp(userIp).userAgent(userAgent).username(userName)
  80 + .sessionTimeout(addTime(Duration.ofMillis(timeLong)))
  81 + .build();
  82 + userSessionCoreMapper.insert(userSession);
  83 +
  84 + // 调用
  85 + userSessionCoreService.refreshUserSession(sessionId, loginUser);
  86 + // 校验 LoginUser 缓存
  87 + LoginUser redisLoginUser = loginUserCoreRedisDAO.get(sessionId);
  88 + assertNotEquals(redisLoginUser.getUpdateTime(), date);
  89 + // 校验 SysUserSessionDO 记录
  90 + SysUserSessionDO updateDO = userSessionCoreMapper.selectById(sessionId);
  91 + assertEquals(updateDO.getUsername(), loginUser.getUsername());
  92 + assertNotEquals(updateDO.getUpdateTime(), userSession.getUpdateTime());
  93 + assertNotEquals(updateDO.getSessionTimeout(), addTime(Duration.ofMillis(timeLong)));
  94 + }
  95 +
  96 + @Test
  97 + public void testDeleteUserSession_success() {
  98 + // 准备参数
  99 + String sessionId = randomString();
  100 + String userIp = randomString();
  101 + String userAgent = randomString();
  102 + Long timeLong = randomLongId();
  103 + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setUserType(randomEle(UserTypeEnum.values()).getValue()));
  104 + // mock 存入 Redis
  105 + when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1));
  106 + // mock 数据
  107 + loginUserCoreRedisDAO.set(sessionId, loginUser);
  108 + SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
  109 + .userId(loginUser.getId()).userType(loginUser.getUserType())
  110 + .userIp(userIp).userAgent(userAgent).username(loginUser.getUsername())
  111 + .sessionTimeout(addTime(Duration.ofMillis(timeLong)))
  112 + .build();
  113 + userSessionCoreMapper.insert(userSession);
  114 +
  115 + // 调用
  116 + userSessionCoreService.deleteUserSession(sessionId);
  117 + // 校验数据不存在了
  118 + assertNull(loginUserCoreRedisDAO.get(sessionId));
  119 + assertNull(userSessionCoreMapper.selectById(sessionId));
  120 + }
  121 +
  122 +}
... ...
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.iocoder.yudao.coreservice.BaseDbUnitTest;
  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.enums.logger.SysLoginLogTypeEnum;
  7 +import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
  8 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
  9 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.impl.SysLoginLogCoreServiceImpl;
  10 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  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.hutool.core.util.RandomUtil.randomEle;
  19 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  20 +
  21 +@Import(SysLoginLogCoreServiceImpl.class)
  22 +public class SysLoginLogServiceImplTest extends BaseDbUnitTest {
  23 +
  24 + @Resource
  25 + private SysLoginLogCoreServiceImpl loginLogCoreService;
  26 +
  27 + @Resource
  28 + private SysLoginLogCoreMapper loginLogCoreMapper;
  29 +
  30 + @Test
  31 + public void testCreateLoginLog() {
  32 + SysLoginLogCreateReqDTO reqDTO = RandomUtils.randomPojo(SysLoginLogCreateReqDTO.class, vo -> {
  33 + // 指定随机的范围,避免超出范围入库失败
  34 + vo.setUserType(randomEle(UserTypeEnum.values()).getValue());
  35 + vo.setLogType(randomEle(SysLoginLogTypeEnum.values()).getType());
  36 + vo.setResult(randomEle(SysLoginResultEnum.values()).getResult());
  37 + vo.setTraceId(TracerUtils.getTraceId());
  38 + });
  39 +
  40 + // 调用
  41 + loginLogCoreService.createLoginLog(reqDTO);
  42 + // 断言,忽略基本字段
  43 + SysLoginLogDO sysLoginLogDO = loginLogCoreMapper.selectOne(null);
  44 + assertPojoEquals(reqDTO, sysLoginLogDO);
  45 + }
  46 +
  47 +}
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service;
... ...
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceTest.java renamed to yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreServiceTest.java
1   -package cn.iocoder.yudao.adminserver.modules.system.service.sms;
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.sms;
2 2  
3 3 import cn.hutool.core.map.MapUtil;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
  6 +import cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms.SysSmsCoreProducer;
  7 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsCoreServiceImpl;
4 8 import cn.iocoder.yudao.framework.common.core.KeyValue;
5 9 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 10 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
... ... @@ -9,10 +13,6 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
9 13 import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
10 14 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO;
11 15 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO;
12   -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
13   -import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
14   -import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
15   -import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsServiceImpl;
16 16 import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
17 17 import org.assertj.core.util.Lists;
18 18 import org.junit.jupiter.api.Test;
... ... @@ -24,7 +24,7 @@ import java.util.List;
24 24 import java.util.Map;
25 25  
26 26 import static cn.hutool.core.util.RandomUtil.randomEle;
27   -import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
  27 +import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.*;
28 28 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
29 29 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
30 30 import static org.junit.jupiter.api.Assertions.assertEquals;
... ... @@ -32,21 +32,21 @@ import static org.mockito.ArgumentMatchers.eq;
32 32 import static org.mockito.Mockito.*;
33 33  
34 34 /**
35   - * {@link SysSmsServiceImpl} 的单元测试类
  35 + * {@link SysSmsCoreService} 的单元测试类
36 36 *
37 37 * @author 芋道源码
38 38 */
39   -public class SysSmsServiceTest extends BaseMockitoUnitTest {
  39 +public class SysSmsCoreServiceTest extends BaseMockitoUnitTest {
40 40  
41 41 @InjectMocks
42   - private SysSmsServiceImpl smsService;
  42 + private SysSmsCoreServiceImpl smsCoreService;
43 43  
44 44 @Mock
45   - private SysSmsTemplateService smsTemplateService;
  45 + private SysSmsTemplateCoreService smsTemplateCoreService;
46 46 @Mock
47   - private SysSmsLogService smsLogService;
  47 + private SysSmsLogCoreService smsLogCoreService;
48 48 @Mock
49   - private SysSmsProducer smsProducer;
  49 + private SysSmsCoreProducer smsCoreProducer;
50 50 @Mock
51 51 private SmsClientFactory smsClientFactory;
52 52  
... ... @@ -68,21 +68,21 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
68 68 o.setContent("验证码为{code}, 操作为{op}");
69 69 o.setParams(Lists.newArrayList("code", "op"));
70 70 });
71   - when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
  71 + when(smsTemplateCoreService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
72 72 String content = randomString();
73   - when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
  73 + when(smsTemplateCoreService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
74 74 .thenReturn(content);
75 75 // mock SmsLogService 的方法
76 76 Long smsLogId = randomLongId();
77   - when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.TRUE), eq(template),
  77 + when(smsLogCoreService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.TRUE), eq(template),
78 78 eq(content), eq(templateParams))).thenReturn(smsLogId);
79 79  
80 80 // 调用
81   - Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
  81 + Long resultSmsLogId = smsCoreService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
82 82 // 断言
83 83 assertEquals(smsLogId, resultSmsLogId);
84 84 // 断言调用
85   - verify(smsProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile),
  85 + verify(smsCoreProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile),
86 86 eq(template.getChannelId()), eq(template.getApiTemplateId()),
87 87 eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login"))));
88 88 }
... ... @@ -105,21 +105,21 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
105 105 o.setContent("验证码为{code}, 操作为{op}");
106 106 o.setParams(Lists.newArrayList("code", "op"));
107 107 });
108   - when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
  108 + when(smsTemplateCoreService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
109 109 String content = randomString();
110   - when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
  110 + when(smsTemplateCoreService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
111 111 .thenReturn(content);
112 112 // mock SmsLogService 的方法
113 113 Long smsLogId = randomLongId();
114   - when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.FALSE), eq(template),
  114 + when(smsLogCoreService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.FALSE), eq(template),
115 115 eq(content), eq(templateParams))).thenReturn(smsLogId);
116 116  
117 117 // 调用
118   - Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
  118 + Long resultSmsLogId = smsCoreService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
119 119 // 断言
120 120 assertEquals(smsLogId, resultSmsLogId);
121 121 // 断言调用
122   - verify(smsProducer, times(0)).sendSmsSendMessage(anyLong(), anyString(),
  122 + verify(smsCoreProducer, times(0)).sendSmsSendMessage(anyLong(), anyString(),
123 123 anyLong(), any(), anyList());
124 124 }
125 125  
... ... @@ -130,8 +130,8 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
130 130 // mock 方法
131 131  
132 132 // 调用,并断言异常
133   - assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode),
134   - SMS_TEMPLATE_NOT_EXISTS);
  133 + assertServiceException(() -> smsCoreService.checkSmsTemplateValid(templateCode),
  134 + SMS_SEND_TEMPLATE_NOT_EXISTS);
135 135 }
136 136  
137 137 @Test
... ... @@ -143,7 +143,7 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
143 143 // mock 方法
144 144  
145 145 // 调用,并断言异常
146   - assertServiceException(() -> smsService.buildTemplateParams(template, templateParams),
  146 + assertServiceException(() -> smsCoreService.buildTemplateParams(template, templateParams),
147 147 SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, "code");
148 148 }
149 149  
... ... @@ -153,7 +153,7 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
153 153 // mock 方法
154 154  
155 155 // 调用,并断言异常
156   - assertServiceException(() -> smsService.checkMobile(null),
  156 + assertServiceException(() -> smsCoreService.checkMobile(null),
157 157 SMS_SEND_MOBILE_NOT_EXISTS);
158 158 }
159 159  
... ... @@ -171,9 +171,9 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
171 171 eq(message.getTemplateParams()))).thenReturn(sendResult);
172 172  
173 173 // 调用
174   - smsService.doSendSms(message);
  174 + smsCoreService.doSendSms(message);
175 175 // 断言
176   - verify(smsLogService, times(1)).updateSmsSendResult(eq(message.getLogId()),
  176 + verify(smsLogCoreService, times(1)).updateSmsSendResult(eq(message.getLogId()),
177 177 eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()),
178 178 eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo()));
179 179 }
... ... @@ -190,12 +190,10 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
190 190 List<SmsReceiveRespDTO> receiveResults = randomPojoList(SmsReceiveRespDTO.class);
191 191  
192 192 // 调用
193   - smsService.receiveSmsStatus(channelCode, text);
  193 + smsCoreService.receiveSmsStatus(channelCode, text);
194 194 // 断言
195   - receiveResults.forEach(result -> {
196   - smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()),
197   - eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode()));
198   - });
  195 + receiveResults.forEach(result -> smsLogCoreService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()),
  196 + eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode())));
199 197 }
200 198  
201 199 }
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreServiceTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.sms;
  2 +
  3 +import cn.hutool.core.map.MapUtil;
  4 +import cn.iocoder.yudao.coreservice.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
  6 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  7 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsLogCoreMapper;
  8 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum;
  9 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum;
  10 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
  11 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsLogCoreServiceImpl;
  12 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  13 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  14 +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
  15 +import org.junit.jupiter.api.Test;
  16 +import org.springframework.context.annotation.Import;
  17 +
  18 +import javax.annotation.Resource;
  19 +import java.util.Date;
  20 +import java.util.Map;
  21 +import java.util.function.Consumer;
  22 +
  23 +import static cn.hutool.core.util.RandomUtil.randomBoolean;
  24 +import static cn.hutool.core.util.RandomUtil.randomEle;
  25 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
  26 +import static org.junit.jupiter.api.Assertions.assertEquals;
  27 +import static org.junit.jupiter.api.Assertions.assertNotNull;
  28 +
  29 +/**
  30 +* {@link SysSmsLogCoreServiceImpl} 的单元测试类
  31 +*
  32 +* @author 芋道源码
  33 +*/
  34 +@Import(SysSmsLogCoreServiceImpl.class)
  35 +public class SysSmsLogCoreServiceTest extends BaseDbUnitTest {
  36 +
  37 + @Resource
  38 + private SysSmsLogCoreServiceImpl smsLogCoreService;
  39 +
  40 + @Resource
  41 + private SysSmsLogCoreMapper smsLogCoreMapper;
  42 +
  43 + @Test
  44 + public void testCreateSmsLog() {
  45 + // 准备参数
  46 + String mobile = randomString();
  47 + Long userId = randomLongId();
  48 + Integer userType = randomEle(UserTypeEnum.values()).getValue();
  49 + Boolean isSend = randomBoolean();
  50 + SysSmsTemplateDO templateDO = randomPojo(SysSmsTemplateDO.class,
  51 + o -> o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()));
  52 + String templateContent = randomString();
  53 + Map<String, Object> templateParams = randomTemplateParams();
  54 + // mock 方法
  55 +
  56 + // 调用
  57 + Long logId = smsLogCoreService.createSmsLog(mobile, userId, userType, isSend,
  58 + templateDO, templateContent, templateParams);
  59 + // 断言
  60 + SysSmsLogDO logDO = smsLogCoreMapper.selectById(logId);
  61 + assertEquals(isSend ? SysSmsSendStatusEnum.INIT.getStatus() : SysSmsSendStatusEnum.IGNORE.getStatus(),
  62 + logDO.getSendStatus());
  63 + assertEquals(mobile, logDO.getMobile());
  64 + assertEquals(userType, logDO.getUserType());
  65 + assertEquals(userId, logDO.getUserId());
  66 + assertEquals(templateDO.getId(), logDO.getTemplateId());
  67 + assertEquals(templateDO.getCode(), logDO.getTemplateCode());
  68 + assertEquals(templateDO.getType(), logDO.getTemplateType());
  69 + assertEquals(templateDO.getChannelId(), logDO.getChannelId());
  70 + assertEquals(templateDO.getChannelCode(), logDO.getChannelCode());
  71 + assertEquals(templateContent, logDO.getTemplateContent());
  72 + assertEquals(templateParams, logDO.getTemplateParams());
  73 + assertEquals(SysSmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus());
  74 + }
  75 +
  76 + @Test
  77 + public void testUpdateSmsSendResult() {
  78 + // mock 数据
  79 + SysSmsLogDO dbSmsLog = randomSmsLogDO(
  80 + o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()));
  81 + smsLogCoreMapper.insert(dbSmsLog);
  82 + // 准备参数
  83 + Long id = dbSmsLog.getId();
  84 + Integer sendCode = randomInteger();
  85 + String sendMsg = randomString();
  86 + String apiSendCode = randomString();
  87 + String apiSendMsg = randomString();
  88 + String apiRequestId = randomString();
  89 + String apiSerialNo = randomString();
  90 +
  91 + // 调用
  92 + smsLogCoreService.updateSmsSendResult(id, sendCode, sendMsg,
  93 + apiSendCode, apiSendMsg, apiRequestId, apiSerialNo);
  94 + // 断言
  95 + dbSmsLog = smsLogCoreMapper.selectById(id);
  96 + assertEquals(CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS.getStatus()
  97 + : SysSmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus());
  98 + assertNotNull(dbSmsLog.getSendTime());
  99 + assertEquals(sendMsg, dbSmsLog.getSendMsg());
  100 + assertEquals(apiSendCode, dbSmsLog.getApiSendCode());
  101 + assertEquals(apiSendMsg, dbSmsLog.getApiSendMsg());
  102 + assertEquals(apiRequestId, dbSmsLog.getApiRequestId());
  103 + assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo());
  104 + }
  105 +
  106 + @Test
  107 + public void testUpdateSmsReceiveResult() {
  108 + // mock 数据
  109 + SysSmsLogDO dbSmsLog = randomSmsLogDO(
  110 + o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()));
  111 + smsLogCoreMapper.insert(dbSmsLog);
  112 + // 准备参数
  113 + Long id = dbSmsLog.getId();
  114 + Boolean success = randomBoolean();
  115 + Date receiveTime = randomDate();
  116 + String apiReceiveCode = randomString();
  117 + String apiReceiveMsg = randomString();
  118 +
  119 + // 调用
  120 + smsLogCoreService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg);
  121 + // 断言
  122 + dbSmsLog = smsLogCoreMapper.selectById(id);
  123 + assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus()
  124 + : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus());
  125 + assertEquals(receiveTime, dbSmsLog.getReceiveTime());
  126 + assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode());
  127 + assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg());
  128 + }
  129 +
  130 + // ========== 随机对象 ==========
  131 +
  132 + @SafeVarargs
  133 + private static SysSmsLogDO randomSmsLogDO(Consumer<SysSmsLogDO>... consumers) {
  134 + Consumer<SysSmsLogDO> consumer = (o) -> {
  135 + o.setTemplateParams(randomTemplateParams());
  136 + o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围
  137 + o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围
  138 + o.setSendStatus(randomEle(SysSmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围
  139 + o.setReceiveStatus(randomEle(SysSmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围
  140 + };
  141 + return randomPojo(SysSmsLogDO.class, ArrayUtils.append(consumer, consumers));
  142 + }
  143 +
  144 +
  145 + private static Map<String, Object> randomTemplateParams() {
  146 + return MapUtil.<String, Object>builder().put(randomString(), randomString())
  147 + .put(randomString(), randomString()).build();
  148 + }
  149 +}
... ...
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateServiceTest.java 0 → 100644
  1 +package cn.iocoder.yudao.coreservice.modules.system.service.sms;
  2 +
  3 +import cn.iocoder.yudao.coreservice.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsTemplateCoreMapper;
  6 +import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
  7 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsTemplateCoreServiceImpl;
  8 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  9 +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
  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.Map;
  16 +import java.util.function.Consumer;
  17 +
  18 +import static cn.hutool.core.bean.BeanUtil.getFieldValue;
  19 +import static cn.hutool.core.util.RandomUtil.randomEle;
  20 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max;
  21 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  22 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  23 +import static org.junit.jupiter.api.Assertions.assertEquals;
  24 +
  25 +/**
  26 +* {@link SysSmsTemplateCoreServiceImpl} 的单元测试类
  27 +*
  28 +* @author 芋道源码
  29 +*/
  30 +@Import(SysSmsTemplateCoreServiceImpl.class)
  31 +public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
  32 +
  33 + @Resource
  34 + private SysSmsTemplateCoreServiceImpl smsTemplateCoreService;
  35 +
  36 + @Resource
  37 + private SysSmsTemplateCoreMapper smsTemplateCoreMapper;
  38 +
  39 + @Test
  40 + @SuppressWarnings("unchecked")
  41 + void testInitLocalCache() {
  42 + // mock 数据
  43 + SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO();
  44 + smsTemplateCoreMapper.insert(smsTemplate01);
  45 + SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO();
  46 + smsTemplateCoreMapper.insert(smsTemplate02);
  47 +
  48 + // 调用
  49 + smsTemplateCoreService.initLocalCache();
  50 + // 断言 deptCache 缓存
  51 + Map<String, SysSmsTemplateDO> smsTemplateCache = (Map<String, SysSmsTemplateDO>) getFieldValue(smsTemplateCoreService, "smsTemplateCache");
  52 + assertEquals(2, smsTemplateCache.size());
  53 + assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode()));
  54 + assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode()));
  55 + // 断言 maxUpdateTime 缓存
  56 + Date maxUpdateTime = (Date) getFieldValue(smsTemplateCoreService, "maxUpdateTime");
  57 + assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime);
  58 + }
  59 +
  60 + // ========== 随机对象 ==========
  61 +
  62 + @SafeVarargs
  63 + private static SysSmsTemplateDO randomSmsTemplateDO(Consumer<SysSmsTemplateDO>... consumers) {
  64 + Consumer<SysSmsTemplateDO> consumer = (o) -> {
  65 + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
  66 + o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围
  67 + };
  68 + return randomPojo(SysSmsTemplateDO.class, ArrayUtils.append(consumer, consumers));
  69 + }
  70 +
  71 +}
... ...
yudao-core-service/src/test/resources/application-unit-test.yaml 0 → 100644
  1 +spring:
  2 + main:
  3 + lazy-initialization: true # 开启懒加载,加快速度
  4 + banner-mode: off # 单元测试,禁用 Banner
  5 +
  6 +--- #################### 数据库相关配置 ####################
  7 +
  8 +spring:
  9 + # 数据源配置项
  10 + datasource:
  11 + name: ruoyi-vue-pro
  12 + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
  13 + driver-class-name: org.h2.Driver
  14 + username: sa
  15 + password:
  16 + schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具
  17 + druid:
  18 + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
  19 + initial-size: 1 # 单元测试,配置为 1,提升启动速度
  20 +
  21 + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
  22 + redis:
  23 + host: 127.0.0.1 # 地址
  24 + port: 16379 # 端口(单元测试,使用 16379 端口)
  25 + database: 0 # 数据库索引
  26 +
  27 +mybatis:
  28 + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
  29 +
  30 +--- #################### 定时任务相关配置 ####################
  31 +
  32 +--- #################### 配置中心相关配置 ####################
  33 +
  34 +--- #################### 服务保障相关配置 ####################
  35 +
  36 +# Lock4j 配置项(单元测试,禁用 Lock4j)
  37 +
  38 +# Resilience4j 配置项
  39 +
  40 +--- #################### 监控相关配置 ####################
  41 +
  42 +--- #################### 芋道相关配置 ####################
  43 +
  44 +# 芋道配置项,设置当前项目所有自定义的配置
... ...
yudao-core-service/src/test/resources/application.yaml 0 → 100644
  1 +spring:
  2 + application:
  3 + name: yudao-core-service
  4 +
  5 + # Jackson 配置项
  6 + jackson:
  7 + serialization:
  8 + write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳
  9 + write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
  10 + write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
  11 + fail-on-empty-beans: false # 允许序列化无属性的 Bean
  12 +
  13 +# MyBatis Plus 的配置项
  14 +mybatis-plus:
  15 + configuration:
  16 + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
  17 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志
  18 + global-config:
  19 + db-config:
  20 + id-type: AUTO # 自增 ID
  21 + logic-delete-value: 1 # 逻辑已删除值(默认为 1)
  22 + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  23 + mapper-locations: classpath*:mapper/*.xml
  24 + type-aliases-package: ${yudao.core-service.base-package}.modules.*.dal.dataobject
  25 +
  26 +--- #################### 芋道相关配置 ####################
  27 +
  28 +yudao:
  29 + info:
  30 + version: 1.0.0
  31 + base-package: cn.iocoder.yudao.coreservice
  32 + core-service:
  33 + base-package: cn.iocoder.yudao.coreservice
  34 +
  35 +debug: false
... ...
yudao-core-service/src/test/resources/logback-spring.xml 0 → 100644
  1 +<configuration>
  2 + <!-- 引用 Spring Boot 的 logback 基础配置 -->
  3 + <include resource="org/springframework/boot/logging/logback/defaults.xml" />
  4 +</configuration>
... ...
yudao-core-service/src/test/resources/sql/clean.sql 0 → 100644
  1 +-- inf 开头的 DB
  2 +DELETE FROM "inf_api_access_log";
  3 +DELETE FROM "inf_api_error_log";
  4 +
  5 +-- sys 开头的 DB
  6 +DELETE FROM "sys_user_session";
  7 +DELETE FROM "sys_dict_data";
  8 +DELETE FROM "sys_sms_template";
  9 +DELETE FROM "sys_sms_log";
... ...
yudao-core-service/src/test/resources/sql/create_tables.sql 0 → 100644
  1 +-- inf 开头的 DB
  2 +
  3 +-- sys 开头的 DB
  4 +
  5 +CREATE TABLE IF NOT EXISTS `sys_user_session` (
  6 + `id` varchar(32) NOT NULL,
  7 + `user_id` bigint DEFAULT NULL,
  8 + "user_type" tinyint NOT NULL,
  9 + `username` varchar(50) NOT NULL DEFAULT '',
  10 + `user_ip` varchar(50) DEFAULT NULL,
  11 + `user_agent` varchar(512) DEFAULT NULL,
  12 + `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  13 + "creator" varchar(64) DEFAULT '',
  14 + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  15 + `updater` varchar(64) DEFAULT '' ,
  16 + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  17 + "deleted" bit NOT NULL DEFAULT FALSE,
  18 + PRIMARY KEY (`id`)
  19 +) COMMENT '用户在线 Session';
  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 '字典数据表';
  36 +
  37 +CREATE TABLE IF NOT EXISTS "inf_api_access_log" (
  38 + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY,
  39 + "trace_id" varchar(64) not null default '',
  40 + "user_id" bigint not null default '0',
  41 + "user_type" tinyint not null default '0',
  42 + "application_name" varchar(50) not null,
  43 + "request_method" varchar(16) not null default '',
  44 + "request_url" varchar(255) not null default '',
  45 + "request_params" varchar(8000) not null default '',
  46 + "user_ip" varchar(50) not null,
  47 + "user_agent" varchar(512) not null,
  48 + "begin_time" timestamp not null,
  49 + "end_time" timestamp not null,
  50 + "duration" integer not null,
  51 + "result_code" integer not null default '0',
  52 + "result_msg" varchar(512) default '',
  53 + "creator" varchar(64) default '',
  54 + "create_time" timestamp not null default current_timestamp,
  55 + "updater" varchar(64) default '',
  56 + "update_time" timestamp not null default current_timestamp,
  57 + "deleted" bit not null default false,
  58 + primary key ("id")
  59 +) COMMENT 'API 访问日志表';
  60 +
  61 +CREATE TABLE IF NOT EXISTS "inf_api_error_log" (
  62 + "id" integer not null GENERATED BY DEFAULT AS IDENTITY,
  63 + "trace_id" varchar(64) not null,
  64 + "user_id" bigint not null default '0',
  65 + "user_type" tinyint not null default '0',
  66 + "application_name" varchar(50) not null,
  67 + "request_method" varchar(16) not null,
  68 + "request_url" varchar(255) not null,
  69 + "request_params" varchar(8000) not null,
  70 + "user_ip" varchar(50) not null,
  71 + "user_agent" varchar(512) not null,
  72 + "exception_time" timestamp not null,
  73 + "exception_name" varchar(128) not null default '',
  74 + "exception_message" clob not null,
  75 + "exception_root_cause_message" clob not null,
  76 + "exception_stack_trace" clob not null,
  77 + "exception_class_name" varchar(512) not null,
  78 + "exception_file_name" varchar(512) not null,
  79 + "exception_method_name" varchar(512) not null,
  80 + "exception_line_number" integer not null,
  81 + "process_status" tinyint not null,
  82 + "process_time" timestamp default null,
  83 + "process_user_id" bigint default '0',
  84 + "creator" varchar(64) default '',
  85 + "create_time" timestamp not null default current_timestamp,
  86 + "updater" varchar(64) default '',
  87 + "update_time" timestamp not null default current_timestamp,
  88 + "deleted" bit not null default false,
  89 + primary key ("id")
  90 +) COMMENT '系统异常日志';
  91 +
  92 +CREATE TABLE IF NOT EXISTS "sys_sms_template" (
  93 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  94 + "type" tinyint NOT NULL,
  95 + "status" tinyint NOT NULL,
  96 + "code" varchar(63) NOT NULL,
  97 + "name" varchar(63) NOT NULL,
  98 + "content" varchar(255) NOT NULL,
  99 + "params" varchar(255) NOT NULL,
  100 + "remark" varchar(255) DEFAULT NULL,
  101 + "api_template_id" varchar(63) NOT NULL,
  102 + "channel_id" bigint NOT NULL,
  103 + "channel_code" varchar(63) NOT NULL,
  104 + "creator" varchar(64) DEFAULT '',
  105 + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  106 + "updater" varchar(64) DEFAULT '',
  107 + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  108 + "deleted" bit NOT NULL DEFAULT FALSE,
  109 + PRIMARY KEY ("id")
  110 +) COMMENT '短信模板';
  111 +
  112 +CREATE TABLE IF NOT EXISTS "sys_sms_log" (
  113 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  114 + "channel_id" bigint NOT NULL,
  115 + "channel_code" varchar(63) NOT NULL,
  116 + "template_id" bigint NOT NULL,
  117 + "template_code" varchar(63) NOT NULL,
  118 + "template_type" tinyint NOT NULL,
  119 + "template_content" varchar(255) NOT NULL,
  120 + "template_params" varchar(255) NOT NULL,
  121 + "api_template_id" varchar(63) NOT NULL,
  122 + "mobile" varchar(11) NOT NULL,
  123 + "user_id" bigint DEFAULT '0',
  124 + "user_type" tinyint DEFAULT '0',
  125 + "send_status" tinyint NOT NULL DEFAULT '0',
  126 + "send_time" timestamp DEFAULT NULL,
  127 + "send_code" int DEFAULT NULL,
  128 + "send_msg" varchar(255) DEFAULT NULL,
  129 + "api_send_code" varchar(63) DEFAULT NULL,
  130 + "api_send_msg" varchar(255) DEFAULT NULL,
  131 + "api_request_id" varchar(255) DEFAULT NULL,
  132 + "api_serial_no" varchar(255) DEFAULT NULL,
  133 + "receive_status" tinyint NOT NULL DEFAULT '0',
  134 + "receive_time" timestamp DEFAULT NULL,
  135 + "api_receive_code" varchar(63) DEFAULT NULL,
  136 + "api_receive_msg" varchar(255) DEFAULT NULL,
  137 + "creator" varchar(64) DEFAULT '',
  138 + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  139 + "updater" varchar(64) DEFAULT '',
  140 + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  141 + "deleted" bit NOT NULL DEFAULT FALSE,
  142 + PRIMARY KEY ("id")
  143 +) COMMENT '短信日志';
  144 +
  145 +CREATE TABLE IF NOT EXISTS `sys_login_log` (
  146 + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  147 + `log_type` bigint(4) NOT NULL,
  148 + "user_id" bigint not null default '0',
  149 + "user_type" tinyint NOT NULL,
  150 + `trace_id` varchar(64) NOT NULL DEFAULT '',
  151 + `username` varchar(50) NOT NULL DEFAULT '',
  152 + `result` tinyint(4) NOT NULL,
  153 + `user_ip` varchar(50) NOT NULL,
  154 + `user_agent` varchar(512) NOT NULL,
  155 + `creator` varchar(64) DEFAULT '',
  156 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  157 + `updater` varchar(64) DEFAULT '',
  158 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  159 + `deleted` bit(1) NOT NULL DEFAULT '0',
  160 + PRIMARY KEY (`id`)
  161 +) COMMENT ='系统访问记录';
... ...
yudao-dependencies/pom.xml
... ... @@ -26,7 +26,7 @@
26 26 <druid.version>1.2.4</druid.version>
27 27 <mybatis-plus.version>3.4.2</mybatis-plus.version>
28 28 <dynamic-datasource.version>3.3.2</dynamic-datasource.version>
29   - <redisson.version>3.15.1</redisson.version>
  29 + <redisson.version>3.16.3</redisson.version>
30 30 <!-- Config 配置中心相关 -->
31 31 <apollo.version>1.7.0</apollo.version>
32 32 <!-- Job 定时任务相关 -->
... ... @@ -34,9 +34,9 @@
34 34 <lock4j.version>2.2.0</lock4j.version>
35 35 <resilience4j.version>1.7.0</resilience4j.version>
36 36 <!-- 监控相关 -->
37   - <skywalking.version>8.5.0</skywalking.version>
  37 + <skywalking.version>8.7.0</skywalking.version>
38 38 <spring-boot-admin.version>2.3.1</spring-boot-admin.version>
39   - <opentracing.version>0.30.0</opentracing.version>
  39 + <opentracing.version>0.31.0</opentracing.version>
40 40 <!-- Test 测试相关 -->
41 41 <podam.version>7.2.6.RELEASE</podam.version>
42 42 <jedis-mock.version>0.1.16</jedis-mock.version>
... ... @@ -49,7 +49,7 @@
49 49 <screw.version>1.0.5</screw.version>
50 50 <guava.version>30.1.1-jre</guava.version>
51 51 <!-- 三方云服务相关 -->
52   - <aliyun-java-sdk-core.version>4.5.18</aliyun-java-sdk-core.version>
  52 + <aliyun-java-sdk-core.version>4.5.25</aliyun-java-sdk-core.version>
53 53 <aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>
54 54 <yunpian-java-sdk.version>1.2.7</yunpian-java-sdk.version>
55 55 </properties>
... ... @@ -74,6 +74,11 @@
74 74 <!-- 业务组件 -->
75 75 <dependency>
76 76 <groupId>cn.iocoder.boot</groupId>
  77 + <artifactId>yudao-core-service</artifactId>
  78 + <version>${revision}</version>
  79 + </dependency>
  80 + <dependency>
  81 + <groupId>cn.iocoder.boot</groupId>
77 82 <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
78 83 <version>${revision}</version>
79 84 </dependency>
... ... @@ -252,12 +257,32 @@
252 257 <groupId>org.apache.skywalking</groupId>
253 258 <artifactId>apm-toolkit-opentracing</artifactId>
254 259 <version>${skywalking.version}</version>
  260 +<!-- <exclusions>-->
  261 +<!-- <exclusion>-->
  262 +<!-- <artifactId>opentracing-api</artifactId>-->
  263 +<!-- <groupId>io.opentracing</groupId>-->
  264 +<!-- </exclusion>-->
  265 +<!-- <exclusion>-->
  266 +<!-- <artifactId>opentracing-util</artifactId>-->
  267 +<!-- <groupId>io.opentracing</groupId>-->
  268 +<!-- </exclusion>-->
  269 +<!-- </exclusions>-->
  270 + </dependency>
  271 + <dependency>
  272 + <groupId>io.opentracing</groupId>
  273 + <artifactId>opentracing-api</artifactId>
  274 + <version>${opentracing.version}</version>
255 275 </dependency>
256 276 <dependency>
257 277 <groupId>io.opentracing</groupId>
258 278 <artifactId>opentracing-util</artifactId>
259 279 <version>${opentracing.version}</version>
260 280 </dependency>
  281 + <dependency>
  282 + <groupId>io.opentracing</groupId>
  283 + <artifactId>opentracing-noop</artifactId>
  284 + <version>${opentracing.version}</version>
  285 + </dependency>
261 286  
262 287 <dependency>
263 288 <groupId>de.codecentric</groupId>
... ...
yudao-framework/yudao-spring-boot-starter-monitor/pom.xml
... ... @@ -42,6 +42,10 @@
42 42  
43 43 <!-- 监控相关 -->
44 44 <dependency>
  45 + <groupId>io.opentracing</groupId>
  46 + <artifactId>opentracing-util</artifactId>
  47 + </dependency>
  48 + <dependency>
45 49 <groupId>org.apache.skywalking</groupId>
46 50 <artifactId>apm-toolkit-trace</artifactId>
47 51 </dependency>
... ... @@ -53,10 +57,6 @@
53 57 <groupId>org.apache.skywalking</groupId>
54 58 <artifactId>apm-toolkit-opentracing</artifactId>
55 59 </dependency>
56   - <dependency>
57   - <groupId>io.opentracing</groupId>
58   - <artifactId>opentracing-util</artifactId>
59   - </dependency>
60 60  
61 61 <dependency>
62 62 <groupId>de.codecentric</groupId>
... ...
yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java
1 1 package cn.iocoder.yudao.framework.tracer.config;
2 2  
  3 +import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
3 4 import cn.iocoder.yudao.framework.tracer.core.aop.BizTraceAspect;
4 5 import cn.iocoder.yudao.framework.tracer.core.filter.TraceFilter;
5   -import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
6   -import io.opentracing.Tracer;
7   -import io.opentracing.util.GlobalTracer;
8   -import org.apache.skywalking.apm.toolkit.opentracing.SkywalkingTracer;
9 6 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
10   -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
11 7 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
12 8 import org.springframework.boot.context.properties.EnableConfigurationProperties;
13 9 import org.springframework.boot.web.servlet.FilterRegistrationBean;
... ... @@ -25,24 +21,25 @@ import org.springframework.context.annotation.Configuration;
25 21 @ConditionalOnProperty(prefix = "yudao.tracer", value = "enable", matchIfMissing = true)
26 22 public class YudaoTracerAutoConfiguration {
27 23  
28   - @Bean
29   - public TracerProperties bizTracerProperties() {
30   - return new TracerProperties();
31   - }
32   -
33   - @Bean
34   - public BizTraceAspect bizTracingAop() {
35   - return new BizTraceAspect(tracer());
36   - }
37   -
38   - @Bean
39   - public Tracer tracer() {
40   - // 创建 SkywalkingTracer 对象
41   - SkywalkingTracer tracer = new SkywalkingTracer();
42   - // 设置为 GlobalTracer 的追踪器
43   - GlobalTracer.register(tracer);
44   - return tracer;
45   - }
  24 + // TODO @芋艿:重要。目前 opentracing 版本存在冲突,要么保证 skywalking,要么保证阿里云短信 sdk
  25 +// @Bean
  26 +// public TracerProperties bizTracerProperties() {
  27 +// return new TracerProperties();
  28 +// }
  29 +//
  30 +// @Bean
  31 +// public BizTraceAspect bizTracingAop() {
  32 +// return new BizTraceAspect(tracer());
  33 +// }
  34 +//
  35 +// @Bean
  36 +// public Tracer tracer() {
  37 +// // 创建 SkywalkingTracer 对象
  38 +// SkywalkingTracer tracer = new SkywalkingTracer();
  39 +// // 设置为 GlobalTracer 的追踪器
  40 +// GlobalTracer.register(tracer);
  41 +// return tracer;
  42 +// }
46 43  
47 44 /**
48 45 * 创建 TraceFilter 过滤器,响应 header 设置 traceId
... ...
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java
... ... @@ -15,7 +15,7 @@ import org.springframework.context.annotation.Configuration;
15 15 * @author 芋道源码
16 16 */
17 17 @Configuration
18   -@MapperScan(value = "${yudao.info.base-package}", annotationClass = Mapper.class,
  18 +@MapperScan(value = {"${yudao.info.base-package}", "${yudao.core-service.base-package}"}, annotationClass = Mapper.class,
19 19 lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试
20 20 public class YudaoMybatisAutoConfiguration {
21 21  
... ...
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/LoginUser.java
1 1 package cn.iocoder.yudao.framework.security.core;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 5 import com.fasterxml.jackson.annotation.JsonIgnore;
5 6 import lombok.Data;
6 7 import org.springframework.security.core.GrantedAuthority;
... ... @@ -24,7 +25,13 @@ public class LoginUser implements UserDetails {
24 25 */
25 26 private Long id;
26 27 /**
27   - * 科室编号
  28 + * 用户类型
  29 + *
  30 + * 关联 {@link UserTypeEnum}
  31 + */
  32 + private Integer userType;
  33 + /**
  34 + * 部门编号
28 35 */
29 36 private Long deptId;
30 37 /**
... ... @@ -49,6 +56,8 @@ public class LoginUser implements UserDetails {
49 56 */
50 57 private Integer status;
51 58  
  59 + // TODO @芋艿:怎么去掉 deptId
  60 +
52 61 @Override
53 62 @JsonIgnore// 避免序列化
54 63 public String getPassword() {
... ...
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java
... ... @@ -97,6 +97,7 @@ public class SecurityFrameworkUtils {
97 97 // 额外设置到 request 中,用于 ApiAccessLogFilter 可以获取到用户编号;
98 98 // 原因是,Spring Security 的 Filter 在 ApiAccessLogFilter 后面,在它记录访问日志时,线上上下文已经没有用户编号等信息
99 99 WebFrameworkUtils.setLoginUserId(request, loginUser.getId());
  100 + WebFrameworkUtils.setLoginUserType(request, loginUser.getUserType());
100 101 }
101 102  
102 103 }
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java
... ... @@ -81,7 +81,7 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
81 81 Map<String, String> queryString, String requestBody, Exception ex) {
82 82 // 处理用户信息
83 83 accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request));
84   - accessLog.setUserType(WebFrameworkUtils.getUserType(request));
  84 + accessLog.setUserType(WebFrameworkUtils.getLoginUserType(request));
85 85 // 设置访问结果
86 86 CommonResult<?> result = WebFrameworkUtils.getCommonResult(request);
87 87 if (result != null) {
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkService.java
... ... @@ -16,8 +16,7 @@ public interface ApiAccessLogFrameworkService {
16 16 * 创建 API 访问日志
17 17 *
18 18 * @param createDTO 创建信息
19   - * @return 是否创建成功
20 19 */
21   - Future<Boolean> createApiAccessLogAsync(@Valid ApiAccessLogCreateDTO createDTO);
  20 + void createApiAccessLogAsync(@Valid ApiAccessLogCreateDTO createDTO);
22 21  
23 22 }
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkService.java
... ... @@ -16,8 +16,7 @@ public interface ApiErrorLogFrameworkService {
16 16 * 创建 API 错误日志
17 17 *
18 18 * @param createDTO 创建信息
19   - * @return 是否创建成功
20 19 */
21   - Future<Boolean> createApiErrorLogAsync(@Valid ApiErrorLogCreateDTO createDTO);
  20 + void createApiErrorLogAsync(@Valid ApiErrorLogCreateDTO createDTO);
22 21  
23 22 }
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
... ... @@ -245,7 +245,7 @@ public class GlobalExceptionHandler {
245 245 private void initExceptionLog(ApiErrorLogCreateDTO errorLog, HttpServletRequest request, Throwable e) {
246 246 // 处理用户信息
247 247 errorLog.setUserId(WebFrameworkUtils.getLoginUserId(request));
248   - errorLog.setUserType(WebFrameworkUtils.getUserType(request));
  248 + errorLog.setUserType(WebFrameworkUtils.getLoginUserType(request));
249 249 // 设置异常字段
250 250 errorLog.setExceptionName(e.getClass().getName());
251 251 errorLog.setExceptionMessage(ExceptionUtil.getMessage(e));
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java
... ... @@ -17,6 +17,7 @@ import javax.servlet.http.HttpServletRequest;
17 17 public class WebFrameworkUtils {
18 18  
19 19 private static final String REQUEST_ATTRIBUTE_LOGIN_USER_ID = "login_user_id";
  20 + private static final String REQUEST_ATTRIBUTE_LOGIN_USER_TYPE = "login_user_type";
20 21  
21 22 private static final String REQUEST_ATTRIBUTE_COMMON_RESULT = "common_result";
22 23  
... ... @@ -24,6 +25,10 @@ public class WebFrameworkUtils {
24 25 request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId);
25 26 }
26 27  
  28 + public static void setLoginUserType(ServletRequest request, Integer userType) {
  29 + request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE, userType);
  30 + }
  31 +
27 32 /**
28 33 * 获得当前用户的编号,从请求中
29 34 *
... ... @@ -37,15 +42,24 @@ public class WebFrameworkUtils {
37 42 return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID);
38 43 }
39 44  
  45 + /**
  46 + * 获得当前用户的类型,从请求中
  47 + *
  48 + * @param request 请求
  49 + * @return 用户编号
  50 + */
  51 + public static Integer getLoginUserType(HttpServletRequest request) {
  52 + if (request == null) {
  53 + return null;
  54 + }
  55 + return (Integer) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE);
  56 + }
  57 +
40 58 public static Long getLoginUserId() {
41 59 HttpServletRequest request = getRequest();
42 60 return getLoginUserId(request);
43 61 }
44 62  
45   - public static Integer getUserType(HttpServletRequest request) {
46   - return UserTypeEnum.ADMIN.getValue(); // TODO 芋艿:等后续优化
47   - }
48   -
49 63 public static void setCommonResult(ServletRequest request, CommonResult<?> result) {
50 64 request.setAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT, result);
51 65 }
... ...
yudao-user-server/pom.xml
... ... @@ -20,6 +20,11 @@
20 20 <!-- 业务组件 -->
21 21 <dependency>
22 22 <groupId>cn.iocoder.boot</groupId>
  23 + <artifactId>yudao-core-service</artifactId>
  24 + </dependency>
  25 +
  26 + <dependency>
  27 + <groupId>cn.iocoder.boot</groupId>
23 28 <artifactId>yudao-spring-boot-starter-biz-dict</artifactId>
24 29 </dependency>
25 30 <dependency>
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/UserServerApplication.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.userserver;
3 3 import org.springframework.boot.SpringApplication;
4 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 9 public static void main(String[] args) {
10 10 SpringApplication.run(UserServerApplication.class, args);
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/framework/security/SecurityConfiguration.java
... ... @@ -18,7 +18,7 @@ public class SecurityConfiguration {
18 18 @Bean
19 19 public Customizer<ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry> authorizeRequestsCustomizer() {
20 20 return registry -> {
21   - registry.antMatchers(api("/**")).anonymous(); // 默认 API 都是用户可访问
  21 + registry.antMatchers(api("/**")).permitAll(); // 默认 API 都是用户可访问
22 22 };
23 23 }
24 24  
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/controller/HelloController.java deleted
1   -package cn.iocoder.yudao.userserver.modules.infra.controller;
2   -
3   -import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
4   -import lombok.extern.slf4j.Slf4j;
5   -import org.springframework.security.access.annotation.Secured;
6   -import org.springframework.security.access.prepost.PreAuthorize;
7   -import org.springframework.web.bind.annotation.RequestMapping;
8   -import org.springframework.web.bind.annotation.RestController;
9   -
10   -/**
11   - * @author weir
12   - */
13   -@Slf4j
14   -@RestController
15   -public class HelloController {
16   -
17   - @RequestMapping("/user/hello")
18   - public String hello(String hello) {
19   - return "echo + " + hello;
20   - }
21   -
22   - @RequestMapping("/user/info")
23   - @PreAuthenticated
24   - public String xx() {
25   - return "none";
26   - }
27   -
28   -}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/convert/logger/InfApiAccessLogConvert.java deleted
1   -package cn.iocoder.yudao.userserver.modules.infra.convert.logger;
2   -
3   -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO;
4   -import cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
5   -import org.mapstruct.Mapper;
6   -import org.mapstruct.factory.Mappers;
7   -
8   -/**
9   - * API 访问日志 Convert
10   - *
11   - * @author 芋道源码
12   - */
13   -@Mapper
14   -public interface InfApiAccessLogConvert {
15   -
16   - InfApiAccessLogConvert INSTANCE = Mappers.getMapper(InfApiAccessLogConvert.class);
17   -
18   - InfApiAccessLogDO convert(ApiAccessLogCreateDTO bean);
19   -
20   -}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/convert/logger/InfApiErrorLogConvert.java deleted
1   -package cn.iocoder.yudao.userserver.modules.infra.convert.logger;
2   -
3   -import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateDTO;
4   -import cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
5   -import org.mapstruct.Mapper;
6   -import org.mapstruct.factory.Mappers;
7   -
8   -/**
9   - * API 错误日志 Convert
10   - *
11   - * @author 芋道源码
12   - */
13   -@Mapper
14   -public interface InfApiErrorLogConvert {
15   -
16   - InfApiErrorLogConvert INSTANCE = Mappers.getMapper(InfApiErrorLogConvert.class);
17   -
18   - InfApiErrorLogDO convert(ApiErrorLogCreateDTO bean);
19   -
20   -}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/dal/dataobject/file/InfFileDO.java deleted
1   -package cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.file;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4   -import com.baomidou.mybatisplus.annotation.IdType;
5   -import com.baomidou.mybatisplus.annotation.TableField;
6   -import com.baomidou.mybatisplus.annotation.TableId;
7   -import com.baomidou.mybatisplus.annotation.TableName;
8   -import lombok.*;
9   -
10   -import java.io.InputStream;
11   -
12   -/**
13   - * 文件表
14   - *
15   - * @author 芋道源码
16   - */
17   -@Data
18   -@TableName("inf_file")
19   -@EqualsAndHashCode(callSuper = true)
20   -@ToString(callSuper = true)
21   -@Builder
22   -@NoArgsConstructor
23   -@AllArgsConstructor
24   -public class InfFileDO extends BaseDO {
25   -
26   - /**
27   - * 文件路径
28   - */
29   - @TableId(type = IdType.INPUT)
30   - private String id;
31   - /**
32   - * 文件类型
33   - *
34   - * 通过 {@link cn.hutool.core.io.FileTypeUtil#getType(InputStream)} 获取
35   - */
36   - @TableField(value = "`type`")
37   - private String type;
38   - /**
39   - * 文件内容
40   - */
41   - private byte[] content;
42   -
43   -}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java deleted
1   -package cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.logger;
2   -
3   -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6   -import com.baomidou.mybatisplus.annotation.TableId;
7   -import com.baomidou.mybatisplus.annotation.TableName;
8   -import lombok.*;
9   -
10   -import java.util.Date;
11   -
12   -/**
13   - * API 访问日志
14   - *
15   - * @author 芋道源码
16   - */
17   -@TableName("inf_api_access_log")
18   -@Data
19   -@EqualsAndHashCode(callSuper = true)
20   -@ToString(callSuper = true)
21   -@Builder
22   -@NoArgsConstructor
23   -@AllArgsConstructor
24   -public class InfApiAccessLogDO extends BaseDO {
25   -
26   - /**
27   - * 编号
28   - */
29   - @TableId
30   - private Integer id;
31   - /**
32   - * 链路追踪编号
33   - *
34   - * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。
35   - */
36   - private String traceId;
37   - /**
38   - * 用户编号
39   - */
40   - private Long userId;
41   - /**
42   - * 用户类型
43   - *
44   - * 枚举 {@link UserTypeEnum}
45   - */
46   - private Integer userType;
47   - /**
48   - * 应用名
49   - *
50   - * 目前读取 `spring.application.name` 配置项
51   - */
52   - private String applicationName;
53   -
54   - // ========== 请求相关字段 ==========
55   -
56   - /**
57   - * 请求方法名
58   - */
59   - private String requestMethod;
60   - /**
61   - * 访问地址
62   - */
63   - private String requestUrl;
64   - /**
65   - * 请求参数
66   - *
67   - * query: Query String
68   - * body: Quest Body
69   - */
70   - private String requestParams;
71   - /**
72   - * 用户 IP
73   - */
74   - private String userIp;
75   - /**
76   - * 浏览器 UA
77   - */
78   - private String userAgent;
79   -
80   - // ========== 执行相关字段 ==========
81   -
82   - /**
83   - * 开始请求时间
84   - */
85   - private Date beginTime;
86   - /**
87   - * 结束请求时间
88   - */
89   - private Date endTime;
90   - /**
91   - * 执行时长,单位:毫秒
92   - */
93   - private Integer duration;
94   - /**
95   - * 结果码
96   - *
97   - * 目前使用的 {@link CommonResult#getCode()} 属性
98   - */
99   - private Integer resultCode;
100   - /**
101   - * 结果提示
102   - *
103   - * 目前使用的 {@link CommonResult#getMsg()} 属性
104   - */
105   - private String resultMsg;
106   -
107   -}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/dal/mysql/config/InfConfigDAOImpl.java deleted
1   -package cn.iocoder.yudao.userserver.modules.infra.dal.mysql.config;
2   -
3   -import cn.iocoder.yudao.framework.apollo.internals.ConfigFrameworkDAO;
4   -import cn.iocoder.yudao.framework.apollo.internals.dto.ConfigRespDTO;
5   -import org.springframework.jdbc.core.BeanPropertyRowMapper;
6   -import org.springframework.jdbc.core.JdbcTemplate;
7   -import org.springframework.jdbc.datasource.DriverManagerDataSource;
8   -
9   -import javax.sql.DataSource;
10   -import java.sql.ResultSet;
11   -import java.util.Date;
12   -import java.util.List;
13   -
14   -/**
15   - * ConfigFrameworkDAO 实现类
16   - *
17   - * @author 芋道源码
18   - */
19   -public class InfConfigDAOImpl implements ConfigFrameworkDAO {
20   -
21   - private final JdbcTemplate jdbcTemplate;
22   -
23   - public InfConfigDAOImpl(String jdbcUrl, String username, String password) {
24   - DataSource dataSource = new DriverManagerDataSource(jdbcUrl, username, password);
25   - this.jdbcTemplate = new JdbcTemplate(dataSource);
26   - }
27   -
28   - @Override
29   - public boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) {
30   - return jdbcTemplate.query("SELECT id FROM inf_config WHERE update_time > ? LIMIT 1",
31   - ResultSet::next, maxUpdateTime);
32   - }
33   -
34   - @Override
35   - public List<ConfigRespDTO> selectList() {
36   - return jdbcTemplate.query("SELECT `key`, `value`, update_time, deleted FROM inf_config", new BeanPropertyRowMapper<>(ConfigRespDTO.class));
37   - }
38   -
39   -}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/service/auth/SysAuthService.java deleted
1   -package cn.iocoder.yudao.userserver.modules.infra.service.auth;
2   -
3   -import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
4   -
5   -/**
6   - * 认证 Service 接口
7   - *
8   - * 提供用户的账号密码登录、token 的校验等认证相关的功能
9   - *
10   - * @author 芋道源码
11   - */
12   -public interface SysAuthService extends SecurityAuthFrameworkService {
13   -
14   -}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/service/auth/impl/SysAuthServiceImpl.java deleted
1   -package cn.iocoder.yudao.userserver.modules.infra.service.auth.impl;
2   -
3   -import cn.iocoder.yudao.framework.security.core.LoginUser;
4   -import cn.iocoder.yudao.userserver.modules.infra.service.auth.SysAuthService;
5   -import lombok.extern.slf4j.Slf4j;
6   -import org.springframework.security.core.userdetails.UserDetails;
7   -import org.springframework.security.core.userdetails.UsernameNotFoundException;
8   -import org.springframework.stereotype.Service;
9   -
10   -/**
11   - * Auth Service 实现类
12   - *
13   - * @author 芋道源码
14   - */
15   -@Service
16   -@Slf4j
17   -public class SysAuthServiceImpl implements SysAuthService {
18   -
19   - @Override
20   - public LoginUser verifyTokenAndRefresh(String token) {
21   - return null;
22   - }
23   -
24   - @Override
25   - public LoginUser mockLogin(Long userId) {
26   - return null;
27   - }
28   -
29   - @Override
30   - public void logout(String token) {
31   -
32   - }
33   -
34   - @Override
35   - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
36   - return null;
37   - }
38   -}
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.controller;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.http 0 → 100644
  1 +### 请求 /system/user/profile/get 接口 => 没有权限
  2 +GET {{userServerUrl}}/system/user/profile/get
  3 +Authorization: Bearer test245
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/user/SysUserProfileController.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.controller.user;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
  5 +import io.swagger.annotations.Api;
  6 +import io.swagger.annotations.ApiOperation;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +import org.springframework.validation.annotation.Validated;
  9 +import org.springframework.web.bind.annotation.GetMapping;
  10 +import org.springframework.web.bind.annotation.RequestMapping;
  11 +import org.springframework.web.bind.annotation.RestController;
  12 +
  13 +@Api(tags = "用户个人中心")
  14 +@RestController
  15 +@RequestMapping("/system/user/profile")
  16 +@Validated
  17 +@Slf4j
  18 +public class SysUserProfileController {
  19 +
  20 + @GetMapping("/get")
  21 + @ApiOperation("获得登录用户信息")
  22 + @PreAuthenticated
  23 + public CommonResult<Boolean> profile() {
  24 + return null;
  25 + }
  26 +
  27 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/package-info.java 0 → 100644
  1 +/**
  2 + * 提供 POJO 类的实体转换
  3 + *
  4 + * 目前使用 MapStruct 框架
  5 + */
  6 +package cn.iocoder.yudao.userserver.modules.member.convert;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md 0 → 100644
  1 +<http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao>
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/infra/dal/mysql/logger/InfApiErrorLogMapper.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/dal/mysql/user/MbrUserMapper.java
1   -package cn.iocoder.yudao.userserver.modules.infra.dal.mysql.logger;
  1 +package cn.iocoder.yudao.userserver.modules.member.dal.mysql.user;
2 2  
  3 +import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
3 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4   -import cn.iocoder.yudao.userserver.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
5 5 import org.apache.ibatis.annotations.Mapper;
6 6  
7 7 /**
8   - * API 错误日志 Mapper
  8 + * MbrUserDO Mapper
9 9 *
10 10 * @author 芋道源码
11 11 */
12 12 @Mapper
13   -public interface InfApiErrorLogMapper extends BaseMapperX<InfApiErrorLogDO> {
  13 +public interface MbrUserMapper extends BaseMapperX<MbrUserDO> {
  14 +
  15 + default MbrUserDO selectByMobile(String mobile) {
  16 + return selectOne("mobile", mobile);
  17 + }
  18 +
14 19 }
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/MbrErrorCodeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.enums;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ErrorCode;
  4 +
  5 +/**
  6 + * Member 错误码枚举类
  7 + *
  8 + * member 系统,使用 1-004-000-000 段
  9 + */
  10 +public interface MbrErrorCodeConstants {
  11 +
  12 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.service;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/MbrUserService.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.service.user;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
  4 +import cn.iocoder.yudao.framework.common.validation.Mobile;
  5 +
  6 +/**
  7 + * 前台用户 Service 接口
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +public interface MbrUserService {
  12 +
  13 + /**
  14 + * 通过手机查询用户
  15 + *
  16 + * @param mobile 手机
  17 + * @return 用户对象
  18 + */
  19 + MbrUserDO getUserByMobile(String mobile);
  20 +
  21 + /**
  22 + * 基于手机号创建用户。
  23 + * 如果用户已经存在,则直接进行返回
  24 + *
  25 + * @param mobile 手机号
  26 + * @param registerIp 注册 IP
  27 + * @return 用户对象
  28 + */
  29 + MbrUserDO createUserIfAbsent(@Mobile String mobile, String registerIp);
  30 +
  31 + /**
  32 + * 更新用户的最后登陆信息
  33 + *
  34 + * @param id 用户编号
  35 + * @param loginIp 登陆 IP
  36 + */
  37 + void updateUserLogin(Long id, String loginIp);
  38 +
  39 + /**
  40 + * 通过用户 ID 查询用户
  41 + *
  42 + * @param id 用户ID
  43 + * @return 用户对象信息
  44 + */
  45 + MbrUserDO getUser(Long id);
  46 +
  47 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/service/user/impl/MbrUserServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.member.service.user.impl;
  2 +
  3 +import cn.hutool.core.util.IdUtil;
  4 +import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
  5 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  6 +import cn.iocoder.yudao.userserver.modules.member.dal.mysql.user.MbrUserMapper;
  7 +import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +import org.springframework.security.crypto.password.PasswordEncoder;
  10 +import org.springframework.stereotype.Service;
  11 +
  12 +import javax.annotation.Resource;
  13 +import javax.validation.Valid;
  14 +import java.util.Date;
  15 +
  16 +/**
  17 + * User Service 实现类
  18 + *
  19 + * @author 芋道源码
  20 + */
  21 +@Service
  22 +@Valid
  23 +@Slf4j
  24 +public class MbrUserServiceImpl implements MbrUserService {
  25 +
  26 + @Resource
  27 + private MbrUserMapper userMapper;
  28 +
  29 + @Resource
  30 + private PasswordEncoder passwordEncoder;
  31 +
  32 + @Override
  33 + public MbrUserDO getUserByMobile(String mobile) {
  34 + return userMapper.selectByMobile(mobile);
  35 + }
  36 +
  37 + @Override
  38 + public MbrUserDO createUserIfAbsent(String mobile, String registerIp) {
  39 + // 用户已经存在
  40 + MbrUserDO user = userMapper.selectByMobile(mobile);
  41 + if (user != null) {
  42 + return user;
  43 + }
  44 + // 用户不存在,则进行创建
  45 + return this.createUser(mobile, registerIp);
  46 + }
  47 +
  48 + private MbrUserDO createUser(String mobile, String registerIp) {
  49 + // 生成密码
  50 + String password = IdUtil.fastSimpleUUID();
  51 + // 插入用户
  52 + MbrUserDO user = new MbrUserDO();
  53 + user.setMobile(mobile);
  54 + user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
  55 + user.setPassword(passwordEncoder.encode(password)); // 加密密码
  56 + user.setRegisterIp(registerIp);
  57 + userMapper.insert(user);
  58 + return user;
  59 + }
  60 +
  61 + @Override
  62 + public void updateUserLogin(Long id, String loginIp) {
  63 + userMapper.updateById(new MbrUserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date()));
  64 + }
  65 +
  66 + @Override
  67 + public MbrUserDO getUser(Long id) {
  68 + return userMapper.selectById(id);
  69 + }
  70 +
  71 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/package-info.java deleted
1   -package cn.iocoder.yudao.userserver.modules;
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.http 0 → 100644
  1 +### 请求 /login 接口 => 成功
  2 +POST {{userServerUrl}}/login
  3 +Content-Type: application/json
  4 +
  5 +{
  6 + "mobile": "15601691300",
  7 + "password": "admin123"
  8 +}
  9 +
  10 +### 请求 /send-sms-code 接口 => 成功
  11 +POST {{userServerUrl}}/send-sms-code
  12 +Content-Type: application/json
  13 +
  14 +{
  15 + "mobile": "15601691399",
  16 + "scene": 1
  17 +}
  18 +
  19 +### 请求 /sms-login 接口 => 成功
  20 +POST {{userServerUrl}}/sms-login
  21 +Content-Type: application/json
  22 +
  23 +{
  24 + "mobile": "15601691301",
  25 + "code": 9999
  26 +}
  27 +
  28 +### 请求 /logout 接口 => 成功
  29 +POST {{userServerUrl}}/logout
  30 +Content-Type: application/json
  31 +Authorization: Bearer c1b76bdaf2c146c581caa4d7fd81ee66
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/MbrAuthController.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.userserver.modules.member.controller.auth.vo.*;
  4 +import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*;
  5 +import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService;
  6 +import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService;
5 7 import io.swagger.annotations.Api;
6 8 import io.swagger.annotations.ApiImplicitParam;
7 9 import io.swagger.annotations.ApiImplicitParams;
... ... @@ -10,37 +12,46 @@ import lombok.extern.slf4j.Slf4j;
10 12 import org.springframework.validation.annotation.Validated;
11 13 import org.springframework.web.bind.annotation.*;
12 14  
  15 +import javax.annotation.Resource;
13 16 import javax.validation.Valid;
14 17  
  18 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  19 +import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
  20 +import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent;
  21 +
15 22 @Api(tags = "认证")
16 23 @RestController
17 24 @RequestMapping("/")
18 25 @Validated
19 26 @Slf4j
20   -public class MbrAuthController {
  27 +public class SysAuthController {
  28 +
  29 + @Resource
  30 + private SysAuthService authService;
  31 + @Resource
  32 + private SysSmsCodeService smsCodeService;
21 33  
22 34 @PostMapping("/login")
23 35 @ApiOperation("使用手机 + 密码登录")
24   - public CommonResult<MbrAuthLoginRespVO> login(@RequestBody @Valid MbrAuthLoginReqVO reqVO) {
25   -// String token = authService.login(reqVO, getClientIP(), getUserAgent());
26   -// // 返回结果
27   -// return success(MbrAuthLoginRespVO.builder().token(token).build());
28   - return null;
  36 + public CommonResult<SysAuthLoginRespVO> login(@RequestBody @Valid SysAuthLoginReqVO reqVO) {
  37 + String token = authService.login(reqVO, getClientIP(), getUserAgent());
  38 + // 返回结果
  39 + return success(SysAuthLoginRespVO.builder().token(token).build());
29 40 }
30 41  
31 42 @PostMapping("/sms-login")
32 43 @ApiOperation("使用手机 + 验证码登录")
33   - public CommonResult<MbrAuthLoginRespVO> smsLogin(@RequestBody @Valid MbrAuthLoginReqVO reqVO) {
34   - return null;
  44 + public CommonResult<SysAuthLoginRespVO> smsLogin(@RequestBody @Valid SysAuthSmsLoginReqVO reqVO) {
  45 + String token = authService.smsLogin(reqVO, getClientIP(), getUserAgent());
  46 + // 返回结果
  47 + return success(SysAuthLoginRespVO.builder().token(token).build());
35 48 }
36 49  
37 50 @PostMapping("/send-sms-code")
38 51 @ApiOperation("发送手机验证码")
39   - public CommonResult<Boolean> sendSmsCode(@RequestBody @Valid MbrAuthSendSmsReqVO reqVO) {
40   -// passportManager.sendSmsCode(sendSmsCodeDTO, HttpUtil.getIp(request));
41   -// // 返回成功
42   -// return success(true);
43   - return null;
  52 + public CommonResult<Boolean> sendSmsCode(@RequestBody @Valid SysAuthSendSmsReqVO reqVO) {
  53 + smsCodeService.sendSmsCode(reqVO.getMobile(), reqVO.getScene(), getClientIP());
  54 + return success(true);
44 55 }
45 56  
46 57 @PostMapping("/reset-password")
... ... @@ -65,7 +76,7 @@ public class MbrAuthController {
65 76  
66 77 @PostMapping("/social-login")
67 78 @ApiOperation("社交登录,使用 code 授权码")
68   - public CommonResult<MbrAuthLoginRespVO> socialLogin(@RequestBody @Valid MbrAuthSocialLoginReqVO reqVO) {
  79 + public CommonResult<SysAuthLoginRespVO> socialLogin(@RequestBody @Valid MbrAuthSocialLoginReqVO reqVO) {
69 80 // String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent());
70 81 // // 返回结果
71 82 // return success(MbrAuthLoginRespVO.builder().token(token).build());
... ... @@ -74,7 +85,7 @@ public class MbrAuthController {
74 85  
75 86 @PostMapping("/social-login2")
76 87 @ApiOperation("社交登录,使用 code 授权码 + 账号密码")
77   - public CommonResult<MbrAuthLoginRespVO> socialLogin2(@RequestBody @Valid MbrAuthSocialLogin2ReqVO reqVO) {
  88 + public CommonResult<SysAuthLoginRespVO> socialLogin2(@RequestBody @Valid MbrAuthSocialLogin2ReqVO reqVO) {
78 89 // String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent());
79 90 // // 返回结果
80 91 // return success(MbrAuthLoginRespVO.builder().token(token).build());
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/vo/MbrAuthResetPasswordReqVO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthResetPasswordReqVO.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
2 2  
3 3 import io.swagger.annotations.ApiModel;
4 4 import io.swagger.annotations.ApiModelProperty;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/vo/MbrAuthSocialBindReqVO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 4 import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 4 import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/vo/MbrAuthSocialLoginReqVO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 4 import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/vo/MbrAuthSocialUnbindReqVO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 4 import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/vo/MbrAuthLoginReqVO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginReqVO.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.Mobile;
4 4 import io.swagger.annotations.ApiModel;
... ... @@ -16,7 +16,7 @@ import javax.validation.constraints.NotEmpty;
16 16 @NoArgsConstructor
17 17 @AllArgsConstructor
18 18 @Builder
19   -public class MbrAuthLoginReqVO {
  19 +public class SysAuthLoginReqVO {
20 20  
21 21 @ApiModelProperty(value = "手机号", required = true, example = "15601691300")
22 22 @NotEmpty(message = "手机号不能为空")
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/vo/MbrAuthLoginRespVO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthLoginRespVO.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
2 2  
3 3 import io.swagger.annotations.ApiModel;
4 4 import io.swagger.annotations.ApiModelProperty;
... ... @@ -12,7 +12,7 @@ import lombok.NoArgsConstructor;
12 12 @NoArgsConstructor
13 13 @AllArgsConstructor
14 14 @Builder
15   -public class MbrAuthLoginRespVO {
  15 +public class SysAuthLoginRespVO {
16 16  
17 17 @ApiModelProperty(value = "token", required = true, example = "yudaoyuanma")
18 18 private String token;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/vo/MbrAuthSendSmsReqVO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSendSmsReqVO.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
2 2  
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
3 4 import cn.iocoder.yudao.framework.common.validation.Mobile;
  5 +import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum;
4 6 import io.swagger.annotations.ApiModel;
5 7 import io.swagger.annotations.ApiModelProperty;
6 8 import lombok.Data;
... ... @@ -11,7 +13,7 @@ import javax.validation.constraints.NotNull;
11 13 @ApiModel("发送手机验证码 Response VO")
12 14 @Data
13 15 @Accessors(chain = true)
14   -public class MbrAuthSendSmsReqVO {
  16 +public class SysAuthSendSmsReqVO {
15 17  
16 18 @ApiModelProperty(value = "手机号", example = "15601691234")
17 19 @Mobile
... ... @@ -19,6 +21,7 @@ public class MbrAuthSendSmsReqVO {
19 21  
20 22 @ApiModelProperty(value = "发送场景", example = "1", notes = "对应 MbrSmsSceneEnum 枚举")
21 23 @NotNull(message = "发送场景不能为空")
  24 + @InEnum(SysSmsSceneEnum.class)
22 25 private Integer scene;
23 26  
24   -}
25 27 \ No newline at end of file
  28 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/controller/auth/vo/MbrAuthSmsLoginReqVO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/SysAuthSmsLoginReqVO.java
1   -package cn.iocoder.yudao.userserver.modules.member.controller.auth.vo;
  1 +package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.Mobile;
4 4 import io.swagger.annotations.ApiModel;
... ... @@ -17,18 +17,13 @@ import javax.validation.constraints.Pattern;
17 17 @NoArgsConstructor
18 18 @AllArgsConstructor
19 19 @Builder
20   -public class MbrAuthSmsLoginReqVO {
  20 +public class SysAuthSmsLoginReqVO {
21 21  
22 22 @ApiModelProperty(value = "手机号", required = true, example = "15601691300")
23 23 @NotEmpty(message = "手机号不能为空")
24 24 @Mobile
25 25 private String mobile;
26 26  
27   - @ApiModelProperty(value = "密码", required = true, example = "buzhidao")
28   - @NotEmpty(message = "密码不能为空")
29   - @Length(min = 4, max = 16, message = "密码长度为 4-16 位")
30   - private String password;
31   -
32 27 @ApiModelProperty(value = "手机验证码", required = true, example = "1024")
33 28 @NotEmpty(message = "手机验证码不能为空")
34 29 @Length(min = 4, max = 6, message = "手机验证码长度为 4-6 位")
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/package-info.java 0 → 100644
  1 +/**
  2 + * 占位
  3 + */
  4 +package cn.iocoder.yudao.userserver.modules.system.controller;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/auth/SysAuthConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.convert.auth;
  2 +
  3 +import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
  4 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  5 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  6 +import org.mapstruct.Mapper;
  7 +import org.mapstruct.Mapping;
  8 +import org.mapstruct.factory.Mappers;
  9 +
  10 +@Mapper
  11 +public interface SysAuthConvert {
  12 +
  13 + SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class);
  14 +
  15 + @Mapping(source = "mobile", target = "username")
  16 + LoginUser convert0(MbrUserDO bean);
  17 +
  18 + default LoginUser convert(MbrUserDO bean) {
  19 + // 目的,为了设置 UserTypeEnum.MEMBER.getValue()
  20 + return convert0(bean).setUserType(UserTypeEnum.MEMBER.getValue());
  21 + }
  22 +
  23 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/package-info.java
  1 +/**
  2 + * 提供 POJO 类的实体转换
  3 + *
  4 + * 目前使用 MapStruct 框架
  5 + */
1 6 package cn.iocoder.yudao.userserver.modules.system.convert;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md 0 → 100644
  1 +<http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao>
... ...
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/member/dal/mysql/sms/MbrSmsCodeDO.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/dataobject/sms/SysSmsCodeDO.java
1   -package cn.iocoder.yudao.userserver.modules.member.dal.mysql.sms;
  1 +package cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.TableName;
5   -import lombok.Data;
6   -import lombok.EqualsAndHashCode;
  5 +import lombok.*;
7 6 import lombok.experimental.Accessors;
8 7  
9 8 import java.util.Date;
... ... @@ -15,11 +14,13 @@ import java.util.Date;
15 14 *
16 15 * @author 芋道源码
17 16 */
18   -@TableName("mbr_sms_code")
  17 +@TableName("sys_sms_code")
19 18 @Data
20 19 @EqualsAndHashCode(callSuper = true)
21   -@Accessors(chain = true)
22   -public class MbrSmsCodeDO extends BaseDO {
  20 +@Builder
  21 +@NoArgsConstructor
  22 +@AllArgsConstructor
  23 +public class SysSmsCodeDO extends BaseDO {
23 24  
24 25 /**
25 26 * 编号
... ... @@ -36,7 +37,7 @@ public class MbrSmsCodeDO extends BaseDO {
36 37 /**
37 38 * 发送场景
38 39 *
39   - * 枚举 {@link MbrSmsCodeDO}
  40 + * 枚举 {@link SysSmsCodeDO}
40 41 */
41 42 private Integer scene;
42 43 /**
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/mysql/sms/SysSmsCodeMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.dal.mysql.sms;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
  5 +import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO;
  6 +import org.apache.ibatis.annotations.Mapper;
  7 +
  8 +@Mapper
  9 +public interface SysSmsCodeMapper extends BaseMapperX<SysSmsCodeDO> {
  10 +
  11 + /**
  12 + * 获得手机号的最后一个手机验证码
  13 + *
  14 + * @param mobile 手机号
  15 + * @param scene 发送场景,选填
  16 + * @return 手机验证码
  17 + */
  18 + default SysSmsCodeDO selectLastByMobile(String mobile, Integer scene) {
  19 + return selectOne(new QueryWrapperX<SysSmsCodeDO>()
  20 + .eq("mobile", mobile)
  21 + .eqIfPresent("scene", scene)
  22 + .orderByDesc("id")
  23 + .last("LIMIT 1"));
  24 + }
  25 +
  26 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/dal/redis/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.dal.redis;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.enums;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ErrorCode;
  4 +
  5 +/**
  6 + * System 错误码枚举类
  7 + *
  8 + * system 系统,使用 1-005-000-000 段
  9 + */
  10 +public interface SysErrorCodeConstants {
  11 +
  12 + // ========== AUTH 模块 1005000000 ==========
  13 + ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1005000000, "登录失败,账号密码不正确");
  14 + ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1005000001, "登录失败,账号被禁用");
  15 + ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1005000002, "登录失败"); // 登录失败的兜底,未知原因
  16 + ErrorCode AUTH_TOKEN_EXPIRED = new ErrorCode(1005000003, "Token 已经过期");
  17 +
  18 + // ========== SMS CODE 模块 1005001000 ==========
  19 + ErrorCode USER_SMS_CODE_NOT_FOUND = new ErrorCode(1005001000, "验证码不存在");
  20 + ErrorCode USER_SMS_CODE_EXPIRED = new ErrorCode(1005001001, "验证码已过期");
  21 + ErrorCode USER_SMS_CODE_USED = new ErrorCode(1005001002, "验证码已使用");
  22 + ErrorCode USER_SMS_CODE_NOT_CORRECT = new ErrorCode(1005001003, "验证码不正确");
  23 + ErrorCode USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY = new ErrorCode(1005001004, "超过每日短信发送数量");
  24 + ErrorCode USER_SMS_CODE_SEND_TOO_FAST = new ErrorCode(1005001005, "短信发送过于频率");
  25 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/sms/MbrSmsSceneEnum.java renamed to yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/sms/SysSmsSceneEnum.java
1   -package cn.iocoder.yudao.userserver.modules.member.enums.sms;
  1 +package cn.iocoder.yudao.userserver.modules.system.enums.sms;
2 2  
3 3 import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
4 4 import lombok.AllArgsConstructor;
... ... @@ -13,13 +13,13 @@ import java.util.Arrays;
13 13 */
14 14 @Getter
15 15 @AllArgsConstructor
16   -public enum MbrSmsSceneEnum implements IntArrayValuable {
  16 +public enum SysSmsSceneEnum implements IntArrayValuable {
17 17  
18 18 LOGIN_BY_SMS(1, "手机号登陆"),
19 19 CHANGE_MOBILE_BY_SMS(2, "更换手机号"),
20 20 ;
21 21  
22   - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MbrSmsSceneEnum::getScene).toArray();
  22 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysSmsSceneEnum::getScene).toArray();
23 23  
24 24 private final Integer scene;
25 25 private final String name;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/sms/SysSmsTemplateCodeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.enums.sms;
  2 +
  3 +/**
  4 + * yudao-user-server 使用到的短信模板的 Code 编码的枚举
  5 + *
  6 + * @author 芋道源码
  7 + */
  8 +public interface SysSmsTemplateCodeConstants {
  9 +
  10 + /**
  11 + * 前台用户短信登录
  12 + */
  13 + String USER_SMS_LOGIN = "user-sms-login";
  14 +
  15 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/package-info.java 0 → 100644
  1 +/**
  2 + * 属于 system 模块的 framework 封装
  3 + *
  4 + * @author 芋道源码
  5 + */
  6 +package cn.iocoder.yudao.userserver.modules.system.framework;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/sms/SmsCodeConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.framework.sms;
  2 +
  3 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  4 +import org.springframework.context.annotation.Configuration;
  5 +
  6 +@Configuration
  7 +@EnableConfigurationProperties(SmsCodeProperties.class)
  8 +public class SmsCodeConfiguration {
  9 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/framework/sms/SmsCodeProperties.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.framework.sms;
  2 +
  3 +import lombok.Data;
  4 +import org.springframework.boot.context.properties.ConfigurationProperties;
  5 +import org.springframework.validation.annotation.Validated;
  6 +
  7 +import javax.validation.constraints.NotEmpty;
  8 +import javax.validation.constraints.NotNull;
  9 +import java.time.Duration;
  10 +import java.util.Collection;
  11 +
  12 +@ConfigurationProperties(prefix = "yudao.sms-code")
  13 +@Validated
  14 +@Data
  15 +public class SmsCodeProperties {
  16 +
  17 + /**
  18 + * 过期时间
  19 + */
  20 + @NotNull(message = "过期时间不能为空")
  21 + private Duration expireTimes;
  22 + /**
  23 + * 短信发送频率
  24 + */
  25 + @NotNull(message = "短信发送频率不能为空")
  26 + private Duration sendFrequency;
  27 + /**
  28 + * 每日发送最大数量
  29 + */
  30 + @NotNull(message = "每日发送最大数量不能为空")
  31 + private Integer sendMaximumQuantityPerDay;
  32 + /**
  33 + * 验证码最小值
  34 + */
  35 + @NotNull(message = "验证码最小值不能为空")
  36 + private Integer beginCode;
  37 + /**
  38 + * 验证码最大值
  39 + */
  40 + @NotNull(message = "验证码最大值不能为空")
  41 + private Integer endCode;
  42 +
  43 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.service.auth;
  2 +
  3 +import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
  4 +import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthLoginReqVO;
  5 +import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthSmsLoginReqVO;
  6 +
  7 +import javax.validation.Valid;
  8 +
  9 +/**
  10 + * 用户前台的认证 Service 接口
  11 + *
  12 + * 提供用户的账号密码登录、token 的校验等认证相关的功能
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +public interface SysAuthService extends SecurityAuthFrameworkService {
  17 +
  18 + /**
  19 + * 手机 + 密码登录
  20 + *
  21 + * @param reqVO 登录信息
  22 + * @param userIp 用户 IP
  23 + * @param userAgent 用户 UA
  24 + * @return 身份令牌,使用 JWT 方式
  25 + */
  26 + String login(@Valid SysAuthLoginReqVO reqVO, String userIp, String userAgent);
  27 +
  28 + /**
  29 + * 手机 + 验证码登陆
  30 + *
  31 + * @param reqVO 登陆信息
  32 + * @param userIp 用户 IP
  33 + * @param userAgent 用户 UA
  34 + * @return 身份令牌,使用 JWT 方式
  35 + */
  36 + String smsLogin(@Valid SysAuthSmsLoginReqVO reqVO, String userIp, String userAgent);
  37 +
  38 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.service.auth.impl;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
  5 +import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum;
  6 +import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
  7 +import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
  8 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
  9 +import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
  10 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  11 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  12 +import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
  13 +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
  14 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  15 +import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
  16 +import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthLoginReqVO;
  17 +import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthSmsLoginReqVO;
  18 +import cn.iocoder.yudao.userserver.modules.system.convert.auth.SysAuthConvert;
  19 +import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum;
  20 +import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService;
  21 +import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService;
  22 +import lombok.extern.slf4j.Slf4j;
  23 +import org.springframework.context.annotation.Lazy;
  24 +import org.springframework.security.authentication.AuthenticationManager;
  25 +import org.springframework.security.authentication.BadCredentialsException;
  26 +import org.springframework.security.authentication.DisabledException;
  27 +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  28 +import org.springframework.security.core.Authentication;
  29 +import org.springframework.security.core.AuthenticationException;
  30 +import org.springframework.security.core.userdetails.UserDetails;
  31 +import org.springframework.security.core.userdetails.UsernameNotFoundException;
  32 +import org.springframework.stereotype.Service;
  33 +import org.springframework.transaction.annotation.Transactional;
  34 +
  35 +import javax.annotation.Resource;
  36 +import java.util.Objects;
  37 +
  38 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  39 +import static cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants.*;
  40 +
  41 +/**
  42 + * Auth Service 实现类
  43 + *
  44 + * @author 芋道源码
  45 + */
  46 +@Service
  47 +@Slf4j
  48 +public class SysAuthServiceImpl implements SysAuthService {
  49 +
  50 + @Resource
  51 + @Lazy // 延迟加载,因为存在相互依赖的问题
  52 + private AuthenticationManager authenticationManager;
  53 +
  54 + @Resource
  55 + private MbrUserService userService;
  56 + @Resource
  57 + private SysSmsCodeService smsCodeService;
  58 + @Resource
  59 + private SysLoginLogCoreService loginLogCoreService;
  60 + @Resource
  61 + private SysUserSessionCoreService userSessionCoreService;
  62 +
  63 + @Override
  64 + public UserDetails loadUserByUsername(String mobile) throws UsernameNotFoundException {
  65 + // 获取 username 对应的 SysUserDO
  66 + MbrUserDO user = userService.getUserByMobile(mobile);
  67 + if (user == null) {
  68 + throw new UsernameNotFoundException(mobile);
  69 + }
  70 + // 创建 LoginUser 对象
  71 + return SysAuthConvert.INSTANCE.convert(user);
  72 + }
  73 +
  74 + @Override
  75 + public String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent) {
  76 + // 使用手机 + 密码,进行登录。
  77 + LoginUser loginUser = this.login0(reqVO.getMobile(), reqVO.getPassword());
  78 +
  79 + // 缓存登录用户到 Redis 中,返回 sessionId 编号
  80 + return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
  81 + }
  82 +
  83 + @Override
  84 + @Transactional
  85 + public String smsLogin(SysAuthSmsLoginReqVO reqVO, String userIp, String userAgent) {
  86 + // 校验验证码
  87 + smsCodeService.useSmsCode(reqVO.getMobile(), SysSmsSceneEnum.LOGIN_BY_SMS.getScene(),
  88 + reqVO.getCode(), userIp);
  89 +
  90 + // 获得获得注册用户
  91 + MbrUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp);
  92 + Assert.notNull(user, "获取用户失败,结果为空");
  93 +
  94 + // 执行登陆
  95 + this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_SMS, SysLoginResultEnum.SUCCESS);
  96 + LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user);
  97 +
  98 + // 缓存登录用户到 Redis 中,返回 sessionId 编号
  99 + return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
  100 + }
  101 +
  102 + private LoginUser login0(String username, String password) {
  103 + final SysLoginLogTypeEnum logTypeEnum = SysLoginLogTypeEnum.LOGIN_USERNAME;
  104 + // 用户验证
  105 + Authentication authentication;
  106 + try {
  107 + // 调用 Spring Security 的 AuthenticationManager#authenticate(...) 方法,使用账号密码进行认证
  108 + // 在其内部,会调用到 loadUserByUsername 方法,获取 User 信息
  109 + authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
  110 + } catch (BadCredentialsException badCredentialsException) {
  111 + this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.BAD_CREDENTIALS);
  112 + throw exception(AUTH_LOGIN_BAD_CREDENTIALS);
  113 + } catch (DisabledException disabledException) {
  114 + this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.USER_DISABLED);
  115 + throw exception(AUTH_LOGIN_USER_DISABLED);
  116 + } catch (AuthenticationException authenticationException) {
  117 + log.error("[login0][username({}) 发生未知异常]", username, authenticationException);
  118 + this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.UNKNOWN_ERROR);
  119 + throw exception(AUTH_LOGIN_FAIL_UNKNOWN);
  120 + }
  121 + // 登录成功的日志
  122 + Assert.notNull(authentication.getPrincipal(), "Principal 不会为空");
  123 + this.createLoginLog(username, logTypeEnum, SysLoginResultEnum.SUCCESS);
  124 + return (LoginUser) authentication.getPrincipal();
  125 + }
  126 +
  127 + private void createLoginLog(String mobile, SysLoginLogTypeEnum logTypeEnum, SysLoginResultEnum loginResult) {
  128 + // 获得用户
  129 + MbrUserDO user = userService.getUserByMobile(mobile);
  130 + // 插入登录日志
  131 + SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO();
  132 + reqDTO.setLogType(logTypeEnum.getType());
  133 + reqDTO.setTraceId(TracerUtils.getTraceId());
  134 + if (user != null) {
  135 + reqDTO.setUserId(user.getId());
  136 + }
  137 + reqDTO.setUsername(mobile);
  138 + reqDTO.setUserAgent(ServletUtils.getUserAgent());
  139 + reqDTO.setUserIp(ServletUtils.getClientIP());
  140 + reqDTO.setResult(loginResult.getResult());
  141 + loginLogCoreService.createLoginLog(reqDTO);
  142 + // 更新最后登录时间
  143 + if (user != null && Objects.equals(SysLoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
  144 + userService.updateUserLogin(user.getId(), ServletUtils.getClientIP());
  145 + }
  146 + }
  147 +
  148 + @Override
  149 + public LoginUser verifyTokenAndRefresh(String token) {
  150 + // 获得 LoginUser
  151 + LoginUser loginUser = userSessionCoreService.getLoginUser(token);
  152 + if (loginUser == null) {
  153 + return null;
  154 + }
  155 + // 刷新 LoginUser 缓存
  156 + this.refreshLoginUserCache(token, loginUser);
  157 + return loginUser;
  158 + }
  159 +
  160 + private void refreshLoginUserCache(String token, LoginUser loginUser) {
  161 + // 每 1/3 的 Session 超时时间,刷新 LoginUser 缓存
  162 + if (System.currentTimeMillis() - loginUser.getUpdateTime().getTime() <
  163 + userSessionCoreService.getSessionTimeoutMillis() / 3) {
  164 + return;
  165 + }
  166 +
  167 + // 重新加载 MbrUserDO 信息
  168 + MbrUserDO user = userService.getUser(loginUser.getId());
  169 + if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) {
  170 + throw exception(AUTH_TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面
  171 + }
  172 +
  173 + // 刷新 LoginUser 缓存
  174 + userSessionCoreService.refreshUserSession(token, loginUser);
  175 + }
  176 +
  177 + @Override
  178 + public LoginUser mockLogin(Long userId) {
  179 + // 获取用户编号对应的 MbrUserDO
  180 + MbrUserDO user = userService.getUser(userId);
  181 + if (user == null) {
  182 + throw new UsernameNotFoundException(String.valueOf(userId));
  183 + }
  184 +
  185 + // 执行登陆
  186 + this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_MOCK, SysLoginResultEnum.SUCCESS);
  187 +
  188 + // 创建 LoginUser 对象
  189 + return SysAuthConvert.INSTANCE.convert(user);
  190 + }
  191 +
  192 + @Override
  193 + public void logout(String token) {
  194 + // 查询用户信息
  195 + LoginUser loginUser = userSessionCoreService.getLoginUser(token);
  196 + if (loginUser == null) {
  197 + return;
  198 + }
  199 + // 删除 session
  200 + userSessionCoreService.deleteUserSession(token);
  201 + // 记录登出日志
  202 + this.createLogoutLog(loginUser.getId(), loginUser.getUsername());
  203 + }
  204 +
  205 + private void createLogoutLog(Long userId, String username) {
  206 + SysLoginLogCreateReqDTO reqDTO = new SysLoginLogCreateReqDTO();
  207 + reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType());
  208 + reqDTO.setTraceId(TracerUtils.getTraceId());
  209 + reqDTO.setUserId(userId);
  210 + reqDTO.setUserType(UserTypeEnum.MEMBER.getValue());
  211 + reqDTO.setUsername(username);
  212 + reqDTO.setUserAgent(ServletUtils.getUserAgent());
  213 + reqDTO.setUserIp(ServletUtils.getClientIP());
  214 + reqDTO.setResult(SysLoginResultEnum.SUCCESS.getResult());
  215 + loginLogCoreService.createLoginLog(reqDTO);
  216 + }
  217 +
  218 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/package-info.java
1   -package cn.iocoder.yudao.userserver.modules.system.service;
2 1 \ No newline at end of file
  2 +package cn.iocoder.yudao.userserver.modules.system.service;
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/sms/SysSmsCodeService.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.service.sms;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ServiceException;
  4 +import cn.iocoder.yudao.framework.common.validation.Mobile;
  5 +import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum;
  6 +
  7 +/**
  8 + * 短信验证码 Service 接口
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +public interface SysSmsCodeService {
  13 +
  14 + /**
  15 + * 创建短信验证码,并进行发送
  16 + *
  17 + * @param mobile 手机号
  18 + * @param scene 发送场景 {@link SysSmsSceneEnum}
  19 + * @param createIp 发送 IP
  20 + */
  21 + void sendSmsCode(@Mobile String mobile, Integer scene, String createIp);
  22 +
  23 + /**
  24 + * 验证短信验证码,并进行使用
  25 + * 如果正确,则将验证码标记成已使用
  26 + * 如果错误,则抛出 {@link ServiceException} 异常
  27 + *
  28 + * @param mobile 手机号
  29 + * @param scene 发送场景
  30 + * @param code 验证码
  31 + * @param usedIp 使用 IP
  32 + */
  33 + void useSmsCode(@Mobile String mobile, Integer scene, String code, String usedIp);
  34 +
  35 +}
... ...
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/sms/impl/SysSmsCodeServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.userserver.modules.system.service.sms.impl;
  2 +
  3 +import cn.hutool.core.map.MapUtil;
  4 +import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
  5 +import cn.iocoder.yudao.userserver.modules.system.dal.dataobject.sms.SysSmsCodeDO;
  6 +import cn.iocoder.yudao.userserver.modules.system.dal.mysql.sms.SysSmsCodeMapper;
  7 +import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsTemplateCodeConstants;
  8 +import cn.iocoder.yudao.userserver.modules.system.framework.sms.SmsCodeProperties;
  9 +import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService;
  10 +import org.springframework.stereotype.Service;
  11 +import org.springframework.validation.annotation.Validated;
  12 +
  13 +import javax.annotation.Resource;
  14 +import java.util.Date;
  15 +
  16 +import static cn.hutool.core.util.RandomUtil.randomInt;
  17 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  18 +import static cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants.*;
  19 +
  20 +/**
  21 + * 短信验证码 Service 实现类
  22 + *
  23 + * @author 芋道源码
  24 + */
  25 +@Service
  26 +@Validated
  27 +public class SysSmsCodeServiceImpl implements SysSmsCodeService {
  28 +
  29 + @Resource
  30 + private SmsCodeProperties smsCodeProperties;
  31 +
  32 + @Resource
  33 + private SysSmsCodeMapper smsCodeMapper;
  34 +
  35 + @Resource
  36 + private SysSmsCoreService smsCoreService;
  37 +
  38 + @Override
  39 + public void sendSmsCode(String mobile, Integer scene, String createIp) {
  40 + // 创建验证码
  41 + String code = this.createSmsCode(mobile, scene, createIp);
  42 + // 发送验证码
  43 + smsCoreService.sendSingleSmsToMember(mobile, null, SysSmsTemplateCodeConstants.USER_SMS_LOGIN,
  44 + MapUtil.of("code", code));
  45 + }
  46 +
  47 + private String createSmsCode(String mobile, Integer scene, String ip) {
  48 + // 校验是否可以发送验证码,不用筛选场景
  49 + SysSmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null);
  50 + if (lastSmsCode != null) {
  51 + if (lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。
  52 + throw exception(USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
  53 + }
  54 + if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime()
  55 + < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁
  56 + throw exception(USER_SMS_CODE_SEND_TOO_FAST);
  57 + }
  58 + // TODO 芋艿:提升,每个 IP 每天可发送数量
  59 + // TODO 芋艿:提升,每个 IP 每小时可发送数量
  60 + }
  61 +
  62 + // 创建验证码记录
  63 + String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1));
  64 + SysSmsCodeDO newSmsCode = SysSmsCodeDO.builder().mobile(mobile).code(code)
  65 + .scene(scene).todayIndex(lastSmsCode != null ? lastSmsCode.getTodayIndex() + 1 : 1)
  66 + .createIp(ip).used(false).build();
  67 + smsCodeMapper.insert(newSmsCode);
  68 + return code;
  69 + }
  70 +
  71 + @Override
  72 + public void useSmsCode(String mobile, Integer scene, String code, String usedIp) {
  73 + // 校验验证码
  74 + SysSmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, scene);
  75 + if (lastSmsCode == null) { // 若验证码不存在,抛出异常
  76 + throw exception(USER_SMS_CODE_NOT_FOUND);
  77 + }
  78 + if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime()
  79 + >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期
  80 + throw exception(USER_SMS_CODE_EXPIRED);
  81 + }
  82 + if (lastSmsCode.getUsed()) { // 验证码已使用
  83 + throw exception(USER_SMS_CODE_USED);
  84 + }
  85 + if (!lastSmsCode.getCode().equals(code)) {
  86 + throw exception(USER_SMS_CODE_NOT_CORRECT);
  87 + }
  88 +
  89 + // 使用验证码
  90 + smsCodeMapper.updateById(SysSmsCodeDO.builder().id(lastSmsCode.getId())
  91 + .used(true).usedTime(new Date()).usedIp(usedIp).build());
  92 + }
  93 +
  94 +}
... ...
yudao-user-server/src/main/resources/application-dev.yaml
... ... @@ -72,7 +72,7 @@ apollo:
72 72 eagerLoad:
73 73 enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置
74 74 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址
75   - dao: cn.iocoder.yudao.userserver.modules.infra.dal.mysql.config.InfConfigDAOImpl
  75 + dao: cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.config.InfConfigCoreDAOImpl
76 76 url: ${spring.datasource.dynamic.datasource.master.url}
77 77 username: ${spring.datasource.dynamic.datasource.master.username}
78 78 password: ${spring.datasource.dynamic.datasource.master.password}
... ...
yudao-user-server/src/main/resources/application-local.yaml
... ... @@ -72,7 +72,7 @@ apollo:
72 72 eagerLoad:
73 73 enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置
74 74 jdbc: # 自定义的 JDBC 配置项,用于数据库的地址
75   - dao: cn.iocoder.yudao.userserver.modules.infra.dal.mysql.config.InfConfigDAOImpl
  75 + dao: cn.iocoder.yudao.coreservice.modules.infra.dal.mysql.config.InfConfigCoreDAOImpl
76 76 url: ${spring.datasource.dynamic.datasource.master.url}
77 77 username: ${spring.datasource.dynamic.datasource.master.username}
78 78 password: ${spring.datasource.dynamic.datasource.master.password}
... ...
yudao-user-server/src/main/resources/application.yaml
... ... @@ -31,7 +31,7 @@ mybatis-plus:
31 31 logic-delete-value: 1 # 逻辑已删除值(默认为 1)
32 32 logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
33 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 39 info:
40 40 version: 1.0.0
41 41 base-package: cn.iocoder.yudao.userserver
  42 + core-service:
  43 + base-package: cn.iocoder.yudao.coreservice
42 44 web:
43 45 api-prefix: /api
44 46 controller-package: ${yudao.info.base-package}
... ... @@ -56,5 +58,13 @@ yudao:
56 58 db-schemas: ${spring.datasource.dynamic.datasource.master.name}
57 59 error-code: # 错误码相关配置项
58 60 constants-class-list:
  61 + - cn.iocoder.yudao.userserver.modules.member.enums.MbrErrorCodeConstants
  62 + - cn.iocoder.yudao.userserver.modules.system.enums.SysErrorCodeConstants
  63 + sms-code: # 短信验证码相关的配置项
  64 + expire-times: 10m
  65 + send-frequency: 1m
  66 + send-maximum-quantity-per-day: 10
  67 + begin-code: 9999 # 这里配置 9999 的原因是,测试方便。
  68 + end-code: 9999 # 这里配置 9999 的原因是,测试方便。
59 69  
60 70 debug: false
... ...
更新日志.md
... ... @@ -7,10 +7,20 @@
7 7  
8 8 * 工作流
9 9  
10   -## [v1.1.0] 待定
  10 +## [v1.1.1] 待定
11 11  
12 12 * 支付
13   -* 三方平台接入
  13 +* 用户前台的社交登陆
  14 +
  15 +## [v1.1.0] 进行中
  16 +
  17 +* 新增管理后台的企业微信、钉钉等社交登录
  18 +* 新增用户前台(例如说,用户使用的小程序)的后端项目 `yudao-user-server`
  19 +* 新增公共服务 `yudao-core-service` 项目,通过 Jar 包的方式,提供 `yudao-user-server` 和 `yudao-admin-server` 的共享逻辑的复用
  20 +* 新增用户前台的手机登录、验证码登录
  21 +* 修复管理后台的用户头像上传 404 的问题,原因是请求路径不对
  22 +* 修复用户导入失败的问题,原因是 Lombok 链式与 cglib 读取属性有冲突
  23 +* 修复阿里云短信发送失败的问题,原因是 Opentracing 依赖的版本太低,调整成 0.31.0
14 24  
15 25 ## [v1.0.0] 2021.05.03
16 26  
... ...