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