Commit 65a86e8d755750e674c081a1035e3a42bd81deee
Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2-qcloud
Conflicts: yudao-ui-admin/yarn.lock
Showing
213 changed files
with
4685 additions
and
2209 deletions
Too many changes.
To preserve performance only 100 of 213 files are displayed.
sql/ruoyi-vue-pro.sql
No preview for this file type
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/http/HttpUtils.java
| 1 | package cn.iocoder.yudao.framework.common.util.http; | 1 | package cn.iocoder.yudao.framework.common.util.http; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.io.FileUtil; | ||
| 4 | import cn.hutool.core.map.TableMap; | 3 | import cn.hutool.core.map.TableMap; |
| 5 | import cn.hutool.core.net.url.UrlBuilder; | 4 | import cn.hutool.core.net.url.UrlBuilder; |
| 6 | -import cn.hutool.core.util.ReferenceUtil; | ||
| 7 | import cn.hutool.core.util.ReflectUtil; | 5 | import cn.hutool.core.util.ReflectUtil; |
| 8 | 6 | ||
| 9 | import java.nio.charset.Charset; | 7 | import java.nio.charset.Charset; |
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/io/IoUtils.java
| @@ -2,7 +2,6 @@ package cn.iocoder.yudao.framework.common.util.io; | @@ -2,7 +2,6 @@ package cn.iocoder.yudao.framework.common.util.io; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.io.IORuntimeException; | 3 | import cn.hutool.core.io.IORuntimeException; |
| 4 | import cn.hutool.core.io.IoUtil; | 4 | import cn.hutool.core.io.IoUtil; |
| 5 | -import cn.hutool.core.util.CharsetUtil; | ||
| 6 | import cn.hutool.core.util.StrUtil; | 5 | import cn.hutool.core.util.StrUtil; |
| 7 | 6 | ||
| 8 | import java.io.InputStream; | 7 | import java.io.InputStream; |
yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/ftp/FtpFileClient.java
| @@ -44,7 +44,7 @@ public class FtpFileClient extends AbstractFileClient<FtpFileClientConfig> { | @@ -44,7 +44,7 @@ public class FtpFileClient extends AbstractFileClient<FtpFileClientConfig> { | ||
| 44 | String dir = StrUtil.removeSuffix(filePath, fileName); | 44 | String dir = StrUtil.removeSuffix(filePath, fileName); |
| 45 | boolean success = ftp.upload(dir, fileName, new ByteArrayInputStream(content)); | 45 | boolean success = ftp.upload(dir, fileName, new ByteArrayInputStream(content)); |
| 46 | if (!success) { | 46 | if (!success) { |
| 47 | - throw new FtpException(StrUtil.format("上海文件到目标目录 ({}) 失败", filePath)); | 47 | + throw new FtpException(StrUtil.format("上传文件到目标目录 ({}) 失败", filePath)); |
| 48 | } | 48 | } |
| 49 | // 拼接返回路径 | 49 | // 拼接返回路径 |
| 50 | return super.formatFileUrl(config.getDomain(), path); | 50 | return super.formatFileUrl(config.getDomain(), path); |
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
| @@ -75,12 +75,20 @@ public interface BaseMapperX<T> extends BaseMapper<T> { | @@ -75,12 +75,20 @@ public interface BaseMapperX<T> extends BaseMapper<T> { | ||
| 75 | return selectList(new LambdaQueryWrapper<T>().in(field, values)); | 75 | return selectList(new LambdaQueryWrapper<T>().in(field, values)); |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | + /** | ||
| 79 | + * 逐条插入,适合少量数据插入,或者对性能要求不高的场景 | ||
| 80 | + * | ||
| 81 | + * 如果大量,请使用 {@link com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#saveBatch(Collection)} 方法 | ||
| 82 | + * 使用示例,可见 RoleMenuBatchInsertMapper、UserRoleBatchInsertMapper 类 | ||
| 83 | + * | ||
| 84 | + * @param entities 实体们 | ||
| 85 | + */ | ||
| 78 | default void insertBatch(Collection<T> entities) { | 86 | default void insertBatch(Collection<T> entities) { |
| 79 | - // TODO 芋艿:修改成支持批量的 | ||
| 80 | entities.forEach(this::insert); | 87 | entities.forEach(this::insert); |
| 81 | } | 88 | } |
| 82 | 89 | ||
| 83 | default void updateBatch(T update) { | 90 | default void updateBatch(T update) { |
| 84 | update(update, new QueryWrapper<>()); | 91 | update(update, new QueryWrapper<>()); |
| 85 | } | 92 | } |
| 93 | + | ||
| 86 | } | 94 | } |
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/type/StringLiSTTypeHandler.java
0 → 100644
| 1 | +package cn.iocoder.yudao.framework.mybatis.core.type; | ||
| 2 | + | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 4 | +import cn.hutool.core.util.StrUtil; | ||
| 5 | +import org.apache.ibatis.type.JdbcType; | ||
| 6 | +import org.apache.ibatis.type.MappedJdbcTypes; | ||
| 7 | +import org.apache.ibatis.type.MappedTypes; | ||
| 8 | +import org.apache.ibatis.type.TypeHandler; | ||
| 9 | + | ||
| 10 | +import java.sql.CallableStatement; | ||
| 11 | +import java.sql.PreparedStatement; | ||
| 12 | +import java.sql.ResultSet; | ||
| 13 | +import java.sql.SQLException; | ||
| 14 | +import java.util.List; | ||
| 15 | + | ||
| 16 | +/** | ||
| 17 | + * List<String> 的类型转换器实现类,对应数据库的 varchar 类型 | ||
| 18 | + * | ||
| 19 | + * @author 永不言败 | ||
| 20 | + * @since 2022 3/23 12:50:15 | ||
| 21 | + */ | ||
| 22 | +@MappedJdbcTypes(JdbcType.VARCHAR) | ||
| 23 | +@MappedTypes(List.class) | ||
| 24 | +public class StringLiSTTypeHandler implements TypeHandler<List<String>> { | ||
| 25 | + | ||
| 26 | + private static final String COMMA = ","; | ||
| 27 | + | ||
| 28 | + @Override | ||
| 29 | + public void setParameter(PreparedStatement ps, int i, List<String> strings, JdbcType jdbcType) throws SQLException { | ||
| 30 | + // 设置占位符 | ||
| 31 | + ps.setString(i, CollUtil.join(strings, COMMA)); | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + @Override | ||
| 35 | + public List<String> getResult(ResultSet rs, String columnName) throws SQLException { | ||
| 36 | + String value = rs.getString(columnName); | ||
| 37 | + return getResult(value); | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + @Override | ||
| 41 | + public List<String> getResult(ResultSet rs, int columnIndex) throws SQLException { | ||
| 42 | + String value = rs.getString(columnIndex); | ||
| 43 | + return getResult(value); | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | + @Override | ||
| 47 | + public List<String> getResult(CallableStatement cs, int columnIndex) throws SQLException { | ||
| 48 | + String value = cs.getString(columnIndex); | ||
| 49 | + return getResult(value); | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + private List<String> getResult(String value) { | ||
| 53 | + if (value == null) { | ||
| 54 | + return null; | ||
| 55 | + } | ||
| 56 | + return StrUtil.splitTrim(value, COMMA); | ||
| 57 | + } | ||
| 58 | +} |
yudao-framework/yudao-spring-boot-starter-redis/pom.xml
| @@ -26,6 +26,12 @@ | @@ -26,6 +26,12 @@ | ||
| 26 | <groupId>org.redisson</groupId> | 26 | <groupId>org.redisson</groupId> |
| 27 | <artifactId>redisson-spring-boot-starter</artifactId> | 27 | <artifactId>redisson-spring-boot-starter</artifactId> |
| 28 | </dependency> | 28 | </dependency> |
| 29 | + | ||
| 30 | + <dependency> | ||
| 31 | + <groupId>org.springframework.boot</groupId> | ||
| 32 | + <artifactId>spring-boot-starter-cache</artifactId> <!-- 实现对 Caches 的自动化配置 --> | ||
| 33 | + </dependency> | ||
| 34 | + | ||
| 29 | </dependencies> | 35 | </dependencies> |
| 30 | 36 | ||
| 31 | </project> | 37 | </project> |
yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoCacheAutoConfiguration.java
0 → 100644
| 1 | +package cn.iocoder.yudao.framework.redis.config; | ||
| 2 | + | ||
| 3 | +import org.springframework.boot.autoconfigure.cache.CacheProperties; | ||
| 4 | +import org.springframework.cache.annotation.EnableCaching; | ||
| 5 | +import org.springframework.context.annotation.Bean; | ||
| 6 | +import org.springframework.context.annotation.Configuration; | ||
| 7 | +import org.springframework.context.annotation.Primary; | ||
| 8 | +import org.springframework.data.redis.cache.RedisCacheConfiguration; | ||
| 9 | +import org.springframework.data.redis.serializer.RedisSerializationContext; | ||
| 10 | +import org.springframework.data.redis.serializer.RedisSerializer; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * Cache 配置类,基于 Redis 实现 | ||
| 14 | + */ | ||
| 15 | +@Configuration | ||
| 16 | +@EnableCaching | ||
| 17 | +public class YudaoCacheAutoConfiguration { | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * RedisCacheConfiguration Bean | ||
| 21 | + * | ||
| 22 | + * 参考 org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration 的 createConfiguration 方法 | ||
| 23 | + */ | ||
| 24 | + @Bean | ||
| 25 | + @Primary | ||
| 26 | + public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) { | ||
| 27 | + // 设置使用 JSON 序列化方式 | ||
| 28 | + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); | ||
| 29 | + config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json())); | ||
| 30 | + | ||
| 31 | + // 设置 CacheProperties.Redis 的属性 | ||
| 32 | + CacheProperties.Redis redisProperties = cacheProperties.getRedis(); | ||
| 33 | + if (redisProperties.getTimeToLive() != null) { | ||
| 34 | + config = config.entryTtl(redisProperties.getTimeToLive()); | ||
| 35 | + } | ||
| 36 | + if (redisProperties.getKeyPrefix() != null) { | ||
| 37 | + config = config.prefixCacheNameWith(redisProperties.getKeyPrefix()); | ||
| 38 | + } | ||
| 39 | + if (!redisProperties.isCacheNullValues()) { | ||
| 40 | + config = config.disableCachingNullValues(); | ||
| 41 | + } | ||
| 42 | + if (!redisProperties.isUseKeyPrefix()) { | ||
| 43 | + config = config.disableKeyPrefix(); | ||
| 44 | + } | ||
| 45 | + return config; | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | +} |
yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java
| 1 | package cn.iocoder.yudao.framework.redis.config; | 1 | package cn.iocoder.yudao.framework.redis.config; |
| 2 | 2 | ||
| 3 | -import lombok.extern.slf4j.Slf4j; | ||
| 4 | import org.springframework.context.annotation.Bean; | 3 | import org.springframework.context.annotation.Bean; |
| 5 | import org.springframework.context.annotation.Configuration; | 4 | import org.springframework.context.annotation.Configuration; |
| 6 | import org.springframework.data.redis.connection.RedisConnectionFactory; | 5 | import org.springframework.data.redis.connection.RedisConnectionFactory; |
| @@ -11,7 +10,6 @@ import org.springframework.data.redis.serializer.RedisSerializer; | @@ -11,7 +10,6 @@ import org.springframework.data.redis.serializer.RedisSerializer; | ||
| 11 | * Redis 配置类 | 10 | * Redis 配置类 |
| 12 | */ | 11 | */ |
| 13 | @Configuration | 12 | @Configuration |
| 14 | -@Slf4j | ||
| 15 | public class YudaoRedisAutoConfiguration { | 13 | public class YudaoRedisAutoConfiguration { |
| 16 | 14 | ||
| 17 | /** | 15 | /** |
yudao-framework/yudao-spring-boot-starter-redis/src/main/resources/META-INF/spring.factories
| 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ | 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
| 2 | - cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration | 2 | + cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration,\ |
| 3 | + cn.iocoder.yudao.framework.redis.config.YudaoCacheAutoConfiguration |
yudao-framework/yudao-spring-boot-starter-redis/《芋道 Spring Boot Cache 入门》.md
0 → 100644
| 1 | +<http://www.iocoder.cn/Spring-Boot/Cache/?yudao> |
yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/LoginUser.java
| @@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | @@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||
| 6 | import com.fasterxml.jackson.annotation.JsonIgnore; | 6 | import com.fasterxml.jackson.annotation.JsonIgnore; |
| 7 | import lombok.Data; | 7 | import lombok.Data; |
| 8 | import org.springframework.security.core.GrantedAuthority; | 8 | import org.springframework.security.core.GrantedAuthority; |
| 9 | -import org.springframework.security.core.authority.SimpleGrantedAuthority; | ||
| 10 | import org.springframework.security.core.userdetails.UserDetails; | 9 | import org.springframework.security.core.userdetails.UserDetails; |
| 11 | 10 | ||
| 12 | import java.util.*; | 11 | import java.util.*; |
| @@ -61,10 +60,6 @@ public class LoginUser implements UserDetails { | @@ -61,10 +60,6 @@ public class LoginUser implements UserDetails { | ||
| 61 | * 部门编号 | 60 | * 部门编号 |
| 62 | */ | 61 | */ |
| 63 | private Long deptId; | 62 | private Long deptId; |
| 64 | - /** | ||
| 65 | - * 所属岗位 | ||
| 66 | - */ | ||
| 67 | - private Set<Long> postIds; | ||
| 68 | 63 | ||
| 69 | // ========== 上下文 ========== | 64 | // ========== 上下文 ========== |
| 70 | /** | 65 | /** |
yudao-framework/yudao-spring-boot-starter-test/pom.xml
| @@ -21,6 +21,17 @@ | @@ -21,6 +21,17 @@ | ||
| 21 | <artifactId>yudao-common</artifactId> | 21 | <artifactId>yudao-common</artifactId> |
| 22 | </dependency> | 22 | </dependency> |
| 23 | 23 | ||
| 24 | + <!-- DB 相关 --> | ||
| 25 | + <dependency> | ||
| 26 | + <groupId>cn.iocoder.boot</groupId> | ||
| 27 | + <artifactId>yudao-spring-boot-starter-mybatis</artifactId> | ||
| 28 | + </dependency> | ||
| 29 | + | ||
| 30 | + <dependency> | ||
| 31 | + <groupId>cn.iocoder.boot</groupId> | ||
| 32 | + <artifactId>yudao-spring-boot-starter-redis</artifactId> | ||
| 33 | + </dependency> | ||
| 34 | + | ||
| 24 | <!-- Test 测试相关 --> | 35 | <!-- Test 测试相关 --> |
| 25 | <dependency> | 36 | <dependency> |
| 26 | <groupId>org.mockito</groupId> | 37 | <groupId>org.mockito</groupId> |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbAndRedisUnitTest.java renamed to yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java
| 1 | -package cn.iocoder.yudao.module.infra.test; | 1 | +package cn.iocoder.yudao.framework.test.core.ut; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; | 3 | import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; |
| 4 | import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; | 4 | import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; |
yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/test/BaseDbUnitTest.java renamed to yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java
| 1 | -package cn.iocoder.yudao.module.bpm.test; | 1 | +package cn.iocoder.yudao.framework.test.core.ut; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; | 3 | import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; |
| 4 | import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; | 4 | import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; |
yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseRedisUnitTest.java renamed to yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java
| 1 | -package cn.iocoder.yudao.module.pay.test; | 1 | +package cn.iocoder.yudao.framework.test.core.ut; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; | 3 | import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; |
| 4 | import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration; | 4 | import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration; |
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java
| @@ -2,21 +2,18 @@ package cn.iocoder.yudao.framework.apilog.core.filter; | @@ -2,21 +2,18 @@ package cn.iocoder.yudao.framework.apilog.core.filter; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.exceptions.ExceptionUtil; | 3 | import cn.hutool.core.exceptions.ExceptionUtil; |
| 4 | import cn.hutool.core.map.MapUtil; | 4 | import cn.hutool.core.map.MapUtil; |
| 5 | -import cn.hutool.core.util.StrUtil; | ||
| 6 | import cn.hutool.extra.servlet.ServletUtil; | 5 | import cn.hutool.extra.servlet.ServletUtil; |
| 7 | -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; | ||
| 8 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||
| 9 | import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; | 6 | import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; |
| 10 | import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; | 7 | import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateReqDTO; |
| 8 | +import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; | ||
| 9 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||
| 10 | +import cn.iocoder.yudao.framework.common.util.date.DateUtils; | ||
| 11 | import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; | 11 | import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; |
| 12 | +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | ||
| 12 | import cn.iocoder.yudao.framework.web.config.WebProperties; | 13 | import cn.iocoder.yudao.framework.web.config.WebProperties; |
| 14 | +import cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter; | ||
| 13 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | 15 | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; |
| 14 | -import cn.iocoder.yudao.framework.common.util.date.DateUtils; | ||
| 15 | -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||
| 16 | -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | ||
| 17 | -import lombok.RequiredArgsConstructor; | ||
| 18 | import lombok.extern.slf4j.Slf4j; | 16 | import lombok.extern.slf4j.Slf4j; |
| 19 | -import org.springframework.web.filter.OncePerRequestFilter; | ||
| 20 | 17 | ||
| 21 | import javax.servlet.FilterChain; | 18 | import javax.servlet.FilterChain; |
| 22 | import javax.servlet.ServletException; | 19 | import javax.servlet.ServletException; |
| @@ -26,27 +23,24 @@ import java.io.IOException; | @@ -26,27 +23,24 @@ import java.io.IOException; | ||
| 26 | import java.util.Date; | 23 | import java.util.Date; |
| 27 | import java.util.Map; | 24 | import java.util.Map; |
| 28 | 25 | ||
| 29 | -import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.*; | 26 | +import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; |
| 30 | 27 | ||
| 31 | /** | 28 | /** |
| 32 | * API 访问日志 Filter | 29 | * API 访问日志 Filter |
| 33 | * | 30 | * |
| 34 | * @author 芋道源码 | 31 | * @author 芋道源码 |
| 35 | */ | 32 | */ |
| 36 | -@RequiredArgsConstructor | ||
| 37 | @Slf4j | 33 | @Slf4j |
| 38 | -public class ApiAccessLogFilter extends OncePerRequestFilter { | 34 | +public class ApiAccessLogFilter extends ApiRequestFilter { |
| 39 | 35 | ||
| 40 | - private final WebProperties webProperties; | ||
| 41 | private final String applicationName; | 36 | private final String applicationName; |
| 42 | 37 | ||
| 43 | private final ApiAccessLogFrameworkService apiAccessLogFrameworkService; | 38 | private final ApiAccessLogFrameworkService apiAccessLogFrameworkService; |
| 44 | 39 | ||
| 45 | - @Override | ||
| 46 | - protected boolean shouldNotFilter(HttpServletRequest request) { | ||
| 47 | - // 只过滤 API 请求的地址 | ||
| 48 | - return !StrUtil.startWithAny(request.getRequestURI(), webProperties.getAppApi().getPrefix(), | ||
| 49 | - webProperties.getAppApi().getPrefix()); | 40 | + public ApiAccessLogFilter(WebProperties webProperties, String applicationName, ApiAccessLogFrameworkService apiAccessLogFrameworkService) { |
| 41 | + super(webProperties); | ||
| 42 | + this.applicationName = applicationName; | ||
| 43 | + this.apiAccessLogFrameworkService = apiAccessLogFrameworkService; | ||
| 50 | } | 44 | } |
| 51 | 45 | ||
| 52 | @Override | 46 | @Override |
yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java
| 1 | package cn.iocoder.yudao.module.bpm.dal.mysql.definition; | 1 | package cn.iocoder.yudao.module.bpm.dal.mysql.definition; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||
| 3 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; | 4 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; |
| 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | import org.apache.ibatis.annotations.Mapper; | 6 | import org.apache.ibatis.annotations.Mapper; |
yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceTest.java
| 1 | package cn.iocoder.yudao.module.bpm.service.definition; | 1 | package cn.iocoder.yudao.module.bpm.service.definition; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.util.RandomUtil; | 3 | import cn.hutool.core.util.RandomUtil; |
| 4 | -import cn.iocoder.yudao.module.bpm.test.BaseDbUnitTest; | 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||
| 6 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 5 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; | 7 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO; |
| 6 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; | 8 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; |
| 7 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; | 9 | import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO; |
| 8 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; | 10 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; |
| 9 | import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; | 11 | import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; |
| 10 | import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO; | 12 | import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmFormFieldRespDTO; |
| 11 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 12 | -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||
| 13 | import org.junit.jupiter.api.Test; | 13 | import org.junit.jupiter.api.Test; |
| 14 | import org.springframework.context.annotation.Import; | 14 | import org.springframework.context.annotation.Import; |
| 15 | 15 | ||
| @@ -18,12 +18,12 @@ import java.util.List; | @@ -18,12 +18,12 @@ import java.util.List; | ||
| 18 | import java.util.stream.Collectors; | 18 | import java.util.stream.Collectors; |
| 19 | import java.util.stream.Stream; | 19 | import java.util.stream.Stream; |
| 20 | 20 | ||
| 21 | -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.FORM_NOT_EXISTS; | ||
| 22 | import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; | 21 | import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; |
| 23 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | 22 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; |
| 24 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | 23 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; |
| 25 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; | 24 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; |
| 26 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | 25 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| 26 | +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.FORM_NOT_EXISTS; | ||
| 27 | import static org.junit.jupiter.api.Assertions.*; | 27 | import static org.junit.jupiter.api.Assertions.*; |
| 28 | 28 | ||
| 29 | /** | 29 | /** |
yudao-module-bpm/yudao-module-bpm-base/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java
| 1 | package cn.iocoder.yudao.module.bpm.service.definition; | 1 | package cn.iocoder.yudao.module.bpm.service.definition; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.bpm.test.BaseDbUnitTest; | ||
| 4 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; | ||
| 5 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; | ||
| 7 | -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; | ||
| 8 | -import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper; | ||
| 9 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 3 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 10 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 11 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; | 5 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; |
| 6 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 12 | import cn.iocoder.yudao.framework.test.core.util.AssertUtils; | 7 | import cn.iocoder.yudao.framework.test.core.util.AssertUtils; |
| 13 | import cn.iocoder.yudao.framework.test.core.util.RandomUtils; | 8 | import cn.iocoder.yudao.framework.test.core.util.RandomUtils; |
| 9 | +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupCreateReqVO; | ||
| 10 | +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; | ||
| 11 | +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO; | ||
| 12 | +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; | ||
| 13 | +import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper; | ||
| 14 | import org.junit.jupiter.api.Assertions; | 14 | import org.junit.jupiter.api.Assertions; |
| 15 | import org.junit.jupiter.api.Test; | 15 | import org.junit.jupiter.api.Test; |
| 16 | import org.springframework.context.annotation.Import; | 16 | import org.springframework.context.annotation.Import; |
| 17 | 17 | ||
| 18 | import javax.annotation.Resource; | 18 | import javax.annotation.Resource; |
| 19 | 19 | ||
| 20 | -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.USER_GROUP_NOT_EXISTS; | ||
| 21 | import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; | 20 | import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; |
| 21 | +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.USER_GROUP_NOT_EXISTS; | ||
| 22 | 22 | ||
| 23 | /** | 23 | /** |
| 24 | * {@link BpmUserGroupServiceImpl} 的单元测试类 | 24 | * {@link BpmUserGroupServiceImpl} 的单元测试类 |
yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
| @@ -215,6 +215,9 @@ public class BpmModelServiceImpl implements BpmModelService { | @@ -215,6 +215,9 @@ public class BpmModelServiceImpl implements BpmModelService { | ||
| 215 | if (oldDefinition == null) { | 215 | if (oldDefinition == null) { |
| 216 | return; | 216 | return; |
| 217 | } | 217 | } |
| 218 | + if(oldDefinition.isSuspended()) { | ||
| 219 | + return; | ||
| 220 | + } | ||
| 218 | processDefinitionService.updateProcessDefinitionState(oldDefinition.getId(), SuspensionState.SUSPENDED.getStateCode()); | 221 | processDefinitionService.updateProcessDefinitionState(oldDefinition.getId(), SuspensionState.SUSPENDED.getStateCode()); |
| 219 | } | 222 | } |
| 220 | 223 |
yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
| @@ -103,6 +103,9 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ | @@ -103,6 +103,9 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ | ||
| 103 | } | 103 | } |
| 104 | // 执行查询 | 104 | // 执行查询 |
| 105 | List<ProcessDefinition> processDefinitions = definitionQuery.list(); | 105 | List<ProcessDefinition> processDefinitions = definitionQuery.list(); |
| 106 | + if (CollUtil.isEmpty(processDefinitions)) { | ||
| 107 | + return Collections.emptyList(); | ||
| 108 | + } | ||
| 106 | 109 | ||
| 107 | // 获得 BpmProcessDefinitionDO Map | 110 | // 获得 BpmProcessDefinitionDO Map |
| 108 | List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( | 111 | List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( |
yudao-module-bpm/yudao-module-bpm-impl-activiti/src/test/java/cn/iocoder/yudao/module/bpm/test/BaseDbUnitTest.java deleted
| 1 | -package cn.iocoder.yudao.module.bpm.test; | ||
| 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-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
| @@ -236,6 +236,9 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ | @@ -236,6 +236,9 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ | ||
| 236 | } | 236 | } |
| 237 | // 执行查询 | 237 | // 执行查询 |
| 238 | List<ProcessDefinition> processDefinitions = definitionQuery.list(); | 238 | List<ProcessDefinition> processDefinitions = definitionQuery.list(); |
| 239 | + if (CollUtil.isEmpty(processDefinitions)) { | ||
| 240 | + return Collections.emptyList(); | ||
| 241 | + } | ||
| 239 | 242 | ||
| 240 | // 获得 BpmProcessDefinitionDO Map | 243 | // 获得 BpmProcessDefinitionDO Map |
| 241 | List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( | 244 | List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( |
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java
| @@ -21,7 +21,6 @@ import cn.iocoder.yudao.module.system.api.permission.RoleApi; | @@ -21,7 +21,6 @@ import cn.iocoder.yudao.module.system.api.permission.RoleApi; | ||
| 21 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | 21 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| 22 | import lombok.extern.slf4j.Slf4j; | 22 | import lombok.extern.slf4j.Slf4j; |
| 23 | import org.flowable.bpmn.model.BpmnModel; | 23 | import org.flowable.bpmn.model.BpmnModel; |
| 24 | -import org.flowable.bpmn.model.FlowElement; | ||
| 25 | import org.flowable.bpmn.model.UserTask; | 24 | import org.flowable.bpmn.model.UserTask; |
| 26 | import org.springframework.context.annotation.Lazy; | 25 | import org.springframework.context.annotation.Lazy; |
| 27 | import org.springframework.stereotype.Service; | 26 | import org.springframework.stereotype.Service; |
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/test/TestDemoController.http
0 → 100644
| 1 | +### 请求 /infra/test-demo/get 接口 => 成功 | ||
| 2 | +GET {{baseUrl}}/infra/test-demo/get?id=106 | ||
| 3 | +Authorization: Bearer {{token}} | ||
| 4 | +tenant-id: {{adminTenentId}} | ||
| 5 | + | ||
| 6 | +### 请求 /infra/test-demo/update 接口 => 成功 | ||
| 7 | +PUT {{baseUrl}}/infra/test-demo/update | ||
| 8 | +Authorization: Bearer {{token}} | ||
| 9 | +tenant-id: {{adminTenentId}} | ||
| 10 | +Content-Type: application/json | ||
| 11 | + | ||
| 12 | + | ||
| 13 | +{ | ||
| 14 | + "id": 106, | ||
| 15 | + "name": "测试", | ||
| 16 | + "status": "0", | ||
| 17 | + "type": 1, | ||
| 18 | + "category": 1 | ||
| 19 | +} |
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/test/TestDemoController.java
| 1 | package cn.iocoder.yudao.module.infra.controller.admin.test; | 1 | package cn.iocoder.yudao.module.infra.controller.admin.test; |
| 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; | ||
| 3 | import cn.iocoder.yudao.module.infra.controller.admin.test.vo.*; | 7 | import cn.iocoder.yudao.module.infra.controller.admin.test.vo.*; |
| 4 | import cn.iocoder.yudao.module.infra.convert.test.TestDemoConvert; | 8 | import cn.iocoder.yudao.module.infra.convert.test.TestDemoConvert; |
| 5 | import cn.iocoder.yudao.module.infra.dal.dataobject.test.TestDemoDO; | 9 | import cn.iocoder.yudao.module.infra.dal.dataobject.test.TestDemoDO; |
| 6 | -import org.springframework.web.bind.annotation.*; | ||
| 7 | -import javax.annotation.Resource; | ||
| 8 | -import org.springframework.validation.annotation.Validated; | 10 | +import cn.iocoder.yudao.module.infra.service.test.TestDemoService; |
| 11 | +import io.swagger.annotations.Api; | ||
| 12 | +import io.swagger.annotations.ApiImplicitParam; | ||
| 13 | +import io.swagger.annotations.ApiOperation; | ||
| 9 | import org.springframework.security.access.prepost.PreAuthorize; | 14 | import org.springframework.security.access.prepost.PreAuthorize; |
| 10 | -import io.swagger.annotations.*; | 15 | +import org.springframework.validation.annotation.Validated; |
| 16 | +import org.springframework.web.bind.annotation.*; | ||
| 11 | 17 | ||
| 12 | -import javax.validation.*; | ||
| 13 | -import javax.servlet.http.*; | ||
| 14 | -import java.util.*; | 18 | +import javax.annotation.Resource; |
| 19 | +import javax.servlet.http.HttpServletResponse; | ||
| 20 | +import javax.validation.Valid; | ||
| 15 | import java.io.IOException; | 21 | import java.io.IOException; |
| 22 | +import java.util.Collection; | ||
| 23 | +import java.util.List; | ||
| 16 | 24 | ||
| 17 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 18 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||
| 19 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 25 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 20 | - | ||
| 21 | -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; | ||
| 22 | - | ||
| 23 | -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | ||
| 24 | -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; | ||
| 25 | - | ||
| 26 | -import cn.iocoder.yudao.module.infra.controller.admin.test.vo.*; | ||
| 27 | -import cn.iocoder.yudao.module.infra.service.test.TestDemoService; | 26 | +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; |
| 28 | 27 | ||
| 29 | @Api(tags = "管理后台 - 字典类型") | 28 | @Api(tags = "管理后台 - 字典类型") |
| 30 | @RestController | 29 | @RestController |
| @@ -37,13 +36,15 @@ public class TestDemoController { | @@ -37,13 +36,15 @@ public class TestDemoController { | ||
| 37 | 36 | ||
| 38 | @PostMapping("/create") | 37 | @PostMapping("/create") |
| 39 | @ApiOperation("创建字典类型") | 38 | @ApiOperation("创建字典类型") |
| 40 | - @PreAuthorize("@ss.hasPermission('infra:test-demo:create')") public CommonResult<Long> createTestDemo(@Valid @RequestBody TestDemoCreateReqVO createReqVO) { | 39 | + @PreAuthorize("@ss.hasPermission('infra:test-demo:create')") |
| 40 | + public CommonResult<Long> createTestDemo(@Valid @RequestBody TestDemoCreateReqVO createReqVO) { | ||
| 41 | return success(testDemoService.createTestDemo(createReqVO)); | 41 | return success(testDemoService.createTestDemo(createReqVO)); |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | @PutMapping("/update") | 44 | @PutMapping("/update") |
| 45 | @ApiOperation("更新字典类型") | 45 | @ApiOperation("更新字典类型") |
| 46 | - @PreAuthorize("@ss.hasPermission('infra:test-demo:update')") public CommonResult<Boolean> updateTestDemo(@Valid @RequestBody TestDemoUpdateReqVO updateReqVO) { | 46 | + @PreAuthorize("@ss.hasPermission('infra:test-demo:update')") |
| 47 | + public CommonResult<Boolean> updateTestDemo(@Valid @RequestBody TestDemoUpdateReqVO updateReqVO) { | ||
| 47 | testDemoService.updateTestDemo(updateReqVO); | 48 | testDemoService.updateTestDemo(updateReqVO); |
| 48 | return success(true); | 49 | return success(true); |
| 49 | } | 50 | } |
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java
| @@ -160,8 +160,9 @@ public class CodegenBuilder { | @@ -160,8 +160,9 @@ public class CodegenBuilder { | ||
| 160 | // 处理 javaField 字段 | 160 | // 处理 javaField 字段 |
| 161 | column.setJavaField(toCamelCase(column.getColumnName())); | 161 | column.setJavaField(toCamelCase(column.getColumnName())); |
| 162 | // 处理 dictType 字段,暂无 | 162 | // 处理 dictType 字段,暂无 |
| 163 | - // 处理 javaType 字段 | ||
| 164 | - String dbType = subBefore(column.getColumnType(), '(', false); | 163 | + // 处理 javaType 字段(兼容无符号类型) |
| 164 | + String dbType = replaceIgnoreCase(subBefore(column.getColumnType(), '(', false), | ||
| 165 | + " UNSIGNED", ""); | ||
| 165 | javaTypeMappings.entrySet().stream() | 166 | javaTypeMappings.entrySet().stream() |
| 166 | .filter(entry -> entry.getValue().contains(dbType)) | 167 | .filter(entry -> entry.getValue().contains(dbType)) |
| 167 | .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); | 168 | .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); |
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
| @@ -217,7 +217,7 @@ public class CodegenEngine { | @@ -217,7 +217,7 @@ public class CodegenEngine { | ||
| 217 | private static String mapperXmlFilePath() { | 217 | private static String mapperXmlFilePath() { |
| 218 | return "yudao-module-${table.moduleName}/" + // 顶级模块 | 218 | return "yudao-module-${table.moduleName}/" + // 顶级模块 |
| 219 | "yudao-module-${table.moduleName}-impl/" + // 子模块 | 219 | "yudao-module-${table.moduleName}-impl/" + // 子模块 |
| 220 | - "src/resources/mapper/${table.businessName}/${table.className}Mapper.xml"; | 220 | + "src/main/java/resources/mapper/${table.businessName}/${table.className}Mapper.xml"; |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | private static String vueTemplatePath(String path) { | 223 | private static String vueTemplatePath(String path) { |
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/test/TestDemoServiceImpl.java
| @@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoUpdateReqV | @@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoUpdateReqV | ||
| 8 | import cn.iocoder.yudao.module.infra.convert.test.TestDemoConvert; | 8 | import cn.iocoder.yudao.module.infra.convert.test.TestDemoConvert; |
| 9 | import cn.iocoder.yudao.module.infra.dal.dataobject.test.TestDemoDO; | 9 | import cn.iocoder.yudao.module.infra.dal.dataobject.test.TestDemoDO; |
| 10 | import cn.iocoder.yudao.module.infra.dal.mysql.test.TestDemoMapper; | 10 | import cn.iocoder.yudao.module.infra.dal.mysql.test.TestDemoMapper; |
| 11 | +import org.springframework.cache.annotation.CacheEvict; | ||
| 12 | +import org.springframework.cache.annotation.Cacheable; | ||
| 11 | import org.springframework.stereotype.Service; | 13 | import org.springframework.stereotype.Service; |
| 12 | import org.springframework.validation.annotation.Validated; | 14 | import org.springframework.validation.annotation.Validated; |
| 13 | 15 | ||
| @@ -40,6 +42,7 @@ public class TestDemoServiceImpl implements TestDemoService { | @@ -40,6 +42,7 @@ public class TestDemoServiceImpl implements TestDemoService { | ||
| 40 | } | 42 | } |
| 41 | 43 | ||
| 42 | @Override | 44 | @Override |
| 45 | + @CacheEvict(value = "test", key = "#updateReqVO.id") | ||
| 43 | public void updateTestDemo(TestDemoUpdateReqVO updateReqVO) { | 46 | public void updateTestDemo(TestDemoUpdateReqVO updateReqVO) { |
| 44 | // 校验存在 | 47 | // 校验存在 |
| 45 | this.validateTestDemoExists(updateReqVO.getId()); | 48 | this.validateTestDemoExists(updateReqVO.getId()); |
| @@ -49,6 +52,7 @@ public class TestDemoServiceImpl implements TestDemoService { | @@ -49,6 +52,7 @@ public class TestDemoServiceImpl implements TestDemoService { | ||
| 49 | } | 52 | } |
| 50 | 53 | ||
| 51 | @Override | 54 | @Override |
| 55 | + @CacheEvict(value = "test", key = "#id") | ||
| 52 | public void deleteTestDemo(Long id) { | 56 | public void deleteTestDemo(Long id) { |
| 53 | // 校验存在 | 57 | // 校验存在 |
| 54 | this.validateTestDemoExists(id); | 58 | this.validateTestDemoExists(id); |
| @@ -63,6 +67,7 @@ public class TestDemoServiceImpl implements TestDemoService { | @@ -63,6 +67,7 @@ public class TestDemoServiceImpl implements TestDemoService { | ||
| 63 | } | 67 | } |
| 64 | 68 | ||
| 65 | @Override | 69 | @Override |
| 70 | + @Cacheable(cacheNames = "test", key = "#id") | ||
| 66 | public TestDemoDO getTestDemo(Long id) { | 71 | public TestDemoDO getTestDemo(Long id) { |
| 67 | return testDemoMapper.selectById(id); | 72 | return testDemoMapper.selectById(id); |
| 68 | } | 73 | } |
yudao-module-infra/yudao-module-infra-impl/src/main/resources/codegen/java/test/serviceTest.vm
| @@ -6,7 +6,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; | @@ -6,7 +6,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; | ||
| 6 | 6 | ||
| 7 | import javax.annotation.Resource; | 7 | import javax.annotation.Resource; |
| 8 | 8 | ||
| 9 | -import ${basePackage}.module.${table.moduleName}.test.BaseDbUnitTest;## 每个项目,默认有一个基础 DB Test 基类 | 9 | +import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest; |
| 10 | 10 | ||
| 11 | import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; | 11 | import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; |
| 12 | import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; | 12 | import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; |
yudao-module-infra/yudao-module-infra-impl/src/main/resources/codegen/vue/views/index.vue.vm
| @@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
| 2 | <div class="app-container"> | 2 | <div class="app-container"> |
| 3 | 3 | ||
| 4 | <!-- 搜索工作栏 --> | 4 | <!-- 搜索工作栏 --> |
| 5 | - <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> | 5 | + <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> |
| 6 | #foreach($column in $columns) | 6 | #foreach($column in $columns) |
| 7 | #if ($column.listOperation) | 7 | #if ($column.listOperation) |
| 8 | #set ($dictType=$column.dictType) | 8 | #set ($dictType=$column.dictType) |
| @@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
| 11 | #set ($comment=$column.columnComment) | 11 | #set ($comment=$column.columnComment) |
| 12 | #if ($column.htmlType == "input") | 12 | #if ($column.htmlType == "input") |
| 13 | <el-form-item label="${comment}" prop="${javaField}"> | 13 | <el-form-item label="${comment}" prop="${javaField}"> |
| 14 | - <el-input v-model="queryParams.${javaField}" placeholder="请输入${comment}" clearable size="small" @keyup.enter.native="handleQuery"/> | 14 | + <el-input v-model="queryParams.${javaField}" placeholder="请输入${comment}" clearable @keyup.enter.native="handleQuery"/> |
| 15 | </el-form-item> | 15 | </el-form-item> |
| 16 | #elseif ($column.htmlType == "select" || $column.htmlType == "radio") | 16 | #elseif ($column.htmlType == "select" || $column.htmlType == "radio") |
| 17 | <el-form-item label="${comment}" prop="${javaField}"> | 17 | <el-form-item label="${comment}" prop="${javaField}"> |
| @@ -27,11 +27,11 @@ | @@ -27,11 +27,11 @@ | ||
| 27 | #elseif($column.htmlType == "datetime") | 27 | #elseif($column.htmlType == "datetime") |
| 28 | #if ($column.listOperationCondition != "BETWEEN")## 非范围 | 28 | #if ($column.listOperationCondition != "BETWEEN")## 非范围 |
| 29 | <el-form-item label="${comment}" prop="${javaField}"> | 29 | <el-form-item label="${comment}" prop="${javaField}"> |
| 30 | - <el-date-picker clearable size="small" v-model="queryParams.${javaField}" type="date" value-format="yyyy-MM-dd" placeholder="选择${comment}" /> | 30 | + <el-date-picker clearable v-model="queryParams.${javaField}" type="date" value-format="yyyy-MM-dd" placeholder="选择${comment}" /> |
| 31 | </el-form-item> | 31 | </el-form-item> |
| 32 | #else## 范围 | 32 | #else## 范围 |
| 33 | <el-form-item label="${comment}"> | 33 | <el-form-item label="${comment}"> |
| 34 | - <el-date-picker v-model="dateRange${AttrName}" size="small" style="width: 240px" value-format="yyyy-MM-dd" | 34 | + <el-date-picker v-model="dateRange${AttrName}" style="width: 240px" value-format="yyyy-MM-dd" |
| 35 | type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" /> | 35 | type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" /> |
| 36 | </el-form-item> | 36 | </el-form-item> |
| 37 | #end | 37 | #end |
| @@ -39,8 +39,8 @@ | @@ -39,8 +39,8 @@ | ||
| 39 | #end | 39 | #end |
| 40 | #end | 40 | #end |
| 41 | <el-form-item> | 41 | <el-form-item> |
| 42 | - <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> | ||
| 43 | - <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> | 42 | + <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button> |
| 43 | + <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button> | ||
| 44 | </el-form-item> | 44 | </el-form-item> |
| 45 | </el-form> | 45 | </el-form> |
| 46 | 46 | ||
| @@ -160,7 +160,7 @@ | @@ -160,7 +160,7 @@ | ||
| 160 | </el-form-item> | 160 | </el-form-item> |
| 161 | #elseif($column.htmlType == "datetime")## 时间框 | 161 | #elseif($column.htmlType == "datetime")## 时间框 |
| 162 | <el-form-item label="${comment}" prop="${javaField}"> | 162 | <el-form-item label="${comment}" prop="${javaField}"> |
| 163 | - <el-date-picker clearable size="small" v-model="form.${javaField}" type="date" value-format="yyyy-MM-dd" placeholder="选择${comment}" /> | 163 | + <el-date-picker clearable v-model="form.${javaField}" type="date" value-format="yyyy-MM-dd" placeholder="选择${comment}" /> |
| 164 | </el-form-item> | 164 | </el-form-item> |
| 165 | #elseif($column.htmlType == "textarea")## 文本框 | 165 | #elseif($column.htmlType == "textarea")## 文本框 |
| 166 | <el-form-item label="${comment}" prop="${javaField}"> | 166 | <el-form-item label="${comment}" prop="${javaField}"> |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceTest.java
| @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.infra.service.config; | @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.infra.service.config; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; | 4 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; |
| 5 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 5 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 6 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 6 | import cn.iocoder.yudao.framework.test.core.util.RandomUtils; | 7 | import cn.iocoder.yudao.framework.test.core.util.RandomUtils; |
| 7 | import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; | 8 | import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigCreateReqVO; |
| 8 | import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; | 9 | import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigExportReqVO; |
| @@ -12,7 +13,6 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; | @@ -12,7 +13,6 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; | ||
| 12 | import cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigMapper; | 13 | import cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigMapper; |
| 13 | import cn.iocoder.yudao.module.infra.enums.config.ConfigTypeEnum; | 14 | import cn.iocoder.yudao.module.infra.enums.config.ConfigTypeEnum; |
| 14 | import cn.iocoder.yudao.module.infra.mq.producer.config.ConfigProducer; | 15 | import cn.iocoder.yudao.module.infra.mq.producer.config.ConfigProducer; |
| 15 | -import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; | ||
| 16 | import org.junit.jupiter.api.Assertions; | 16 | import org.junit.jupiter.api.Assertions; |
| 17 | import org.junit.jupiter.api.Test; | 17 | import org.junit.jupiter.api.Test; |
| 18 | import org.springframework.boot.test.mock.mockito.MockBean; | 18 | import org.springframework.boot.test.mock.mockito.MockBean; |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImplTest.java
| @@ -7,13 +7,13 @@ import cn.iocoder.yudao.framework.file.core.client.FileClientConfig; | @@ -7,13 +7,13 @@ import cn.iocoder.yudao.framework.file.core.client.FileClientConfig; | ||
| 7 | import cn.iocoder.yudao.framework.file.core.client.FileClientFactory; | 7 | import cn.iocoder.yudao.framework.file.core.client.FileClientFactory; |
| 8 | import cn.iocoder.yudao.framework.file.core.client.local.LocalFileClientConfig; | 8 | import cn.iocoder.yudao.framework.file.core.client.local.LocalFileClientConfig; |
| 9 | import cn.iocoder.yudao.framework.file.core.enums.FileStorageEnum; | 9 | import cn.iocoder.yudao.framework.file.core.enums.FileStorageEnum; |
| 10 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 10 | import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigCreateReqVO; | 11 | import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigCreateReqVO; |
| 11 | import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; | 12 | import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; |
| 12 | import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigUpdateReqVO; | 13 | import cn.iocoder.yudao.module.infra.controller.admin.file.vo.config.FileConfigUpdateReqVO; |
| 13 | import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileConfigDO; | 14 | import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileConfigDO; |
| 14 | import cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper; | 15 | import cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper; |
| 15 | import cn.iocoder.yudao.module.infra.mq.producer.file.FileConfigProducer; | 16 | import cn.iocoder.yudao.module.infra.mq.producer.file.FileConfigProducer; |
| 16 | -import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; | ||
| 17 | import lombok.Data; | 17 | import lombok.Data; |
| 18 | import org.junit.jupiter.api.Test; | 18 | import org.junit.jupiter.api.Test; |
| 19 | import org.springframework.boot.test.mock.mockito.MockBean; | 19 | import org.springframework.boot.test.mock.mockito.MockBean; |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceTest.java
| @@ -4,11 +4,11 @@ import cn.hutool.core.io.resource.ResourceUtil; | @@ -4,11 +4,11 @@ import cn.hutool.core.io.resource.ResourceUtil; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 5 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 6 | import cn.iocoder.yudao.framework.file.core.client.FileClient; | 6 | import cn.iocoder.yudao.framework.file.core.client.FileClient; |
| 7 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 7 | import cn.iocoder.yudao.framework.test.core.util.AssertUtils; | 8 | import cn.iocoder.yudao.framework.test.core.util.AssertUtils; |
| 8 | import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO; | 9 | import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePageReqVO; |
| 9 | import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; | 10 | import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; |
| 10 | import cn.iocoder.yudao.module.infra.dal.mysql.file.FileMapper; | 11 | import cn.iocoder.yudao.module.infra.dal.mysql.file.FileMapper; |
| 11 | -import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; | ||
| 12 | import org.junit.jupiter.api.Test; | 12 | import org.junit.jupiter.api.Test; |
| 13 | import org.springframework.boot.test.mock.mockito.MockBean; | 13 | import org.springframework.boot.test.mock.mockito.MockBean; |
| 14 | import org.springframework.context.annotation.Import; | 14 | import org.springframework.context.annotation.Import; |
| @@ -18,7 +18,7 @@ import javax.annotation.Resource; | @@ -18,7 +18,7 @@ import javax.annotation.Resource; | ||
| 18 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; | 18 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; |
| 19 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | 19 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; |
| 20 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; | 20 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; |
| 21 | -import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; | 21 | +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; |
| 22 | import static org.junit.jupiter.api.Assertions.*; | 22 | import static org.junit.jupiter.api.Assertions.*; |
| 23 | import static org.mockito.ArgumentMatchers.same; | 23 | import static org.mockito.ArgumentMatchers.same; |
| 24 | import static org.mockito.Mockito.*; | 24 | import static org.mockito.Mockito.*; |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceTest.java
| 1 | package cn.iocoder.yudao.module.infra.service.job; | 1 | package cn.iocoder.yudao.module.infra.service.job; |
| 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.randomLongId; | ||
| 6 | -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | ||
| 7 | -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; | ||
| 8 | -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; | ||
| 9 | -import static org.junit.jupiter.api.Assertions.assertEquals; | ||
| 10 | -import static org.junit.jupiter.api.Assertions.assertNotNull; | ||
| 11 | - | ||
| 12 | -import java.util.ArrayList; | ||
| 13 | -import java.util.List; | ||
| 14 | - | ||
| 15 | -import javax.annotation.Resource; | ||
| 16 | - | ||
| 17 | -import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; | ||
| 18 | -import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; | ||
| 19 | -import org.junit.jupiter.api.Test; | ||
| 20 | -import org.springframework.context.annotation.Import; | ||
| 21 | - | ||
| 22 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | ||
| 5 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 23 | import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; | 6 | import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; |
| 24 | import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; | 7 | import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; |
| 8 | +import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; | ||
| 25 | import cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper; | 9 | import cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper; |
| 26 | import cn.iocoder.yudao.module.infra.enums.job.JobLogStatusEnum; | 10 | import cn.iocoder.yudao.module.infra.enums.job.JobLogStatusEnum; |
| 27 | -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 11 | +import org.junit.jupiter.api.Test; |
| 12 | +import org.springframework.context.annotation.Import; | ||
| 13 | + | ||
| 14 | +import javax.annotation.Resource; | ||
| 15 | +import java.util.ArrayList; | ||
| 16 | +import java.util.List; | ||
| 17 | + | ||
| 18 | +import static cn.hutool.core.util.RandomUtil.randomEle; | ||
| 19 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime; | ||
| 20 | +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | ||
| 21 | +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; | ||
| 22 | +import static org.junit.jupiter.api.Assertions.assertEquals; | ||
| 23 | +import static org.junit.jupiter.api.Assertions.assertNotNull; | ||
| 28 | 24 | ||
| 29 | @Import(JobLogServiceImpl.class) | 25 | @Import(JobLogServiceImpl.class) |
| 30 | public class JobLogServiceTest extends BaseDbUnitTest { | 26 | public class JobLogServiceTest extends BaseDbUnitTest { |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobServiceTest.java
| 1 | package cn.iocoder.yudao.module.infra.service.job; | 1 | package cn.iocoder.yudao.module.infra.service.job; |
| 2 | 2 | ||
| 3 | -import static cn.hutool.core.util.RandomUtil.randomEle; | ||
| 4 | -import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; | ||
| 5 | -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | ||
| 6 | -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | ||
| 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 org.junit.jupiter.api.Assertions.assertEquals; | ||
| 10 | -import static org.junit.jupiter.api.Assertions.assertNotNull; | ||
| 11 | -import static org.junit.jupiter.api.Assertions.assertNull; | ||
| 12 | -import static org.mockito.ArgumentMatchers.eq; | ||
| 13 | -import static org.mockito.Mockito.times; | ||
| 14 | -import static org.mockito.Mockito.verify; | ||
| 15 | - | ||
| 16 | -import java.util.ArrayList; | ||
| 17 | -import java.util.List; | ||
| 18 | - | ||
| 19 | -import javax.annotation.Resource; | ||
| 20 | - | 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | ||
| 5 | +import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; | ||
| 6 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 21 | import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobCreateReqVO; | 7 | import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobCreateReqVO; |
| 8 | +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobExportReqVO; | ||
| 9 | +import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobPageReqVO; | ||
| 22 | import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; | 10 | import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; |
| 23 | import cn.iocoder.yudao.module.infra.convert.job.JobConvert; | 11 | import cn.iocoder.yudao.module.infra.convert.job.JobConvert; |
| 24 | import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO; | 12 | import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO; |
| 25 | -import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; | 13 | +import cn.iocoder.yudao.module.infra.dal.mysql.job.JobMapper; |
| 14 | +import cn.iocoder.yudao.module.infra.enums.job.JobStatusEnum; | ||
| 26 | import org.junit.jupiter.api.Test; | 15 | import org.junit.jupiter.api.Test; |
| 27 | import org.quartz.SchedulerException; | 16 | import org.quartz.SchedulerException; |
| 28 | import org.springframework.boot.test.mock.mockito.MockBean; | 17 | import org.springframework.boot.test.mock.mockito.MockBean; |
| 29 | import org.springframework.context.annotation.Import; | 18 | import org.springframework.context.annotation.Import; |
| 30 | 19 | ||
| 31 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 32 | -import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; | ||
| 33 | -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobExportReqVO; | ||
| 34 | -import cn.iocoder.yudao.module.infra.controller.admin.job.vo.job.JobPageReqVO; | ||
| 35 | -import cn.iocoder.yudao.module.infra.dal.mysql.job.JobMapper; | ||
| 36 | -import cn.iocoder.yudao.module.infra.enums.job.JobStatusEnum; | ||
| 37 | -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 20 | +import javax.annotation.Resource; |
| 21 | +import java.util.ArrayList; | ||
| 22 | +import java.util.List; | ||
| 23 | + | ||
| 24 | +import static cn.hutool.core.util.RandomUtil.randomEle; | ||
| 25 | +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | ||
| 26 | +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | ||
| 27 | +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | ||
| 28 | +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; | ||
| 29 | +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; | ||
| 30 | +import static org.junit.jupiter.api.Assertions.*; | ||
| 31 | +import static org.mockito.ArgumentMatchers.eq; | ||
| 32 | +import static org.mockito.Mockito.times; | ||
| 33 | +import static org.mockito.Mockito.verify; | ||
| 38 | 34 | ||
| 39 | @Import(JobServiceImpl.class) | 35 | @Import(JobServiceImpl.class) |
| 40 | public class JobServiceTest extends BaseDbUnitTest { | 36 | public class JobServiceTest extends BaseDbUnitTest { |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImplTest.java
| @@ -6,12 +6,12 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | @@ -6,12 +6,12 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||
| 6 | import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; | 6 | import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; |
| 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 8 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 8 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 9 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 9 | import cn.iocoder.yudao.framework.test.core.util.RandomUtils; | 10 | import cn.iocoder.yudao.framework.test.core.util.RandomUtils; |
| 10 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; | 11 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; |
| 11 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; | 12 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; |
| 12 | import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; | 13 | import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; |
| 13 | import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiAccessLogMapper; | 14 | import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiAccessLogMapper; |
| 14 | -import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; | ||
| 15 | import org.junit.jupiter.api.Test; | 15 | import org.junit.jupiter.api.Test; |
| 16 | import org.springframework.context.annotation.Import; | 16 | import org.springframework.context.annotation.Import; |
| 17 | 17 |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImplTest.java
| @@ -5,13 +5,13 @@ import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDT | @@ -5,13 +5,13 @@ import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiErrorLogCreateReqDT | ||
| 5 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | 5 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 7 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 8 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 8 | import cn.iocoder.yudao.framework.test.core.util.RandomUtils; | 9 | import cn.iocoder.yudao.framework.test.core.util.RandomUtils; |
| 9 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; | 10 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; |
| 10 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; | 11 | import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; |
| 11 | import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; | 12 | import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; |
| 12 | import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper; | 13 | import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper; |
| 13 | import cn.iocoder.yudao.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; | 14 | import cn.iocoder.yudao.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; |
| 14 | -import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; | ||
| 15 | import org.junit.jupiter.api.Assertions; | 15 | import org.junit.jupiter.api.Assertions; |
| 16 | import org.junit.jupiter.api.Test; | 16 | import org.junit.jupiter.api.Test; |
| 17 | import org.springframework.context.annotation.Import; | 17 | import org.springframework.context.annotation.Import; |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/service/test/TestDemoServiceImplTest.java
| @@ -3,13 +3,13 @@ package cn.iocoder.yudao.module.infra.service.test; | @@ -3,13 +3,13 @@ package cn.iocoder.yudao.module.infra.service.test; | ||
| 3 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 3 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; | 5 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; |
| 6 | -import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoExportReqVO; | ||
| 7 | -import cn.iocoder.yudao.module.infra.dal.dataobject.test.TestDemoDO; | 6 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 8 | import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoCreateReqVO; | 7 | import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoCreateReqVO; |
| 8 | +import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoExportReqVO; | ||
| 9 | import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoPageReqVO; | 9 | import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoPageReqVO; |
| 10 | import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoUpdateReqVO; | 10 | import cn.iocoder.yudao.module.infra.controller.admin.test.vo.TestDemoUpdateReqVO; |
| 11 | +import cn.iocoder.yudao.module.infra.dal.dataobject.test.TestDemoDO; | ||
| 11 | import cn.iocoder.yudao.module.infra.dal.mysql.test.TestDemoMapper; | 12 | import cn.iocoder.yudao.module.infra.dal.mysql.test.TestDemoMapper; |
| 12 | -import cn.iocoder.yudao.module.infra.test.BaseDbUnitTest; | ||
| 13 | import org.junit.jupiter.api.Test; | 13 | import org.junit.jupiter.api.Test; |
| 14 | import org.springframework.context.annotation.Import; | 14 | import org.springframework.context.annotation.Import; |
| 15 | 15 |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/BaseDbUnitTest.java deleted
| 1 | -package cn.iocoder.yudao.module.infra.test; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; | ||
| 4 | -import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; | ||
| 5 | -import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration; | ||
| 6 | -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; | ||
| 7 | -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; | ||
| 8 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; | ||
| 9 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; | ||
| 10 | -import org.springframework.boot.test.context.SpringBootTest; | ||
| 11 | -import org.springframework.context.annotation.Import; | ||
| 12 | -import org.springframework.test.context.ActiveProfiles; | ||
| 13 | -import org.springframework.test.context.jdbc.Sql; | ||
| 14 | - | ||
| 15 | -/** | ||
| 16 | - * 依赖内存 DB 的单元测试 | ||
| 17 | - * | ||
| 18 | - * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 | ||
| 19 | - * | ||
| 20 | - * @author 芋道源码 | ||
| 21 | - */ | ||
| 22 | -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) | ||
| 23 | -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 | ||
| 24 | -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB | ||
| 25 | -public class BaseDbUnitTest { | ||
| 26 | - | ||
| 27 | - @Import({ | ||
| 28 | - // DB 配置类 | ||
| 29 | - YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 | ||
| 30 | - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 | ||
| 31 | - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 | ||
| 32 | - DruidDataSourceAutoConfigure.class, // Druid 自动配置类 | ||
| 33 | - SqlInitializationTestConfiguration.class, // SQL 初始化 | ||
| 34 | - // MyBatis 配置类 | ||
| 35 | - YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 | ||
| 36 | - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 | ||
| 37 | - }) | ||
| 38 | - public static class Application { | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | -} |
yudao-module-infra/yudao-module-infra-impl/src/test/java/cn/iocoder/yudao/module/infra/test/QuartzTestConfiguration.java deleted
| 1 | -package cn.iocoder.yudao.module.infra.test; | ||
| 2 | - | ||
| 3 | -import org.mockito.Mockito; | ||
| 4 | -import org.quartz.Scheduler; | ||
| 5 | -import org.springframework.context.annotation.Bean; | ||
| 6 | -import org.springframework.context.annotation.Configuration; | ||
| 7 | - | ||
| 8 | -@Configuration | ||
| 9 | -public class QuartzTestConfiguration { | ||
| 10 | - | ||
| 11 | - @Bean | ||
| 12 | - public Scheduler scheduler() { | ||
| 13 | - return Mockito.mock(Scheduler.class); | ||
| 14 | - } | ||
| 15 | - | ||
| 16 | -} |
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java
| @@ -33,6 +33,6 @@ public interface AuthConvert { | @@ -33,6 +33,6 @@ public interface AuthConvert { | ||
| 33 | 33 | ||
| 34 | SmsCodeSendReqDTO convert(AppAuthSendSmsReqVO reqVO); | 34 | SmsCodeSendReqDTO convert(AppAuthSendSmsReqVO reqVO); |
| 35 | SmsCodeUseReqDTO convert(AppAuthResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp); | 35 | SmsCodeUseReqDTO convert(AppAuthResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp); |
| 36 | - SmsCodeUseReqDTO convert(AppAuthSmsLoginReqVO reqVO, Integer scene, String userIp); | 36 | + SmsCodeUseReqDTO convert(AppAuthSmsLoginReqVO reqVO, Integer scene, String usedIp); |
| 37 | 37 | ||
| 38 | } | 38 | } |
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java
| @@ -87,7 +87,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { | @@ -87,7 +87,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { | ||
| 87 | LoginUser loginUser = this.login0(reqVO.getMobile(), reqVO.getPassword()); | 87 | LoginUser loginUser = this.login0(reqVO.getMobile(), reqVO.getPassword()); |
| 88 | 88 | ||
| 89 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 | 89 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 |
| 90 | - return userSessionApi.createUserSession(loginUser, userIp, userAgent); | 90 | + return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_USERNAME, userIp, userAgent); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | @Override | 93 | @Override |
| @@ -101,11 +101,10 @@ public class MemberAuthServiceImpl implements MemberAuthService { | @@ -101,11 +101,10 @@ public class MemberAuthServiceImpl implements MemberAuthService { | ||
| 101 | Assert.notNull(user, "获取用户失败,结果为空"); | 101 | Assert.notNull(user, "获取用户失败,结果为空"); |
| 102 | 102 | ||
| 103 | // 执行登陆 | 103 | // 执行登陆 |
| 104 | - this.createLoginLog(user.getMobile(), LoginLogTypeEnum.LOGIN_SMS, LoginResultEnum.SUCCESS); | ||
| 105 | LoginUser loginUser = AuthConvert.INSTANCE.convert(user); | 104 | LoginUser loginUser = AuthConvert.INSTANCE.convert(user); |
| 106 | 105 | ||
| 107 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 | 106 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 |
| 108 | - return userSessionApi.createUserSession(loginUser, userIp, userAgent); | 107 | + return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_SMS, userIp, userAgent); |
| 109 | } | 108 | } |
| 110 | 109 | ||
| 111 | @Override | 110 | @Override |
| @@ -122,7 +121,6 @@ public class MemberAuthServiceImpl implements MemberAuthService { | @@ -122,7 +121,6 @@ public class MemberAuthServiceImpl implements MemberAuthService { | ||
| 122 | if (user == null) { | 121 | if (user == null) { |
| 123 | throw exception(USER_NOT_EXISTS); | 122 | throw exception(USER_NOT_EXISTS); |
| 124 | } | 123 | } |
| 125 | - this.createLoginLog(user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL, LoginResultEnum.SUCCESS); | ||
| 126 | 124 | ||
| 127 | // 创建 LoginUser 对象 | 125 | // 创建 LoginUser 对象 |
| 128 | LoginUser loginUser = AuthConvert.INSTANCE.convert(user); | 126 | LoginUser loginUser = AuthConvert.INSTANCE.convert(user); |
| @@ -131,7 +129,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { | @@ -131,7 +129,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { | ||
| 131 | socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); | 129 | socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); |
| 132 | 130 | ||
| 133 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 | 131 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 |
| 134 | - return userSessionApi.createUserSession(loginUser, userIp, userAgent); | 132 | + return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_SOCIAL, userIp, userAgent); |
| 135 | } | 133 | } |
| 136 | 134 | ||
| 137 | @Override | 135 | @Override |
| @@ -150,6 +148,13 @@ public class MemberAuthServiceImpl implements MemberAuthService { | @@ -150,6 +148,13 @@ public class MemberAuthServiceImpl implements MemberAuthService { | ||
| 150 | return sessionId; | 148 | return sessionId; |
| 151 | } | 149 | } |
| 152 | 150 | ||
| 151 | + private String createUserSessionAfterLoginSuccess(LoginUser loginUser, LoginLogTypeEnum logType, String userIp, String userAgent) { | ||
| 152 | + // 插入登陆日志 | ||
| 153 | + createLoginLog(loginUser.getUsername(), logType, LoginResultEnum.SUCCESS); | ||
| 154 | + // 缓存登录用户到 Redis 中,返回 sessionId 编号 | ||
| 155 | + return userSessionApi.createUserSession(loginUser, userIp, userAgent); | ||
| 156 | + } | ||
| 157 | + | ||
| 153 | @Override | 158 | @Override |
| 154 | public void socialBind(Long userId, AppAuthSocialBindReqVO reqVO) { | 159 | public void socialBind(Long userId, AppAuthSocialBindReqVO reqVO) { |
| 155 | // 绑定社交用户(新增) | 160 | // 绑定社交用户(新增) |
| @@ -186,9 +191,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { | @@ -186,9 +191,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { | ||
| 186 | this.createLoginLog(username, logType, LoginResultEnum.UNKNOWN_ERROR); | 191 | this.createLoginLog(username, logType, LoginResultEnum.UNKNOWN_ERROR); |
| 187 | throw exception(AUTH_LOGIN_FAIL_UNKNOWN); | 192 | throw exception(AUTH_LOGIN_FAIL_UNKNOWN); |
| 188 | } | 193 | } |
| 189 | - // 登录成功的日志 | ||
| 190 | Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); | 194 | Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); |
| 191 | - this.createLoginLog(username, logType, LoginResultEnum.SUCCESS); | ||
| 192 | return (LoginUser) authentication.getPrincipal(); | 195 | return (LoginUser) authentication.getPrincipal(); |
| 193 | } | 196 | } |
| 194 | 197 |
yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java
| @@ -3,12 +3,12 @@ package cn.iocoder.yudao.module.member.service.auth; | @@ -3,12 +3,12 @@ package cn.iocoder.yudao.module.member.service.auth; | ||
| 3 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 3 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 4 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; | 4 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; |
| 5 | import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; | 5 | import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; |
| 6 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest; | ||
| 6 | import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthResetPasswordReqVO; | 7 | import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthResetPasswordReqVO; |
| 7 | import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthUpdatePasswordReqVO; | 8 | import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthUpdatePasswordReqVO; |
| 8 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | 9 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; |
| 9 | import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; | 10 | import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; |
| 10 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; | 11 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; |
| 11 | -import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; | ||
| 12 | import cn.iocoder.yudao.module.system.api.auth.UserSessionApi; | 12 | import cn.iocoder.yudao.module.system.api.auth.UserSessionApi; |
| 13 | import cn.iocoder.yudao.module.system.api.logger.LoginLogApi; | 13 | import cn.iocoder.yudao.module.system.api.logger.LoginLogApi; |
| 14 | import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; | 14 | import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; |
yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java
| @@ -4,12 +4,12 @@ import cn.hutool.core.util.RandomUtil; | @@ -4,12 +4,12 @@ import cn.hutool.core.util.RandomUtil; | ||
| 4 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 4 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 5 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; | 5 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; |
| 6 | import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; | 6 | import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; |
| 7 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest; | ||
| 7 | import cn.iocoder.yudao.module.infra.api.file.FileApi; | 8 | import cn.iocoder.yudao.module.infra.api.file.FileApi; |
| 8 | import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; | 9 | import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; |
| 9 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | 10 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; |
| 10 | import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; | 11 | import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; |
| 11 | import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl; | 12 | import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl; |
| 12 | -import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; | ||
| 13 | import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; | 13 | import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; |
| 14 | import org.junit.jupiter.api.Test; | 14 | import org.junit.jupiter.api.Test; |
| 15 | import org.springframework.boot.test.mock.mockito.MockBean; | 15 | import org.springframework.boot.test.mock.mockito.MockBean; |
| @@ -25,7 +25,8 @@ import static cn.hutool.core.util.RandomUtil.*; | @@ -25,7 +25,8 @@ import static cn.hutool.core.util.RandomUtil.*; | ||
| 25 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | 25 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| 26 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; | 26 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; |
| 27 | import static org.junit.jupiter.api.Assertions.assertEquals; | 27 | import static org.junit.jupiter.api.Assertions.assertEquals; |
| 28 | -import static org.mockito.Mockito.*; | 28 | +import static org.mockito.Mockito.eq; |
| 29 | +import static org.mockito.Mockito.when; | ||
| 29 | 30 | ||
| 30 | // TODO @芋艿:单测的 review,等逻辑都达成一致后 | 31 | // TODO @芋艿:单测的 review,等逻辑都达成一致后 |
| 31 | /** | 32 | /** |
yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbAndRedisUnitTest.java deleted
| 1 | -package cn.iocoder.yudao.module.member.test; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; | ||
| 4 | -import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; | ||
| 5 | -import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; | ||
| 6 | -import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration; | ||
| 7 | -import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration; | ||
| 8 | -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; | ||
| 9 | -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; | ||
| 10 | -import org.redisson.spring.starter.RedissonAutoConfiguration; | ||
| 11 | -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; | ||
| 12 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; | ||
| 13 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; | ||
| 14 | -import org.springframework.boot.test.context.SpringBootTest; | ||
| 15 | -import org.springframework.context.annotation.Import; | ||
| 16 | -import org.springframework.test.context.ActiveProfiles; | ||
| 17 | -import org.springframework.test.context.jdbc.Sql; | ||
| 18 | - | ||
| 19 | -/** | ||
| 20 | - * 依赖内存 DB + Redis 的单元测试 | ||
| 21 | - * | ||
| 22 | - * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis | ||
| 23 | - * | ||
| 24 | - * @author 芋道源码 | ||
| 25 | - */ | ||
| 26 | -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) | ||
| 27 | -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 | ||
| 28 | -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB | ||
| 29 | -public class BaseDbAndRedisUnitTest { | ||
| 30 | - | ||
| 31 | - @Import({ | ||
| 32 | - // DB 配置类 | ||
| 33 | - YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 | ||
| 34 | - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 | ||
| 35 | - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 | ||
| 36 | - DruidDataSourceAutoConfigure.class, // Druid 自动配置类 | ||
| 37 | - SqlInitializationTestConfiguration.class, // SQL 初始化 | ||
| 38 | - // MyBatis 配置类 | ||
| 39 | - YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 | ||
| 40 | - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 | ||
| 41 | - | ||
| 42 | - // Redis 配置类 | ||
| 43 | - RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer | ||
| 44 | - RedisAutoConfiguration.class, // Spring Redis 自动配置类 | ||
| 45 | - YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 | ||
| 46 | - RedissonAutoConfiguration.class, // Redisson 自动高配置类 | ||
| 47 | - }) | ||
| 48 | - public static class Application { | ||
| 49 | - } | ||
| 50 | - | ||
| 51 | -} |
yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/test/BaseDbUnitTest.java deleted
| 1 | -package cn.iocoder.yudao.module.member.test; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; | ||
| 4 | -import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; | ||
| 5 | -import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration; | ||
| 6 | -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; | ||
| 7 | -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; | ||
| 8 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; | ||
| 9 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; | ||
| 10 | -import org.springframework.boot.test.context.SpringBootTest; | ||
| 11 | -import org.springframework.context.annotation.Import; | ||
| 12 | -import org.springframework.test.context.ActiveProfiles; | ||
| 13 | -import org.springframework.test.context.jdbc.Sql; | ||
| 14 | - | ||
| 15 | -/** | ||
| 16 | - * 依赖内存 DB 的单元测试 | ||
| 17 | - * | ||
| 18 | - * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 | ||
| 19 | - * | ||
| 20 | - * @author 芋道源码 | ||
| 21 | - */ | ||
| 22 | -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) | ||
| 23 | -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 | ||
| 24 | -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB | ||
| 25 | -public class BaseDbUnitTest { | ||
| 26 | - | ||
| 27 | - @Import({ | ||
| 28 | - // DB 配置类 | ||
| 29 | - YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 | ||
| 30 | - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 | ||
| 31 | - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 | ||
| 32 | - DruidDataSourceAutoConfigure.class, // Druid 自动配置类 | ||
| 33 | - SqlInitializationTestConfiguration.class, // SQL 初始化 | ||
| 34 | - // MyBatis 配置类 | ||
| 35 | - YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 | ||
| 36 | - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 | ||
| 37 | - }) | ||
| 38 | - public static class Application { | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | -} |
yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayAppServiceTest.java
| 1 | package cn.iocoder.yudao.module.pay.service.merchant; | 1 | package cn.iocoder.yudao.module.pay.service.merchant; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.util.RandomUtil; | 3 | import cn.hutool.core.util.RandomUtil; |
| 4 | -import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; | 4 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 6 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 5 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; | 7 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; |
| 6 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; | 8 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; |
| 7 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; | 9 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; |
| @@ -10,9 +12,6 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; | @@ -10,9 +12,6 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayAppDO; | ||
| 10 | import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; | 12 | import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; |
| 11 | import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayAppMapper; | 13 | import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayAppMapper; |
| 12 | import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayMerchantMapper; | 14 | import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayMerchantMapper; |
| 13 | -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 14 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 15 | -import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; | ||
| 16 | import org.junit.jupiter.api.Test; | 15 | import org.junit.jupiter.api.Test; |
| 17 | import org.mockito.Mockito; | 16 | import org.mockito.Mockito; |
| 18 | import org.springframework.boot.test.mock.mockito.MockBean; | 17 | import org.springframework.boot.test.mock.mockito.MockBean; |
| @@ -28,7 +27,7 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq | @@ -28,7 +27,7 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq | ||
| 28 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | 27 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; |
| 29 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; | 28 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; |
| 30 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | 29 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| 31 | -import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; | 30 | +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_APP_NOT_FOUND; |
| 32 | import static org.junit.jupiter.api.Assertions.*; | 31 | import static org.junit.jupiter.api.Assertions.*; |
| 33 | 32 | ||
| 34 | @Import(PayAppServiceImpl.class) | 33 | @Import(PayAppServiceImpl.class) |
yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayChannelServiceTest.java
| @@ -6,13 +6,13 @@ import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; | @@ -6,13 +6,13 @@ import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; | ||
| 6 | import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; | 6 | import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; |
| 7 | import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig; | 7 | import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig; |
| 8 | import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; | 8 | import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; |
| 9 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 9 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; | 10 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; |
| 10 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; | 11 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; |
| 11 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; | 12 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; |
| 12 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; | 13 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; |
| 13 | import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; | 14 | import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; |
| 14 | import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayChannelMapper; | 15 | import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayChannelMapper; |
| 15 | -import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; | ||
| 16 | import com.alibaba.fastjson.JSON; | 16 | import com.alibaba.fastjson.JSON; |
| 17 | import org.junit.jupiter.api.Test; | 17 | import org.junit.jupiter.api.Test; |
| 18 | import org.springframework.boot.test.mock.mockito.MockBean; | 18 | import org.springframework.boot.test.mock.mockito.MockBean; |
yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/merchant/PayMerchantServiceTest.java
| 1 | package cn.iocoder.yudao.module.pay.service.merchant; | 1 | package cn.iocoder.yudao.module.pay.service.merchant; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.util.RandomUtil; | 3 | import cn.hutool.core.util.RandomUtil; |
| 4 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 6 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 4 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; | 7 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; |
| 5 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; | 8 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; |
| 6 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; | 9 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; |
| 7 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; | 10 | import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; |
| 8 | import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; | 11 | import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayMerchantDO; |
| 9 | import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayMerchantMapper; | 12 | import cn.iocoder.yudao.module.pay.dal.mysql.merchant.PayMerchantMapper; |
| 10 | -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 11 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 12 | -import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; | ||
| 13 | import org.junit.jupiter.api.Test; | 13 | import org.junit.jupiter.api.Test; |
| 14 | import org.springframework.context.annotation.Import; | 14 | import org.springframework.context.annotation.Import; |
| 15 | 15 | ||
| @@ -22,7 +22,7 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq | @@ -22,7 +22,7 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEq | ||
| 22 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | 22 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; |
| 23 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; | 23 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; |
| 24 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | 24 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| 25 | -import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; | 25 | +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_MERCHANT_NOT_EXISTS; |
| 26 | import static org.junit.jupiter.api.Assertions.*; | 26 | import static org.junit.jupiter.api.Assertions.*; |
| 27 | 27 | ||
| 28 | /** | 28 | /** |
yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java
| @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils; | @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils; | ||
| 7 | import cn.iocoder.yudao.framework.pay.config.PayProperties; | 7 | import cn.iocoder.yudao.framework.pay.config.PayProperties; |
| 8 | import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; | 8 | import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; |
| 9 | import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; | 9 | import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; |
| 10 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 10 | import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExportReqVO; | 11 | import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderExportReqVO; |
| 11 | import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderPageReqVO; | 12 | import cn.iocoder.yudao.module.pay.controller.admin.order.vo.PayOrderPageReqVO; |
| 12 | import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; | 13 | import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; |
| @@ -17,7 +18,6 @@ import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum; | @@ -17,7 +18,6 @@ import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum; | ||
| 17 | import cn.iocoder.yudao.module.pay.service.merchant.PayAppService; | 18 | import cn.iocoder.yudao.module.pay.service.merchant.PayAppService; |
| 18 | import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; | 19 | import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; |
| 19 | import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; | 20 | import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; |
| 20 | -import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; | ||
| 21 | import org.junit.jupiter.api.Test; | 21 | import org.junit.jupiter.api.Test; |
| 22 | import org.springframework.boot.test.mock.mockito.MockBean; | 22 | import org.springframework.boot.test.mock.mockito.MockBean; |
| 23 | import org.springframework.context.annotation.Import; | 23 | import org.springframework.context.annotation.Import; |
yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/package-info.java deleted
| 1 | -package cn.iocoder.yudao.module.pay.service; |
yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java
| @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; | 4 | import cn.iocoder.yudao.framework.common.util.date.DateUtils; |
| 5 | import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; | 5 | import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; |
| 6 | import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; | 6 | import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; |
| 7 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 7 | import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; | 8 | import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; |
| 8 | import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; | 9 | import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; |
| 9 | import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; | 10 | import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; |
| @@ -16,7 +17,6 @@ import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; | @@ -16,7 +17,6 @@ import cn.iocoder.yudao.module.pay.service.merchant.PayChannelService; | ||
| 16 | import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; | 17 | import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; |
| 17 | import cn.iocoder.yudao.module.pay.service.order.PayOrderExtensionService; | 18 | import cn.iocoder.yudao.module.pay.service.order.PayOrderExtensionService; |
| 18 | import cn.iocoder.yudao.module.pay.service.order.PayOrderService; | 19 | import cn.iocoder.yudao.module.pay.service.order.PayOrderService; |
| 19 | -import cn.iocoder.yudao.module.pay.test.BaseDbUnitTest; | ||
| 20 | import org.junit.jupiter.api.Test; | 20 | import org.junit.jupiter.api.Test; |
| 21 | import org.springframework.boot.test.mock.mockito.MockBean; | 21 | import org.springframework.boot.test.mock.mockito.MockBean; |
| 22 | import org.springframework.context.annotation.Import; | 22 | import org.springframework.context.annotation.Import; |
yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseDbAndRedisUnitTest.java deleted
| 1 | -package cn.iocoder.yudao.module.pay.test; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; | ||
| 4 | -import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; | ||
| 5 | -import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; | ||
| 6 | -import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration; | ||
| 7 | -import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration; | ||
| 8 | -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; | ||
| 9 | -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; | ||
| 10 | -import org.redisson.spring.starter.RedissonAutoConfiguration; | ||
| 11 | -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; | ||
| 12 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; | ||
| 13 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; | ||
| 14 | -import org.springframework.boot.test.context.SpringBootTest; | ||
| 15 | -import org.springframework.context.annotation.Import; | ||
| 16 | -import org.springframework.test.context.ActiveProfiles; | ||
| 17 | -import org.springframework.test.context.jdbc.Sql; | ||
| 18 | - | ||
| 19 | -/** | ||
| 20 | - * 依赖内存 DB + Redis 的单元测试 | ||
| 21 | - * | ||
| 22 | - * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis | ||
| 23 | - * | ||
| 24 | - * @author 芋道源码 | ||
| 25 | - */ | ||
| 26 | -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) | ||
| 27 | -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 | ||
| 28 | -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB | ||
| 29 | -public class BaseDbAndRedisUnitTest { | ||
| 30 | - | ||
| 31 | - @Import({ | ||
| 32 | - // DB 配置类 | ||
| 33 | - YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 | ||
| 34 | - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 | ||
| 35 | - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 | ||
| 36 | - DruidDataSourceAutoConfigure.class, // Druid 自动配置类 | ||
| 37 | - SqlInitializationTestConfiguration.class, // SQL 初始化 | ||
| 38 | - // MyBatis 配置类 | ||
| 39 | - YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 | ||
| 40 | - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 | ||
| 41 | - | ||
| 42 | - // Redis 配置类 | ||
| 43 | - RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer | ||
| 44 | - RedisAutoConfiguration.class, // Spring Redis 自动配置类 | ||
| 45 | - YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类 | ||
| 46 | - RedissonAutoConfiguration.class, // Redisson 自动高配置类 | ||
| 47 | - }) | ||
| 48 | - public static class Application { | ||
| 49 | - } | ||
| 50 | - | ||
| 51 | -} |
yudao-module-pay/yudao-module-pay-impl/src/test/java/cn/iocoder/yudao/module/pay/test/BaseDbUnitTest.java deleted
| 1 | -package cn.iocoder.yudao.module.pay.test; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; | ||
| 4 | -import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; | ||
| 5 | -import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration; | ||
| 6 | -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; | ||
| 7 | -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; | ||
| 8 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; | ||
| 9 | -import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; | ||
| 10 | -import org.springframework.boot.test.context.SpringBootTest; | ||
| 11 | -import org.springframework.context.annotation.Import; | ||
| 12 | -import org.springframework.test.context.ActiveProfiles; | ||
| 13 | -import org.springframework.test.context.jdbc.Sql; | ||
| 14 | - | ||
| 15 | -/** | ||
| 16 | - * 依赖内存 DB 的单元测试 | ||
| 17 | - * | ||
| 18 | - * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 | ||
| 19 | - * | ||
| 20 | - * @author 芋道源码 | ||
| 21 | - */ | ||
| 22 | -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) | ||
| 23 | -@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 | ||
| 24 | -@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB | ||
| 25 | -public class BaseDbUnitTest { | ||
| 26 | - | ||
| 27 | - @Import({ | ||
| 28 | - // DB 配置类 | ||
| 29 | - YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类 | ||
| 30 | - DataSourceAutoConfiguration.class, // Spring DB 自动配置类 | ||
| 31 | - DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 | ||
| 32 | - DruidDataSourceAutoConfigure.class, // Druid 自动配置类 | ||
| 33 | - SqlInitializationTestConfiguration.class, // SQL 初始化 | ||
| 34 | - // MyBatis 配置类 | ||
| 35 | - YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 | ||
| 36 | - MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 | ||
| 37 | - }) | ||
| 38 | - public static class Application { | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | -} |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sensitiveword/SensitiveWordApi.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.api.sensitiveword; | ||
| 2 | + | ||
| 3 | +import java.util.List; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * 敏感词 API 接口 | ||
| 7 | + * | ||
| 8 | + * @author 永不言败 | ||
| 9 | + */ | ||
| 10 | +public interface SensitiveWordApi { | ||
| 11 | + | ||
| 12 | + /** | ||
| 13 | + * 获得文本所包含的不合法的敏感词数组 | ||
| 14 | + * | ||
| 15 | + * @param text 文本 | ||
| 16 | + * @param tags 标签数组 | ||
| 17 | + * @return 不合法的敏感词数组 | ||
| 18 | + */ | ||
| 19 | + List<String> validateText(String text, List<String> tags); | ||
| 20 | + | ||
| 21 | + /** | ||
| 22 | + * 判断文本是否包含敏感词 | ||
| 23 | + * | ||
| 24 | + * @param text 文本 | ||
| 25 | + * @param tags 表述数组 | ||
| 26 | + * @return 是否包含 | ||
| 27 | + */ | ||
| 28 | + boolean isTextValid(String text, List<String> tags); | ||
| 29 | + | ||
| 30 | +} |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/DictTypeConstants.java
| @@ -14,16 +14,16 @@ public interface DictTypeConstants { | @@ -14,16 +14,16 @@ public interface DictTypeConstants { | ||
| 14 | 14 | ||
| 15 | String USER_SEX = "system_user_sex"; // 用户性别 | 15 | String USER_SEX = "system_user_sex"; // 用户性别 |
| 16 | 16 | ||
| 17 | - String OPERATE_TYPE = "sys_operate_type"; // 操作类型 | 17 | + String OPERATE_TYPE = "system_operate_type"; // 操作类型 |
| 18 | 18 | ||
| 19 | - String LOGIN_TYPE = "sys_login_type"; // 登录日志的类型 | ||
| 20 | - String LOGIN_RESULT = "sys_login_result"; // 登录结果 | 19 | + String LOGIN_TYPE = "system_login_type"; // 登录日志的类型 |
| 20 | + String LOGIN_RESULT = "system_login_result"; // 登录结果 | ||
| 21 | 21 | ||
| 22 | String ERROR_CODE_TYPE = "system_error_code_type"; // 错误码的类型枚举 | 22 | String ERROR_CODE_TYPE = "system_error_code_type"; // 错误码的类型枚举 |
| 23 | 23 | ||
| 24 | - String SMS_CHANNEL_CODE = "sys_sms_channel_code"; // 短信渠道编码 | ||
| 25 | - String SMS_TEMPLATE_TYPE = "sys_sms_template_type"; // 短信模板类型 | ||
| 26 | - String SMS_SEND_STATUS = "sys_sms_send_status"; // 短信发送状态 | ||
| 27 | - String SMS_RECEIVE_STATUS = "sys_sms_receive_status"; // 短信接收状态 | 24 | + String SMS_CHANNEL_CODE = "system_sms_channel_code"; // 短信渠道编码 |
| 25 | + String SMS_TEMPLATE_TYPE = "system_sms_template_type"; // 短信模板类型 | ||
| 26 | + String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 | ||
| 27 | + String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 | ||
| 28 | 28 | ||
| 29 | } | 29 | } |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
| @@ -119,4 +119,8 @@ public interface ErrorCodeConstants { | @@ -119,4 +119,8 @@ public interface ErrorCodeConstants { | ||
| 119 | ErrorCode SOCIAL_USER_UNBIND_NOT_SELF = new ErrorCode(1002018001, "社交解绑失败,非当前用户绑定"); | 119 | ErrorCode SOCIAL_USER_UNBIND_NOT_SELF = new ErrorCode(1002018001, "社交解绑失败,非当前用户绑定"); |
| 120 | ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1002018002, "社交授权失败,找不到对应的用户"); | 120 | ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1002018002, "社交授权失败,找不到对应的用户"); |
| 121 | 121 | ||
| 122 | + // ========== 系统铭感词 1002019000 ========= | ||
| 123 | + ErrorCode SENSITIVE_WORD_NOT_EXISTS = new ErrorCode(1002019000, "系统敏感词在所有标签中都不存在"); | ||
| 124 | + ErrorCode SENSITIVE_WORD_EXISTS = new ErrorCode(1002019001, "系统敏感词已在标签中存在"); | ||
| 125 | + | ||
| 122 | } | 126 | } |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sensitiveword/SensitiveWordApiImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.api.sensitiveword; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.module.system.service.sensitiveword.SensitiveWordService; | ||
| 4 | +import org.springframework.stereotype.Service; | ||
| 5 | + | ||
| 6 | +import javax.annotation.Resource; | ||
| 7 | +import java.util.List; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * 敏感词 API 实现类 | ||
| 11 | + * | ||
| 12 | + * @author 永不言败 | ||
| 13 | + */ | ||
| 14 | +@Service | ||
| 15 | +public class SensitiveWordApiImpl implements SensitiveWordApi { | ||
| 16 | + | ||
| 17 | + @Resource | ||
| 18 | + private SensitiveWordService sensitiveWordService; | ||
| 19 | + | ||
| 20 | + @Override | ||
| 21 | + public List<String> validateText(String text, List<String> tags) { | ||
| 22 | + return sensitiveWordService.validateText(text, tags); | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + @Override | ||
| 26 | + public boolean isTextValid(String text, List<String> tags) { | ||
| 27 | + return sensitiveWordService.isTextValid(text, tags); | ||
| 28 | + } | ||
| 29 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sensitiveword/SensitiveWordController.http
0 → 100644
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sensitiveword/SensitiveWordController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.sensitiveword; | ||
| 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 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.*; | ||
| 8 | +import cn.iocoder.yudao.module.system.convert.sensitiveword.SensitiveWordConvert; | ||
| 9 | +import cn.iocoder.yudao.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; | ||
| 10 | +import cn.iocoder.yudao.module.system.service.sensitiveword.SensitiveWordService; | ||
| 11 | +import io.swagger.annotations.Api; | ||
| 12 | +import io.swagger.annotations.ApiImplicitParam; | ||
| 13 | +import io.swagger.annotations.ApiOperation; | ||
| 14 | +import org.springframework.security.access.prepost.PreAuthorize; | ||
| 15 | +import org.springframework.validation.annotation.Validated; | ||
| 16 | +import org.springframework.web.bind.annotation.*; | ||
| 17 | + | ||
| 18 | +import javax.annotation.Resource; | ||
| 19 | +import javax.servlet.http.HttpServletResponse; | ||
| 20 | +import javax.validation.Valid; | ||
| 21 | +import java.io.IOException; | ||
| 22 | +import java.util.List; | ||
| 23 | +import java.util.Set; | ||
| 24 | + | ||
| 25 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||
| 26 | +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; | ||
| 27 | + | ||
| 28 | +@Api(tags = "管理后台 - 敏感词") | ||
| 29 | +@RestController | ||
| 30 | +@RequestMapping("/system/sensitive-word") | ||
| 31 | +@Validated | ||
| 32 | +public class SensitiveWordController { | ||
| 33 | + | ||
| 34 | + @Resource | ||
| 35 | + private SensitiveWordService sensitiveWordService; | ||
| 36 | + | ||
| 37 | + @PostMapping("/create") | ||
| 38 | + @ApiOperation("创建敏感词") | ||
| 39 | + @PreAuthorize("@ss.hasPermission('system:sensitive-word:create')") | ||
| 40 | + public CommonResult<Long> createSensitiveWord(@Valid @RequestBody SensitiveWordCreateReqVO createReqVO) { | ||
| 41 | + return success(sensitiveWordService.createSensitiveWord(createReqVO)); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + @PutMapping("/update") | ||
| 45 | + @ApiOperation("更新敏感词") | ||
| 46 | + @PreAuthorize("@ss.hasPermission('system:sensitive-word:update')") | ||
| 47 | + public CommonResult<Boolean> updateSensitiveWord(@Valid @RequestBody SensitiveWordUpdateReqVO updateReqVO) { | ||
| 48 | + sensitiveWordService.updateSensitiveWord(updateReqVO); | ||
| 49 | + return success(true); | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + @DeleteMapping("/delete") | ||
| 53 | + @ApiOperation("删除敏感词") | ||
| 54 | + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) | ||
| 55 | + @PreAuthorize("@ss.hasPermission('system:sensitive-word:delete')") | ||
| 56 | + public CommonResult<Boolean> deleteSensitiveWord(@RequestParam("id") Long id) { | ||
| 57 | + sensitiveWordService.deleteSensitiveWord(id); | ||
| 58 | + return success(true); | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + @GetMapping("/get") | ||
| 62 | + @ApiOperation("获得敏感词") | ||
| 63 | + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) | ||
| 64 | + @PreAuthorize("@ss.hasPermission('system:sensitive-word:query')") | ||
| 65 | + public CommonResult<SensitiveWordRespVO> getSensitiveWord(@RequestParam("id") Long id) { | ||
| 66 | + SensitiveWordDO sensitiveWord = sensitiveWordService.getSensitiveWord(id); | ||
| 67 | + return success(SensitiveWordConvert.INSTANCE.convert(sensitiveWord)); | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + @GetMapping("/page") | ||
| 71 | + @ApiOperation("获得敏感词分页") | ||
| 72 | + @PreAuthorize("@ss.hasPermission('system:sensitive-word:query')") | ||
| 73 | + public CommonResult<PageResult<SensitiveWordRespVO>> getSensitiveWordPage(@Valid SensitiveWordPageReqVO pageVO) { | ||
| 74 | + PageResult<SensitiveWordDO> pageResult = sensitiveWordService.getSensitiveWordPage(pageVO); | ||
| 75 | + return success(SensitiveWordConvert.INSTANCE.convertPage(pageResult)); | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + @GetMapping("/export-excel") | ||
| 79 | + @ApiOperation("导出敏感词 Excel") | ||
| 80 | + @PreAuthorize("@ss.hasPermission('system:sensitive-word:export')") | ||
| 81 | + @OperateLog(type = EXPORT) | ||
| 82 | + public void exportSensitiveWordExcel(@Valid SensitiveWordExportReqVO exportReqVO, | ||
| 83 | + HttpServletResponse response) throws IOException { | ||
| 84 | + List<SensitiveWordDO> list = sensitiveWordService.getSensitiveWordList(exportReqVO); | ||
| 85 | + // 导出 Excel | ||
| 86 | + List<SensitiveWordExcelVO> datas = SensitiveWordConvert.INSTANCE.convertList02(list); | ||
| 87 | + ExcelUtils.write(response, "敏感词.xls", "数据", SensitiveWordExcelVO.class, datas); | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + @GetMapping("/get-tags") | ||
| 91 | + @ApiOperation("获取所有敏感词的标签数组") | ||
| 92 | + @PreAuthorize("@ss.hasPermission('system:sensitive-word:query')") | ||
| 93 | + public CommonResult<Set<String>> getSensitiveWordTags() throws IOException { | ||
| 94 | + return success(sensitiveWordService.getSensitiveWordTags()); | ||
| 95 | + } | ||
| 96 | + | ||
| 97 | + @GetMapping("/validate-text") | ||
| 98 | + @ApiOperation("获得文本所包含的不合法的敏感词数组") | ||
| 99 | + public CommonResult<List<String>> validateText(@RequestParam("text") String text, | ||
| 100 | + @RequestParam(value = "tags", required = false) List<String> tags) { | ||
| 101 | + return success(sensitiveWordService.validateText(text, tags)); | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sensitiveword/vo/SensitiveWordBaseVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo; | ||
| 2 | + | ||
| 3 | +import io.swagger.annotations.ApiModelProperty; | ||
| 4 | +import lombok.Data; | ||
| 5 | + | ||
| 6 | +import javax.validation.constraints.NotNull; | ||
| 7 | +import java.util.List; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | +* 敏感词 Base VO,提供给添加、修改、详细的子 VO 使用 | ||
| 11 | +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 | ||
| 12 | +*/ | ||
| 13 | +@Data | ||
| 14 | +public class SensitiveWordBaseVO { | ||
| 15 | + | ||
| 16 | + @ApiModelProperty(value = "敏感词", required = true, example = "敏感词") | ||
| 17 | + @NotNull(message = "敏感词不能为空") | ||
| 18 | + private String name; | ||
| 19 | + | ||
| 20 | + @ApiModelProperty(value = "标签", required = true, example = "短信,评论") | ||
| 21 | + @NotNull(message = "标签不能为空") | ||
| 22 | + private List<String> tags; | ||
| 23 | + | ||
| 24 | + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") | ||
| 25 | + @NotNull(message = "状态不能为空") | ||
| 26 | + private Integer status; | ||
| 27 | + | ||
| 28 | + @ApiModelProperty(value = "描述", example = "污言秽语") | ||
| 29 | + private String description; | ||
| 30 | + | ||
| 31 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sensitiveword/vo/SensitiveWordCreateReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo; | ||
| 2 | + | ||
| 3 | +import io.swagger.annotations.ApiModel; | ||
| 4 | +import lombok.Data; | ||
| 5 | +import lombok.EqualsAndHashCode; | ||
| 6 | +import lombok.ToString; | ||
| 7 | + | ||
| 8 | +@ApiModel("管理后台 - 敏感词创建 Request VO") | ||
| 9 | +@Data | ||
| 10 | +@EqualsAndHashCode(callSuper = true) | ||
| 11 | +@ToString(callSuper = true) | ||
| 12 | +public class SensitiveWordCreateReqVO extends SensitiveWordBaseVO { | ||
| 13 | + | ||
| 14 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sensitiveword/vo/SensitiveWordExcelVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo; | ||
| 2 | + | ||
| 3 | +import com.alibaba.excel.annotation.ExcelProperty; | ||
| 4 | +import lombok.Data; | ||
| 5 | + | ||
| 6 | +import java.util.Date; | ||
| 7 | +import java.util.List; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * 敏感词 Excel VO | ||
| 11 | + * | ||
| 12 | + * @author 永不言败 | ||
| 13 | + */ | ||
| 14 | +@Data | ||
| 15 | +public class SensitiveWordExcelVO { | ||
| 16 | + | ||
| 17 | + @ExcelProperty("编号") | ||
| 18 | + private Long id; | ||
| 19 | + | ||
| 20 | + @ExcelProperty("敏感词") | ||
| 21 | + private String name; | ||
| 22 | + | ||
| 23 | + @ExcelProperty("标签") | ||
| 24 | + private List<String> tags; | ||
| 25 | + | ||
| 26 | + @ExcelProperty("状态,true-启用,false-禁用") | ||
| 27 | + private Integer status; | ||
| 28 | + | ||
| 29 | + @ExcelProperty("描述") | ||
| 30 | + private String description; | ||
| 31 | + | ||
| 32 | + @ExcelProperty("创建时间") | ||
| 33 | + private Date createTime; | ||
| 34 | + | ||
| 35 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sensitiveword/vo/SensitiveWordExportReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo; | ||
| 2 | + | ||
| 3 | +import io.swagger.annotations.ApiModel; | ||
| 4 | +import io.swagger.annotations.ApiModelProperty; | ||
| 5 | +import lombok.Data; | ||
| 6 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 7 | + | ||
| 8 | +import java.util.Date; | ||
| 9 | + | ||
| 10 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||
| 11 | + | ||
| 12 | +@ApiModel(value = "管理后台 - 敏感词 Excel 导出 Request VO", description = "参数和 SensitiveWordPageReqVO 是一致的") | ||
| 13 | +@Data | ||
| 14 | +public class SensitiveWordExportReqVO { | ||
| 15 | + | ||
| 16 | + @ApiModelProperty(value = "敏感词", example = "敏感词") | ||
| 17 | + private String name; | ||
| 18 | + | ||
| 19 | + @ApiModelProperty(value = "标签", example = "短信,评论") | ||
| 20 | + private String tag; | ||
| 21 | + | ||
| 22 | + @ApiModelProperty(value = "状态", example = "true-启用,false-禁用") | ||
| 23 | + private Integer status; | ||
| 24 | + | ||
| 25 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 26 | + @ApiModelProperty(value = "开始创建时间") | ||
| 27 | + private Date beginCreateTime; | ||
| 28 | + | ||
| 29 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 30 | + @ApiModelProperty(value = "结束创建时间") | ||
| 31 | + private Date endCreateTime; | ||
| 32 | + | ||
| 33 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sensitiveword/vo/SensitiveWordPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||
| 4 | +import io.swagger.annotations.ApiModel; | ||
| 5 | +import io.swagger.annotations.ApiModelProperty; | ||
| 6 | +import lombok.Data; | ||
| 7 | +import lombok.EqualsAndHashCode; | ||
| 8 | +import lombok.ToString; | ||
| 9 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 10 | + | ||
| 11 | +import java.util.Date; | ||
| 12 | + | ||
| 13 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||
| 14 | + | ||
| 15 | +@ApiModel("管理后台 - 敏感词分页 Request VO") | ||
| 16 | +@Data | ||
| 17 | +@EqualsAndHashCode(callSuper = true) | ||
| 18 | +@ToString(callSuper = true) | ||
| 19 | +public class SensitiveWordPageReqVO extends PageParam { | ||
| 20 | + | ||
| 21 | + @ApiModelProperty(value = "敏感词", example = "敏感词") | ||
| 22 | + private String name; | ||
| 23 | + | ||
| 24 | + @ApiModelProperty(value = "标签", example = "短信,评论") | ||
| 25 | + private String tag; | ||
| 26 | + | ||
| 27 | + @ApiModelProperty(value = "状态", example = "true-启用,true-禁用") | ||
| 28 | + private Integer status; | ||
| 29 | + | ||
| 30 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 31 | + @ApiModelProperty(value = "开始创建时间") | ||
| 32 | + private Date beginCreateTime; | ||
| 33 | + | ||
| 34 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 35 | + @ApiModelProperty(value = "结束创建时间") | ||
| 36 | + private Date endCreateTime; | ||
| 37 | + | ||
| 38 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sensitiveword/vo/SensitiveWordRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo; | ||
| 2 | + | ||
| 3 | +import io.swagger.annotations.ApiModel; | ||
| 4 | +import io.swagger.annotations.ApiModelProperty; | ||
| 5 | +import lombok.Data; | ||
| 6 | +import lombok.EqualsAndHashCode; | ||
| 7 | +import lombok.ToString; | ||
| 8 | + | ||
| 9 | +import java.util.Date; | ||
| 10 | + | ||
| 11 | +@ApiModel("管理后台 - 敏感词 Response VO") | ||
| 12 | +@Data | ||
| 13 | +@EqualsAndHashCode(callSuper = true) | ||
| 14 | +@ToString(callSuper = true) | ||
| 15 | +public class SensitiveWordRespVO extends SensitiveWordBaseVO { | ||
| 16 | + | ||
| 17 | + @ApiModelProperty(value = "编号", required = true, example = "1") | ||
| 18 | + private Long id; | ||
| 19 | + | ||
| 20 | + @ApiModelProperty(value = "创建时间", required = true) | ||
| 21 | + private Date createTime; | ||
| 22 | + | ||
| 23 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sensitiveword/vo/SensitiveWordUpdateReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo; | ||
| 2 | + | ||
| 3 | +import io.swagger.annotations.ApiModel; | ||
| 4 | +import io.swagger.annotations.ApiModelProperty; | ||
| 5 | +import lombok.Data; | ||
| 6 | +import lombok.EqualsAndHashCode; | ||
| 7 | +import lombok.ToString; | ||
| 8 | + | ||
| 9 | +import javax.validation.constraints.NotNull; | ||
| 10 | + | ||
| 11 | +@ApiModel("管理后台 - 敏感词更新 Request VO") | ||
| 12 | +@Data | ||
| 13 | +@EqualsAndHashCode(callSuper = true) | ||
| 14 | +@ToString(callSuper = true) | ||
| 15 | +public class SensitiveWordUpdateReqVO extends SensitiveWordBaseVO { | ||
| 16 | + | ||
| 17 | + @ApiModelProperty(value = "编号", required = true, example = "1") | ||
| 18 | + @NotNull(message = "编号不能为空") | ||
| 19 | + private Long id; | ||
| 20 | + | ||
| 21 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java
| @@ -30,7 +30,7 @@ public interface OperateLogConvert { | @@ -30,7 +30,7 @@ public interface OperateLogConvert { | ||
| 30 | default List<OperateLogExcelVO> convertList(List<OperateLogDO> list, Map<Long, AdminUserDO> userMap) { | 30 | default List<OperateLogExcelVO> convertList(List<OperateLogDO> list, Map<Long, AdminUserDO> userMap) { |
| 31 | return list.stream().map(operateLog -> { | 31 | return list.stream().map(operateLog -> { |
| 32 | OperateLogExcelVO excelVO = convert02(operateLog); | 32 | OperateLogExcelVO excelVO = convert02(operateLog); |
| 33 | - MapUtils.findAndThen(userMap, operateLog.getId(), user -> excelVO.setUserNickname(user.getNickname())); | 33 | + MapUtils.findAndThen(userMap, operateLog.getUserId(), user -> excelVO.setUserNickname(user.getNickname())); |
| 34 | excelVO.setSuccessStr(SUCCESS.getCode().equals(operateLog.getResultCode()) ? "成功" : "失败"); | 34 | excelVO.setSuccessStr(SUCCESS.getCode().equals(operateLog.getResultCode()) ? "成功" : "失败"); |
| 35 | return excelVO; | 35 | return excelVO; |
| 36 | }).collect(Collectors.toList()); | 36 | }).collect(Collectors.toList()); |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/convert/sensitiveword/SensitiveWordConvert.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.convert.sensitiveword; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordCreateReqVO; | ||
| 5 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordExcelVO; | ||
| 6 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordRespVO; | ||
| 7 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordUpdateReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; | ||
| 9 | +import org.mapstruct.Mapper; | ||
| 10 | +import org.mapstruct.factory.Mappers; | ||
| 11 | + | ||
| 12 | +import java.util.List; | ||
| 13 | + | ||
| 14 | +/** | ||
| 15 | + * 敏感词 Convert | ||
| 16 | + * | ||
| 17 | + * @author 永不言败 | ||
| 18 | + */ | ||
| 19 | +@Mapper | ||
| 20 | +public interface SensitiveWordConvert { | ||
| 21 | + | ||
| 22 | + SensitiveWordConvert INSTANCE = Mappers.getMapper(SensitiveWordConvert.class); | ||
| 23 | + | ||
| 24 | + SensitiveWordDO convert(SensitiveWordCreateReqVO bean); | ||
| 25 | + | ||
| 26 | + SensitiveWordDO convert(SensitiveWordUpdateReqVO bean); | ||
| 27 | + | ||
| 28 | + SensitiveWordRespVO convert(SensitiveWordDO bean); | ||
| 29 | + | ||
| 30 | + List<SensitiveWordRespVO> convertList(List<SensitiveWordDO> list); | ||
| 31 | + | ||
| 32 | + PageResult<SensitiveWordRespVO> convertPage(PageResult<SensitiveWordDO> page); | ||
| 33 | + | ||
| 34 | + List<SensitiveWordExcelVO> convertList02(List<SensitiveWordDO> list); | ||
| 35 | + | ||
| 36 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/package-info.java deleted
| 1 | -package cn.iocoder.yudao.module.system.dal.dataobject; |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.dal.dataobject.sensitiveword; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.type.StringLiSTTypeHandler; | ||
| 6 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 7 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 8 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 9 | +import lombok.*; | ||
| 10 | + | ||
| 11 | +import java.util.List; | ||
| 12 | + | ||
| 13 | +/** | ||
| 14 | + * 敏感词 DO | ||
| 15 | + * | ||
| 16 | + * @author 永不言败 | ||
| 17 | + */ | ||
| 18 | +@TableName(value = "system_sensitive_word", autoResultMap = true) | ||
| 19 | +@Data | ||
| 20 | +@EqualsAndHashCode(callSuper = true) | ||
| 21 | +@ToString(callSuper = true) | ||
| 22 | +@Builder | ||
| 23 | +@NoArgsConstructor | ||
| 24 | +@AllArgsConstructor | ||
| 25 | +public class SensitiveWordDO extends BaseDO { | ||
| 26 | + | ||
| 27 | + /** | ||
| 28 | + * 编号 | ||
| 29 | + */ | ||
| 30 | + @TableId | ||
| 31 | + private Long id; | ||
| 32 | + /** | ||
| 33 | + * 敏感词 | ||
| 34 | + */ | ||
| 35 | + private String name; | ||
| 36 | + /** | ||
| 37 | + * 描述 | ||
| 38 | + */ | ||
| 39 | + private String description; | ||
| 40 | + /** | ||
| 41 | + * 标签数组 | ||
| 42 | + * | ||
| 43 | + * 用于实现不同的业务场景下,需要使用不同标签的敏感词。 | ||
| 44 | + * 例如说,tag 有短信、论坛两种,敏感词 "推广" 在短信下是敏感词,在论坛下不是敏感词。 | ||
| 45 | + * 此时,我们会存储一条敏感词记录,它的 name 为"推广",tag 为短信。 | ||
| 46 | + */ | ||
| 47 | + @TableField(typeHandler = StringLiSTTypeHandler.class) | ||
| 48 | + private List<String> tags; | ||
| 49 | + /** | ||
| 50 | + * 状态 | ||
| 51 | + * | ||
| 52 | + * 枚举 {@link CommonStatusEnum} | ||
| 53 | + */ | ||
| 54 | + private Integer status; | ||
| 55 | + | ||
| 56 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java
| @@ -15,12 +15,14 @@ import java.util.List; | @@ -15,12 +15,14 @@ import java.util.List; | ||
| 15 | public interface DeptMapper extends BaseMapperX<DeptDO> { | 15 | public interface DeptMapper extends BaseMapperX<DeptDO> { |
| 16 | 16 | ||
| 17 | default List<DeptDO> selectList(DeptListReqVO reqVO) { | 17 | default List<DeptDO> selectList(DeptListReqVO reqVO) { |
| 18 | - return selectList(new LambdaQueryWrapperX<DeptDO>().likeIfPresent(DeptDO::getName, reqVO.getName()) | 18 | + return selectList(new LambdaQueryWrapperX<DeptDO>() |
| 19 | + .likeIfPresent(DeptDO::getName, reqVO.getName()) | ||
| 19 | .eqIfPresent(DeptDO::getStatus, reqVO.getStatus())); | 20 | .eqIfPresent(DeptDO::getStatus, reqVO.getStatus())); |
| 20 | } | 21 | } |
| 21 | 22 | ||
| 22 | default DeptDO selectByParentIdAndName(Long parentId, String name) { | 23 | default DeptDO selectByParentIdAndName(Long parentId, String name) { |
| 23 | - return selectOne(new LambdaQueryWrapper<DeptDO>().eq(DeptDO::getParentId, parentId) | 24 | + return selectOne(new LambdaQueryWrapper<DeptDO>() |
| 25 | + .eq(DeptDO::getParentId, parentId) | ||
| 24 | .eq(DeptDO::getName, name)); | 26 | .eq(DeptDO::getName, name)); |
| 25 | } | 27 | } |
| 26 | 28 |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuBatchInsertMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.dal.mysql.permission; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; | ||
| 4 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||
| 5 | +import org.springframework.stereotype.Repository; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * 实体 {@link RoleMenuDO} 的批量插入 Mapper | ||
| 9 | + * | ||
| 10 | + * @author 芋道源码 | ||
| 11 | + */ | ||
| 12 | +@Repository | ||
| 13 | +public class RoleMenuBatchInsertMapper extends ServiceImpl<RoleMenuMapper, RoleMenuDO> { | ||
| 14 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java
| @@ -3,8 +3,10 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission; | @@ -3,8 +3,10 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission; | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; | 4 | import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; |
| 5 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 5 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| 6 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||
| 6 | import org.apache.ibatis.annotations.Mapper; | 7 | import org.apache.ibatis.annotations.Mapper; |
| 7 | import org.apache.ibatis.annotations.Select; | 8 | import org.apache.ibatis.annotations.Select; |
| 9 | +import org.springframework.stereotype.Repository; | ||
| 8 | 10 | ||
| 9 | import java.util.Collection; | 11 | import java.util.Collection; |
| 10 | import java.util.Date; | 12 | import java.util.Date; |
| @@ -14,18 +16,12 @@ import java.util.stream.Collectors; | @@ -14,18 +16,12 @@ import java.util.stream.Collectors; | ||
| 14 | @Mapper | 16 | @Mapper |
| 15 | public interface RoleMenuMapper extends BaseMapperX<RoleMenuDO> { | 17 | public interface RoleMenuMapper extends BaseMapperX<RoleMenuDO> { |
| 16 | 18 | ||
| 17 | - default List<RoleMenuDO> selectListByRoleId(Long roleId) { | ||
| 18 | - return selectList(new QueryWrapper<RoleMenuDO>().eq("role_id", roleId)); | 19 | + @Repository |
| 20 | + class BatchInsertMapper extends ServiceImpl<RoleMenuMapper, RoleMenuDO> { | ||
| 19 | } | 21 | } |
| 20 | 22 | ||
| 21 | - default void insertList(Long roleId, Collection<Long> menuIds) { | ||
| 22 | - List<RoleMenuDO> list = menuIds.stream().map(menuId -> { | ||
| 23 | - RoleMenuDO entity = new RoleMenuDO(); | ||
| 24 | - entity.setRoleId(roleId); | ||
| 25 | - entity.setMenuId(menuId); | ||
| 26 | - return entity; | ||
| 27 | - }).collect(Collectors.toList()); | ||
| 28 | - insertBatch(list); | 23 | + default List<RoleMenuDO> selectListByRoleId(Long roleId) { |
| 24 | + return selectList(new QueryWrapper<RoleMenuDO>().eq("role_id", roleId)); | ||
| 29 | } | 25 | } |
| 30 | 26 | ||
| 31 | default void deleteListByRoleIdAndMenuIds(Long roleId, Collection<Long> menuIds) { | 27 | default void deleteListByRoleIdAndMenuIds(Long roleId, Collection<Long> menuIds) { |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/UserRoleBatchInsertMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.dal.mysql.permission; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; | ||
| 4 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||
| 5 | +import org.springframework.stereotype.Repository; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * 实体 {@link UserRoleDO} 的批量插入 Mapper | ||
| 9 | + * | ||
| 10 | + * @author 芋道源码 | ||
| 11 | + */ | ||
| 12 | +@Repository | ||
| 13 | +public class UserRoleBatchInsertMapper extends ServiceImpl<UserRoleMapper, UserRoleDO> { | ||
| 14 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/UserRoleMapper.java
| @@ -7,7 +7,6 @@ import org.apache.ibatis.annotations.Mapper; | @@ -7,7 +7,6 @@ import org.apache.ibatis.annotations.Mapper; | ||
| 7 | 7 | ||
| 8 | import java.util.Collection; | 8 | import java.util.Collection; |
| 9 | import java.util.List; | 9 | import java.util.List; |
| 10 | -import java.util.stream.Collectors; | ||
| 11 | 10 | ||
| 12 | @Mapper | 11 | @Mapper |
| 13 | public interface UserRoleMapper extends BaseMapperX<UserRoleDO> { | 12 | public interface UserRoleMapper extends BaseMapperX<UserRoleDO> { |
| @@ -20,17 +19,6 @@ public interface UserRoleMapper extends BaseMapperX<UserRoleDO> { | @@ -20,17 +19,6 @@ public interface UserRoleMapper extends BaseMapperX<UserRoleDO> { | ||
| 20 | return selectList(new QueryWrapper<UserRoleDO>().eq("role_id", roleId)); | 19 | return selectList(new QueryWrapper<UserRoleDO>().eq("role_id", roleId)); |
| 21 | } | 20 | } |
| 22 | 21 | ||
| 23 | - | ||
| 24 | - default void insertList(Long userId, Collection<Long> roleIds) { | ||
| 25 | - List<UserRoleDO> list = roleIds.stream().map(roleId -> { | ||
| 26 | - UserRoleDO entity = new UserRoleDO(); | ||
| 27 | - entity.setUserId(userId); | ||
| 28 | - entity.setRoleId(roleId); | ||
| 29 | - return entity; | ||
| 30 | - }).collect(Collectors.toList()); | ||
| 31 | - insertBatch(list); | ||
| 32 | - } | ||
| 33 | - | ||
| 34 | default void deleteListByUserIdAndRoleIdIds(Long userId, Collection<Long> roleIds) { | 22 | default void deleteListByUserIdAndRoleIdIds(Long userId, Collection<Long> roleIds) { |
| 35 | delete(new QueryWrapper<UserRoleDO>().eq("user_id", userId) | 23 | delete(new QueryWrapper<UserRoleDO>().eq("user_id", userId) |
| 36 | .in("role_id", roleIds)); | 24 | .in("role_id", roleIds)); |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.dal.mysql.sensitiveword; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||
| 6 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordExportReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordPageReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; | ||
| 9 | +import org.apache.ibatis.annotations.Mapper; | ||
| 10 | +import org.apache.ibatis.annotations.Select; | ||
| 11 | + | ||
| 12 | +import java.util.Date; | ||
| 13 | +import java.util.List; | ||
| 14 | + | ||
| 15 | +/** | ||
| 16 | + * 敏感词 Mapper | ||
| 17 | + * | ||
| 18 | + * @author 永不言败 | ||
| 19 | + */ | ||
| 20 | +@Mapper | ||
| 21 | +public interface SensitiveWordMapper extends BaseMapperX<SensitiveWordDO> { | ||
| 22 | + | ||
| 23 | + default PageResult<SensitiveWordDO> selectPage(SensitiveWordPageReqVO reqVO) { | ||
| 24 | + return selectPage(reqVO, new LambdaQueryWrapperX<SensitiveWordDO>() | ||
| 25 | + .likeIfPresent(SensitiveWordDO::getName, reqVO.getName()) | ||
| 26 | + .likeIfPresent(SensitiveWordDO::getTags, reqVO.getTag()) | ||
| 27 | + .eqIfPresent(SensitiveWordDO::getStatus, reqVO.getStatus()) | ||
| 28 | + .betweenIfPresent(SensitiveWordDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) | ||
| 29 | + .orderByDesc(SensitiveWordDO::getId)); | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + default List<SensitiveWordDO> selectList(SensitiveWordExportReqVO reqVO) { | ||
| 33 | + return selectList(new LambdaQueryWrapperX<SensitiveWordDO>() | ||
| 34 | + .likeIfPresent(SensitiveWordDO::getName, reqVO.getName()) | ||
| 35 | + .likeIfPresent(SensitiveWordDO::getTags, reqVO.getTag()) | ||
| 36 | + .eqIfPresent(SensitiveWordDO::getStatus, reqVO.getStatus()) | ||
| 37 | + .betweenIfPresent(SensitiveWordDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) | ||
| 38 | + .orderByDesc(SensitiveWordDO::getId)); | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + default SensitiveWordDO selectByName(String name) { | ||
| 42 | + return selectOne(SensitiveWordDO::getName, name); | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + @Select("SELECT id FROM system_sensitive_word WHERE update_time > #{maxUpdateTime} LIMIT 1") | ||
| 46 | + SensitiveWordDO selectExistsByUpdateTimeAfter(Date maxUpdateTime); | ||
| 47 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/redis/auth/LoginUserRedisDAO.java
| @@ -41,7 +41,7 @@ public class LoginUserRedisDAO { | @@ -41,7 +41,7 @@ public class LoginUserRedisDAO { | ||
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | private static String formatKey(String sessionId) { | 43 | private static String formatKey(String sessionId) { |
| 44 | - return String.format(LOGIN_USER.getKeyTemplate(), sessionId); | 44 | + return LOGIN_USER.formatKey(sessionId); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | } | 47 | } |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/sensitiveword/SensitiveWordRefreshConsumer.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.mq.consumer.sensitiveword; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; | ||
| 4 | +import cn.iocoder.yudao.module.system.mq.message.sensitiveword.SensitiveWordRefreshMessage; | ||
| 5 | +import cn.iocoder.yudao.module.system.service.sensitiveword.SensitiveWordService; | ||
| 6 | +import lombok.extern.slf4j.Slf4j; | ||
| 7 | +import org.springframework.stereotype.Component; | ||
| 8 | + | ||
| 9 | +import javax.annotation.Resource; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | + * 针对 {@link SensitiveWordRefreshMessage} 的消费者 | ||
| 13 | + * | ||
| 14 | + * @author 芋道源码 | ||
| 15 | + */ | ||
| 16 | +@Component | ||
| 17 | +@Slf4j | ||
| 18 | +public class SensitiveWordRefreshConsumer extends AbstractChannelMessageListener<SensitiveWordRefreshMessage> { | ||
| 19 | + | ||
| 20 | + @Resource | ||
| 21 | + private SensitiveWordService sensitiveWordService; | ||
| 22 | + | ||
| 23 | + @Override | ||
| 24 | + public void onMessage(SensitiveWordRefreshMessage message) { | ||
| 25 | + log.info("[onMessage][收到 SensitiveWord 刷新消息]"); | ||
| 26 | + sensitiveWordService.initLocalCache(); | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/message/sensitiveword/SensitiveWordRefreshMessage.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.mq.message.sensitiveword; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessage; | ||
| 4 | +import lombok.Data; | ||
| 5 | +import lombok.EqualsAndHashCode; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * 敏感词的刷新 Message | ||
| 9 | + */ | ||
| 10 | +@Data | ||
| 11 | +@EqualsAndHashCode(callSuper = true) | ||
| 12 | +public class SensitiveWordRefreshMessage extends AbstractChannelMessage { | ||
| 13 | + | ||
| 14 | + @Override | ||
| 15 | + public String getChannel() { | ||
| 16 | + return "system.sensitive-word.refresh"; | ||
| 17 | + } | ||
| 18 | + | ||
| 19 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/mq/producer/sensitiveword/SensitiveWordProducer.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.mq.producer.sensitiveword; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; | ||
| 4 | +import cn.iocoder.yudao.module.system.mq.message.sensitiveword.SensitiveWordRefreshMessage; | ||
| 5 | +import org.springframework.stereotype.Component; | ||
| 6 | + | ||
| 7 | +import javax.annotation.Resource; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * 敏感词相关的 Producer | ||
| 11 | + */ | ||
| 12 | +@Component | ||
| 13 | +public class SensitiveWordProducer { | ||
| 14 | + | ||
| 15 | + @Resource | ||
| 16 | + private RedisMQTemplate redisMQTemplate; | ||
| 17 | + | ||
| 18 | + /** | ||
| 19 | + * 发送 {@link SensitiveWordRefreshMessage} 消息 | ||
| 20 | + */ | ||
| 21 | + public void sendSensitiveWordRefreshMessage() { | ||
| 22 | + SensitiveWordRefreshMessage message = new SensitiveWordRefreshMessage(); | ||
| 23 | + redisMQTemplate.send(message); | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
| @@ -107,7 +107,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | @@ -107,7 +107,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||
| 107 | LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); | 107 | LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); |
| 108 | 108 | ||
| 109 | // 缓存登陆用户到 Redis 中,返回 sessionId 编号 | 109 | // 缓存登陆用户到 Redis 中,返回 sessionId 编号 |
| 110 | - return userSessionService.createUserSession(loginUser, userIp, userAgent); | 110 | + return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_USERNAME, userIp, userAgent); |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | private void verifyCaptcha(AuthLoginReqVO reqVO) { | 113 | private void verifyCaptcha(AuthLoginReqVO reqVO) { |
| @@ -155,9 +155,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | @@ -155,9 +155,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||
| 155 | this.createLoginLog(username, logTypeEnum, LoginResultEnum.UNKNOWN_ERROR); | 155 | this.createLoginLog(username, logTypeEnum, LoginResultEnum.UNKNOWN_ERROR); |
| 156 | throw exception(AUTH_LOGIN_FAIL_UNKNOWN); | 156 | throw exception(AUTH_LOGIN_FAIL_UNKNOWN); |
| 157 | } | 157 | } |
| 158 | - // 登录成功的日志 | ||
| 159 | Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); | 158 | Assert.notNull(authentication.getPrincipal(), "Principal 不会为空"); |
| 160 | - this.createLoginLog(username, logTypeEnum, LoginResultEnum.SUCCESS); | ||
| 161 | return (LoginUser) authentication.getPrincipal(); | 159 | return (LoginUser) authentication.getPrincipal(); |
| 162 | } | 160 | } |
| 163 | 161 | ||
| @@ -207,7 +205,6 @@ public class AdminAuthServiceImpl implements AdminAuthService { | @@ -207,7 +205,6 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||
| 207 | if (user == null) { | 205 | if (user == null) { |
| 208 | throw exception(USER_NOT_EXISTS); | 206 | throw exception(USER_NOT_EXISTS); |
| 209 | } | 207 | } |
| 210 | - this.createLoginLog(user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL, LoginResultEnum.SUCCESS); | ||
| 211 | 208 | ||
| 212 | // 创建 LoginUser 对象 | 209 | // 创建 LoginUser 对象 |
| 213 | LoginUser loginUser = this.buildLoginUser(user); | 210 | LoginUser loginUser = this.buildLoginUser(user); |
| @@ -216,7 +213,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | @@ -216,7 +213,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||
| 216 | socialUserService.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); | 213 | socialUserService.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); |
| 217 | 214 | ||
| 218 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 | 215 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 |
| 219 | - return userSessionService.createUserSession(loginUser, userIp, userAgent); | 216 | + return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_SOCIAL, userIp, userAgent); |
| 220 | } | 217 | } |
| 221 | 218 | ||
| 222 | @Override | 219 | @Override |
| @@ -232,6 +229,13 @@ public class AdminAuthServiceImpl implements AdminAuthService { | @@ -232,6 +229,13 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||
| 232 | socialUserService.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); | 229 | socialUserService.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); |
| 233 | 230 | ||
| 234 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 | 231 | // 缓存登录用户到 Redis 中,返回 sessionId 编号 |
| 232 | + return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_SOCIAL, userIp, userAgent); | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + private String createUserSessionAfterLoginSuccess(LoginUser loginUser, LoginLogTypeEnum logType, String userIp, String userAgent) { | ||
| 236 | + // 插入登陆日志 | ||
| 237 | + createLoginLog(loginUser.getUsername(), logType, LoginResultEnum.SUCCESS); | ||
| 238 | + // 缓存登录用户到 Redis 中,返回 sessionId 编号 | ||
| 235 | return userSessionService.createUserSession(loginUser, userIp, userAgent); | 239 | return userSessionService.createUserSession(loginUser, userIp, userAgent); |
| 236 | } | 240 | } |
| 237 | 241 |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java
| @@ -8,7 +8,6 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | @@ -8,7 +8,6 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | ||
| 8 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 8 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 9 | import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; | 9 | import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; |
| 10 | import cn.iocoder.yudao.framework.security.core.LoginUser; | 10 | import cn.iocoder.yudao.framework.security.core.LoginUser; |
| 11 | -import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum; | ||
| 12 | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; | 11 | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| 13 | import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; | 12 | import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; |
| 14 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; | 13 | import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; |
| @@ -16,8 +15,11 @@ import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; | @@ -16,8 +15,11 @@ import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; | ||
| 16 | import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; | 15 | import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; |
| 17 | import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; | 16 | import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; |
| 18 | import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; | 17 | import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; |
| 18 | +import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuBatchInsertMapper; | ||
| 19 | import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper; | 19 | import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper; |
| 20 | +import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleBatchInsertMapper; | ||
| 20 | import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper; | 21 | import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper; |
| 22 | +import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum; | ||
| 21 | import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; | 23 | import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; |
| 22 | import cn.iocoder.yudao.module.system.service.dept.DeptService; | 24 | import cn.iocoder.yudao.module.system.service.dept.DeptService; |
| 23 | import com.google.common.collect.ImmutableMultimap; | 25 | import com.google.common.collect.ImmutableMultimap; |
| @@ -79,7 +81,11 @@ public class PermissionServiceImpl implements PermissionService { | @@ -79,7 +81,11 @@ public class PermissionServiceImpl implements PermissionService { | ||
| 79 | @Resource | 81 | @Resource |
| 80 | private RoleMenuMapper roleMenuMapper; | 82 | private RoleMenuMapper roleMenuMapper; |
| 81 | @Resource | 83 | @Resource |
| 84 | + private RoleMenuBatchInsertMapper roleMenuBatchInsertMapper; | ||
| 85 | + @Resource | ||
| 82 | private UserRoleMapper userRoleMapper; | 86 | private UserRoleMapper userRoleMapper; |
| 87 | + @Resource | ||
| 88 | + private UserRoleBatchInsertMapper userRoleBatchInsertMapper; | ||
| 83 | 89 | ||
| 84 | @Resource | 90 | @Resource |
| 85 | private RoleService roleService; | 91 | private RoleService roleService; |
| @@ -202,7 +208,12 @@ public class PermissionServiceImpl implements PermissionService { | @@ -202,7 +208,12 @@ public class PermissionServiceImpl implements PermissionService { | ||
| 202 | Collection<Long> deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds); | 208 | Collection<Long> deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds); |
| 203 | // 执行新增和删除。对于已经授权的菜单,不用做任何处理 | 209 | // 执行新增和删除。对于已经授权的菜单,不用做任何处理 |
| 204 | if (!CollectionUtil.isEmpty(createMenuIds)) { | 210 | if (!CollectionUtil.isEmpty(createMenuIds)) { |
| 205 | - roleMenuMapper.insertList(roleId, createMenuIds); | 211 | + roleMenuBatchInsertMapper.saveBatch(CollectionUtils.convertList(createMenuIds, menuId -> { |
| 212 | + RoleMenuDO entity = new RoleMenuDO(); | ||
| 213 | + entity.setRoleId(roleId); | ||
| 214 | + entity.setMenuId(menuId); | ||
| 215 | + return entity; | ||
| 216 | + })); | ||
| 206 | } | 217 | } |
| 207 | if (!CollectionUtil.isEmpty(deleteMenuIds)) { | 218 | if (!CollectionUtil.isEmpty(deleteMenuIds)) { |
| 208 | roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds); | 219 | roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds); |
| @@ -240,7 +251,12 @@ public class PermissionServiceImpl implements PermissionService { | @@ -240,7 +251,12 @@ public class PermissionServiceImpl implements PermissionService { | ||
| 240 | Collection<Long> deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds); | 251 | Collection<Long> deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds); |
| 241 | // 执行新增和删除。对于已经授权的角色,不用做任何处理 | 252 | // 执行新增和删除。对于已经授权的角色,不用做任何处理 |
| 242 | if (!CollectionUtil.isEmpty(createRoleIds)) { | 253 | if (!CollectionUtil.isEmpty(createRoleIds)) { |
| 243 | - userRoleMapper.insertList(userId, createRoleIds); | 254 | + userRoleBatchInsertMapper.saveBatch(CollectionUtils.convertList(createRoleIds, roleId -> { |
| 255 | + UserRoleDO entity = new UserRoleDO(); | ||
| 256 | + entity.setUserId(userId); | ||
| 257 | + entity.setRoleId(roleId); | ||
| 258 | + return entity; | ||
| 259 | + })); | ||
| 244 | } | 260 | } |
| 245 | if (!CollectionUtil.isEmpty(deleteMenuIds)) { | 261 | if (!CollectionUtil.isEmpty(deleteMenuIds)) { |
| 246 | userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds); | 262 | userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds); |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java
| @@ -126,6 +126,7 @@ public class RoleServiceImpl implements RoleService { | @@ -126,6 +126,7 @@ public class RoleServiceImpl implements RoleService { | ||
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | @Override | 128 | @Override |
| 129 | + @Transactional | ||
| 129 | public Long createRole(RoleCreateReqVO reqVO, Integer type) { | 130 | public Long createRole(RoleCreateReqVO reqVO, Integer type) { |
| 130 | // 校验角色 | 131 | // 校验角色 |
| 131 | checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null); | 132 | checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null); |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordService.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.service.sensitiveword; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordCreateReqVO; | ||
| 5 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordExportReqVO; | ||
| 6 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordPageReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordUpdateReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; | ||
| 9 | + | ||
| 10 | +import javax.validation.Valid; | ||
| 11 | +import java.util.List; | ||
| 12 | +import java.util.Set; | ||
| 13 | + | ||
| 14 | +/** | ||
| 15 | + * 敏感词 Service 接口 | ||
| 16 | + * | ||
| 17 | + * @author 永不言败 | ||
| 18 | + */ | ||
| 19 | +public interface SensitiveWordService { | ||
| 20 | + | ||
| 21 | + /** | ||
| 22 | + * 初始化本地缓存 | ||
| 23 | + */ | ||
| 24 | + void initLocalCache(); | ||
| 25 | + | ||
| 26 | + /** | ||
| 27 | + * 创建敏感词 | ||
| 28 | + * | ||
| 29 | + * @param createReqVO 创建信息 | ||
| 30 | + * @return 编号 | ||
| 31 | + */ | ||
| 32 | + Long createSensitiveWord(@Valid SensitiveWordCreateReqVO createReqVO); | ||
| 33 | + | ||
| 34 | + /** | ||
| 35 | + * 更新敏感词 | ||
| 36 | + * | ||
| 37 | + * @param updateReqVO 更新信息 | ||
| 38 | + */ | ||
| 39 | + void updateSensitiveWord(@Valid SensitiveWordUpdateReqVO updateReqVO); | ||
| 40 | + | ||
| 41 | + /** | ||
| 42 | + * 删除敏感词 | ||
| 43 | + * | ||
| 44 | + * @param id 编号 | ||
| 45 | + */ | ||
| 46 | + void deleteSensitiveWord(Long id); | ||
| 47 | + | ||
| 48 | + /** | ||
| 49 | + * 获得敏感词 | ||
| 50 | + * | ||
| 51 | + * @param id 编号 | ||
| 52 | + * @return 敏感词 | ||
| 53 | + */ | ||
| 54 | + SensitiveWordDO getSensitiveWord(Long id); | ||
| 55 | + | ||
| 56 | + /** | ||
| 57 | + * 获得敏感词列表 | ||
| 58 | + * | ||
| 59 | + * @return 敏感词列表 | ||
| 60 | + */ | ||
| 61 | + List<SensitiveWordDO> getSensitiveWordList(); | ||
| 62 | + | ||
| 63 | + /** | ||
| 64 | + * 获得敏感词分页 | ||
| 65 | + * | ||
| 66 | + * @param pageReqVO 分页查询 | ||
| 67 | + * @return 敏感词分页 | ||
| 68 | + */ | ||
| 69 | + PageResult<SensitiveWordDO> getSensitiveWordPage(SensitiveWordPageReqVO pageReqVO); | ||
| 70 | + | ||
| 71 | + /** | ||
| 72 | + * 获得敏感词列表, 用于 Excel 导出 | ||
| 73 | + * | ||
| 74 | + * @param exportReqVO 查询条件 | ||
| 75 | + * @return 敏感词列表 | ||
| 76 | + */ | ||
| 77 | + List<SensitiveWordDO> getSensitiveWordList(SensitiveWordExportReqVO exportReqVO); | ||
| 78 | + | ||
| 79 | + /** | ||
| 80 | + * 获得所有敏感词的标签数组 | ||
| 81 | + * | ||
| 82 | + * @return 标签数组 | ||
| 83 | + */ | ||
| 84 | + Set<String> getSensitiveWordTags(); | ||
| 85 | + | ||
| 86 | + /** | ||
| 87 | + * 获得文本所包含的不合法的敏感词数组 | ||
| 88 | + * | ||
| 89 | + * @param text 文本 | ||
| 90 | + * @param tags 标签数组 | ||
| 91 | + * @return 不合法的敏感词数组 | ||
| 92 | + */ | ||
| 93 | + List<String> validateText(String text, List<String> tags); | ||
| 94 | + | ||
| 95 | + /** | ||
| 96 | + * 判断文本是否包含敏感词 | ||
| 97 | + * | ||
| 98 | + * @param text 文本 | ||
| 99 | + * @param tags 表述数组 | ||
| 100 | + * @return 是否包含 | ||
| 101 | + */ | ||
| 102 | + boolean isTextValid(String text, List<String> tags); | ||
| 103 | + | ||
| 104 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.service.sensitiveword; | ||
| 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.common.util.collection.CollectionUtils; | ||
| 7 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordCreateReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordExportReqVO; | ||
| 9 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordPageReqVO; | ||
| 10 | +import cn.iocoder.yudao.module.system.controller.admin.sensitiveword.vo.SensitiveWordUpdateReqVO; | ||
| 11 | +import cn.iocoder.yudao.module.system.convert.sensitiveword.SensitiveWordConvert; | ||
| 12 | +import cn.iocoder.yudao.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; | ||
| 13 | +import cn.iocoder.yudao.module.system.dal.mysql.sensitiveword.SensitiveWordMapper; | ||
| 14 | +import cn.iocoder.yudao.module.system.mq.producer.sensitiveword.SensitiveWordProducer; | ||
| 15 | +import cn.iocoder.yudao.module.system.util.collection.SimpleTrie; | ||
| 16 | +import com.google.common.collect.HashMultimap; | ||
| 17 | +import com.google.common.collect.Multimap; | ||
| 18 | +import lombok.Getter; | ||
| 19 | +import lombok.extern.slf4j.Slf4j; | ||
| 20 | +import org.springframework.scheduling.annotation.Scheduled; | ||
| 21 | +import org.springframework.stereotype.Service; | ||
| 22 | +import org.springframework.validation.annotation.Validated; | ||
| 23 | + | ||
| 24 | +import javax.annotation.PostConstruct; | ||
| 25 | +import javax.annotation.Resource; | ||
| 26 | +import java.util.*; | ||
| 27 | + | ||
| 28 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 29 | +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SENSITIVE_WORD_EXISTS; | ||
| 30 | +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SENSITIVE_WORD_NOT_EXISTS; | ||
| 31 | + | ||
| 32 | +/** | ||
| 33 | + * 敏感词 Service 实现类 | ||
| 34 | + * | ||
| 35 | + * @author 永不言败 | ||
| 36 | + */ | ||
| 37 | +@Service | ||
| 38 | +@Slf4j | ||
| 39 | +@Validated | ||
| 40 | +public class SensitiveWordServiceImpl implements SensitiveWordService { | ||
| 41 | + | ||
| 42 | + /** | ||
| 43 | + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 | ||
| 44 | + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 | ||
| 45 | + */ | ||
| 46 | + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; | ||
| 47 | + | ||
| 48 | + /** | ||
| 49 | + * 敏感词标签缓存 | ||
| 50 | + * key:敏感词编号 {@link SensitiveWordDO#getId()} | ||
| 51 | + * <p> | ||
| 52 | + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 | ||
| 53 | + */ | ||
| 54 | + @Getter | ||
| 55 | + private volatile Set<String> sensitiveWordTagsCache = Collections.emptySet(); | ||
| 56 | + | ||
| 57 | + /** | ||
| 58 | + * 缓存敏感词的最大更新时间,用于后续的增量轮询,判断是否有更新 | ||
| 59 | + */ | ||
| 60 | + @Getter | ||
| 61 | + private volatile Date maxUpdateTime; | ||
| 62 | + | ||
| 63 | + @Resource | ||
| 64 | + private SensitiveWordMapper sensitiveWordMapper; | ||
| 65 | + | ||
| 66 | + @Resource | ||
| 67 | + private SensitiveWordProducer sensitiveWordProducer; | ||
| 68 | + | ||
| 69 | + /** | ||
| 70 | + * 默认的敏感词的字典树,包含所有敏感词 | ||
| 71 | + */ | ||
| 72 | + @Getter | ||
| 73 | + private volatile SimpleTrie defaultSensitiveWordTrie = new SimpleTrie(Collections.emptySet()); | ||
| 74 | + /** | ||
| 75 | + * 标签与敏感词的字段数的映射 | ||
| 76 | + */ | ||
| 77 | + @Getter | ||
| 78 | + private volatile Map<String, SimpleTrie> tagSensitiveWordTries = Collections.emptyMap(); | ||
| 79 | + | ||
| 80 | + /** | ||
| 81 | + * 初始化缓存 | ||
| 82 | + */ | ||
| 83 | + @Override | ||
| 84 | + @PostConstruct | ||
| 85 | + public void initLocalCache() { | ||
| 86 | + // 获取敏感词列表,如果有更新 | ||
| 87 | + List<SensitiveWordDO> sensitiveWordList = loadSensitiveWordIfUpdate(maxUpdateTime); | ||
| 88 | + if (CollUtil.isEmpty(sensitiveWordList)) { | ||
| 89 | + return; | ||
| 90 | + } | ||
| 91 | + | ||
| 92 | + // 写入 sensitiveWordTagsCache 缓存 | ||
| 93 | + Set<String> tags = new HashSet<>(); | ||
| 94 | + sensitiveWordList.forEach(word -> tags.addAll(word.getTags())); | ||
| 95 | + sensitiveWordTagsCache = tags; | ||
| 96 | + // 写入 defaultSensitiveWordTrie、tagSensitiveWordTries 缓存 | ||
| 97 | + initSensitiveWordTrie(sensitiveWordList); | ||
| 98 | + // 写入 maxUpdateTime 最大更新时间 | ||
| 99 | + maxUpdateTime = CollectionUtils.getMaxValue(sensitiveWordList, SensitiveWordDO::getUpdateTime); | ||
| 100 | + log.info("[initLocalCache][初始化 敏感词 数量为 {}]", sensitiveWordList.size()); | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + private void initSensitiveWordTrie(List<SensitiveWordDO> wordDOs) { | ||
| 104 | + // 过滤禁用的敏感词 | ||
| 105 | + wordDOs = CollectionUtils.filterList(wordDOs, word -> word.getStatus().equals(CommonStatusEnum.ENABLE.getStatus())); | ||
| 106 | + | ||
| 107 | + // 初始化默认的 defaultSensitiveWordTrie | ||
| 108 | + this.defaultSensitiveWordTrie = new SimpleTrie(CollectionUtils.convertList(wordDOs, SensitiveWordDO::getName)); | ||
| 109 | + | ||
| 110 | + // 初始化 tagSensitiveWordTries | ||
| 111 | + Multimap<String, String> tagWords = HashMultimap.create(); | ||
| 112 | + for (SensitiveWordDO word : wordDOs) { | ||
| 113 | + if (CollUtil.isEmpty(word.getTags())) { | ||
| 114 | + continue; | ||
| 115 | + } | ||
| 116 | + word.getTags().forEach(tag -> tagWords.put(tag, word.getName())); | ||
| 117 | + } | ||
| 118 | + // 添加到 tagSensitiveWordTries 中 | ||
| 119 | + Map<String, SimpleTrie> tagSensitiveWordTries = new HashMap<>(); | ||
| 120 | + tagWords.asMap().forEach((tag, words) -> tagSensitiveWordTries.put(tag, new SimpleTrie(words))); | ||
| 121 | + this.tagSensitiveWordTries = tagSensitiveWordTries; | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) | ||
| 125 | + public void schedulePeriodicRefresh() { | ||
| 126 | + initLocalCache(); | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + /** | ||
| 130 | + * 如果敏感词发生变化,从数据库中获取最新的全量敏感词。 | ||
| 131 | + * 如果未发生变化,则返回空 | ||
| 132 | + * | ||
| 133 | + * @param maxUpdateTime 当前敏感词的最大更新时间 | ||
| 134 | + * @return 敏感词列表 | ||
| 135 | + */ | ||
| 136 | + private List<SensitiveWordDO> loadSensitiveWordIfUpdate(Date maxUpdateTime) { | ||
| 137 | + // 第一步,判断是否要更新。 | ||
| 138 | + // 如果更新时间为空,说明 DB 一定有新数据 | ||
| 139 | + if (maxUpdateTime == null) { | ||
| 140 | + log.info("[loadSensitiveWordIfUpdate][首次加载全量敏感词]"); | ||
| 141 | + } else { // 判断数据库中是否有更新的敏感词 | ||
| 142 | + if (sensitiveWordMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) { | ||
| 143 | + return null; | ||
| 144 | + } | ||
| 145 | + log.info("[loadSensitiveWordIfUpdate][增量加载全量敏感词]"); | ||
| 146 | + } | ||
| 147 | + // 第二步,如果有更新,则从数据库加载所有敏感词 | ||
| 148 | + return sensitiveWordMapper.selectList(); | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + @Override | ||
| 152 | + public Long createSensitiveWord(SensitiveWordCreateReqVO createReqVO) { | ||
| 153 | + // 校验唯一性 | ||
| 154 | + checkSensitiveWordNameUnique(null, createReqVO.getName()); | ||
| 155 | + // 插入 | ||
| 156 | + SensitiveWordDO sensitiveWord = SensitiveWordConvert.INSTANCE.convert(createReqVO); | ||
| 157 | + sensitiveWordMapper.insert(sensitiveWord); | ||
| 158 | + // 发送消息,刷新缓存 | ||
| 159 | + sensitiveWordProducer.sendSensitiveWordRefreshMessage(); | ||
| 160 | + return sensitiveWord.getId(); | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + @Override | ||
| 164 | + public void updateSensitiveWord(SensitiveWordUpdateReqVO updateReqVO) { | ||
| 165 | + // 校验唯一性 | ||
| 166 | + checkSensitiveWordExists(updateReqVO.getId()); | ||
| 167 | + checkSensitiveWordNameUnique(updateReqVO.getId(), updateReqVO.getName()); | ||
| 168 | + // 更新 | ||
| 169 | + SensitiveWordDO updateObj = SensitiveWordConvert.INSTANCE.convert(updateReqVO); | ||
| 170 | + sensitiveWordMapper.updateById(updateObj); | ||
| 171 | + // 发送消息,刷新缓存 | ||
| 172 | + sensitiveWordProducer.sendSensitiveWordRefreshMessage(); | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + @Override | ||
| 176 | + public void deleteSensitiveWord(Long id) { | ||
| 177 | + // 校验存在 | ||
| 178 | + checkSensitiveWordExists(id); | ||
| 179 | + // 删除 | ||
| 180 | + sensitiveWordMapper.deleteById(id); | ||
| 181 | + // 发送消息,刷新缓存 | ||
| 182 | + sensitiveWordProducer.sendSensitiveWordRefreshMessage(); | ||
| 183 | + } | ||
| 184 | + | ||
| 185 | + private void checkSensitiveWordNameUnique(Long id, String name) { | ||
| 186 | + SensitiveWordDO word = sensitiveWordMapper.selectByName(name); | ||
| 187 | + if (word == null) { | ||
| 188 | + return; | ||
| 189 | + } | ||
| 190 | + // 如果 id 为空,说明不用比较是否为相同 id 的敏感词 | ||
| 191 | + if (id == null) { | ||
| 192 | + throw exception(SENSITIVE_WORD_EXISTS); | ||
| 193 | + } | ||
| 194 | + if (!word.getId().equals(id)) { | ||
| 195 | + throw exception(SENSITIVE_WORD_EXISTS); | ||
| 196 | + } | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + private void checkSensitiveWordExists(Long id) { | ||
| 200 | + if (sensitiveWordMapper.selectById(id) == null) { | ||
| 201 | + throw exception(SENSITIVE_WORD_NOT_EXISTS); | ||
| 202 | + } | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + @Override | ||
| 206 | + public SensitiveWordDO getSensitiveWord(Long id) { | ||
| 207 | + return sensitiveWordMapper.selectById(id); | ||
| 208 | + } | ||
| 209 | + | ||
| 210 | + @Override | ||
| 211 | + public List<SensitiveWordDO> getSensitiveWordList() { | ||
| 212 | + return sensitiveWordMapper.selectList(); | ||
| 213 | + } | ||
| 214 | + | ||
| 215 | + @Override | ||
| 216 | + public PageResult<SensitiveWordDO> getSensitiveWordPage(SensitiveWordPageReqVO pageReqVO) { | ||
| 217 | + return sensitiveWordMapper.selectPage(pageReqVO); | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + @Override | ||
| 221 | + public List<SensitiveWordDO> getSensitiveWordList(SensitiveWordExportReqVO exportReqVO) { | ||
| 222 | + return sensitiveWordMapper.selectList(exportReqVO); | ||
| 223 | + } | ||
| 224 | + | ||
| 225 | + @Override | ||
| 226 | + public Set<String> getSensitiveWordTags() { | ||
| 227 | + return sensitiveWordTagsCache; | ||
| 228 | + } | ||
| 229 | + | ||
| 230 | + @Override | ||
| 231 | + public List<String> validateText(String text, List<String> tags) { | ||
| 232 | + if (CollUtil.isEmpty(tags)) { | ||
| 233 | + return defaultSensitiveWordTrie.validate(text); | ||
| 234 | + } | ||
| 235 | + // 有标签的情况 | ||
| 236 | + Set<String> result = new HashSet<>(); | ||
| 237 | + tags.forEach(tag -> { | ||
| 238 | + SimpleTrie trie = tagSensitiveWordTries.get(tag); | ||
| 239 | + if (trie == null) { | ||
| 240 | + return; | ||
| 241 | + } | ||
| 242 | + result.addAll(trie.validate(text)); | ||
| 243 | + }); | ||
| 244 | + return new ArrayList<>(result); | ||
| 245 | + } | ||
| 246 | + | ||
| 247 | + @Override | ||
| 248 | + public boolean isTextValid(String text, List<String> tags) { | ||
| 249 | + if (CollUtil.isEmpty(tags)) { | ||
| 250 | + return defaultSensitiveWordTrie.isValid(text); | ||
| 251 | + } | ||
| 252 | + // 有标签的情况 | ||
| 253 | + for (String tag : tags) { | ||
| 254 | + SimpleTrie trie = tagSensitiveWordTries.get(tag); | ||
| 255 | + if (trie == null) { | ||
| 256 | + continue; | ||
| 257 | + } | ||
| 258 | + if (!trie.isValid(text)) { | ||
| 259 | + return false; | ||
| 260 | + } | ||
| 261 | + } | ||
| 262 | + return true; | ||
| 263 | + } | ||
| 264 | + | ||
| 265 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/util/collection/SimpleTrie.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.util.collection; | ||
| 2 | + | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 4 | + | ||
| 5 | +import java.util.*; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * 基于前缀树,实现敏感词的校验 | ||
| 9 | + * <p> | ||
| 10 | + * 相比 Apache Common 提供的 PatriciaTrie 来说,性能可能会更加好一些。 | ||
| 11 | + * | ||
| 12 | + * @author 芋道源码 | ||
| 13 | + */ | ||
| 14 | +@SuppressWarnings("unchecked") | ||
| 15 | +public class SimpleTrie { | ||
| 16 | + | ||
| 17 | + /** | ||
| 18 | + * 一个敏感词结束后对应的 key | ||
| 19 | + */ | ||
| 20 | + private static final Character CHARACTER_END = '\0'; | ||
| 21 | + | ||
| 22 | + /** | ||
| 23 | + * 使用敏感词,构建的前缀树 | ||
| 24 | + */ | ||
| 25 | + private final Map<Character, Object> children; | ||
| 26 | + | ||
| 27 | + /** | ||
| 28 | + * 基于字符串,构建前缀树 | ||
| 29 | + * | ||
| 30 | + * @param strs 字符串数组 | ||
| 31 | + */ | ||
| 32 | + public SimpleTrie(Collection<String> strs) { | ||
| 33 | + children = new HashMap<>(); | ||
| 34 | + // 构建树 | ||
| 35 | + CollUtil.sort(strs, String::compareTo); // 排序,优先使用较短的前缀 | ||
| 36 | + for (String str : strs) { | ||
| 37 | + Map<Character, Object> child = children; | ||
| 38 | + // 遍历每个字符 | ||
| 39 | + for (Character c : str.toCharArray()) { | ||
| 40 | + // 如果已经到达结束,就没必要在添加更长的敏感词。 | ||
| 41 | + // 例如说,有两个敏感词是:吃饭啊、吃饭。输入一句话是 “我要吃饭啊”,则只要匹配到 “吃饭” 这个敏感词即可。 | ||
| 42 | + if (child.containsKey(CHARACTER_END)) { | ||
| 43 | + break; | ||
| 44 | + } | ||
| 45 | + if (!child.containsKey(c)) { | ||
| 46 | + child.put(c, new HashMap<>()); | ||
| 47 | + } | ||
| 48 | + child = (Map<Character, Object>) child.get(c); | ||
| 49 | + } | ||
| 50 | + // 结束 | ||
| 51 | + child.put(CHARACTER_END, null); | ||
| 52 | + } | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + /** | ||
| 56 | + * 验证文本是否合法,即不包含敏感词 | ||
| 57 | + * | ||
| 58 | + * @param text 文本 | ||
| 59 | + * @return 是否 ok | ||
| 60 | + */ | ||
| 61 | + public boolean isValid(String text) { | ||
| 62 | + // 遍历 text,使用每一个 [i, n) 段的字符串,使用 children 前缀树匹配,是否包含敏感词 | ||
| 63 | + for (int i = 0; i < text.length() - 1; i++) { | ||
| 64 | + Map<Character, Object> child = (Map<Character, Object>) children.get(text.charAt(i)); | ||
| 65 | + if (child == null) { | ||
| 66 | + continue; | ||
| 67 | + } | ||
| 68 | + boolean ok = recursion(text, i + 1, child); | ||
| 69 | + if (!ok) { | ||
| 70 | + return false; | ||
| 71 | + } | ||
| 72 | + } | ||
| 73 | + return true; | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + /** | ||
| 77 | + * 验证文本从指定位置开始,是否包含某个敏感词 | ||
| 78 | + * | ||
| 79 | + * @param text 文本 | ||
| 80 | + * @param index 开始位置 | ||
| 81 | + * @param child 节点(当前遍历到的) | ||
| 82 | + * @return 是否包含 | ||
| 83 | + */ | ||
| 84 | + private boolean recursion(String text, int index, Map<Character, Object> child) { | ||
| 85 | + if (index == text.length()) { | ||
| 86 | + return true; | ||
| 87 | + } | ||
| 88 | + child = (Map<Character, Object>) child.get(text.charAt(index)); | ||
| 89 | + return child == null || !child.containsKey(CHARACTER_END) && recursion(text, ++index, child); | ||
| 90 | + } | ||
| 91 | + | ||
| 92 | + /** | ||
| 93 | + * 获得文本所包含的不合法的敏感词 | ||
| 94 | + * | ||
| 95 | + * 注意,才当即最短匹配原则。例如说:当敏感词存在 “煞笔”,“煞笔二货 ”时,只会返回 “煞笔”。 | ||
| 96 | + * | ||
| 97 | + * @param text 文本 | ||
| 98 | + * @return 匹配的敏感词 | ||
| 99 | + */ | ||
| 100 | + public List<String> validate(String text) { | ||
| 101 | + Set<String> results = new HashSet<>(); | ||
| 102 | + for (int i = 0; i < text.length() - 1; i++) { | ||
| 103 | + Character c = text.charAt(i); | ||
| 104 | + Map<Character, Object> child = (Map<Character, Object>) children.get(c); | ||
| 105 | + if (child == null) { | ||
| 106 | + continue; | ||
| 107 | + } | ||
| 108 | + StringBuilder result = new StringBuilder().append(c); | ||
| 109 | + boolean ok = recursionWithResult(text, i + 1, child, result); | ||
| 110 | + if (!ok) { | ||
| 111 | + results.add(result.toString()); | ||
| 112 | + } | ||
| 113 | + } | ||
| 114 | + return new ArrayList<>(results); | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + /** | ||
| 118 | + * 返回文本从 index 开始的敏感词,并使用 StringBuilder 参数进行返回 | ||
| 119 | + * | ||
| 120 | + * 逻辑和 {@link #recursion(String, int, Map)} 是一致,只是多了 result 返回结果 | ||
| 121 | + * | ||
| 122 | + * @param text 文本 | ||
| 123 | + * @param index 开始未知 | ||
| 124 | + * @param child 节点(当前遍历到的) | ||
| 125 | + * @param result 返回敏感词 | ||
| 126 | + * @return 是否有敏感词 | ||
| 127 | + */ | ||
| 128 | + @SuppressWarnings("unchecked") | ||
| 129 | + private static boolean recursionWithResult(String text, int index, Map<Character, Object> child, StringBuilder result) { | ||
| 130 | + if (index == text.length()) { | ||
| 131 | + return true; | ||
| 132 | + } | ||
| 133 | + Character c = text.charAt(index); | ||
| 134 | + child = (Map<Character, Object>) child.get(c); | ||
| 135 | + if (child == null) { | ||
| 136 | + return true; | ||
| 137 | + } | ||
| 138 | + if (child.containsKey(CHARACTER_END)) { | ||
| 139 | + result.append(c); | ||
| 140 | + return false; | ||
| 141 | + } | ||
| 142 | + return recursionWithResult(text, ++index, child, result.append(c)); | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | +} |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/util/package-info.java
0 → 100644
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/AuthServiceImplTest.java
| @@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.system.service.social.SocialUserService; | @@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.system.service.social.SocialUserService; | ||
| 13 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 13 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 14 | import cn.iocoder.yudao.framework.security.core.LoginUser; | 14 | import cn.iocoder.yudao.framework.security.core.LoginUser; |
| 15 | import cn.iocoder.yudao.framework.test.core.util.AssertUtils; | 15 | import cn.iocoder.yudao.framework.test.core.util.AssertUtils; |
| 16 | -import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; | 16 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 17 | import org.junit.jupiter.api.BeforeEach; | 17 | import org.junit.jupiter.api.BeforeEach; |
| 18 | import org.junit.jupiter.api.Test; | 18 | import org.junit.jupiter.api.Test; |
| 19 | import org.springframework.boot.test.mock.mockito.MockBean; | 19 | import org.springframework.boot.test.mock.mockito.MockBean; |
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/auth/UserSessionServiceImplTest.java
| @@ -15,7 +15,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | @@ -15,7 +15,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 15 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | 15 | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; |
| 16 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 16 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 17 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 17 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 18 | -import cn.iocoder.yudao.module.system.test.BaseDbAndRedisUnitTest; | 18 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest; |
| 19 | import org.junit.jupiter.api.Test; | 19 | import org.junit.jupiter.api.Test; |
| 20 | import org.springframework.boot.test.mock.mockito.MockBean; | 20 | import org.springframework.boot.test.mock.mockito.MockBean; |
| 21 | import org.springframework.context.annotation.Import; | 21 | import org.springframework.context.annotation.Import; |
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/common/CaptchaServiceTest.java
| @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.service.common; | @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.service.common; | ||
| 3 | import cn.iocoder.yudao.module.system.controller.admin.common.vo.CaptchaImageRespVO; | 3 | import cn.iocoder.yudao.module.system.controller.admin.common.vo.CaptchaImageRespVO; |
| 4 | import cn.iocoder.yudao.module.system.dal.redis.common.CaptchaRedisDAO; | 4 | import cn.iocoder.yudao.module.system.dal.redis.common.CaptchaRedisDAO; |
| 5 | import cn.iocoder.yudao.module.system.framework.captcha.config.CaptchaProperties; | 5 | import cn.iocoder.yudao.module.system.framework.captcha.config.CaptchaProperties; |
| 6 | -import cn.iocoder.yudao.module.system.test.BaseRedisUnitTest; | 6 | +import cn.iocoder.yudao.framework.test.core.ut.BaseRedisUnitTest; |
| 7 | import org.junit.jupiter.api.Test; | 7 | import org.junit.jupiter.api.Test; |
| 8 | import org.springframework.context.annotation.Import; | 8 | import org.springframework.context.annotation.Import; |
| 9 | 9 |
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceTest.java
| @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; | @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.system.enums.dept.DeptIdEnum; | ||
| 10 | import cn.iocoder.yudao.module.system.mq.producer.dept.DeptProducer; | 10 | import cn.iocoder.yudao.module.system.mq.producer.dept.DeptProducer; |
| 11 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; | 11 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; |
| 12 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 12 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 13 | -import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; | 13 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 14 | import com.google.common.collect.Multimap; | 14 | import com.google.common.collect.Multimap; |
| 15 | import org.junit.jupiter.api.Test; | 15 | import org.junit.jupiter.api.Test; |
| 16 | import org.springframework.boot.test.mock.mockito.MockBean; | 16 | import org.springframework.boot.test.mock.mockito.MockBean; |
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dept/PostServiceTest.java
| @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportRe | @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostExportRe | ||
| 10 | import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; | 10 | import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO; |
| 11 | import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; | 11 | import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; |
| 12 | import cn.iocoder.yudao.module.system.dal.mysql.dept.PostMapper; | 12 | import cn.iocoder.yudao.module.system.dal.mysql.dept.PostMapper; |
| 13 | -import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; | 13 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 14 | import org.junit.jupiter.api.Test; | 14 | import org.junit.jupiter.api.Test; |
| 15 | import org.springframework.context.annotation.Import; | 15 | import org.springframework.context.annotation.Import; |
| 16 | 16 |
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceTest.java
| @@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.dict.DictDataMapper; | @@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.dict.DictDataMapper; | ||
| 12 | import cn.iocoder.yudao.module.system.mq.producer.dict.DictDataProducer; | 12 | import cn.iocoder.yudao.module.system.mq.producer.dict.DictDataProducer; |
| 13 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; | 13 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; |
| 14 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 14 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 15 | -import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; | 15 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 16 | import com.google.common.collect.ImmutableTable; | 16 | import com.google.common.collect.ImmutableTable; |
| 17 | import org.junit.jupiter.api.Test; | 17 | import org.junit.jupiter.api.Test; |
| 18 | import org.springframework.boot.test.mock.mockito.MockBean; | 18 | import org.springframework.boot.test.mock.mockito.MockBean; |
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceTest.java
| @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; | @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; | ||
| 10 | import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper; | 10 | import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper; |
| 11 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; | 11 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; |
| 12 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 12 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 13 | -import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; | 13 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 14 | import org.junit.jupiter.api.Test; | 14 | import org.junit.jupiter.api.Test; |
| 15 | import org.springframework.boot.test.mock.mockito.MockBean; | 15 | import org.springframework.boot.test.mock.mockito.MockBean; |
| 16 | import org.springframework.context.annotation.Import; | 16 | import org.springframework.context.annotation.Import; |
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/errorcode/ErrorCodeServiceTest.java
| @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.errorcode.ErrorCodeMapper; | @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.errorcode.ErrorCodeMapper; | ||
| 11 | import cn.iocoder.yudao.module.system.enums.errorcode.ErrorCodeTypeEnum; | 11 | import cn.iocoder.yudao.module.system.enums.errorcode.ErrorCodeTypeEnum; |
| 12 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; | 12 | import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; |
| 13 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 13 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 14 | -import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; | 14 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 15 | import org.assertj.core.util.Lists; | 15 | import org.assertj.core.util.Lists; |
| 16 | import org.junit.jupiter.api.Test; | 16 | import org.junit.jupiter.api.Test; |
| 17 | import org.springframework.context.annotation.Import; | 17 | import org.springframework.context.annotation.Import; |
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/LoginLogServiceImplTest.java
| @@ -13,7 +13,7 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | @@ -13,7 +13,7 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | ||
| 13 | import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; | 13 | import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; |
| 14 | import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; | 14 | import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; |
| 15 | import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; | 15 | import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; |
| 16 | -import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; | 16 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 17 | import org.junit.jupiter.api.Test; | 17 | import org.junit.jupiter.api.Test; |
| 18 | import org.springframework.context.annotation.Import; | 18 | import org.springframework.context.annotation.Import; |
| 19 | 19 |
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImplTest.java
| @@ -17,7 +17,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; | @@ -17,7 +17,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; | ||
| 17 | import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; | 17 | import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; |
| 18 | import cn.iocoder.yudao.module.system.enums.common.SexEnum; | 18 | import cn.iocoder.yudao.module.system.enums.common.SexEnum; |
| 19 | import cn.iocoder.yudao.module.system.service.user.AdminUserService; | 19 | import cn.iocoder.yudao.module.system.service.user.AdminUserService; |
| 20 | -import cn.iocoder.yudao.module.system.test.BaseDbUnitTest; | 20 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 21 | import org.junit.jupiter.api.Test; | 21 | import org.junit.jupiter.api.Test; |
| 22 | import org.springframework.boot.test.mock.mockito.MockBean; | 22 | import org.springframework.boot.test.mock.mockito.MockBean; |
| 23 | import org.springframework.context.annotation.Import; | 23 | import org.springframework.context.annotation.Import; |