diff --git a/novalon-manage-api/manage-db/pom.xml b/novalon-manage-api/manage-db/pom.xml index fe7a31b..ed373d7 100644 --- a/novalon-manage-api/manage-db/pom.xml +++ b/novalon-manage-api/manage-db/pom.xml @@ -17,6 +17,16 @@ Database module for Novalon Manage API + + cn.novalon.manage + manage-sys + ${project.version} + + + cn.novalon.manage + manage-notify + ${project.version} + cn.novalon.manage manage-common @@ -26,6 +36,10 @@ org.springframework.boot spring-boot-starter-data-r2dbc + + org.springframework.data + spring-data-r2dbc + org.postgresql r2dbc-postgresql diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/config/RepositoryScanConfig.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/config/RepositoryScanConfig.java new file mode 100644 index 0000000..c501f0d --- /dev/null +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/config/RepositoryScanConfig.java @@ -0,0 +1,9 @@ +package cn.novalon.manage.db.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan(basePackages = "cn.novalon.manage.db.repository") +public class RepositoryScanConfig { +} \ No newline at end of file diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/DictionaryConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/DictionaryConverter.java index 5aa4922..7eae1bc 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/DictionaryConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/DictionaryConverter.java @@ -1,12 +1,18 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.Dictionary; +import cn.novalon.manage.sys.core.domain.Dictionary; import cn.novalon.manage.db.entity.DictionaryEntity; import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 字典实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component public class DictionaryConverter { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/OperationLogConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/OperationLogConverter.java index 17726a7..3506ff3 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/OperationLogConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/OperationLogConverter.java @@ -1,12 +1,19 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.OperationLog; +import cn.novalon.manage.sys.core.domain.OperationLog; import cn.novalon.manage.db.entity.OperationLogEntity; + import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 操作日志实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component public class OperationLogConverter { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysConfigConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysConfigConverter.java index 92d255f..9971a93 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysConfigConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysConfigConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysConfig; +import cn.novalon.manage.sys.core.domain.SysConfig; import cn.novalon.manage.db.entity.SysConfigEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 系统配置实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysConfigConverter { public SysConfig toDomain(SysConfigEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysDictDataConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysDictDataConverter.java index 78f8a6d..5d744e1 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysDictDataConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysDictDataConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysDictData; +import cn.novalon.manage.sys.core.domain.SysDictData; import cn.novalon.manage.db.entity.SysDictDataEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 字典数据实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysDictDataConverter { public SysDictData toDomain(SysDictDataEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysDictTypeConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysDictTypeConverter.java index f081131..8389e3f 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysDictTypeConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysDictTypeConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysDictType; +import cn.novalon.manage.sys.core.domain.SysDictType; import cn.novalon.manage.db.entity.SysDictTypeEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 字典类型实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysDictTypeConverter { public SysDictType toDomain(SysDictTypeEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysExceptionLogConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysExceptionLogConverter.java index b78dac2..629bb94 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysExceptionLogConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysExceptionLogConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysExceptionLog; +import cn.novalon.manage.sys.core.domain.SysExceptionLog; import cn.novalon.manage.db.entity.SysExceptionLogEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 异常日志实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysExceptionLogConverter { public SysExceptionLog toDomain(SysExceptionLogEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysFileConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysFileConverter.java index 6d82616..d1349fa 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysFileConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysFileConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysFile; +import cn.novalon.manage.sys.core.domain.SysFile; import cn.novalon.manage.db.entity.SysFileEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 文件实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysFileConverter { public SysFile toDomain(SysFileEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysLoginLogConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysLoginLogConverter.java index f41c4c0..d100f21 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysLoginLogConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysLoginLogConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysLoginLog; +import cn.novalon.manage.sys.core.domain.SysLoginLog; import cn.novalon.manage.db.entity.SysLoginLogEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 登录日志实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysLoginLogConverter { public SysLoginLog toDomain(SysLoginLogEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysMenuConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysMenuConverter.java index b194701..3fe744e 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysMenuConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysMenuConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysMenu; +import cn.novalon.manage.sys.core.domain.SysMenu; import cn.novalon.manage.db.entity.SysMenuEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 菜单实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysMenuConverter { public SysMenu toDomain(SysMenuEntity entity) { @@ -25,6 +30,8 @@ public class SysMenuConverter { domain.setPerms(entity.getPerms()); domain.setComponent(entity.getComponent()); domain.setStatus(entity.getStatus()); + domain.setCreateBy(entity.getCreateBy()); + domain.setUpdateBy(entity.getUpdateBy()); domain.setCreatedAt(entity.getCreatedAt()); domain.setUpdatedAt(entity.getUpdatedAt()); domain.setDeletedAt(entity.getDeletedAt()); @@ -44,6 +51,8 @@ public class SysMenuConverter { entity.setPerms(domain.getPerms()); entity.setComponent(domain.getComponent()); entity.setStatus(domain.getStatus()); + entity.setCreateBy(domain.getCreateBy()); + entity.setUpdateBy(domain.getUpdateBy()); entity.setCreatedAt(domain.getCreatedAt()); entity.setUpdatedAt(domain.getUpdatedAt()); entity.setDeletedAt(domain.getDeletedAt()); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysNoticeConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysNoticeConverter.java index 856881e..a4c3842 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysNoticeConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysNoticeConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysNotice; +import cn.novalon.manage.notify.core.domain.SysNotice; import cn.novalon.manage.db.entity.SysNoticeEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 通知公告实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysNoticeConverter { public SysNotice toDomain(SysNoticeEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysRoleConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysRoleConverter.java index aee085b..2eccf4e 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysRoleConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysRoleConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysRole; +import cn.novalon.manage.sys.core.domain.SysRole; import cn.novalon.manage.db.entity.SysRoleEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 角色实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysRoleConverter { public SysRole toDomain(SysRoleEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysUserConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysUserConverter.java index a4ee5cb..09a5132 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysUserConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysUserConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysUser; +import cn.novalon.manage.sys.core.domain.SysUser; import cn.novalon.manage.db.entity.SysUserEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 用户实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysUserConverter { public SysUser toDomain(SysUserEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysUserMessageConverter.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysUserMessageConverter.java index cd41aca..02bf9ce 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysUserMessageConverter.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/converter/SysUserMessageConverter.java @@ -1,6 +1,6 @@ package cn.novalon.manage.db.converter; -import cn.novalon.manage.common.domain.SysUserMessage; +import cn.novalon.manage.sys.core.domain.SysUserMessage; import cn.novalon.manage.db.entity.SysUserMessageEntity; import org.springframework.stereotype.Component; @@ -8,8 +8,13 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; +/** + * 用户消息实体转换器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component - public class SysUserMessageConverter { public SysUserMessage toDomain(SysUserMessageEntity entity) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/DictionaryDao.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/DictionaryDao.java index 91b39b3..ddcabba 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/DictionaryDao.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/DictionaryDao.java @@ -6,6 +6,12 @@ import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典数据访问接口 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public interface DictionaryDao extends R2dbcRepository { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/QueryField.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/QueryField.java index 96ad3cf..b7733c3 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/QueryField.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/QueryField.java @@ -6,11 +6,11 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * @author zhangxiang - * @version 1.0 - * @description 查询字段注解 - * @date 2026/03/11 - **/ + * 查询字段注解 + * + * @author 张翔 + * @date 2026-03-13 + */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface QueryField { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/QueryUtil.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/QueryUtil.java index 26d7209..8c4cc55 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/QueryUtil.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/QueryUtil.java @@ -15,11 +15,11 @@ import java.util.Collection; import java.util.List; /** - * @author zhangxiang - * @version 1.0 - * @description 查询工具类 - * @date 2026/03/11 - **/ + * 查询工具类 + * + * @author 张翔 + * @date 2026-03-13 + */ public class QueryUtil { private static final Logger log = LoggerFactory.getLogger(QueryUtil.class); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/SysUserDao.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/SysUserDao.java index 4b438a4..c15f1f3 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/SysUserDao.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/dao/SysUserDao.java @@ -7,6 +7,12 @@ import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 用户数据访问接口 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public interface SysUserDao extends R2dbcRepository { @@ -23,4 +29,6 @@ public interface SysUserDao extends R2dbcRepository { Flux findByDeletedAtIsNull(Sort sort); Mono countByDeletedAtIsNull(); + + Flux findByRoleId(Long roleId); } \ No newline at end of file diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/BaseEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/BaseEntity.java index d27d4a7..5a146b3 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/BaseEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/BaseEntity.java @@ -7,6 +7,12 @@ import org.springframework.data.relational.core.mapping.Column; import java.time.LocalDateTime; +/** + * 数据库实体基类 + * + * @author 张翔 + * @date 2026-03-13 + */ public abstract class BaseEntity { @Id diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/DictionaryEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/DictionaryEntity.java index 8b1aa14..b86d42b 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/DictionaryEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/DictionaryEntity.java @@ -6,6 +6,12 @@ import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; +/** + * 字典数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("sys_dictionary") public class DictionaryEntity { @Id diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/OperationLogEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/OperationLogEntity.java index 71e4dc7..06a5807 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/OperationLogEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/OperationLogEntity.java @@ -3,6 +3,12 @@ package cn.novalon.manage.db.entity; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; +/** + * 操作日志数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("operation_log") public class OperationLogEntity extends BaseEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysConfigEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysConfigEntity.java index 030d4bf..5ce6cd5 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysConfigEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysConfigEntity.java @@ -6,6 +6,12 @@ import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; +/** + * 系统配置数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("sys_config") public class SysConfigEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysDictDataEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysDictDataEntity.java index 7b61250..a5c3c59 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysDictDataEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysDictDataEntity.java @@ -6,6 +6,12 @@ import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; +/** + * 字典数据数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("sys_dict_data") public class SysDictDataEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysDictTypeEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysDictTypeEntity.java index c9fe13a..0df839b 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysDictTypeEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysDictTypeEntity.java @@ -6,6 +6,12 @@ import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; +/** + * 字典类型数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("sys_dict_type") public class SysDictTypeEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysExceptionLogEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysExceptionLogEntity.java index 54e02fa..6f2ca29 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysExceptionLogEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysExceptionLogEntity.java @@ -6,6 +6,12 @@ import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; +/** + * 异常日志数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("sys_exception_log") public class SysExceptionLogEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysFileEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysFileEntity.java index 769451c..dad8adb 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysFileEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysFileEntity.java @@ -6,6 +6,12 @@ import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; +/** + * 文件管理数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("sys_file") public class SysFileEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysLoginLogEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysLoginLogEntity.java index d989398..4bb4bd3 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysLoginLogEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysLoginLogEntity.java @@ -6,6 +6,12 @@ import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; +/** + * 登录日志数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("sys_login_log") public class SysLoginLogEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysMenuEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysMenuEntity.java index 7b57b75..405bfa8 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysMenuEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysMenuEntity.java @@ -3,7 +3,13 @@ package cn.novalon.manage.db.entity; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; -@Table("sys_menu") +/** + * 菜单数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ +@Table("menus") public class SysMenuEntity extends BaseEntity { @Column("menu_name") @@ -25,7 +31,7 @@ public class SysMenuEntity extends BaseEntity { private String component; @Column("status") - private String status; + private Integer status; public String getMenuName() { return menuName; @@ -75,11 +81,11 @@ public class SysMenuEntity extends BaseEntity { this.component = component; } - public String getStatus() { + public Integer getStatus() { return status; } - public void setStatus(String status) { + public void setStatus(Integer status) { this.status = status; } } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysMenuQueryCriteria.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysMenuQueryCriteria.java index 66c9b91..af9465c 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysMenuQueryCriteria.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysMenuQueryCriteria.java @@ -4,11 +4,11 @@ import cn.novalon.manage.common.domain.query.SysMenuQuery; import cn.novalon.manage.db.dao.QueryField; /** - * @author zhangxiang - * @version 1.0 - * @description 菜单查询条件对象 - * @date 2026/03/11 - **/ + * 菜单查询条件对象 + * + * @author 张翔 + * @date 2026-03-13 + */ public class SysMenuQueryCriteria { @QueryField(propName = "menuName", type = QueryField.Type.INNER_LIKE) diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysNoticeEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysNoticeEntity.java index 9b1eb8a..8bc5982 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysNoticeEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysNoticeEntity.java @@ -6,6 +6,12 @@ import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; +/** + * 通知公告数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("sys_notice") public class SysNoticeEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysRoleEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysRoleEntity.java index 3322dfa..524ada8 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysRoleEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysRoleEntity.java @@ -3,6 +3,12 @@ package cn.novalon.manage.db.entity; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; +/** + * 角色数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("roles") public class SysRoleEntity extends BaseEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysRoleQueryCriteria.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysRoleQueryCriteria.java index 7e9f882..eb62520 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysRoleQueryCriteria.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysRoleQueryCriteria.java @@ -1,14 +1,14 @@ package cn.novalon.manage.db.entity; -import cn.novalon.manage.common.domain.query.SysRoleQuery; +import cn.novalon.manage.sys.core.query.SysRoleQuery; import cn.novalon.manage.db.dao.QueryField; /** - * @author zhangxiang - * @version 1.0 - * @description 角色查询条件对象 - * @date 2026/03/11 - **/ + * 角色查询条件对象 + * + * @author 张翔 + * @date 2026-03-13 + */ public class SysRoleQueryCriteria { @QueryField(propName = "roleName", type = QueryField.Type.INNER_LIKE) diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserEntity.java index db61948..c4b1c55 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserEntity.java @@ -3,6 +3,12 @@ package cn.novalon.manage.db.entity; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; +/** + * 用户数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("users") public class SysUserEntity extends BaseEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserMessageEntity.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserMessageEntity.java index 31a543e..bcbd16e 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserMessageEntity.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserMessageEntity.java @@ -6,6 +6,12 @@ import org.springframework.data.relational.core.mapping.Table; import java.time.LocalDateTime; +/** + * 用户消息数据库实体类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Table("sys_user_message") public class SysUserMessageEntity { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserQueryCriteria.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserQueryCriteria.java index 77b9627..cd05f6c 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserQueryCriteria.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/entity/SysUserQueryCriteria.java @@ -1,14 +1,14 @@ package cn.novalon.manage.db.entity; -import cn.novalon.manage.common.domain.query.SysUserQuery; +import cn.novalon.manage.sys.core.query.SysUserQuery; import cn.novalon.manage.db.dao.QueryField; /** - * @author zhangxiang - * @version 1.0 - * @description 用户查询条件对象 - * @date 2026/03/11 - **/ + * 用户查询条件对象 + * + * @author 张翔 + * @date 2026-03-13 + */ public class SysUserQueryCriteria { @QueryField(propName = "username", type = QueryField.Type.INNER_LIKE) @@ -23,6 +23,9 @@ public class SysUserQueryCriteria { @QueryField(propName = "status", type = QueryField.Type.EQUAL) private Integer status; + @QueryField(blurry = "username,email", type = QueryField.Type.INNER_LIKE) + private String keyword; + public String getUsername() { return username; } @@ -55,6 +58,14 @@ public class SysUserQueryCriteria { this.status = status; } + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } + /** * 从领域查询对象转换 * @@ -68,5 +79,6 @@ public class SysUserQueryCriteria { this.email = query.getEmail(); this.roleId = query.getRoleId(); this.status = query.getStatus(); + this.keyword = query.getKeyword(); } } diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/DictionaryRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/DictionaryRepository.java index 11caec4..5885560 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/DictionaryRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/DictionaryRepository.java @@ -1,22 +1,30 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.Dictionary; +import cn.novalon.manage.sys.core.domain.Dictionary; +import cn.novalon.manage.sys.core.repository.IDictionaryRepository; import cn.novalon.manage.db.converter.DictionaryConverter; import cn.novalon.manage.db.dao.DictionaryDao; import cn.novalon.manage.db.entity.DictionaryEntity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class DictionaryRepository implements IDictionaryRepository { - @Autowired - private DictionaryDao dictionaryDao; + private final DictionaryDao dictionaryDao; + private final DictionaryConverter dictionaryConverter; - @Autowired - private DictionaryConverter dictionaryConverter; + public DictionaryRepository(DictionaryDao dictionaryDao, DictionaryConverter dictionaryConverter) { + this.dictionaryDao = dictionaryDao; + this.dictionaryConverter = dictionaryConverter; + } @Override public Flux findAll() { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/OperationLogRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/OperationLogRepository.java index 675f701..fae9899 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/OperationLogRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/OperationLogRepository.java @@ -1,24 +1,32 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.OperationLog; +import cn.novalon.manage.sys.core.domain.OperationLog; +import cn.novalon.manage.sys.core.repository.IOperationLogRepository; import cn.novalon.manage.db.converter.OperationLogConverter; import cn.novalon.manage.db.entity.OperationLogEntity; import cn.novalon.manage.db.dao.OperationLogDao; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.LocalDateTime; +/** + * 操作日志仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class OperationLogRepository implements IOperationLogRepository { - @Autowired - private OperationLogDao operationLogDao; + private final OperationLogDao operationLogDao; + private final OperationLogConverter operationLogConverter; - @Autowired - private OperationLogConverter operationLogConverter; + public OperationLogRepository(OperationLogDao operationLogDao, OperationLogConverter operationLogConverter) { + this.operationLogDao = operationLogDao; + this.operationLogConverter = operationLogConverter; + } @Override public Mono findById(Long id) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysConfigRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysConfigRepository.java index ba2be6b..91e0392 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysConfigRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysConfigRepository.java @@ -3,21 +3,29 @@ package cn.novalon.manage.db.repository; import cn.novalon.manage.db.converter.SysConfigConverter; import cn.novalon.manage.db.dao.SysConfigDao; import cn.novalon.manage.db.entity.SysConfigEntity; -import cn.novalon.manage.common.domain.SysConfig; -import org.springframework.beans.factory.annotation.Autowired; +import cn.novalon.manage.sys.core.domain.SysConfig; +import cn.novalon.manage.sys.core.repository.ISysConfigRepository; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 系统配置仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysConfigRepository implements ISysConfigRepository { - @Autowired - private SysConfigDao sysConfigDao; + private final SysConfigDao sysConfigDao; + private final SysConfigConverter sysConfigConverter; - @Autowired - private SysConfigConverter sysConfigConverter; + public SysConfigRepository(SysConfigDao sysConfigDao, SysConfigConverter sysConfigConverter) { + this.sysConfigDao = sysConfigDao; + this.sysConfigConverter = sysConfigConverter; + } @Override public Mono findById(Long id) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysDictDataRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysDictDataRepository.java index 6882bdd..9cc57ce 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysDictDataRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysDictDataRepository.java @@ -1,22 +1,30 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.SysDictData; +import cn.novalon.manage.sys.core.domain.SysDictData; +import cn.novalon.manage.sys.core.repository.ISysDictDataRepository; import cn.novalon.manage.db.converter.SysDictDataConverter; import cn.novalon.manage.db.dao.SysDictDataDao; import cn.novalon.manage.db.entity.SysDictDataEntity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典数据仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysDictDataRepository implements ISysDictDataRepository { - @Autowired - private SysDictDataDao sysDictDataDao; + private final SysDictDataDao sysDictDataDao; + private final SysDictDataConverter sysDictDataConverter; - @Autowired - private SysDictDataConverter sysDictDataConverter; + public SysDictDataRepository(SysDictDataDao sysDictDataDao, SysDictDataConverter sysDictDataConverter) { + this.sysDictDataDao = sysDictDataDao; + this.sysDictDataConverter = sysDictDataConverter; + } @Override public Flux findByDeletedAtIsNull() { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysDictTypeRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysDictTypeRepository.java index f0ad6d1..1bc2747 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysDictTypeRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysDictTypeRepository.java @@ -1,22 +1,30 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.SysDictType; +import cn.novalon.manage.sys.core.domain.SysDictType; +import cn.novalon.manage.sys.core.repository.ISysDictTypeRepository; import cn.novalon.manage.db.converter.SysDictTypeConverter; import cn.novalon.manage.db.dao.SysDictTypeDao; import cn.novalon.manage.db.entity.SysDictTypeEntity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典类型仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysDictTypeRepository implements ISysDictTypeRepository { - @Autowired - private SysDictTypeDao sysDictTypeDao; + private final SysDictTypeDao sysDictTypeDao; + private final SysDictTypeConverter sysDictTypeConverter; - @Autowired - private SysDictTypeConverter sysDictTypeConverter; + public SysDictTypeRepository(SysDictTypeDao sysDictTypeDao, SysDictTypeConverter sysDictTypeConverter) { + this.sysDictTypeDao = sysDictTypeDao; + this.sysDictTypeConverter = sysDictTypeConverter; + } @Override public Flux findByDeletedAtIsNull() { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysExceptionLogRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysExceptionLogRepository.java index 396e6a0..4724c96 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysExceptionLogRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysExceptionLogRepository.java @@ -1,24 +1,32 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.SysExceptionLog; +import cn.novalon.manage.sys.core.domain.SysExceptionLog; +import cn.novalon.manage.sys.core.repository.ISysExceptionLogRepository; import cn.novalon.manage.db.converter.SysExceptionLogConverter; import cn.novalon.manage.db.dao.SysExceptionLogDao; import cn.novalon.manage.db.entity.SysExceptionLogEntity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.LocalDateTime; +/** + * 异常日志仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysExceptionLogRepository implements ISysExceptionLogRepository { - @Autowired - private SysExceptionLogDao sysExceptionLogDao; + private final SysExceptionLogDao sysExceptionLogDao; + private final SysExceptionLogConverter sysExceptionLogConverter; - @Autowired - private SysExceptionLogConverter sysExceptionLogConverter; + public SysExceptionLogRepository(SysExceptionLogDao sysExceptionLogDao, SysExceptionLogConverter sysExceptionLogConverter) { + this.sysExceptionLogDao = sysExceptionLogDao; + this.sysExceptionLogConverter = sysExceptionLogConverter; + } @Override public Flux findAllByOrderByCreateTimeDesc() { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysFileRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysFileRepository.java index 96bd336..eb98207 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysFileRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysFileRepository.java @@ -1,22 +1,30 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.SysFile; +import cn.novalon.manage.sys.core.domain.SysFile; +import cn.novalon.manage.sys.core.repository.ISysFileRepository; import cn.novalon.manage.db.converter.SysFileConverter; import cn.novalon.manage.db.dao.SysFileDao; import cn.novalon.manage.db.entity.SysFileEntity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 文件管理仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysFileRepository implements ISysFileRepository { - @Autowired - private SysFileDao sysFileDao; + private final SysFileDao sysFileDao; + private final SysFileConverter sysFileConverter; - @Autowired - private SysFileConverter sysFileConverter; + public SysFileRepository(SysFileDao sysFileDao, SysFileConverter sysFileConverter) { + this.sysFileDao = sysFileDao; + this.sysFileConverter = sysFileConverter; + } @Override public Flux findByDeletedAtIsNullOrderByCreatedAtDesc() { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysLoginLogRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysLoginLogRepository.java index c889814..a341b15 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysLoginLogRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysLoginLogRepository.java @@ -1,24 +1,32 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.SysLoginLog; +import cn.novalon.manage.sys.core.domain.SysLoginLog; +import cn.novalon.manage.sys.core.repository.ISysLoginLogRepository; import cn.novalon.manage.db.converter.SysLoginLogConverter; import cn.novalon.manage.db.dao.SysLoginLogDao; import cn.novalon.manage.db.entity.SysLoginLogEntity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.LocalDateTime; +/** + * 登录日志仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysLoginLogRepository implements ISysLoginLogRepository { - @Autowired - private SysLoginLogDao sysLoginLogDao; + private final SysLoginLogDao sysLoginLogDao; + private final SysLoginLogConverter sysLoginLogConverter; - @Autowired - private SysLoginLogConverter sysLoginLogConverter; + public SysLoginLogRepository(SysLoginLogDao sysLoginLogDao, SysLoginLogConverter sysLoginLogConverter) { + this.sysLoginLogDao = sysLoginLogDao; + this.sysLoginLogConverter = sysLoginLogConverter; + } @Override public Flux findAllByOrderByLoginTimeDesc() { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysMenuRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysMenuRepository.java index 2dbcc41..2a98ff9 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysMenuRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysMenuRepository.java @@ -1,12 +1,13 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.SysMenu; +import cn.novalon.manage.sys.core.domain.SysMenu; +import cn.novalon.manage.sys.core.repository.ISysMenuRepository; +import cn.novalon.manage.sys.core.query.SysMenuQuery; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; import cn.novalon.manage.db.converter.SysMenuConverter; import cn.novalon.manage.db.dao.SysMenuDao; import cn.novalon.manage.db.entity.SysMenuEntity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.data.relational.core.query.Query; import org.springframework.stereotype.Repository; @@ -15,14 +16,22 @@ import reactor.core.publisher.Mono; import java.util.List; +/** + * 菜单仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysMenuRepository implements ISysMenuRepository { - @Autowired - private SysMenuDao sysMenuDao; + private final SysMenuDao sysMenuDao; + private final SysMenuConverter sysMenuConverter; - @Autowired - private SysMenuConverter sysMenuConverter; + public SysMenuRepository(SysMenuDao sysMenuDao, SysMenuConverter sysMenuConverter) { + this.sysMenuDao = sysMenuDao; + this.sysMenuConverter = sysMenuConverter; + } @Override public Flux findByParentId(Long parentId) { @@ -72,8 +81,27 @@ public class SysMenuRepository implements ISysMenuRepository { } @Override - public Mono> findByQueryWithPagination(Query query, PageRequest pageRequest) { - return Mono.just(new PageResponse<>()); + public Mono> findByQueryWithPagination(SysMenuQuery query, PageRequest pageRequest) { + int page = pageRequest.getPage(); + int size = pageRequest.getSize(); + + return sysMenuDao.count() + .flatMap(count -> { + int totalPages = (int) Math.ceil((double) count / size); + int offset = page * size; + + Flux menuFlux = sysMenuDao.findByDeletedAtIsNull() + .skip(offset) + .take(size); + + return menuFlux.collectList() + .map(menus -> { + List menuList = menus.stream() + .map(sysMenuConverter::toDomain) + .toList(); + return new PageResponse<>(menuList, totalPages, count, page, size); + }); + }); } @Override diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysNoticeRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysNoticeRepository.java index a83abc9..932d4c0 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysNoticeRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysNoticeRepository.java @@ -1,22 +1,30 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.SysNotice; +import cn.novalon.manage.notify.core.domain.SysNotice; +import cn.novalon.manage.notify.core.repository.ISysNoticeRepository; import cn.novalon.manage.db.converter.SysNoticeConverter; import cn.novalon.manage.db.dao.SysNoticeDao; import cn.novalon.manage.db.entity.SysNoticeEntity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 通知公告仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysNoticeRepository implements ISysNoticeRepository { - @Autowired - private SysNoticeDao sysNoticeDao; + private final SysNoticeDao sysNoticeDao; + private final SysNoticeConverter sysNoticeConverter; - @Autowired - private SysNoticeConverter sysNoticeConverter; + public SysNoticeRepository(SysNoticeDao sysNoticeDao, SysNoticeConverter sysNoticeConverter) { + this.sysNoticeDao = sysNoticeDao; + this.sysNoticeConverter = sysNoticeConverter; + } @Override public Flux findByDeletedAtIsNull() { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRoleRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRoleRepository.java index 19a9fe4..e03fd94 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRoleRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysRoleRepository.java @@ -1,26 +1,42 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.SysRole; +import cn.novalon.manage.sys.core.domain.SysRole; +import cn.novalon.manage.sys.core.repository.ISysRoleRepository; +import cn.novalon.manage.sys.core.query.SysRoleQuery; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; import cn.novalon.manage.db.converter.SysRoleConverter; import cn.novalon.manage.db.dao.SysRoleDao; +import cn.novalon.manage.common.dao.QueryUtil; import cn.novalon.manage.db.entity.SysRoleEntity; -import org.springframework.beans.factory.annotation.Autowired; +import cn.novalon.manage.db.entity.SysRoleQueryCriteria; import org.springframework.data.domain.Sort; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.data.relational.core.query.Query; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.List; + +/** + * 角色仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysRoleRepository implements ISysRoleRepository { - @Autowired - private SysRoleDao sysRoleDao; + private final SysRoleDao sysRoleDao; + private final SysRoleConverter sysRoleConverter; + private final R2dbcEntityTemplate r2dbcEntityTemplate; - @Autowired - private SysRoleConverter sysRoleConverter; + public SysRoleRepository(SysRoleDao sysRoleDao, SysRoleConverter sysRoleConverter, R2dbcEntityTemplate r2dbcEntityTemplate) { + this.sysRoleDao = sysRoleDao; + this.sysRoleConverter = sysRoleConverter; + this.r2dbcEntityTemplate = r2dbcEntityTemplate; + } @Override public Mono findById(Long id) { @@ -75,8 +91,37 @@ public class SysRoleRepository implements ISysRoleRepository { } @Override - public Mono> findByQueryWithPagination(Query query, PageRequest pageRequest) { - return Mono.just(new PageResponse<>()); + public Mono> findByQueryWithPagination(SysRoleQuery query, PageRequest pageRequest) { + int page = pageRequest.getPage(); + int size = pageRequest.getSize(); + String sort = pageRequest.getSort(); + String order = pageRequest.getOrder(); + + Sort sortObj = Sort.unsorted(); + if (sort != null && !sort.isEmpty()) { + sortObj = Sort.by(Sort.Direction.fromString(order), sort); + } + + org.springframework.data.domain.PageRequest pageable = org.springframework.data.domain.PageRequest.of(page, + size, sortObj); + + SysRoleQueryCriteria criteria = new SysRoleQueryCriteria(); + criteria.convert(query); + Query dbQuery = QueryUtil.getQuery(criteria); + + return r2dbcEntityTemplate.select(SysRoleEntity.class) + .matching(dbQuery.with(pageable)) + .all() + .collectList() + .zipWith(r2dbcEntityTemplate.count(dbQuery, SysRoleEntity.class)) + .map(tuple -> { + long total = tuple.getT2(); + int totalPages = (int) Math.ceil((double) total / size); + List roleList = tuple.getT1().stream() + .map(sysRoleConverter::toDomain) + .toList(); + return new PageResponse<>(roleList, totalPages, total, page, size); + }); } @Override diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserMessageRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserMessageRepository.java index bbb8633..8821be7 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserMessageRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserMessageRepository.java @@ -1,22 +1,30 @@ package cn.novalon.manage.db.repository; -import cn.novalon.manage.common.domain.SysUserMessage; +import cn.novalon.manage.sys.core.domain.SysUserMessage; +import cn.novalon.manage.sys.core.repository.ISysUserMessageRepository; import cn.novalon.manage.db.converter.SysUserMessageConverter; import cn.novalon.manage.db.entity.SysUserMessageEntity; import cn.novalon.manage.db.dao.SysUserMessageDao; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 用户消息仓储实现类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysUserMessageRepository implements ISysUserMessageRepository { - @Autowired - private SysUserMessageDao sysUserMessageDao; + private final SysUserMessageDao sysUserMessageDao; + private final SysUserMessageConverter sysUserMessageConverter; - @Autowired - private SysUserMessageConverter sysUserMessageConverter; + public SysUserMessageRepository(SysUserMessageDao sysUserMessageDao, SysUserMessageConverter sysUserMessageConverter) { + this.sysUserMessageDao = sysUserMessageDao; + this.sysUserMessageConverter = sysUserMessageConverter; + } @Override public Flux findByUserIdOrderByCreateTimeDesc(Long userId) { diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserRepository.java b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserRepository.java index 5b7108b..f68326d 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserRepository.java +++ b/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/SysUserRepository.java @@ -3,11 +3,15 @@ package cn.novalon.manage.db.repository; import cn.novalon.manage.db.converter.SysUserConverter; import cn.novalon.manage.db.dao.SysUserDao; import cn.novalon.manage.db.entity.SysUserEntity; -import cn.novalon.manage.common.domain.SysUser; +import cn.novalon.manage.db.entity.SysUserQueryCriteria; +import cn.novalon.manage.common.dao.QueryUtil; +import cn.novalon.manage.sys.core.domain.SysUser; +import cn.novalon.manage.sys.core.query.SysUserQuery; +import cn.novalon.manage.sys.core.repository.ISysUserRepository; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.data.relational.core.query.Query; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; @@ -15,14 +19,29 @@ import reactor.core.publisher.Mono; import java.util.List; +/** + * 用户仓储实现类 + * + * 文件定义:用户数据访问层的仓储实现,负责用户数据的持久化操作 + * 涉及业务:用户增删改查、分页查询、条件查询、逻辑删除等数据访问业务 + * 算法:使用R2DBC进行响应式数据库操作,支持分页算法、条件查询算法 + * + * @author 张翔 + * @date 2026-03-13 + */ @Repository public class SysUserRepository implements ISysUserRepository { - @Autowired - private SysUserDao sysUserDao; + private final SysUserDao sysUserDao; + private final SysUserConverter sysUserConverter; + private final R2dbcEntityTemplate r2dbcEntityTemplate; - @Autowired - private SysUserConverter sysUserConverter; + public SysUserRepository(SysUserDao sysUserDao, SysUserConverter sysUserConverter, + R2dbcEntityTemplate r2dbcEntityTemplate) { + this.sysUserDao = sysUserDao; + this.sysUserConverter = sysUserConverter; + this.r2dbcEntityTemplate = r2dbcEntityTemplate; + } @Override public Mono findByUsername(String username) { @@ -90,8 +109,42 @@ public class SysUserRepository implements ISysUserRepository { } @Override - public Mono> findByQueryWithPagination(Query query, PageRequest pageRequest) { - return Mono.just(new PageResponse<>()); + public Mono> findByQueryWithPagination(SysUserQuery query, PageRequest pageRequest) { + int page = pageRequest.getPage(); + int size = pageRequest.getSize(); + String sort = pageRequest.getSort(); + String order = pageRequest.getOrder(); + String keyword = pageRequest.getKeyword(); + + SysUserQuery sysUserQuery = new SysUserQuery(); + sysUserQuery.setKeyword(keyword); + + SysUserQueryCriteria criteria = new SysUserQueryCriteria(); + criteria.convert(sysUserQuery); + + Query queryObj = QueryUtil.getQuery(criteria); + + Sort sortObj = Sort.unsorted(); + if (sort != null && !sort.isEmpty()) { + sortObj = Sort.by(Sort.Direction.fromString(order), sort); + } + + org.springframework.data.domain.PageRequest pageable = org.springframework.data.domain.PageRequest.of(page, + size, sortObj); + + return r2dbcEntityTemplate.select(SysUserEntity.class) + .matching(queryObj.with(pageable)) + .all() + .collectList() + .zipWith(r2dbcEntityTemplate.count(queryObj, SysUserEntity.class)) + .map(tuple -> { + long total = tuple.getT2(); + int totalPages = (int) Math.ceil((double) total / size); + List userList = tuple.getT1().stream() + .map(sysUserConverter::toDomain) + .toList(); + return new PageResponse<>(userList, totalPages, total, page, size); + }); } @Override @@ -139,4 +192,14 @@ public class SysUserRepository implements ISysUserRepository { .flatMap(id -> restoreById(id)) .then(); } + + @Override + public Mono updateRoleIdToNullByRoleId(Long roleId) { + return sysUserDao.findByRoleId(roleId) + .flatMap(entity -> { + entity.setRoleId(null); + return sysUserDao.save(entity); + }) + .then(); + } } \ No newline at end of file diff --git a/novalon-manage-api/manage-notify/src/main/java/cn/novalon/manage/notify/core/domain/SysNotice.java b/novalon-manage-api/manage-notify/src/main/java/cn/novalon/manage/notify/core/domain/SysNotice.java new file mode 100644 index 0000000..2699e86 --- /dev/null +++ b/novalon-manage-api/manage-notify/src/main/java/cn/novalon/manage/notify/core/domain/SysNotice.java @@ -0,0 +1,97 @@ +package cn.novalon.manage.notify.core.domain; + +import java.time.LocalDateTime; + +public class SysNotice { + + private Long id; + private String noticeTitle; + private String noticeType; + private String noticeContent; + private String status; + private String createBy; + private String updateBy; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private LocalDateTime deletedAt; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNoticeTitle() { + return noticeTitle; + } + + public void setNoticeTitle(String noticeTitle) { + this.noticeTitle = noticeTitle; + } + + public String getNoticeType() { + return noticeType; + } + + public void setNoticeType(String noticeType) { + this.noticeType = noticeType; + } + + public String getNoticeContent() { + return noticeContent; + } + + public void setNoticeContent(String noticeContent) { + this.noticeContent = noticeContent; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + } + + public LocalDateTime getDeletedAt() { + return deletedAt; + } + + public void setDeletedAt(LocalDateTime deletedAt) { + this.deletedAt = deletedAt; + } +} diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysNoticeRepository.java b/novalon-manage-api/manage-notify/src/main/java/cn/novalon/manage/notify/core/repository/ISysNoticeRepository.java similarity index 77% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysNoticeRepository.java rename to novalon-manage-api/manage-notify/src/main/java/cn/novalon/manage/notify/core/repository/ISysNoticeRepository.java index 3138e02..f6f27fd 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysNoticeRepository.java +++ b/novalon-manage-api/manage-notify/src/main/java/cn/novalon/manage/notify/core/repository/ISysNoticeRepository.java @@ -1,6 +1,6 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.notify.core.repository; -import cn.novalon.manage.common.domain.SysNotice; +import cn.novalon.manage.notify.core.domain.SysNotice; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -15,4 +15,4 @@ public interface ISysNoticeRepository { Mono save(SysNotice notice); Mono deleteByIdAndDeletedAtIsNull(Long id); -} \ No newline at end of file +} diff --git a/novalon-manage-api/manage-sys/pom.xml b/novalon-manage-api/manage-sys/pom.xml index 8391350..847fed3 100644 --- a/novalon-manage-api/manage-sys/pom.xml +++ b/novalon-manage-api/manage-sys/pom.xml @@ -22,11 +22,6 @@ manage-common ${project.version} - - cn.novalon.manage - manage-db - ${project.version} - org.springframework.boot spring-boot-starter-webflux @@ -53,16 +48,33 @@ reactor-test test + + io.github.resilience4j + resilience4j-spring-boot3 + 2.2.0 + + + io.github.resilience4j + resilience4j-reactor + 2.2.0 + - org.springframework.boot - spring-boot-maven-plugin - - cn.novalon.manage.sys.ManageSysApplication - + org.apache.maven.plugins + maven-jar-plugin + 3.4.2 + + + default-jar + package + + jar + + + org.apache.maven.plugins diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/ManageSysApplication.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/ManageSysApplication.java deleted file mode 100644 index 604a5fe..0000000 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/ManageSysApplication.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.novalon.manage.sys; - -import cn.novalon.manage.common.config.JwtProperties; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories; - -@SpringBootApplication -@EnableConfigurationProperties(JwtProperties.class) -@ComponentScan(basePackages = {"cn.novalon.manage.sys", "cn.novalon.manage.db"}) -@EnableR2dbcRepositories(basePackages = "cn.novalon.manage.db.dao") -public class ManageSysApplication { - public static void main(String[] args) { - SpringApplication.run(ManageSysApplication.class, args); - } -} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/ExceptionLogConfig.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/ExceptionLogConfig.java new file mode 100644 index 0000000..ddbfe15 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/ExceptionLogConfig.java @@ -0,0 +1,21 @@ +package cn.novalon.manage.sys.config; + +import cn.novalon.manage.common.handler.ExceptionLogService; +import cn.novalon.manage.sys.handler.ExceptionLogServiceImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 异常日志配置类 + * + * @author 张翔 + * @date 2026-03-13 + */ +@Configuration +public class ExceptionLogConfig { + + @Bean + public ExceptionLogService exceptionLogService(ExceptionLogServiceImpl exceptionLogServiceImpl) { + return exceptionLogServiceImpl; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/MultipartConfig.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/MultipartConfig.java deleted file mode 100644 index 8b7110f..0000000 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/MultipartConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.novalon.manage.sys.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.codec.multipart.DefaultPartHttpMessageReader; -import org.springframework.http.codec.multipart.MultipartHttpMessageReader; - -@Configuration -public class MultipartConfig { - - @Bean - public MultipartHttpMessageReader multipartHttpMessageReader() { - DefaultPartHttpMessageReader partReader = new DefaultPartHttpMessageReader(); - partReader.setMaxHeadersSize(8192); - partReader.setMaxDiskUsagePerPart(10 * 1024 * 1024); - partReader.setEnableLoggingRequestDetails(true); - return new MultipartHttpMessageReader(partReader); - } -} \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/OpenApiConfig.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/OpenApiConfig.java deleted file mode 100644 index e50384b..0000000 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/OpenApiConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.novalon.manage.sys.config; - -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.servers.Server; -import io.swagger.v3.oas.models.tags.Tag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Arrays; -import java.util.List; - -@Configuration -public class OpenApiConfig { - - @Bean - public OpenAPI customOpenAPI() { - return new OpenAPI() - .info(new Info() - .title("Novalon Manage System API") - .version("1.0.0") - .description("Novalon 管理系统 RESTful API 文档") - .contact(new Contact() - .name("Novalon Team") - .email("support@novalon.cn")) - .license(new License() - .name("Apache 2.0") - .url("https://www.apache.org/licenses/LICENSE-2.0"))) - .servers(List.of( - new Server().url("http://localhost:8080").description("开发环境"), - new Server().url("https://api.novalon.cn").description("生产环境"))) - .tags(Arrays.asList( - new Tag().name("用户管理").description("用户相关操作"), - new Tag().name("角色管理").description("角色相关操作"), - new Tag().name("配置管理").description("系统配置相关操作"), - new Tag().name("字典管理").description("字典数据相关操作"), - new Tag().name("通知管理").description("系统通知相关操作"), - new Tag().name("文件管理").description("文件上传下载相关操作"), - new Tag().name("日志管理").description("操作日志相关操作"), - new Tag().name("认证管理").description("登录认证相关操作"), - new Tag().name("统计信息").description("系统统计相关操作"))); - } -} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/SecurityConfig.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/SecurityConfig.java index fa569da..02d5ee9 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/SecurityConfig.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/SecurityConfig.java @@ -11,6 +11,12 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.server.SecurityWebFilterChain; +/** + * 安全配置类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Configuration @EnableWebFluxSecurity public class SecurityConfig { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/SystemRouter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/SystemRouter.java deleted file mode 100644 index acd863c..0000000 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/SystemRouter.java +++ /dev/null @@ -1,173 +0,0 @@ -package cn.novalon.manage.sys.config; - -import cn.novalon.manage.sys.handler.auth.SysAuthHandler; -import cn.novalon.manage.sys.handler.config.SysConfigHandler; -import cn.novalon.manage.sys.handler.dictionary.DictionaryHandler; -import cn.novalon.manage.sys.handler.dict.SysDictHandler; -import cn.novalon.manage.sys.handler.file.SysFileHandler; -import cn.novalon.manage.sys.handler.log.SysLogHandler; -import cn.novalon.manage.sys.handler.message.SysUserMessageHandler; -import cn.novalon.manage.sys.handler.notice.SysNoticeHandler; -import cn.novalon.manage.sys.handler.role.SysRoleHandler; -import cn.novalon.manage.sys.handler.stats.StatsHandler; -import cn.novalon.manage.sys.handler.user.SysUserHandler; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.ServerResponse; - -import static org.springframework.web.reactive.function.server.RouterFunctions.route; - -@Configuration -public class SystemRouter { - - @Bean - public RouterFunction dictionaryRoutes(DictionaryHandler dictionaryHandler) { - return route() - .GET("/api/dictionaries", dictionaryHandler::getAllDictionaries) - .GET("/api/dictionaries/{id}", dictionaryHandler::getDictionaryById) - .GET("/api/dictionaries/type/{type}", dictionaryHandler::getDictionariesByType) - .GET("/api/dictionaries/check/exists", dictionaryHandler::checkTypeAndCodeExists) - .POST("/api/dictionaries", dictionaryHandler::createDictionary) - .PUT("/api/dictionaries/{id}", dictionaryHandler::updateDictionary) - .DELETE("/api/dictionaries/{id}", dictionaryHandler::deleteDictionary) - .build(); - } - - @Bean - public RouterFunction userRoutes(SysUserHandler userHandler) { - return route() - .GET("/api/users", userHandler::getAllUsers) - .GET("/api/users/page", userHandler::getUsersByPage) - .GET("/api/users/count", userHandler::getUserCount) - .GET("/api/users/{id}", userHandler::getUserById) - .GET("/api/users/username/{username}", userHandler::getUserByUsername) - .POST("/api/users", userHandler::createUser) - .PUT("/api/users/{id}", userHandler::updateUser) - .DELETE("/api/users/{id}", userHandler::deleteUser) - .POST("/api/users/{id}/password", userHandler::changePassword) - .DELETE("/api/users/{id}/logical", userHandler::logicalDeleteUser) - .POST("/api/users/logical-delete", userHandler::logicalDeleteUsers) - .POST("/api/users/{id}/restore", userHandler::restoreUser) - .POST("/api/users/restore", userHandler::restoreUsers) - .GET("/api/users/check/username", userHandler::checkUsernameExists) - .GET("/api/users/check/email", userHandler::checkEmailExists) - .build(); - } - - @Bean - public RouterFunction roleRoutes(SysRoleHandler roleHandler) { - return route() - .GET("/api/roles", roleHandler::getAllRoles) - .GET("/api/roles/page", roleHandler::getRolesByPage) - .GET("/api/roles/count", roleHandler::getRoleCount) - .GET("/api/roles/name/{roleName}", roleHandler::getRoleByName) - .GET("/api/roles/check-name", roleHandler::checkNameExists) - .GET("/api/roles/{id}", roleHandler::getRoleById) - .POST("/api/roles", roleHandler::createRole) - .PUT("/api/roles/{id}", roleHandler::updateRole) - .DELETE("/api/roles/{id}", roleHandler::deleteRole) - .POST("/api/roles/{id}/restore", roleHandler::restoreRole) - .build(); - } - - @Bean - public RouterFunction configRoutes(SysConfigHandler configHandler) { - return route() - .GET("/api/config", configHandler::getAllConfigs) - .GET("/api/config/{id}", configHandler::getConfigById) - .GET("/api/config/key/{configKey}", configHandler::getConfigByKey) - .POST("/api/config", configHandler::createConfig) - .PUT("/api/config/{id}", configHandler::updateConfig) - .DELETE("/api/config/{id}", configHandler::deleteConfig) - .build(); - } - - @Bean - public RouterFunction noticeRoutes(SysNoticeHandler noticeHandler) { - return route() - .GET("/api/notices", noticeHandler::getAllNotices) - .GET("/api/notices/{id}", noticeHandler::getNoticeById) - .GET("/api/notices/status/{status}", noticeHandler::getNoticesByStatus) - .POST("/api/notices", noticeHandler::createNotice) - .PUT("/api/notices/{id}", noticeHandler::updateNotice) - .DELETE("/api/notices/{id}", noticeHandler::deleteNotice) - .build(); - } - - @Bean - public RouterFunction fileRoutes(SysFileHandler fileHandler) { - return route() - .GET("/api/files", fileHandler::getAllFiles) - .GET("/api/files/{id}", fileHandler::getFileById) - .POST("/api/files/upload", fileHandler::uploadFile) - .GET("/api/files/{id}/download", fileHandler::downloadFile) - .GET("/api/files/download/{fileName}", fileHandler::downloadFileByName) - .GET("/api/files/{id}/preview", fileHandler::previewFile) - .GET("/api/files/preview/{fileName}", fileHandler::previewFileByName) - .DELETE("/api/files/{id}", fileHandler::deleteFile) - .build(); - } - - @Bean - public RouterFunction logRoutes(SysLogHandler logHandler) { - return route() - .GET("/api/logs/login", logHandler::getAllLoginLogs) - .GET("/api/logs/login/page", logHandler::getLoginLogsByPage) - .GET("/api/logs/login/count", logHandler::getLoginLogCount) - .GET("/api/logs/login/{id}", logHandler::getLoginLogById) - .POST("/api/logs/login", logHandler::createLoginLog) - .GET("/api/logs/exception", logHandler::getAllExceptionLogs) - .GET("/api/logs/exception/page", logHandler::getExceptionLogsByPage) - .GET("/api/logs/exception/count", logHandler::getExceptionLogCount) - .GET("/api/logs/exception/{id}", logHandler::getExceptionLogById) - .POST("/api/logs/exception", logHandler::createExceptionLog) - .build(); - } - - @Bean - public RouterFunction authRoutes(SysAuthHandler authHandler) { - return route() - .POST("/api/auth/login", authHandler::login) - .POST("/api/auth/register", authHandler::register) - .POST("/api/auth/logout", authHandler::logout) - .build(); - } - - @Bean - public RouterFunction messageRoutes(SysUserMessageHandler messageHandler) { - return route() - .GET("/api/messages/user/{userId}", messageHandler::getMessagesByUser) - .GET("/api/messages/user/{userId}/unread", messageHandler::getUnreadCount) - .GET("/api/messages/user/{userId}/unread/list", messageHandler::getUnreadList) - .POST("/api/messages", messageHandler::createMessage) - .PUT("/api/messages/{id}/read", messageHandler::markAsRead) - .DELETE("/api/messages/{id}", messageHandler::deleteMessage) - .build(); - } - - @Bean - public RouterFunction statsRoutes(StatsHandler statsHandler) { - return route() - .GET("/api/stats/overview", statsHandler::getOverview) - .build(); - } - - @Bean - public RouterFunction dictRoutes(SysDictHandler dictHandler) { - return route() - .GET("/api/dict/types", dictHandler::getAllDictTypes) - .GET("/api/dict/types/{id}", dictHandler::getDictTypeById) - .GET("/api/dict/types/type/{dictType}", dictHandler::getDictTypeByType) - .POST("/api/dict/types", dictHandler::createDictType) - .PUT("/api/dict/types/{id}", dictHandler::updateDictType) - .DELETE("/api/dict/types/{id}", dictHandler::deleteDictType) - .GET("/api/dict/data", dictHandler::getAllDictData) - .GET("/api/dict/data/type/{dictType}", dictHandler::getDictDataByType) - .GET("/api/dict/data/{id}", dictHandler::getDictDataById) - .POST("/api/dict/data", dictHandler::createDictData) - .PUT("/api/dict/data/{id}", dictHandler::updateDictData) - .DELETE("/api/dict/data/{id}", dictHandler::deleteDictData) - .build(); - } -} \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/WebFluxConfig.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/WebFluxConfig.java deleted file mode 100644 index cafa2a4..0000000 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/WebFluxConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.novalon.manage.sys.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.http.codec.ServerCodecConfigurer; -import org.springframework.web.reactive.config.WebFluxConfigurer; - -@Configuration -public class WebFluxConfig implements WebFluxConfigurer { - - @Override - public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { - configurer.defaultCodecs().maxInMemorySize(16 * 1024 * 1024); - } -} \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/WebSocketConfig.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/WebSocketConfig.java index 9c8caca..f44c9ab 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/WebSocketConfig.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/WebSocketConfig.java @@ -3,6 +3,7 @@ package cn.novalon.manage.sys.config; import cn.novalon.manage.sys.websocket.SysWebSocketHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; import org.springframework.web.reactive.HandlerMapping; import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping; import org.springframework.web.reactive.socket.WebSocketHandler; @@ -11,6 +12,12 @@ import org.springframework.web.reactive.socket.server.support.WebSocketHandlerAd import java.util.HashMap; import java.util.Map; +/** + * WebSocket配置类 + * + * @author 张翔 + * @date 2026-03-13 + */ @Configuration public class WebSocketConfig { @@ -20,7 +27,7 @@ public class WebSocketConfig { map.put("/ws", webSocketHandler); SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping(); - handlerMapping.setOrder(1); + handlerMapping.setOrder(Ordered.HIGHEST_PRECEDENCE); handlerMapping.setUrlMap(map); return handlerMapping; } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateMenuCommand.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateMenuCommand.java new file mode 100644 index 0000000..e20a7be --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateMenuCommand.java @@ -0,0 +1,21 @@ +package cn.novalon.manage.sys.core.command; + +/** + * 创建菜单命令对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public record CreateMenuCommand( + Long parentId, + String menuName, + String menuType, + Integer orderNum, + String component, + String perms, + Integer status) { + public static CreateMenuCommand of(Long parentId, String menuName, String menuType, Integer orderNum, + String component, String perms, Integer status) { + return new CreateMenuCommand(parentId, menuName, menuType, orderNum, component, perms, status); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateNoticeCommand.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateNoticeCommand.java new file mode 100644 index 0000000..aad4267 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateNoticeCommand.java @@ -0,0 +1,39 @@ +package cn.novalon.manage.sys.core.command; + +/** + * 创建公告命令对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public record CreateNoticeCommand( + String noticeTitle, + String noticeContent, + String noticeType, + String status) { + public static CreateNoticeCommand of(String noticeTitle, String noticeContent, String noticeType, String status) { + validateNoticeTitle(noticeTitle); + validateNoticeContent(noticeContent); + validateNoticeType(noticeType); + return new CreateNoticeCommand(noticeTitle, noticeContent, noticeType, status); + } + + private static void validateNoticeTitle(String noticeTitle) { + if (noticeTitle == null || noticeTitle.trim().isEmpty()) { + throw new IllegalArgumentException("Notice title is required"); + } + } + + private static void validateNoticeContent(String noticeContent) { + if (noticeContent == null || noticeContent.trim().isEmpty()) { + throw new IllegalArgumentException("Notice content is required"); + } + } + + private static void validateNoticeType(String noticeType) { + if (noticeType != null && !noticeType.equals("1") && !noticeType.equals("2")) { + throw new IllegalArgumentException( + "Invalid notice type. Notice type must be 1 (notification) or 2 (announcement)"); + } + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateRoleCommand.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateRoleCommand.java new file mode 100644 index 0000000..16767e3 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateRoleCommand.java @@ -0,0 +1,27 @@ +package cn.novalon.manage.sys.core.command; + +import cn.novalon.manage.common.util.StatusConstants; + +/** + * 创建角色命令对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public record CreateRoleCommand( + String roleName, + String roleKey, + Integer roleSort, + Integer status +) { + public static CreateRoleCommand of(String roleName, String roleKey, Integer roleSort, Integer status) { + validateStatus(status); + return new CreateRoleCommand(roleName, roleKey, roleSort, status); + } + + private static void validateStatus(Integer status) { + if (status != null && status != StatusConstants.ENABLED && status != StatusConstants.DISABLED) { + throw new IllegalArgumentException("Invalid status value. Status must be 0 (disabled) or 1 (enabled)"); + } + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateUserCommand.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateUserCommand.java new file mode 100644 index 0000000..26e42d8 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/CreateUserCommand.java @@ -0,0 +1,29 @@ +package cn.novalon.manage.sys.core.command; + +import cn.novalon.manage.sys.primitive.Email; +import cn.novalon.manage.sys.primitive.Password; +import cn.novalon.manage.sys.primitive.Username; + +/** + * 创建用户命令对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public record CreateUserCommand( + Username username, + Password password, + Email email, + Long roleId, + Integer status +) { + public static CreateUserCommand of(String username, String password, String email, Long roleId, Integer status) { + return new CreateUserCommand( + Username.of(username), + Password.of(password), + Email.of(email), + roleId, + status + ); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/UpdateMenuCommand.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/UpdateMenuCommand.java new file mode 100644 index 0000000..b8641da --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/UpdateMenuCommand.java @@ -0,0 +1,23 @@ +package cn.novalon.manage.sys.core.command; + +/** + * 更新菜单命令对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public record UpdateMenuCommand( + Long id, + Long parentId, + String menuName, + String menuType, + Integer orderNum, + String component, + String perms, + Integer status +) { + public static UpdateMenuCommand of(Long id, Long parentId, String menuName, String menuType, Integer orderNum, + String component, String perms, Integer status) { + return new UpdateMenuCommand(id, parentId, menuName, menuType, orderNum, component, perms, status); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/UpdateRoleCommand.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/UpdateRoleCommand.java new file mode 100644 index 0000000..1f7af44 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/UpdateRoleCommand.java @@ -0,0 +1,19 @@ +package cn.novalon.manage.sys.core.command; + +/** + * 更新角色命令对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public record UpdateRoleCommand( + Long id, + String roleName, + String roleKey, + Integer roleSort, + Integer status +) { + public static UpdateRoleCommand of(Long id, String roleName, String roleKey, Integer roleSort, Integer status) { + return new UpdateRoleCommand(id, roleName, roleKey, roleSort, status); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/UpdateUserCommand.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/UpdateUserCommand.java new file mode 100644 index 0000000..069eba1 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/command/UpdateUserCommand.java @@ -0,0 +1,20 @@ +package cn.novalon.manage.sys.core.command; + +/** + * 更新用户命令对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public record UpdateUserCommand( + Long id, + String username, + String password, + String email, + Long roleId, + Integer status +) { + public static UpdateUserCommand of(Long id, String username, String password, String email, Long roleId, Integer status) { + return new UpdateUserCommand(id, username, password, email, roleId, status); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/BaseDomain.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/BaseDomain.java new file mode 100644 index 0000000..5e6acc4 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/BaseDomain.java @@ -0,0 +1,67 @@ +package cn.novalon.manage.sys.core.domain; + +import java.time.LocalDateTime; + +/** + * 基础领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public abstract class BaseDomain { + + protected Long id; + protected String createBy; + protected String updateBy; + protected LocalDateTime createdAt; + protected LocalDateTime updatedAt; + protected LocalDateTime deletedAt; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + } + + public LocalDateTime getDeletedAt() { + return deletedAt; + } + + public void setDeletedAt(LocalDateTime deletedAt) { + this.deletedAt = deletedAt; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/Dictionary.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/Dictionary.java new file mode 100644 index 0000000..a76e831 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/Dictionary.java @@ -0,0 +1,123 @@ +package cn.novalon.manage.sys.core.domain; + +import java.time.LocalDateTime; + +/** + * 字典领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class Dictionary { + private Long id; + private String type; + private String code; + private String name; + private String value; + private String remark; + private Integer sort; + private String createBy; + private String updateBy; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private LocalDateTime deletedAt; + + public Dictionary() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + } + + public LocalDateTime getDeletedAt() { + return deletedAt; + } + + public void setDeletedAt(LocalDateTime deletedAt) { + this.deletedAt = deletedAt; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/OperationLog.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/OperationLog.java new file mode 100644 index 0000000..7c192af --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/OperationLog.java @@ -0,0 +1,92 @@ +package cn.novalon.manage.sys.core.domain; + +/** + * 操作日志领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class OperationLog extends BaseDomain { + + private String username; + private String operation; + private String method; + private String params; + private String result; + private String ip; + private Long duration; + private String status; + private String errorMsg; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getParams() { + return params; + } + + public void setParams(String params) { + this.params = params; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public Long getDuration() { + return duration; + } + + public void setDuration(Long duration) { + this.duration = duration; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysConfig.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysConfig.java new file mode 100644 index 0000000..7b7ad28 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysConfig.java @@ -0,0 +1,44 @@ +package cn.novalon.manage.sys.core.domain; + +import java.time.LocalDateTime; + +/** + * 系统配置领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysConfig { + + private Long id; + private String configName; + private String configKey; + private String configValue; + private String configType; + private String createBy; + private String updateBy; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private LocalDateTime deletedAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getConfigName() { return configName; } + public void setConfigName(String configName) { this.configName = configName; } + public String getConfigKey() { return configKey; } + public void setConfigKey(String configKey) { this.configKey = configKey; } + public String getConfigValue() { return configValue; } + public void setConfigValue(String configValue) { this.configValue = configValue; } + public String getConfigType() { return configType; } + public void setConfigType(String configType) { this.configType = configType; } + public String getCreateBy() { return createBy; } + public void setCreateBy(String createBy) { this.createBy = createBy; } + public String getUpdateBy() { return updateBy; } + public void setUpdateBy(String updateBy) { this.updateBy = updateBy; } + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } + public LocalDateTime getUpdatedAt() { return updatedAt; } + public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; } + public LocalDateTime getDeletedAt() { return deletedAt; } + public void setDeletedAt(LocalDateTime deletedAt) { this.deletedAt = deletedAt; } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysDictData.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysDictData.java new file mode 100644 index 0000000..f653f61 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysDictData.java @@ -0,0 +1,59 @@ +package cn.novalon.manage.sys.core.domain; + +import java.time.LocalDateTime; + +/** + * 字典数据领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysDictData { + + private Long id; + private Long dictTypeId; + private String dictLabel; + private String dictValue; + private Integer dictSort; + private String dictType; + private String cssClass; + private String listClass; + private String isDefault; + private String status; + private String createBy; + private String updateBy; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private LocalDateTime deletedAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public Long getDictTypeId() { return dictTypeId; } + public void setDictTypeId(Long dictTypeId) { this.dictTypeId = dictTypeId; } + public String getDictLabel() { return dictLabel; } + public void setDictLabel(String dictLabel) { this.dictLabel = dictLabel; } + public String getDictValue() { return dictValue; } + public void setDictValue(String dictValue) { this.dictValue = dictValue; } + public Integer getDictSort() { return dictSort; } + public void setDictSort(Integer dictSort) { this.dictSort = dictSort; } + public String getDictType() { return dictType; } + public void setDictType(String dictType) { this.dictType = dictType; } + public String getCssClass() { return cssClass; } + public void setCssClass(String cssClass) { this.cssClass = cssClass; } + public String getListClass() { return listClass; } + public void setListClass(String listClass) { this.listClass = listClass; } + public String getIsDefault() { return isDefault; } + public void setIsDefault(String isDefault) { this.isDefault = isDefault; } + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } + public String getCreateBy() { return createBy; } + public void setCreateBy(String createBy) { this.createBy = createBy; } + public String getUpdateBy() { return updateBy; } + public void setUpdateBy(String updateBy) { this.updateBy = updateBy; } + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } + public LocalDateTime getUpdatedAt() { return updatedAt; } + public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; } + public LocalDateTime getDeletedAt() { return deletedAt; } + public void setDeletedAt(LocalDateTime deletedAt) { this.deletedAt = deletedAt; } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysDictType.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysDictType.java new file mode 100644 index 0000000..cffa7af --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysDictType.java @@ -0,0 +1,44 @@ +package cn.novalon.manage.sys.core.domain; + +import java.time.LocalDateTime; + +/** + * 字典类型领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysDictType { + + private Long id; + private String dictName; + private String dictType; + private String status; + private String remark; + private String createBy; + private String updateBy; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private LocalDateTime deletedAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getDictName() { return dictName; } + public void setDictName(String dictName) { this.dictName = dictName; } + public String getDictType() { return dictType; } + public void setDictType(String dictType) { this.dictType = dictType; } + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } + public String getRemark() { return remark; } + public void setRemark(String remark) { this.remark = remark; } + public String getCreateBy() { return createBy; } + public void setCreateBy(String createBy) { this.createBy = createBy; } + public String getUpdateBy() { return updateBy; } + public void setUpdateBy(String updateBy) { this.updateBy = updateBy; } + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } + public LocalDateTime getUpdatedAt() { return updatedAt; } + public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; } + public LocalDateTime getDeletedAt() { return deletedAt; } + public void setDeletedAt(LocalDateTime deletedAt) { this.deletedAt = deletedAt; } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysExceptionLog.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysExceptionLog.java new file mode 100644 index 0000000..431bc7c --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysExceptionLog.java @@ -0,0 +1,44 @@ +package cn.novalon.manage.sys.core.domain; + +import java.time.LocalDateTime; + +/** + * 异常日志领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysExceptionLog { + + private Long id; + private String username; + private String title; + private String exceptionName; + private String methodName; + private String methodParams; + private String exceptionMsg; + private String exceptionStack; + private String ip; + private LocalDateTime createTime; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + public String getExceptionName() { return exceptionName; } + public void setExceptionName(String exceptionName) { this.exceptionName = exceptionName; } + public String getMethodName() { return methodName; } + public void setMethodName(String methodName) { this.methodName = methodName; } + public String getMethodParams() { return methodParams; } + public void setMethodParams(String methodParams) { this.methodParams = methodParams; } + public String getExceptionMsg() { return exceptionMsg; } + public void setExceptionMsg(String exceptionMsg) { this.exceptionMsg = exceptionMsg; } + public String getExceptionStack() { return exceptionStack; } + public void setExceptionStack(String exceptionStack) { this.exceptionStack = exceptionStack; } + public String getIp() { return ip; } + public void setIp(String ip) { this.ip = ip; } + public LocalDateTime getCreateTime() { return createTime; } + public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysFile.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysFile.java new file mode 100644 index 0000000..59dcb49 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysFile.java @@ -0,0 +1,44 @@ +package cn.novalon.manage.sys.core.domain; + +import java.time.LocalDateTime; + +/** + * 文件管理领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysFile { + + private Long id; + private String fileName; + private String filePath; + private String fileSize; + private String fileType; + private String storageType; + private String createBy; + private String updateBy; + private LocalDateTime createdAt; + private LocalDateTime deletedAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getFileName() { return fileName; } + public void setFileName(String fileName) { this.fileName = fileName; } + public String getFilePath() { return filePath; } + public void setFilePath(String filePath) { this.filePath = filePath; } + public String getFileSize() { return fileSize; } + public void setFileSize(String fileSize) { this.fileSize = fileSize; } + public String getFileType() { return fileType; } + public void setFileType(String fileType) { this.fileType = fileType; } + public String getStorageType() { return storageType; } + public void setStorageType(String storageType) { this.storageType = storageType; } + public String getCreateBy() { return createBy; } + public void setCreateBy(String createBy) { this.createBy = createBy; } + public String getUpdateBy() { return updateBy; } + public void setUpdateBy(String updateBy) { this.updateBy = updateBy; } + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } + public LocalDateTime getDeletedAt() { return deletedAt; } + public void setDeletedAt(LocalDateTime deletedAt) { this.deletedAt = deletedAt; } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysLoginLog.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysLoginLog.java new file mode 100644 index 0000000..06cc737 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysLoginLog.java @@ -0,0 +1,41 @@ +package cn.novalon.manage.sys.core.domain; + +import java.time.LocalDateTime; + +/** + * 登录日志领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysLoginLog { + + private Long id; + private String username; + private String ip; + private String location; + private String browser; + private String os; + private String status; + private String message; + private LocalDateTime loginTime; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + public String getIp() { return ip; } + public void setIp(String ip) { this.ip = ip; } + public String getLocation() { return location; } + public void setLocation(String location) { this.location = location; } + public String getBrowser() { return browser; } + public void setBrowser(String browser) { this.browser = browser; } + public String getOs() { return os; } + public void setOs(String os) { this.os = os; } + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } + public LocalDateTime getLoginTime() { return loginTime; } + public void setLoginTime(LocalDateTime loginTime) { this.loginTime = loginTime; } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysMenu.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysMenu.java new file mode 100644 index 0000000..cc11466 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysMenu.java @@ -0,0 +1,103 @@ +package cn.novalon.manage.sys.core.domain; + +import java.util.List; + +/** + * 菜单领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysMenu extends BaseDomain { + + private String menuName; + private Long parentId; + private Integer orderNum; + private String menuType; + private String perms; + private String component; + private Integer status; + private String createBy; + private String updateBy; + private List children; + + public String getMenuName() { + return menuName; + } + + public void setMenuName(String menuName) { + this.menuName = menuName; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public String getMenuType() { + return menuType; + } + + public void setMenuType(String menuType) { + this.menuType = menuType; + } + + public String getPerms() { + return perms; + } + + public void setPerms(String perms) { + this.perms = perms; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysRole.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysRole.java new file mode 100644 index 0000000..3619d12 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysRole.java @@ -0,0 +1,75 @@ +package cn.novalon.manage.sys.core.domain; + +import cn.novalon.manage.common.util.SnowflakeId; + +import java.time.LocalDateTime; + +/** + * 角色领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysRole extends BaseDomain { + + private String roleName; + private String roleKey; + private Integer roleSort; + private Integer status; + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleKey() { + return roleKey; + } + + public void setRoleKey(String roleKey) { + this.roleKey = roleKey; + } + + public Integer getRoleSort() { + return roleSort; + } + + public void setRoleSort(Integer roleSort) { + this.roleSort = roleSort; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + /** + * 生成主键ID + * + * @return 主键ID + */ + public Long generateId() { + this.id = SnowflakeId.nextId(); + return this.id; + } + + /** + * 删除角色 + */ + public void delete() { + this.deletedAt = LocalDateTime.now(); + } + + /** + * 恢复角色 + */ + public void restore() { + this.deletedAt = null; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysUser.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysUser.java new file mode 100644 index 0000000..71ca299 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysUser.java @@ -0,0 +1,77 @@ +package cn.novalon.manage.sys.core.domain; + +import cn.novalon.manage.common.util.SnowflakeId; + +import java.time.LocalDateTime; + +/** + * 用户领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysUser extends BaseDomain { + + private String username; + private String password; + private String email; + private Long roleId; + private Integer status; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + /** + * 生成主键ID + * + * @return 主键ID + */ + public Long generateId() { + this.id = SnowflakeId.nextId(); + return this.id; + } + + /** + * 删除用户 + */ + public void delete() { + this.deletedAt = LocalDateTime.now(); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysUserMessage.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysUserMessage.java new file mode 100644 index 0000000..f32a8e9 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/domain/SysUserMessage.java @@ -0,0 +1,35 @@ +package cn.novalon.manage.sys.core.domain; + +import java.time.LocalDateTime; + +/** + * 用户消息领域对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysUserMessage { + + private Long id; + private Long userId; + private String title; + private String content; + private String messageType; + private String isRead; + private LocalDateTime createTime; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public Long getUserId() { return userId; } + public void setUserId(Long userId) { this.userId = userId; } + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + public String getContent() { return content; } + public void setContent(String content) { this.content = content; } + public String getMessageType() { return messageType; } + public void setMessageType(String messageType) { this.messageType = messageType; } + public String getIsRead() { return isRead; } + public void setIsRead(String isRead) { this.isRead = isRead; } + public LocalDateTime getCreateTime() { return createTime; } + public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/exception/DictionaryAlreadyExistsException.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/exception/DictionaryAlreadyExistsException.java index b37ede5..e1ba8f5 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/exception/DictionaryAlreadyExistsException.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/exception/DictionaryAlreadyExistsException.java @@ -1,5 +1,11 @@ package cn.novalon.manage.sys.core.exception; +/** + * 字典已存在异常 + * + * @author 张翔 + * @date 2026-03-13 + */ public class DictionaryAlreadyExistsException extends RuntimeException { private final String type; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/query/SysMenuQuery.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/query/SysMenuQuery.java new file mode 100644 index 0000000..318d8e3 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/query/SysMenuQuery.java @@ -0,0 +1,56 @@ +package cn.novalon.manage.sys.core.query; + +/** + * 菜单查询对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysMenuQuery { + + private String menuName; + private String menuType; + private Integer status; + private Long parentId; + private String keyword; + + public String getMenuName() { + return menuName; + } + + public void setMenuName(String menuName) { + this.menuName = menuName; + } + + public String getMenuType() { + return menuType; + } + + public void setMenuType(String menuType) { + this.menuType = menuType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/query/SysRoleQuery.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/query/SysRoleQuery.java new file mode 100644 index 0000000..6c47388 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/query/SysRoleQuery.java @@ -0,0 +1,50 @@ +package cn.novalon.manage.sys.core.query; + +/** + * 角色查询对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysRoleQuery { + + private String roleName; + + private String roleKey; + + private Integer status; + + private String keyword; + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleKey() { + return roleKey; + } + + public void setRoleKey(String roleKey) { + this.roleKey = roleKey; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/query/SysUserQuery.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/query/SysUserQuery.java new file mode 100644 index 0000000..a9d3588 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/query/SysUserQuery.java @@ -0,0 +1,60 @@ +package cn.novalon.manage.sys.core.query; + +/** + * 用户查询对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class SysUserQuery { + + private String username; + + private String email; + + private Long roleId; + + private Integer status; + + private String keyword; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } +} diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/IDictionaryRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/IDictionaryRepository.java similarity index 76% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/IDictionaryRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/IDictionaryRepository.java index e670919..fecdcb7 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/IDictionaryRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/IDictionaryRepository.java @@ -1,9 +1,15 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.Dictionary; +import cn.novalon.manage.sys.core.domain.Dictionary; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface IDictionaryRepository { Flux findAll(); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/IOperationLogRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/IOperationLogRepository.java similarity index 72% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/IOperationLogRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/IOperationLogRepository.java index 9f8406e..66025a6 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/IOperationLogRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/IOperationLogRepository.java @@ -1,11 +1,17 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.OperationLog; +import cn.novalon.manage.sys.core.domain.OperationLog; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.LocalDateTime; +/** + * 操作日志仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface IOperationLogRepository { Mono findById(Long id); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysConfigRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysConfigRepository.java similarity index 76% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysConfigRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysConfigRepository.java index 7e0a3b9..090943b 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysConfigRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysConfigRepository.java @@ -1,10 +1,16 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysConfig; +import cn.novalon.manage.sys.core.domain.SysConfig; import org.springframework.data.domain.Sort; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 系统配置仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysConfigRepository { Mono findById(Long id); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysDictDataRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysDictDataRepository.java similarity index 73% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysDictDataRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysDictDataRepository.java index 75e7ab0..e157d1e 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysDictDataRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysDictDataRepository.java @@ -1,9 +1,15 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysDictData; +import cn.novalon.manage.sys.core.domain.SysDictData; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典数据仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysDictDataRepository { Flux findByDeletedAtIsNull(); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysDictTypeRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysDictTypeRepository.java similarity index 68% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysDictTypeRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysDictTypeRepository.java index 885a600..6816827 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysDictTypeRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysDictTypeRepository.java @@ -1,9 +1,15 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysDictType; +import cn.novalon.manage.sys.core.domain.SysDictType; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典类型仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysDictTypeRepository { Flux findByDeletedAtIsNull(); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysExceptionLogRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysExceptionLogRepository.java similarity index 75% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysExceptionLogRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysExceptionLogRepository.java index c013505..e187b81 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysExceptionLogRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysExceptionLogRepository.java @@ -1,11 +1,17 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysExceptionLog; +import cn.novalon.manage.sys.core.domain.SysExceptionLog; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.LocalDateTime; +/** + * 异常日志仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysExceptionLogRepository { Flux findAllByOrderByCreateTimeDesc(); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysFileRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysFileRepository.java similarity index 72% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysFileRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysFileRepository.java index c790731..41f9a86 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysFileRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysFileRepository.java @@ -1,9 +1,15 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysFile; +import cn.novalon.manage.sys.core.domain.SysFile; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 文件仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysFileRepository { Flux findByDeletedAtIsNullOrderByCreatedAtDesc(); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysLoginLogRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysLoginLogRepository.java similarity index 74% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysLoginLogRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysLoginLogRepository.java index 53e38eb..074a227 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysLoginLogRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysLoginLogRepository.java @@ -1,11 +1,17 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysLoginLog; +import cn.novalon.manage.sys.core.domain.SysLoginLog; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.LocalDateTime; +/** + * 登录日志仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysLoginLogRepository { Flux findAllByOrderByLoginTimeDesc(); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysMenuRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysMenuRepository.java similarity index 66% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysMenuRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysMenuRepository.java index 48c4221..5f91c3d 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysMenuRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysMenuRepository.java @@ -1,15 +1,19 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysMenu; +import cn.novalon.manage.sys.core.domain.SysMenu; +import cn.novalon.manage.sys.core.query.SysMenuQuery; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; import org.springframework.data.domain.Sort; -import org.springframework.data.relational.core.query.Query; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.List; - +/** + * 菜单仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysMenuRepository { Flux findByParentId(Long parentId); @@ -28,7 +32,7 @@ public interface ISysMenuRepository { Mono count(); - Mono> findByQueryWithPagination(Query query, PageRequest pageRequest); + Mono> findByQueryWithPagination(SysMenuQuery query, PageRequest pageRequest); Flux findByStatus(String status); } \ No newline at end of file diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysRoleRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysRoleRepository.java similarity index 72% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysRoleRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysRoleRepository.java index 4df2967..1403e78 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysRoleRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysRoleRepository.java @@ -1,13 +1,19 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysRole; +import cn.novalon.manage.sys.core.domain.SysRole; +import cn.novalon.manage.sys.core.query.SysRoleQuery; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; import org.springframework.data.domain.Sort; -import org.springframework.data.relational.core.query.Query; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 角色仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysRoleRepository { Mono findById(Long id); @@ -28,7 +34,7 @@ public interface ISysRoleRepository { Mono countByRoleNameLikeOrRoleKeyLike(String roleName, String roleKey); - Mono> findByQueryWithPagination(Query query, PageRequest pageRequest); + Mono> findByQueryWithPagination(SysRoleQuery query, PageRequest pageRequest); Mono findByRoleName(String roleName); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysUserMessageRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysUserMessageRepository.java similarity index 73% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysUserMessageRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysUserMessageRepository.java index 2b92700..51019e0 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysUserMessageRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysUserMessageRepository.java @@ -1,9 +1,15 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysUserMessage; +import cn.novalon.manage.sys.core.domain.SysUserMessage; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 用户消息仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysUserMessageRepository { Flux findByUserIdOrderByCreateTimeDesc(Long userId); diff --git a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysUserRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysUserRepository.java similarity index 72% rename from novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysUserRepository.java rename to novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysUserRepository.java index fec51dd..c55a59e 100644 --- a/novalon-manage-api/manage-db/src/main/java/cn/novalon/manage/db/repository/ISysUserRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/repository/ISysUserRepository.java @@ -1,15 +1,21 @@ -package cn.novalon.manage.db.repository; +package cn.novalon.manage.sys.core.repository; -import cn.novalon.manage.common.domain.SysUser; +import cn.novalon.manage.sys.core.domain.SysUser; +import cn.novalon.manage.sys.core.query.SysUserQuery; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; import org.springframework.data.domain.Sort; -import org.springframework.data.relational.core.query.Query; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.List; +/** + * 用户仓储接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysUserRepository { Mono findByUsername(String username); @@ -34,7 +40,7 @@ public interface ISysUserRepository { Mono count(); - Mono> findByQueryWithPagination(Query query, PageRequest pageRequest); + Mono> findByQueryWithPagination(SysUserQuery query, PageRequest pageRequest); Mono existsByUsername(String username); @@ -47,4 +53,6 @@ public interface ISysUserRepository { Mono restoreById(Long id); Mono restoreByIds(List ids); + + Mono updateRoleIdToNullByRoleId(Long roleId); } \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/IDictionaryService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/IDictionaryService.java index a7e271b..82335d2 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/IDictionaryService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/IDictionaryService.java @@ -1,6 +1,6 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.Dictionary; +import cn.novalon.manage.sys.core.domain.Dictionary; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/IOperationLogService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/IOperationLogService.java index 22ba8d9..b61eba4 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/IOperationLogService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/IOperationLogService.java @@ -1,9 +1,15 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.OperationLog; +import cn.novalon.manage.sys.core.domain.OperationLog; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 操作日志服务接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface IOperationLogService { Mono save(OperationLog log); Flux findAll(); diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysConfigService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysConfigService.java index 8af2945..aca3e25 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysConfigService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysConfigService.java @@ -1,9 +1,15 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysConfig; +import cn.novalon.manage.sys.core.domain.SysConfig; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 系统配置服务接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysConfigService { Flux findAll(); Mono findById(Long id); diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysDictDataService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysDictDataService.java index a73549d..3b552a2 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysDictDataService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysDictDataService.java @@ -1,9 +1,15 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysDictData; +import cn.novalon.manage.sys.core.domain.SysDictData; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典数据服务接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysDictDataService { Flux findAll(); Flux findByDictType(String dictType); diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysDictTypeService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysDictTypeService.java index 89659a9..205fe7f 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysDictTypeService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysDictTypeService.java @@ -1,9 +1,15 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysDictType; +import cn.novalon.manage.sys.core.domain.SysDictType; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典类型服务接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysDictTypeService { Flux findAll(); Mono findById(Long id); diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysExceptionLogService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysExceptionLogService.java index 9ea4682..14ace6e 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysExceptionLogService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysExceptionLogService.java @@ -1,6 +1,6 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysExceptionLog; +import cn.novalon.manage.sys.core.domain.SysExceptionLog; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; import reactor.core.publisher.Flux; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysFileService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysFileService.java index 621e5d8..05c69e5 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysFileService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysFileService.java @@ -1,11 +1,17 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysFile; +import cn.novalon.manage.sys.core.domain.SysFile; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.http.codec.multipart.FilePart; import org.springframework.web.multipart.MultipartFile; +/** + * 文件服务接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysFileService { Flux findAll(); Flux findByCreateBy(String createBy); diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysLoginLogService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysLoginLogService.java index 062dd01..38a4c7e 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysLoginLogService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysLoginLogService.java @@ -1,6 +1,6 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysLoginLog; +import cn.novalon.manage.sys.core.domain.SysLoginLog; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; import reactor.core.publisher.Flux; @@ -8,6 +8,12 @@ import reactor.core.publisher.Mono; import java.time.LocalDateTime; +/** + * 登录日志服务接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysLoginLogService { Mono findById(Long id); Flux findAll(); diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysMenuService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysMenuService.java index 7f5f7d2..bf66042 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysMenuService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysMenuService.java @@ -1,15 +1,25 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysMenu; +import cn.novalon.manage.sys.core.domain.SysMenu; +import cn.novalon.manage.sys.core.command.CreateMenuCommand; +import cn.novalon.manage.sys.core.command.UpdateMenuCommand; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 菜单服务接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysMenuService { Mono findById(Long id); Flux findAll(); Flux findByParentId(Long parentId); Mono createMenu(SysMenu menu); + Mono createMenu(CreateMenuCommand command); Mono updateMenu(SysMenu menu); + Mono updateMenu(UpdateMenuCommand command); Mono deleteMenu(Long id); Flux buildMenuTree(Flux menus); } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysNoticeService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysNoticeService.java deleted file mode 100644 index 5a1ba11..0000000 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysNoticeService.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.novalon.manage.sys.core.service; - -import cn.novalon.manage.common.domain.SysNotice; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -public interface ISysNoticeService { - Flux findAll(); - Flux findByStatus(String status); - Mono findById(Long id); - Mono save(SysNotice notice); - Mono deleteById(Long id); -} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysRoleService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysRoleService.java index 4bf1fd4..39bab7f 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysRoleService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysRoleService.java @@ -1,18 +1,28 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysRole; +import cn.novalon.manage.sys.core.domain.SysRole; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; +import cn.novalon.manage.sys.core.command.CreateRoleCommand; +import cn.novalon.manage.sys.core.command.UpdateRoleCommand; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 角色服务接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysRoleService { Mono findById(Long id); Flux findAll(); Mono> findRolesByPage(PageRequest pageRequest); Mono count(); Mono createRole(SysRole role); + Mono createRole(CreateRoleCommand command); Mono updateRole(SysRole role); + Mono updateRole(UpdateRoleCommand command); Mono deleteRole(Long id); Mono findByRoleName(String roleName); Mono existsByRoleName(String roleName); diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysUserMessageService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysUserMessageService.java index ae1cd32..d27e612 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysUserMessageService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysUserMessageService.java @@ -1,6 +1,6 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysUserMessage; +import cn.novalon.manage.sys.core.domain.SysUserMessage; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysUserService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysUserService.java index a497310..7f77d21 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysUserService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/ISysUserService.java @@ -1,28 +1,57 @@ package cn.novalon.manage.sys.core.service; -import cn.novalon.manage.common.domain.SysUser; +import cn.novalon.manage.sys.core.domain.SysUser; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; +import cn.novalon.manage.sys.core.command.CreateUserCommand; +import cn.novalon.manage.sys.core.command.UpdateUserCommand; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.List; +/** + * 用户服务接口 + * + * @author 张翔 + * @date 2026-03-13 + */ public interface ISysUserService { Mono findById(Long id); + Flux findAll(); + Flux findAll(boolean includeDeleted); + Mono> findUsersByPage(PageRequest pageRequest); + Mono count(); + Mono findByUsername(String username); + Mono existsByUsername(String username); + Mono existsByEmail(String email); + Mono createUser(SysUser user); + + Mono createUser(CreateUserCommand command); + Mono updateUser(SysUser user); + + Mono updateUser(UpdateUserCommand command); + Mono deleteUser(Long id); + Mono logicalDeleteUser(Long id); + Mono logicalDeleteUsers(List ids); + Mono restoreUser(Long id); + Mono restoreUsers(List ids); + Mono changePassword(Long userId, String oldPassword, String newPassword); + + Mono updateRoleIdToNullByRoleId(Long roleId); } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/DictionaryService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/DictionaryService.java index bd8ec1f..a31f82a 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/DictionaryService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/DictionaryService.java @@ -1,8 +1,8 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.Dictionary; +import cn.novalon.manage.sys.core.domain.Dictionary; import cn.novalon.manage.sys.core.exception.DictionaryAlreadyExistsException; -import cn.novalon.manage.db.repository.DictionaryRepository; +import cn.novalon.manage.sys.core.repository.IDictionaryRepository; import cn.novalon.manage.sys.core.service.IDictionaryService; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; @@ -10,12 +10,18 @@ import reactor.core.publisher.Mono; import java.time.LocalDateTime; +/** + * 字典服务实现类 + * + * @author 张翔 + * @date 2026-03-14 + */ @Service public class DictionaryService implements IDictionaryService { - private final DictionaryRepository repository; + private final IDictionaryRepository repository; - public DictionaryService(DictionaryRepository repository) { + public DictionaryService(IDictionaryRepository repository) { this.repository = repository; } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/OperationLogService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/OperationLogService.java index c0380c5..6703fbc 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/OperationLogService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/OperationLogService.java @@ -1,7 +1,7 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.OperationLog; -import cn.novalon.manage.db.repository.OperationLogRepository; +import cn.novalon.manage.sys.core.domain.OperationLog; +import cn.novalon.manage.sys.core.repository.IOperationLogRepository; import cn.novalon.manage.sys.core.service.IOperationLogService; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; @@ -12,9 +12,9 @@ import java.time.LocalDateTime; @Service public class OperationLogService implements IOperationLogService { - private final OperationLogRepository logRepository; + private final IOperationLogRepository logRepository; - public OperationLogService(OperationLogRepository logRepository) { + public OperationLogService(IOperationLogRepository logRepository) { this.logRepository = logRepository; } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysConfigService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysConfigService.java index 173ccb7..5c4fd71 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysConfigService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysConfigService.java @@ -1,12 +1,18 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.SysConfig; -import cn.novalon.manage.db.repository.ISysConfigRepository; +import cn.novalon.manage.sys.core.domain.SysConfig; +import cn.novalon.manage.sys.core.repository.ISysConfigRepository; import cn.novalon.manage.sys.core.service.ISysConfigService; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 系统配置服务实现类 + * + * @author 张翔 + * @date 2026-03-14 + */ @Service public class SysConfigService implements ISysConfigService { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysDictDataService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysDictDataService.java index acf3554..63bc3d5 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysDictDataService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysDictDataService.java @@ -1,7 +1,7 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.SysDictData; -import cn.novalon.manage.db.repository.ISysDictDataRepository; +import cn.novalon.manage.sys.core.domain.SysDictData; +import cn.novalon.manage.sys.core.repository.ISysDictDataRepository; import cn.novalon.manage.sys.core.service.ISysDictDataService; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysDictTypeService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysDictTypeService.java index b2bd464..ab5c1a5 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysDictTypeService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysDictTypeService.java @@ -1,12 +1,18 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.SysDictType; -import cn.novalon.manage.db.repository.ISysDictTypeRepository; +import cn.novalon.manage.sys.core.domain.SysDictType; +import cn.novalon.manage.sys.core.repository.ISysDictTypeRepository; import cn.novalon.manage.sys.core.service.ISysDictTypeService; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 字典类型服务实现类 + * + * @author 张翔 + * @date 2026-03-14 + */ @Service public class SysDictTypeService implements ISysDictTypeService { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysExceptionLogService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysExceptionLogService.java index a7c15a1..5f2569f 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysExceptionLogService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysExceptionLogService.java @@ -1,7 +1,7 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.SysExceptionLog; -import cn.novalon.manage.db.repository.ISysExceptionLogRepository; +import cn.novalon.manage.sys.core.domain.SysExceptionLog; +import cn.novalon.manage.sys.core.repository.ISysExceptionLogRepository; import cn.novalon.manage.sys.core.service.ISysExceptionLogService; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; @@ -12,6 +12,12 @@ import reactor.core.publisher.Mono; import java.time.LocalDateTime; import java.util.List; +/** + * 异常日志服务实现类 + * + * @author 张翔 + * @date 2026-03-14 + */ @Service public class SysExceptionLogService implements ISysExceptionLogService { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysFileService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysFileService.java index 8aae5bf..09ca152 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysFileService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysFileService.java @@ -1,7 +1,7 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.SysFile; -import cn.novalon.manage.db.repository.ISysFileRepository; +import cn.novalon.manage.sys.core.domain.SysFile; +import cn.novalon.manage.sys.core.repository.ISysFileRepository; import cn.novalon.manage.sys.core.service.ISysFileService; import org.springframework.http.codec.multipart.FilePart; import org.springframework.stereotype.Service; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysLoginLogService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysLoginLogService.java index b395bd3..213d82b 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysLoginLogService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysLoginLogService.java @@ -1,7 +1,7 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.SysLoginLog; -import cn.novalon.manage.db.repository.SysLoginLogRepository; +import cn.novalon.manage.sys.core.domain.SysLoginLog; +import cn.novalon.manage.sys.core.repository.ISysLoginLogRepository; import cn.novalon.manage.sys.core.service.ISysLoginLogService; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; @@ -13,12 +13,18 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +/** + * 登录日志服务实现类 + * + * @author 张翔 + * @date 2026-03-14 + */ @Service public class SysLoginLogService implements ISysLoginLogService { - private final SysLoginLogRepository repository; + private final ISysLoginLogRepository repository; - public SysLoginLogService(SysLoginLogRepository repository) { + public SysLoginLogService(ISysLoginLogRepository repository) { this.repository = repository; } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysMenuService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysMenuService.java index 5619f4a..54d79e0 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysMenuService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysMenuService.java @@ -1,8 +1,11 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.SysMenu; -import cn.novalon.manage.db.repository.ISysMenuRepository; +import cn.novalon.manage.sys.core.domain.SysMenu; +import cn.novalon.manage.sys.core.repository.ISysMenuRepository; import cn.novalon.manage.sys.core.service.ISysMenuService; +import cn.novalon.manage.sys.core.command.CreateMenuCommand; +import cn.novalon.manage.sys.core.command.UpdateMenuCommand; +import cn.novalon.manage.common.util.StatusConstants; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -11,6 +14,12 @@ import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; +/** + * 菜单服务实现类 + * + * @author 张翔 + * @date 2026-03-14 + */ @Service public class SysMenuService implements ISysMenuService { @@ -38,7 +47,20 @@ public class SysMenuService implements ISysMenuService { @Override public Mono createMenu(SysMenu menu) { menu.setCreatedAt(LocalDateTime.now()); - menu.setStatus("0"); + return menuRepository.save(menu); + } + + @Override + public Mono createMenu(CreateMenuCommand command) { + SysMenu menu = new SysMenu(); + menu.setParentId(command.parentId()); + menu.setMenuName(command.menuName()); + menu.setMenuType(command.menuType()); + menu.setOrderNum(command.orderNum()); + menu.setComponent(command.component()); + menu.setPerms(command.perms()); + menu.setStatus(command.status() != null ? command.status() : StatusConstants.ENABLED); + menu.setCreatedAt(LocalDateTime.now()); return menuRepository.save(menu); } @@ -48,6 +70,37 @@ public class SysMenuService implements ISysMenuService { return menuRepository.save(menu); } + @Override + public Mono updateMenu(UpdateMenuCommand command) { + return menuRepository.findById(command.id()) + .switchIfEmpty(Mono.error(new RuntimeException("Menu not found"))) + .flatMap(menu -> { + if (command.parentId() != null) { + menu.setParentId(command.parentId()); + } + if (command.menuName() != null) { + menu.setMenuName(command.menuName()); + } + if (command.menuType() != null) { + menu.setMenuType(command.menuType()); + } + if (command.orderNum() != null) { + menu.setOrderNum(command.orderNum()); + } + if (command.component() != null) { + menu.setComponent(command.component()); + } + if (command.perms() != null) { + menu.setPerms(command.perms()); + } + if (command.status() != null) { + menu.setStatus(command.status()); + } + menu.setUpdatedAt(LocalDateTime.now()); + return menuRepository.save(menu); + }); + } + @Override public Mono deleteMenu(Long id) { return menuRepository.deleteById(id); diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysNoticeService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysNoticeService.java deleted file mode 100644 index 05174cb..0000000 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysNoticeService.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.novalon.manage.sys.core.service.impl; - -import cn.novalon.manage.common.domain.SysNotice; -import cn.novalon.manage.db.repository.ISysNoticeRepository; -import cn.novalon.manage.sys.core.service.ISysNoticeService; -import cn.novalon.manage.sys.core.service.IWebSocketService; -import org.springframework.stereotype.Service; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -@Service -public class SysNoticeService implements ISysNoticeService { - - private final ISysNoticeRepository repository; - private final IWebSocketService webSocketService; - - public SysNoticeService(ISysNoticeRepository repository, IWebSocketService webSocketService) { - this.repository = repository; - this.webSocketService = webSocketService; - } - - @Override - public Flux findAll() { - return repository.findByDeletedAtIsNull(); - } - - @Override - public Flux findByStatus(String status) { - return repository.findByStatusAndDeletedAtIsNull(status); - } - - @Override - public Mono findById(Long id) { - return repository.findById(id); - } - - @Override - public Mono save(SysNotice notice) { - return repository.save(notice) - .flatMap(savedNotice -> { - return webSocketService.notifyNewNotice( - savedNotice.getNoticeTitle(), - savedNotice.getNoticeContent()).thenReturn(savedNotice); - }); - } - - @Override - public Mono deleteById(Long id) { - return repository.deleteByIdAndDeletedAtIsNull(id); - } -} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysRoleService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysRoleService.java index 8d4f459..bd7aba1 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysRoleService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysRoleService.java @@ -1,15 +1,15 @@ package cn.novalon.manage.sys.core.service.impl; import cn.novalon.manage.common.util.StatusConstants; -import cn.novalon.manage.common.domain.SysRole; -import cn.novalon.manage.common.domain.query.SysRoleQuery; -import cn.novalon.manage.db.repository.ISysRoleRepository; +import cn.novalon.manage.sys.core.domain.SysRole; +import cn.novalon.manage.sys.core.query.SysRoleQuery; +import cn.novalon.manage.sys.core.repository.ISysRoleRepository; import cn.novalon.manage.sys.core.service.ISysRoleService; +import cn.novalon.manage.sys.core.service.ISysUserService; +import cn.novalon.manage.sys.core.command.CreateRoleCommand; +import cn.novalon.manage.sys.core.command.UpdateRoleCommand; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; -import cn.novalon.manage.db.dao.QueryUtil; -import cn.novalon.manage.db.entity.SysRoleQueryCriteria; -import org.springframework.data.relational.core.query.Query; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -20,9 +20,11 @@ import java.time.LocalDateTime; public class SysRoleService implements ISysRoleService { private final ISysRoleRepository roleRepository; + private final ISysUserService userService; - public SysRoleService(ISysRoleRepository roleRepository) { + public SysRoleService(ISysRoleRepository roleRepository, ISysUserService userService) { this.roleRepository = roleRepository; + this.userService = userService; } @Override @@ -44,12 +46,7 @@ public class SysRoleService implements ISysRoleService { query.setRoleKey(pageRequest.getKeyword()); } - SysRoleQueryCriteria criteria = new SysRoleQueryCriteria(); - criteria.convert(query); - - Query queryObj = QueryUtil.getQuery(criteria); - - return roleRepository.findByQueryWithPagination(queryObj, pageRequest); + return roleRepository.findByQueryWithPagination(query, pageRequest); } @Override @@ -60,7 +57,20 @@ public class SysRoleService implements ISysRoleService { @Override public Mono createRole(SysRole role) { role.setCreatedAt(LocalDateTime.now()); - role.setStatus(StatusConstants.ENABLED); + if (role.getStatus() == null) { + role.setStatus(StatusConstants.ENABLED); + } + return roleRepository.save(role); + } + + @Override + public Mono createRole(CreateRoleCommand command) { + SysRole role = new SysRole(); + role.setRoleName(command.roleName()); + role.setRoleKey(command.roleKey()); + role.setRoleSort(command.roleSort()); + role.setStatus(command.status() != null ? command.status() : StatusConstants.ENABLED); + role.setCreatedAt(LocalDateTime.now()); return roleRepository.save(role); } @@ -70,9 +80,35 @@ public class SysRoleService implements ISysRoleService { return roleRepository.save(role); } + @Override + public Mono updateRole(UpdateRoleCommand command) { + return roleRepository.findById(command.id()) + .switchIfEmpty(Mono.error(new RuntimeException("Role not found"))) + .flatMap(role -> { + if (command.roleName() != null) { + role.setRoleName(command.roleName()); + } + if (command.roleKey() != null) { + role.setRoleKey(command.roleKey()); + } + if (command.roleSort() != null) { + role.setRoleSort(command.roleSort()); + } + if (command.status() != null) { + role.setStatus(command.status()); + } + role.setUpdatedAt(LocalDateTime.now()); + return roleRepository.save(role); + }); + } + @Override public Mono deleteRole(Long id) { - return roleRepository.deleteById(id); + return roleRepository.findById(id) + .flatMap(role -> { + return userService.updateRoleIdToNullByRoleId(id) + .then(roleRepository.deleteById(id)); + }); } @Override diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserMessageService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserMessageService.java index ceca09a..dfd9a4d 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserMessageService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserMessageService.java @@ -1,13 +1,19 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.SysUserMessage; -import cn.novalon.manage.db.repository.ISysUserMessageRepository; +import cn.novalon.manage.sys.core.domain.SysUserMessage; +import cn.novalon.manage.sys.core.repository.ISysUserMessageRepository; import cn.novalon.manage.sys.core.service.ISysUserMessageService; import cn.novalon.manage.sys.core.service.IWebSocketService; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * 用户消息服务实现类 + * + * @author 张翔 + * @date 2026-03-14 + */ @Service public class SysUserMessageService implements ISysUserMessageService { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserService.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserService.java index 1653f49..cd36dbd 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserService.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/SysUserService.java @@ -1,15 +1,14 @@ package cn.novalon.manage.sys.core.service.impl; import cn.novalon.manage.common.util.StatusConstants; -import cn.novalon.manage.common.domain.SysUser; -import cn.novalon.manage.common.domain.query.SysUserQuery; +import cn.novalon.manage.sys.core.domain.SysUser; +import cn.novalon.manage.sys.core.query.SysUserQuery; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; -import cn.novalon.manage.db.repository.ISysUserRepository; -import cn.novalon.manage.db.dao.QueryUtil; -import cn.novalon.manage.db.entity.SysUserQueryCriteria; +import cn.novalon.manage.sys.core.repository.ISysUserRepository; import cn.novalon.manage.sys.core.service.ISysUserService; -import org.springframework.data.relational.core.query.Query; +import cn.novalon.manage.sys.core.command.CreateUserCommand; +import cn.novalon.manage.sys.core.command.UpdateUserCommand; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; @@ -18,6 +17,16 @@ import reactor.core.publisher.Mono; import java.time.LocalDateTime; import java.util.List; +/** + * 用户服务实现类 + * + * 文件定义:实现用户管理的核心业务逻辑 + * 涉及业务:用户注册、登录、信息修改、删除、密码修改、逻辑删除等用户生命周期管理 + * 算法:使用R2DBC进行响应式数据库操作,支持分页查询、条件查询、批量操作 + * + * @author 张翔 + * @date 2026-03-13 + */ @Service public class SysUserService implements ISysUserService { @@ -57,12 +66,7 @@ public class SysUserService implements ISysUserService { query.setEmail(pageRequest.getKeyword()); } - SysUserQueryCriteria criteria = new SysUserQueryCriteria(); - criteria.convert(query); - - Query queryObj = QueryUtil.getQuery(criteria); - - return userRepository.findByQueryWithPagination(queryObj, pageRequest); + return userRepository.findByQueryWithPagination(query, pageRequest); } @Override @@ -79,7 +83,21 @@ public class SysUserService implements ISysUserService { public Mono createUser(SysUser user) { user.setPassword(passwordEncoder.encode(user.getPassword())); user.setCreatedAt(LocalDateTime.now()); - user.setStatus(StatusConstants.ENABLED); + if (user.getStatus() == null) { + user.setStatus(StatusConstants.ENABLED); + } + return userRepository.save(user); + } + + @Override + public Mono createUser(CreateUserCommand command) { + SysUser user = new SysUser(); + user.setUsername(command.username().getValue()); + user.setPassword(passwordEncoder.encode(command.password().getValue())); + user.setEmail(command.email().getValue()); + user.setRoleId(command.roleId()); + user.setStatus(command.status() != null ? command.status() : StatusConstants.ENABLED); + user.setCreatedAt(LocalDateTime.now()); return userRepository.save(user); } @@ -89,9 +107,41 @@ public class SysUserService implements ISysUserService { return userRepository.save(user); } + @Override + public Mono updateUser(UpdateUserCommand command) { + return userRepository.findById(command.id()) + .switchIfEmpty(Mono.error(new RuntimeException("User not found"))) + .flatMap(user -> { + if (command.username() != null) { + user.setUsername(command.username()); + } + if (command.password() != null) { + user.setPassword(passwordEncoder.encode(command.password())); + } + if (command.email() != null) { + user.setEmail(command.email()); + } + if (command.roleId() != null) { + user.setRoleId(command.roleId()); + } + if (command.status() != null) { + user.setStatus(command.status()); + } + user.setUpdatedAt(LocalDateTime.now()); + return userRepository.save(user); + }); + } + @Override public Mono deleteUser(Long id) { - return userRepository.deleteById(id); + return userRepository.findById(id) + .switchIfEmpty(Mono.error(new RuntimeException("User not found"))) + .flatMap(user -> userRepository.deleteById(id)); + } + + @Override + public Mono updateRoleIdToNullByRoleId(Long roleId) { + return userRepository.updateRoleIdToNullByRoleId(roleId); } @Override diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/WebSocketServiceImpl.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/WebSocketServiceImpl.java index c3d7eb2..cfb4210 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/WebSocketServiceImpl.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/core/service/impl/WebSocketServiceImpl.java @@ -8,6 +8,12 @@ import reactor.core.publisher.Mono; import java.util.HashMap; import java.util.Map; +/** + * WebSocket服务实现类 + * + * @author 张翔 + * @date 2026-03-14 + */ @Service public class WebSocketServiceImpl implements IWebSocketService { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/LoginRequest.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/LoginRequest.java index c1cddfd..f2b9fd4 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/LoginRequest.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/LoginRequest.java @@ -2,6 +2,16 @@ package cn.novalon.manage.sys.dto.request; import jakarta.validation.constraints.NotBlank; +/** + * 登录请求DTO + * + * 文件定义:封装用户登录请求的参数 + * 涉及业务:用户登录认证 + * 算法:使用Jakarta Validation进行参数验证 + * + * @author 张翔 + * @date 2026-03-13 + */ public class LoginRequest { @NotBlank(message = "用户名不能为空") diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/MenuCreateRequest.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/MenuCreateRequest.java new file mode 100644 index 0000000..ff6cbcd --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/MenuCreateRequest.java @@ -0,0 +1,89 @@ +package cn.novalon.manage.sys.dto.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +/** + * 菜单创建请求DTO + * + * 文件定义:用于创建菜单的请求DTO对象,封装HTTP请求参数 + * 涉及业务:菜单管理、权限分配等场景 + * 算法:通过验证注解确保请求参数的有效性 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class MenuCreateRequest { + + private Long parentId; + + @NotBlank(message = "菜单名称不能为空") + private String menuName; + + @NotBlank(message = "菜单类型不能为空") + private String menuType; + + private Integer orderNum; + + private String component; + + private String perms; + + private Integer status; + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getMenuName() { + return menuName; + } + + public void setMenuName(String menuName) { + this.menuName = menuName; + } + + public String getMenuType() { + return menuType; + } + + public void setMenuType(String menuType) { + this.menuType = menuType; + } + + public Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getPerms() { + return perms; + } + + public void setPerms(String perms) { + this.perms = perms; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/MenuUpdateRequest.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/MenuUpdateRequest.java new file mode 100644 index 0000000..86f2714 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/MenuUpdateRequest.java @@ -0,0 +1,84 @@ +package cn.novalon.manage.sys.dto.request; + +/** + * 菜单更新请求DTO + * + * 文件定义:用于更新菜单的请求DTO对象,封装HTTP请求参数 + * 涉及业务:菜单管理、权限分配等场景 + * 算法:支持部分字段更新,通过验证注解确保请求参数的有效性 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class MenuUpdateRequest { + + private Long parentId; + + private String menuName; + + private String menuType; + + private Integer orderNum; + + private String component; + + private String perms; + + private Integer status; + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getMenuName() { + return menuName; + } + + public void setMenuName(String menuName) { + this.menuName = menuName; + } + + public String getMenuType() { + return menuType; + } + + public void setMenuType(String menuType) { + this.menuType = menuType; + } + + public Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getPerms() { + return perms; + } + + public void setPerms(String perms) { + this.perms = perms; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/RoleCreateRequest.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/RoleCreateRequest.java new file mode 100644 index 0000000..14b201d --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/RoleCreateRequest.java @@ -0,0 +1,60 @@ +package cn.novalon.manage.sys.dto.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +/** + * 角色创建请求DTO + * + * 文件定义:用于创建角色的请求DTO对象,封装HTTP请求参数 + * 涉及业务:角色管理、权限分配等场景 + * 算法:通过验证注解确保请求参数的有效性 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class RoleCreateRequest { + + @NotBlank(message = "角色名称不能为空") + private String roleName; + + @NotBlank(message = "角色权限字符串不能为空") + private String roleKey; + + @NotNull(message = "显示顺序不能为空") + private Integer roleSort; + + private Integer status; + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleKey() { + return roleKey; + } + + public void setRoleKey(String roleKey) { + this.roleKey = roleKey; + } + + public Integer getRoleSort() { + return roleSort; + } + + public void setRoleSort(Integer roleSort) { + this.roleSort = roleSort; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/RoleUpdateRequest.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/RoleUpdateRequest.java new file mode 100644 index 0000000..434a0e5 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/request/RoleUpdateRequest.java @@ -0,0 +1,56 @@ +package cn.novalon.manage.sys.dto.request; + +import jakarta.validation.constraints.NotBlank; + +/** + * 角色更新请求DTO + * + * 文件定义:用于更新角色的请求DTO对象,封装HTTP请求参数 + * 涉及业务:角色管理、权限分配等场景 + * 算法:支持部分字段更新,通过验证注解确保请求参数的有效性 + * + * @author 张翔 + * @date 2026-03-13 + */ +public class RoleUpdateRequest { + + private String roleName; + + private String roleKey; + + private Integer roleSort; + + private Integer status; + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleKey() { + return roleKey; + } + + public void setRoleKey(String roleKey) { + this.roleKey = roleKey; + } + + public Integer getRoleSort() { + return roleSort; + } + + public void setRoleSort(Integer roleSort) { + this.roleSort = roleSort; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/response/UserResponse.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/response/UserResponse.java index c5abed9..de2d4c9 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/response/UserResponse.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/dto/response/UserResponse.java @@ -68,7 +68,7 @@ public class UserResponse { this.updatedAt = updatedAt; } - public static UserResponse fromDomain(cn.novalon.manage.common.domain.SysUser user) { + public static UserResponse fromDomain(cn.novalon.manage.sys.core.domain.SysUser user) { UserResponse response = new UserResponse(); response.setId(user.getId()); response.setUsername(user.getUsername()); diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/filter/RateLimitFilter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/filter/RateLimitFilter.java new file mode 100644 index 0000000..ebafbcd --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/filter/RateLimitFilter.java @@ -0,0 +1,71 @@ +package cn.novalon.manage.sys.filter; + +import io.github.resilience4j.ratelimiter.RateLimiter; +import io.github.resilience4j.ratelimiter.RequestNotPermitted; +import io.github.resilience4j.ratelimiter.RateLimiterRegistry; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * API限流过滤器 + * + * @author 张翔 + * @date 2026-03-13 + */ +@Component +public class RateLimitFilter implements WebFilter { + + private final RateLimiter rateLimiter; + private final ConcurrentHashMap ipRateLimiterMap = new ConcurrentHashMap<>(); + + public RateLimitFilter(RateLimiterRegistry rateLimiterRegistry) { + this.rateLimiter = rateLimiterRegistry.rateLimiter("apiRateLimiter"); + } + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + String clientIp = getClientIp(exchange); + RateLimiter ipRateLimiter = ipRateLimiterMap.computeIfAbsent(clientIp, k -> rateLimiter); + + return Mono.fromCallable(() -> ipRateLimiter.acquirePermission()) + .flatMap(permitted -> { + if (permitted) { + return chain.filter(exchange); + } else { + exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS); + exchange.getResponse().getHeaders().add("X-RateLimit-Limit", + String.valueOf(ipRateLimiter.getRateLimiterConfig().getLimitForPeriod())); + exchange.getResponse().getHeaders().add("X-RateLimit-Remaining", "0"); + exchange.getResponse().getHeaders().add("Retry-After", "1"); + return exchange.getResponse().setComplete(); + } + }) + .onErrorResume(RequestNotPermitted.class, e -> { + exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS); + exchange.getResponse().getHeaders().add("X-RateLimit-Limit", + String.valueOf(ipRateLimiter.getRateLimiterConfig().getLimitForPeriod())); + exchange.getResponse().getHeaders().add("X-RateLimit-Remaining", "0"); + exchange.getResponse().getHeaders().add("Retry-After", "1"); + return exchange.getResponse().setComplete(); + }); + } + + private String getClientIp(ServerWebExchange exchange) { + String ip = exchange.getRequest().getHeaders().getFirst("X-Forwarded-For"); + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = exchange.getRequest().getHeaders().getFirst("X-Real-IP"); + } + if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { + ip = exchange.getRequest().getRemoteAddress() != null + ? exchange.getRequest().getRemoteAddress().getAddress().getHostAddress() + : "unknown"; + } + return ip; + } +} \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/ExceptionLogServiceImpl.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/ExceptionLogServiceImpl.java new file mode 100644 index 0000000..7586700 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/ExceptionLogServiceImpl.java @@ -0,0 +1,42 @@ +package cn.novalon.manage.sys.handler; + +import cn.novalon.manage.common.handler.ExceptionLogService; +import cn.novalon.manage.sys.core.domain.SysExceptionLog; +import cn.novalon.manage.sys.core.service.ISysExceptionLogService; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +/** + * 异常日志服务实现 + * + * 文件定义:实现异常日志记录接口,使用sys模块的异常日志服务 + * 涉及业务:异常日志记录、错误追踪 + * 算法:使用响应式编程实现异步日志记录 + * + * @author 张翔 + * @date 2026-03-13 + */ +@Service +public class ExceptionLogServiceImpl implements ExceptionLogService { + + private final ISysExceptionLogService exceptionLogService; + + public ExceptionLogServiceImpl(ISysExceptionLogService exceptionLogService) { + this.exceptionLogService = exceptionLogService; + } + + @Override + public Mono logException(String title, String exceptionName, String exceptionMsg, + String methodName, String ip, String stackTrace) { + SysExceptionLog exceptionLog = new SysExceptionLog(); + exceptionLog.setTitle(title); + exceptionLog.setExceptionName(exceptionName); + exceptionLog.setExceptionMsg(exceptionMsg); + exceptionLog.setMethodName(methodName); + exceptionLog.setIp(ip); + exceptionLog.setCreateTime(java.time.LocalDateTime.now()); + exceptionLog.setExceptionStack(stackTrace); + + return exceptionLogService.save(exceptionLog).then(); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/GlobalExceptionHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/GlobalExceptionHandler.java deleted file mode 100644 index e5ba252..0000000 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/GlobalExceptionHandler.java +++ /dev/null @@ -1,162 +0,0 @@ -package cn.novalon.manage.sys.handler; - -import cn.novalon.manage.common.domain.SysExceptionLog; -import cn.novalon.manage.sys.core.exception.DictionaryAlreadyExistsException; -import cn.novalon.manage.sys.core.service.ISysExceptionLogService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.dao.DuplicateKeyException; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.FieldError; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.server.ResponseStatusException; -import org.springframework.web.server.ServerWebExchange; -import org.springframework.web.server.ServerWebInputException; - -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; - -@RestControllerAdvice -public class GlobalExceptionHandler { - - private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); - - private final ISysExceptionLogService exceptionLogService; - - public GlobalExceptionHandler(ISysExceptionLogService exceptionLogService) { - this.exceptionLogService = exceptionLogService; - } - - @ExceptionHandler(Exception.class) - public ResponseEntity> handleException(Exception ex, ServerWebExchange exchange) { - logger.error("Exception occurred: ", ex); - - SysExceptionLog exceptionLog = new SysExceptionLog(); - exceptionLog.setTitle("System Exception"); - exceptionLog.setExceptionName(ex.getClass().getSimpleName()); - exceptionLog.setExceptionMsg(ex.getMessage()); - exceptionLog.setMethodName(exchange.getRequest().getPath().value()); - exceptionLog.setIp(getClientIp(exchange)); - exceptionLog.setCreateTime(LocalDateTime.now()); - - StringBuilder stackTrace = new StringBuilder(); - for (StackTraceElement element : ex.getStackTrace()) { - stackTrace.append(element.toString()).append("\n"); - } - exceptionLog.setExceptionStack(stackTrace.toString()); - - exceptionLogService.save(exceptionLog).subscribe(); - - Map response = new HashMap<>(); - response.put("code", HttpStatus.INTERNAL_SERVER_ERROR.value()); - response.put("message", ex.getMessage()); - response.put("timestamp", LocalDateTime.now()); - - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response); - } - - @ExceptionHandler(IllegalArgumentException.class) - public ResponseEntity> handleIllegalArgumentException(IllegalArgumentException ex, ServerWebExchange exchange) { - logger.warn("Illegal argument: ", ex); - - Map response = new HashMap<>(); - response.put("code", HttpStatus.BAD_REQUEST.value()); - response.put("message", ex.getMessage()); - response.put("timestamp", LocalDateTime.now()); - - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response); - } - - @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, ServerWebExchange exchange) { - logger.warn("Validation failed: ", ex); - - Map response = new HashMap<>(); - response.put("code", HttpStatus.BAD_REQUEST.value()); - - String errorMessage = ex.getBindingResult().getFieldErrors().stream() - .map(FieldError::getDefaultMessage) - .collect(Collectors.joining(", ")); - response.put("message", errorMessage); - response.put("timestamp", LocalDateTime.now()); - - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response); - } - - @ExceptionHandler(ServerWebInputException.class) - public ResponseEntity> handleServerWebInputException(ServerWebInputException ex, ServerWebExchange exchange) { - logger.warn("Server web input exception: ", ex); - - Map response = new HashMap<>(); - response.put("code", HttpStatus.BAD_REQUEST.value()); - response.put("message", ex.getReason()); - response.put("timestamp", LocalDateTime.now()); - - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response); - } - - @ExceptionHandler(ResponseStatusException.class) - public ResponseEntity> handleResponseStatusException(ResponseStatusException ex, ServerWebExchange exchange) { - logger.warn("Response status exception: ", ex); - - Map response = new HashMap<>(); - response.put("code", ex.getStatusCode().value()); - response.put("message", ex.getReason()); - response.put("timestamp", LocalDateTime.now()); - - return ResponseEntity.status(ex.getStatusCode()).body(response); - } - - @ExceptionHandler(DuplicateKeyException.class) - public ResponseEntity> handleDuplicateKeyException(DuplicateKeyException ex, ServerWebExchange exchange) { - logger.warn("Duplicate key: ", ex); - - Map response = new HashMap<>(); - response.put("code", HttpStatus.CONFLICT.value()); - response.put("message", "Duplicate key violation"); - response.put("timestamp", LocalDateTime.now()); - - return ResponseEntity.status(HttpStatus.CONFLICT).body(response); - } - - @ExceptionHandler(DataIntegrityViolationException.class) - public ResponseEntity> handleDataIntegrityViolationException(DataIntegrityViolationException ex, ServerWebExchange exchange) { - logger.warn("Data integrity violation: ", ex); - - Map response = new HashMap<>(); - response.put("code", HttpStatus.CONFLICT.value()); - response.put("message", "Data integrity violation"); - response.put("timestamp", LocalDateTime.now()); - - return ResponseEntity.status(HttpStatus.CONFLICT).body(response); - } - - @ExceptionHandler(DictionaryAlreadyExistsException.class) - public ResponseEntity> handleDictionaryAlreadyExistsException(DictionaryAlreadyExistsException ex, ServerWebExchange exchange) { - logger.warn("Dictionary already exists: type={}, code={}", ex.getType(), ex.getCode()); - - Map response = new HashMap<>(); - response.put("code", HttpStatus.CONFLICT.value()); - response.put("message", ex.getMessage()); - response.put("timestamp", LocalDateTime.now()); - - return ResponseEntity.status(HttpStatus.CONFLICT).body(response); - } - - private String getClientIp(ServerWebExchange exchange) { - String ip = exchange.getRequest().getHeaders().getFirst("X-Forwarded-For"); - if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { - ip = exchange.getRequest().getHeaders().getFirst("X-Real-IP"); - } - if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { - ip = "127.0.0.1"; - } - return ip; - } -} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/auth/SysAuthHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/auth/SysAuthHandler.java index 1f6e606..e3cb7b6 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/auth/SysAuthHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/auth/SysAuthHandler.java @@ -4,7 +4,7 @@ import cn.novalon.manage.sys.dto.request.LoginRequest; import cn.novalon.manage.sys.dto.request.UserRegisterRequest; import cn.novalon.manage.sys.dto.response.AuthResponse; import cn.novalon.manage.sys.security.JwtTokenProvider; -import cn.novalon.manage.common.domain.SysUser; +import cn.novalon.manage.sys.core.domain.SysUser; import cn.novalon.manage.sys.core.service.ISysUserService; import org.springframework.http.HttpStatus; import org.springframework.security.crypto.password.PasswordEncoder; @@ -19,6 +19,16 @@ import java.time.LocalDateTime; import java.util.Map; import java.util.stream.Collectors; +/** + * 认证处理器 + * + * 文件定义:处理用户登录、注册等认证相关的HTTP请求 + * 涉及业务:用户登录、用户注册、Token生成、密码验证 + * 算法:使用BCrypt验证密码,使用JWT生成Token + * + * @author 张翔 + * @date 2026-03-13 + */ @Component public class SysAuthHandler { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/config/SysConfigHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/config/SysConfigHandler.java index 4430f8b..0767191 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/config/SysConfigHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/config/SysConfigHandler.java @@ -1,6 +1,6 @@ package cn.novalon.manage.sys.handler.config; -import cn.novalon.manage.common.domain.SysConfig; +import cn.novalon.manage.sys.core.domain.SysConfig; import cn.novalon.manage.sys.core.service.ISysConfigService; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dict/SysDictHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dict/SysDictHandler.java index 8cb9b04..68c5308 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dict/SysDictHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dict/SysDictHandler.java @@ -1,7 +1,7 @@ package cn.novalon.manage.sys.handler.dict; -import cn.novalon.manage.common.domain.SysDictType; -import cn.novalon.manage.common.domain.SysDictData; +import cn.novalon.manage.sys.core.domain.SysDictType; +import cn.novalon.manage.sys.core.domain.SysDictData; import cn.novalon.manage.sys.core.service.ISysDictTypeService; import cn.novalon.manage.sys.core.service.ISysDictDataService; import org.springframework.http.HttpStatus; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandler.java index bfbe0ed..2797c04 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandler.java @@ -1,6 +1,6 @@ package cn.novalon.manage.sys.handler.dictionary; -import cn.novalon.manage.common.domain.Dictionary; +import cn.novalon.manage.sys.core.domain.Dictionary; import cn.novalon.manage.sys.core.service.IDictionaryService; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/file/SysFileHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/file/SysFileHandler.java index a50791f..630ed1b 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/file/SysFileHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/file/SysFileHandler.java @@ -1,6 +1,6 @@ package cn.novalon.manage.sys.handler.file; -import cn.novalon.manage.common.domain.SysFile; +import cn.novalon.manage.sys.core.domain.SysFile; import cn.novalon.manage.sys.core.service.ISysFileService; import cn.novalon.manage.sys.dto.response.FilePreviewResponse; import org.springframework.core.io.Resource; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/log/SysLogHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/log/SysLogHandler.java index d8c3a21..9937abf 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/log/SysLogHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/log/SysLogHandler.java @@ -1,7 +1,7 @@ package cn.novalon.manage.sys.handler.log; -import cn.novalon.manage.common.domain.SysLoginLog; -import cn.novalon.manage.common.domain.SysExceptionLog; +import cn.novalon.manage.sys.core.domain.SysLoginLog; +import cn.novalon.manage.sys.core.domain.SysExceptionLog; import cn.novalon.manage.sys.core.service.ISysLoginLogService; import cn.novalon.manage.sys.core.service.ISysExceptionLogService; import cn.novalon.manage.common.dto.PageRequest; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/menu/MenuHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/menu/MenuHandler.java new file mode 100644 index 0000000..499b24d --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/menu/MenuHandler.java @@ -0,0 +1,93 @@ +package cn.novalon.manage.sys.handler.menu; + +import cn.novalon.manage.sys.core.domain.SysMenu; +import cn.novalon.manage.sys.core.service.ISysMenuService; +import cn.novalon.manage.sys.dto.request.MenuCreateRequest; +import cn.novalon.manage.sys.dto.request.MenuUpdateRequest; +import cn.novalon.manage.sys.core.command.CreateMenuCommand; +import cn.novalon.manage.sys.core.command.UpdateMenuCommand; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +@Component +public class MenuHandler { + + private final ISysMenuService menuService; + + public MenuHandler(ISysMenuService menuService) { + this.menuService = menuService; + } + + public Mono getAllMenus(ServerRequest request) { + return ServerResponse.ok() + .body(menuService.findAll(), SysMenu.class); + } + + public Mono getMenuById(ServerRequest request) { + Long id = Long.valueOf(request.pathVariable("id")); + return menuService.findById(id) + .flatMap(menu -> ServerResponse.ok().bodyValue(menu)) + .switchIfEmpty(ServerResponse.notFound().build()); + } + + public Mono getMenuTree(ServerRequest request) { + return ServerResponse.ok() + .body(menuService.buildMenuTree(menuService.findAll()), SysMenu.class); + } + + public Mono getMenusByParent(ServerRequest request) { + Long parentId = request.queryParam("parentId") + .map(Long::valueOf) + .orElse(0L); + return ServerResponse.ok() + .body(menuService.findByParentId(parentId), SysMenu.class); + } + + public Mono getMenusByType(ServerRequest request) { + String menuType = request.queryParam("menuType").orElse(null); + return ServerResponse.ok() + .body(menuService.findAll().filter(menu -> menuType == null || menuType.equals(menu.getMenuType())), SysMenu.class); + } + + public Mono createMenu(ServerRequest request) { + return request.bodyToMono(MenuCreateRequest.class) + .map(req -> CreateMenuCommand.of( + req.getParentId(), + req.getMenuName(), + req.getMenuType(), + req.getOrderNum(), + req.getComponent(), + req.getPerms(), + req.getStatus() + )) + .flatMap(menuService::createMenu) + .flatMap(menu -> ServerResponse.status(HttpStatus.CREATED).bodyValue(menu)); + } + + public Mono updateMenu(ServerRequest request) { + Long id = Long.valueOf(request.pathVariable("id")); + return request.bodyToMono(MenuUpdateRequest.class) + .map(req -> UpdateMenuCommand.of( + id, + req.getParentId(), + req.getMenuName(), + req.getMenuType(), + req.getOrderNum(), + req.getComponent(), + req.getPerms(), + req.getStatus() + )) + .flatMap(menuService::updateMenu) + .flatMap(menu -> ServerResponse.ok().bodyValue(menu)) + .switchIfEmpty(ServerResponse.notFound().build()); + } + + public Mono deleteMenu(ServerRequest request) { + Long id = Long.valueOf(request.pathVariable("id")); + return menuService.deleteMenu(id) + .then(ServerResponse.noContent().build()); + } +} \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/message/SysUserMessageHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/message/SysUserMessageHandler.java index f03b112..ba4fce2 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/message/SysUserMessageHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/message/SysUserMessageHandler.java @@ -1,6 +1,6 @@ package cn.novalon.manage.sys.handler.message; -import cn.novalon.manage.common.domain.SysUserMessage; +import cn.novalon.manage.sys.core.domain.SysUserMessage; import cn.novalon.manage.sys.core.service.ISysUserMessageService; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/notice/SysNoticeHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/notice/SysNoticeHandler.java deleted file mode 100644 index dde0473..0000000 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/notice/SysNoticeHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -package cn.novalon.manage.sys.handler.notice; - -import cn.novalon.manage.common.domain.SysNotice; -import cn.novalon.manage.sys.core.service.ISysNoticeService; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Mono; - -@Component -public class SysNoticeHandler { - - private final ISysNoticeService noticeService; - - public SysNoticeHandler(ISysNoticeService noticeService) { - this.noticeService = noticeService; - } - - public Mono getAllNotices(ServerRequest request) { - return ServerResponse.ok() - .body(noticeService.findAll(), SysNotice.class); - } - - public Mono getNoticeById(ServerRequest request) { - Long id = Long.valueOf(request.pathVariable("id")); - return noticeService.findById(id) - .flatMap(notice -> ServerResponse.ok().bodyValue(notice)) - .switchIfEmpty(ServerResponse.notFound().build()); - } - - public Mono getNoticesByStatus(ServerRequest request) { - String status = request.pathVariable("status"); - return ServerResponse.ok() - .body(noticeService.findByStatus(status), SysNotice.class); - } - - public Mono createNotice(ServerRequest request) { - return request.bodyToMono(SysNotice.class) - .flatMap(noticeService::save) - .flatMap(notice -> ServerResponse.status(HttpStatus.CREATED).bodyValue(notice)); - } - - public Mono updateNotice(ServerRequest request) { - Long id = Long.valueOf(request.pathVariable("id")); - return request.bodyToMono(SysNotice.class) - .flatMap(notice -> noticeService.findById(id) - .flatMap(existing -> { - existing.setNoticeTitle(notice.getNoticeTitle()); - existing.setNoticeType(notice.getNoticeType()); - existing.setNoticeContent(notice.getNoticeContent()); - existing.setStatus(notice.getStatus()); - return noticeService.save(existing); - })) - .flatMap(updatedNotice -> ServerResponse.ok().bodyValue(updatedNotice)) - .switchIfEmpty(ServerResponse.notFound().build()); - } - - public Mono deleteNotice(ServerRequest request) { - Long id = Long.valueOf(request.pathVariable("id")); - return noticeService.deleteById(id) - .then(ServerResponse.noContent().build()); - } -} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/role/SysRoleHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/role/SysRoleHandler.java index c049cac..86bde04 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/role/SysRoleHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/role/SysRoleHandler.java @@ -1,8 +1,12 @@ package cn.novalon.manage.sys.handler.role; -import cn.novalon.manage.common.domain.SysRole; +import cn.novalon.manage.sys.core.domain.SysRole; import cn.novalon.manage.sys.core.service.ISysRoleService; import cn.novalon.manage.common.dto.PageRequest; +import cn.novalon.manage.sys.dto.request.RoleCreateRequest; +import cn.novalon.manage.sys.dto.request.RoleUpdateRequest; +import cn.novalon.manage.sys.core.command.CreateRoleCommand; +import cn.novalon.manage.sys.core.command.UpdateRoleCommand; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.http.HttpStatus; @@ -77,7 +81,13 @@ public class SysRoleHandler { @Operation(summary = "创建角色", description = "创建新角色") public Mono createRole(ServerRequest request) { - return request.bodyToMono(SysRole.class) + return request.bodyToMono(RoleCreateRequest.class) + .map(req -> CreateRoleCommand.of( + req.getRoleName(), + req.getRoleKey(), + req.getRoleSort(), + req.getStatus() + )) .flatMap(roleService::createRole) .flatMap(role -> ServerResponse.status(HttpStatus.CREATED).bodyValue(role)); } @@ -85,15 +95,15 @@ public class SysRoleHandler { @Operation(summary = "更新角色", description = "更新角色信息") public Mono updateRole(ServerRequest request) { Long id = Long.valueOf(request.pathVariable("id")); - return request.bodyToMono(SysRole.class) - .flatMap(role -> roleService.findById(id) - .flatMap(existing -> { - if (role.getRoleName() != null) existing.setRoleName(role.getRoleName()); - if (role.getRoleKey() != null) existing.setRoleKey(role.getRoleKey()); - if (role.getRoleSort() != null) existing.setRoleSort(role.getRoleSort()); - if (role.getStatus() != null) existing.setStatus(role.getStatus()); - return roleService.updateRole(existing); - })) + return request.bodyToMono(RoleUpdateRequest.class) + .map(req -> UpdateRoleCommand.of( + id, + req.getRoleName(), + req.getRoleKey(), + req.getRoleSort(), + req.getStatus() + )) + .flatMap(roleService::updateRole) .flatMap(updatedRole -> ServerResponse.ok().bodyValue(updatedRole)) .switchIfEmpty(ServerResponse.notFound().build()); } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/user/SysUserHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/user/SysUserHandler.java index afcadc3..ecac7b2 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/user/SysUserHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/user/SysUserHandler.java @@ -1,10 +1,13 @@ package cn.novalon.manage.sys.handler.user; -import cn.novalon.manage.common.domain.SysUser; +import cn.novalon.manage.sys.core.domain.SysUser; import cn.novalon.manage.sys.core.service.ISysUserService; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.sys.dto.request.PasswordChangeRequest; +import cn.novalon.manage.sys.dto.request.UserRegisterRequest; import cn.novalon.manage.sys.dto.request.UserUpdateRequest; +import cn.novalon.manage.sys.core.command.CreateUserCommand; +import cn.novalon.manage.sys.core.command.UpdateUserCommand; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.http.HttpStatus; @@ -15,6 +18,16 @@ import reactor.core.publisher.Mono; import java.util.List; +/** + * 用户处理器 + * + * 文件定义:处理用户相关的HTTP请求,将请求转换为Service层调用 + * 涉及业务:用户查询、创建、更新、删除、密码修改等RESTful API操作 + * 算法:使用WebFlux函数式编程模型处理响应式请求 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component @Tag(name = "用户管理", description = "用户相关操作") public class SysUserHandler { @@ -75,7 +88,14 @@ public class SysUserHandler { @Operation(summary = "创建用户", description = "创建新用户") public Mono createUser(ServerRequest request) { - return request.bodyToMono(SysUser.class) + return request.bodyToMono(UserRegisterRequest.class) + .map(req -> CreateUserCommand.of( + req.getUsername(), + req.getPassword(), + req.getEmail(), + null, + null + )) .flatMap(userService::createUser) .flatMap(user -> ServerResponse.status(HttpStatus.CREATED).bodyValue(user)); } @@ -84,16 +104,15 @@ public class SysUserHandler { public Mono updateUser(ServerRequest request) { Long id = Long.valueOf(request.pathVariable("id")); return request.bodyToMono(UserUpdateRequest.class) - .flatMap(req -> userService.findById(id) - .flatMap(existing -> { - if (req.getEmail() != null) - existing.setEmail(req.getEmail()); - if (req.getStatus() != null) - existing.setStatus(req.getStatus()); - if (req.getRoleId() != null) - existing.setRoleId(req.getRoleId()); - return userService.updateUser(existing); - })) + .map(req -> UpdateUserCommand.of( + id, + null, + null, + req.getEmail(), + req.getRoleId(), + req.getStatus() + )) + .flatMap(userService::updateUser) .flatMap(user -> ServerResponse.ok().bodyValue(user)) .switchIfEmpty(ServerResponse.notFound().build()); } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/primitive/Email.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/primitive/Email.java new file mode 100644 index 0000000..3e26fdd --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/primitive/Email.java @@ -0,0 +1,66 @@ +package cn.novalon.manage.sys.primitive; + +import org.apache.commons.lang3.StringUtils; + +import java.util.regex.Pattern; + +/** + * 邮箱值对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public final class Email { + + private static final Pattern EMAIL_PATTERN = Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"); + + private final String value; + + public String getValue() { + return value; + } + + private Email(String value) { + this.value = value; + } + + public static Email of(String value) { + if (StringUtils.isBlank(value)) { + throw new IllegalArgumentException("Email is required"); + } + validate(value); + return new Email(value); + } + + public static Email ofNullable(String value) { + if (StringUtils.isBlank(value)) { + return null; + } + validate(value); + return new Email(value); + } + + private static void validate(String value) { + if (!EMAIL_PATTERN.matcher(value).matches()) { + throw new IllegalArgumentException("Invalid email format"); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Email email = (Email) o; + return value.equals(email.value); + } + + @Override + public int hashCode() { + return value.hashCode(); + } + + @Override + public String toString() { + return value; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/primitive/Password.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/primitive/Password.java new file mode 100644 index 0000000..00952c9 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/primitive/Password.java @@ -0,0 +1,66 @@ +package cn.novalon.manage.sys.primitive; + +import org.apache.commons.lang3.StringUtils; + +/** + * 密码值对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public final class Password { + + private static final int MIN_LENGTH = 8; + + private final String value; + + public String getValue() { + return value; + } + + private Password(String value) { + this.value = value; + } + + public static Password of(String value) { + if (StringUtils.isBlank(value)) { + throw new IllegalArgumentException("Password is required"); + } + validate(value); + return new Password(value); + } + + private static void validate(String value) { + if (value.length() < MIN_LENGTH) { + throw new IllegalArgumentException("Password must be at least " + MIN_LENGTH + " characters long"); + } + + boolean hasUppercase = value.chars().anyMatch(Character::isUpperCase); + boolean hasLowercase = value.chars().anyMatch(Character::isLowerCase); + boolean hasDigit = value.chars().anyMatch(Character::isDigit); + boolean hasSpecial = value.chars().anyMatch(c -> !Character.isLetterOrDigit(c)); + + if (!hasUppercase || !hasLowercase || !hasDigit || !hasSpecial) { + throw new IllegalArgumentException( + "Password must contain at least one uppercase letter, one lowercase letter, one digit, and one special character"); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Password password = (Password) o; + return value.equals(password.value); + } + + @Override + public int hashCode() { + return value.hashCode(); + } + + @Override + public String toString() { + return "********"; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/primitive/Username.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/primitive/Username.java new file mode 100644 index 0000000..6e290dd --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/primitive/Username.java @@ -0,0 +1,70 @@ +package cn.novalon.manage.sys.primitive; + +import org.apache.commons.lang3.StringUtils; + +import java.util.regex.Pattern; + +/** + * 用户名值对象 + * + * @author 张翔 + * @date 2026-03-13 + */ +public final class Username { + + private static final int MIN_LENGTH = 3; + private static final int MAX_LENGTH = 50; + private static final Pattern USERNAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_]+$"); + + private final String value; + + public String getValue() { + return value; + } + + private Username(String value) { + this.value = value; + } + + public static Username of(String value) { + if (StringUtils.isBlank(value)) { + throw new IllegalArgumentException("Username is required"); + } + validate(value); + return new Username(value); + } + + private static void validate(String value) { + String trimmed = value.trim(); + + if (trimmed.length() < MIN_LENGTH) { + throw new IllegalArgumentException("Username must be at least " + MIN_LENGTH + " characters long"); + } + + if (trimmed.length() > MAX_LENGTH) { + throw new IllegalArgumentException("Username must be at most " + MAX_LENGTH + " characters long"); + } + + if (!USERNAME_PATTERN.matcher(trimmed).matches()) { + throw new IllegalArgumentException("Username can only contain letters, numbers, and underscores"); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Username username = (Username) o; + return value.equals(username.value); + } + + @Override + public int hashCode() { + return value.hashCode(); + } + + @Override + public String toString() { + return value; + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/security/JwtAuthenticationFilter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/security/JwtAuthenticationFilter.java index d137b85..05aed8e 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/security/JwtAuthenticationFilter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/security/JwtAuthenticationFilter.java @@ -13,6 +13,12 @@ import reactor.core.publisher.Mono; import java.util.Collections; +/** + * JWT认证过滤器 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component public class JwtAuthenticationFilter implements WebFilter { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/security/JwtTokenProvider.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/security/JwtTokenProvider.java index f6d1ae1..d5b52c4 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/security/JwtTokenProvider.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/security/JwtTokenProvider.java @@ -12,6 +12,12 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; +/** + * JWT Token提供者 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component public class JwtTokenProvider { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/websocket/SysWebSocketHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/websocket/SysWebSocketHandler.java index bf8e679..6216a40 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/websocket/SysWebSocketHandler.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/websocket/SysWebSocketHandler.java @@ -2,40 +2,110 @@ package cn.novalon.manage.sys.websocket; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.web.reactive.socket.WebSocketHandler; import org.springframework.web.reactive.socket.WebSocketSession; import reactor.core.publisher.Mono; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +/** + * WebSocket处理器 + * + * 文件定义:处理WebSocket连接和消息推送 + * 涉及业务:实时消息推送、系统公告通知、用户消息 + * 算法:使用ConcurrentHashMap管理WebSocket会话,支持点对点和广播消息,添加心跳机制和超时处理 + * + * @author 张翔 + * @date 2026-03-13 + */ @Component public class SysWebSocketHandler implements WebSocketHandler { private final Map sessions = new ConcurrentHashMap<>(); + private final Map lastActivityTime = new ConcurrentHashMap<>(); private final ObjectMapper objectMapper = new ObjectMapper(); + @Value("${websocket.idle-timeout:300s}") + private Duration idleTimeout; + + @Value("${websocket.heartbeat-interval:30s}") + private Duration heartbeatInterval; + @Override public Mono handle(WebSocketSession session) { String userId = extractUserId(session); + lastActivityTime.put(userId, LocalDateTime.now()); return session.receive() .doOnNext(message -> { String payload = message.getPayloadAsText(); handleIncomingMessage(session, userId, payload); + lastActivityTime.put(userId, LocalDateTime.now()); }) .doOnComplete(() -> { sessions.remove(userId); + lastActivityTime.remove(userId); System.out.println("WebSocket session closed for user: " + userId); }) .doOnError(error -> { sessions.remove(userId); + lastActivityTime.remove(userId); System.err.println("WebSocket error for user " + userId + ": " + error.getMessage()); }) .then(); } + /** + * 定时清理空闲连接 + */ + @Scheduled(fixedRate = 60000) + public void cleanupIdleConnections() { + LocalDateTime now = LocalDateTime.now(); + lastActivityTime.entrySet().removeIf(entry -> { + LocalDateTime lastActivity = entry.getValue(); + if (Duration.between(lastActivity, now).compareTo(idleTimeout) > 0) { + String userId = entry.getKey(); + WebSocketSession session = sessions.get(userId); + if (session != null) { + try { + session.close(); + System.out.println("Closed idle WebSocket connection for user: " + userId); + } catch (Exception e) { + System.err.println("Error closing idle connection for user " + userId + ": " + e.getMessage()); + } + } + return true; + } + return false; + }); + } + + /** + * 定时发送心跳消息 + */ + @Scheduled(fixedRate = 30000) + public void sendHeartbeat() { + sessions.forEach((userId, session) -> { + try { + if (session.isOpen()) { + String heartbeatMessage = objectMapper.writeValueAsString(Map.of( + "type", "heartbeat", + "timestamp", System.currentTimeMillis() + )); + session.send(Mono.just(session.textMessage(heartbeatMessage))).subscribe(); + } + } catch (Exception e) { + System.err.println("Error sending heartbeat to user " + userId + ": " + e.getMessage()); + } + }); + } + private String extractUserId(WebSocketSession session) { String query = session.getHandshakeInfo().getUri().getQuery(); if (query != null && query.contains("userId=")) { @@ -54,10 +124,17 @@ public class SysWebSocketHandler implements WebSocketHandler { case "ping": sendMessageToUser(userId, Map.of("type", "pong", "timestamp", System.currentTimeMillis())); break; + case "pong": + lastActivityTime.put(userId, LocalDateTime.now()); + break; case "subscribe": sessions.put(userId, session); + lastActivityTime.put(userId, LocalDateTime.now()); System.out.println("User " + userId + " subscribed to WebSocket"); break; + case "heartbeat": + lastActivityTime.put(userId, LocalDateTime.now()); + break; default: System.out.println("Unknown message type: " + type); } @@ -68,7 +145,7 @@ public class SysWebSocketHandler implements WebSocketHandler { public void sendMessageToUser(String userId, Object message) { WebSocketSession session = sessions.get(userId); - if (session != null) { + if (session != null && session.isOpen()) { try { String json = objectMapper.writeValueAsString(message); session.send(Mono.just(session.textMessage(json))).subscribe(); @@ -89,7 +166,9 @@ public class SysWebSocketHandler implements WebSocketHandler { sessions.forEach((userId, session) -> { try { - session.send(Mono.just(session.textMessage(json))).subscribe(); + if (session.isOpen()) { + session.send(Mono.just(session.textMessage(json))).subscribe(); + } } catch (Exception e) { System.err.println("Error broadcasting to user " + userId + ": " + e.getMessage()); } diff --git a/novalon-manage-api/manage-sys/src/main/resources/application.yml b/novalon-manage-api/manage-sys/src/main/resources/application.yml index c44b682..1ac9a6b 100644 --- a/novalon-manage-api/manage-sys/src/main/resources/application.yml +++ b/novalon-manage-api/manage-sys/src/main/resources/application.yml @@ -1,5 +1,8 @@ server: - port: 8080 + port: 8084 + netty: + connection-timeout: 60s + idle-timeout: 300s spring: application: @@ -30,6 +33,21 @@ jwt: secret: novalon-manage-secret-key-change-in-production expiration: 86400000 +websocket: + enabled: true + heartbeat-interval: 30s + idle-timeout: 300s + max-text-message-buffer-size: 8192 + max-binary-message-buffer-size: 8192 + +resilience4j: + ratelimiter: + instances: + apiRateLimiter: + limit-for-period: 100 + limit-refresh-period: 1s + timeout-duration: 0 + logging: level: cn.novalon.manage: DEBUG diff --git a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/DictionaryServiceTest.java b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/DictionaryServiceTest.java index dd247cf..38f8a9a 100644 --- a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/DictionaryServiceTest.java +++ b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/DictionaryServiceTest.java @@ -1,9 +1,9 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.Dictionary; +import cn.novalon.manage.sys.core.domain.Dictionary; import cn.novalon.manage.sys.core.exception.DictionaryAlreadyExistsException; import cn.novalon.manage.sys.core.service.IDictionaryService; -import cn.novalon.manage.db.repository.DictionaryRepository; +import cn.novalon.manage.sys.core.repository.IDictionaryRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -22,7 +22,7 @@ import static org.mockito.Mockito.*; class DictionaryServiceTest { @Mock - private DictionaryRepository repository; + private IDictionaryRepository repository; private IDictionaryService service; diff --git a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysConfigServiceTest.java b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysConfigServiceTest.java index 89e0f8a..4f2dfdb 100644 --- a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysConfigServiceTest.java +++ b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysConfigServiceTest.java @@ -1,7 +1,7 @@ package cn.novalon.manage.sys.core.service.impl; -import cn.novalon.manage.common.domain.SysConfig; -import cn.novalon.manage.db.repository.ISysConfigRepository; +import cn.novalon.manage.sys.core.domain.SysConfig; +import cn.novalon.manage.sys.core.repository.ISysConfigRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysRoleServiceTest.java b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysRoleServiceTest.java index f390012..22fb974 100644 --- a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysRoleServiceTest.java +++ b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysRoleServiceTest.java @@ -1,8 +1,10 @@ package cn.novalon.manage.sys.core.service.impl; import cn.novalon.manage.common.util.StatusConstants; -import cn.novalon.manage.common.domain.SysRole; -import cn.novalon.manage.db.repository.ISysRoleRepository; +import cn.novalon.manage.sys.core.domain.SysRole; +import cn.novalon.manage.sys.core.query.SysRoleQuery; +import cn.novalon.manage.sys.core.repository.ISysRoleRepository; +import cn.novalon.manage.sys.core.service.ISysUserService; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; import org.junit.jupiter.api.BeforeEach; @@ -28,13 +30,16 @@ class SysRoleServiceTest { @Mock private ISysRoleRepository roleRepository; + @Mock + private ISysUserService userService; + private SysRoleService roleService; private SysRole testRole; @BeforeEach void setUp() { - roleService = new SysRoleService(roleRepository); + roleService = new SysRoleService(roleRepository, userService); testRole = new SysRole(); testRole.setId(1L); @@ -78,14 +83,14 @@ class SysRoleServiceTest { pageResponse.setContent(List.of(testRole)); pageResponse.setTotalElements(1L); - when(roleRepository.findByQueryWithPagination(any(Query.class), eq(pageRequest))) + when(roleRepository.findByQueryWithPagination(any(SysRoleQuery.class), eq(pageRequest))) .thenReturn(Mono.just(pageResponse)); StepVerifier.create(roleService.findRolesByPage(pageRequest)) .expectNextMatches(response -> response.getTotalElements() == 1L) .verifyComplete(); - verify(roleRepository).findByQueryWithPagination(any(Query.class), eq(pageRequest)); + verify(roleRepository).findByQueryWithPagination(any(SysRoleQuery.class), eq(pageRequest)); } @Test @@ -133,11 +138,15 @@ class SysRoleServiceTest { @Test void testDeleteRole() { + when(roleRepository.findById(1L)).thenReturn(Mono.just(testRole)); + when(userService.updateRoleIdToNullByRoleId(1L)).thenReturn(Mono.empty()); when(roleRepository.deleteById(1L)).thenReturn(Mono.empty()); StepVerifier.create(roleService.deleteRole(1L)) .verifyComplete(); + verify(roleRepository).findById(1L); + verify(userService).updateRoleIdToNullByRoleId(1L); verify(roleRepository).deleteById(1L); } diff --git a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysUserServiceTest.java b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysUserServiceTest.java index 7d0a2cb..e898c14 100644 --- a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysUserServiceTest.java +++ b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/core/service/impl/SysUserServiceTest.java @@ -1,8 +1,9 @@ package cn.novalon.manage.sys.core.service.impl; import cn.novalon.manage.common.util.StatusConstants; -import cn.novalon.manage.common.domain.SysUser; -import cn.novalon.manage.db.repository.ISysUserRepository; +import cn.novalon.manage.sys.core.domain.SysUser; +import cn.novalon.manage.sys.core.query.SysUserQuery; +import cn.novalon.manage.sys.core.repository.ISysUserRepository; import cn.novalon.manage.common.dto.PageRequest; import cn.novalon.manage.common.dto.PageResponse; import org.junit.jupiter.api.BeforeEach; @@ -107,14 +108,14 @@ class SysUserServiceTest { pageResponse.setContent(List.of(testUser)); pageResponse.setTotalElements(1L); - when(userRepository.findByQueryWithPagination(any(Query.class), eq(pageRequest))) + when(userRepository.findByQueryWithPagination(any(SysUserQuery.class), eq(pageRequest))) .thenReturn(Mono.just(pageResponse)); StepVerifier.create(userService.findUsersByPage(pageRequest)) .expectNextMatches(response -> response.getTotalElements() == 1L) .verifyComplete(); - verify(userRepository).findByQueryWithPagination(any(Query.class), eq(pageRequest)); + verify(userRepository).findByQueryWithPagination(any(SysUserQuery.class), eq(pageRequest)); } @Test @@ -127,14 +128,14 @@ class SysUserServiceTest { pageResponse.setContent(List.of(testUser)); pageResponse.setTotalElements(1L); - when(userRepository.findByQueryWithPagination(any(Query.class), eq(pageRequest))) + when(userRepository.findByQueryWithPagination(any(SysUserQuery.class), eq(pageRequest))) .thenReturn(Mono.just(pageResponse)); StepVerifier.create(userService.findUsersByPage(pageRequest)) .expectNextMatches(response -> response.getTotalElements() == 1L) .verifyComplete(); - verify(userRepository).findByQueryWithPagination(any(Query.class), eq(pageRequest)); + verify(userRepository).findByQueryWithPagination(any(SysUserQuery.class), eq(pageRequest)); } @Test @@ -199,6 +200,7 @@ class SysUserServiceTest { @Test void testDeleteUser() { + when(userRepository.findById(1L)).thenReturn(Mono.just(testUser)); when(userRepository.deleteById(1L)).thenReturn(Mono.empty()); StepVerifier.create(userService.deleteUser(1L)) diff --git a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandlerTest.java b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandlerTest.java index 481dab8..1a45e12 100644 --- a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandlerTest.java +++ b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandlerTest.java @@ -1,6 +1,6 @@ package cn.novalon.manage.sys.handler.dictionary; -import cn.novalon.manage.common.domain.Dictionary; +import cn.novalon.manage.sys.core.domain.Dictionary; import cn.novalon.manage.sys.core.service.IDictionaryService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test;