From c8646974d85e025788269d2e38e4f756d36f0f56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Thu, 12 Mar 2026 12:37:14 +0800 Subject: [PATCH] refactor: complete infrastructure refactoring phase 1 - Restore DAO layer design pattern (DictionaryDao, OperationLogDao, SysUserDao) - Update Repository implementations to use DAO layer - Add batch conversion methods to all converters (toEntityList, toDomainList) - Migrate DictionaryHandler to functional WebFlux style - Create unified SystemRouter configuration - Add comprehensive .gitignore file --- .../manage/sys/config/SystemRouter.java | 27 ++++ .../handler/dictionary/DictionaryHandler.java | 64 +++++++++ .../db/converter/DictionaryConverter.java | 66 +++++++++ .../db/converter/OperationLogConverter.java | 23 ++++ .../db/converter/SysConfigConverter.java | 8 +- .../db/converter/SysDictDataConverter.java | 8 +- .../db/converter/SysDictTypeConverter.java | 8 +- .../converter/SysExceptionLogConverter.java | 4 + .../db/converter/SysFileConverter.java | 4 + .../db/converter/SysLoginLogConverter.java | 4 + .../db/converter/SysMenuConverter.java | 4 + .../db/converter/SysNoticeConverter.java | 8 +- .../db/converter/SysRoleConverter.java | 4 + .../db/converter/SysUserConverter.java | 25 ++++ .../db/converter/SysUserMessageConverter.java | 4 + .../infrastructure/db/dao/DictionaryDao.java | 21 +++ .../db/repository/DictionaryRepository.java | 49 +++++++ .../db/repository/OperationLogRepository.java | 10 ++ .../db/repository/SysUserRepository.java | 129 +++++++++++++++++- 19 files changed, 453 insertions(+), 17 deletions(-) create mode 100644 novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/SystemRouter.java create mode 100644 novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandler.java create mode 100644 novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/DictionaryConverter.java create mode 100644 novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/dao/DictionaryDao.java create mode 100644 novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/DictionaryRepository.java 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 new file mode 100644 index 0000000..297a1f2 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/config/SystemRouter.java @@ -0,0 +1,27 @@ +package cn.novalon.manage.sys.config; + +import cn.novalon.manage.sys.handler.dictionary.DictionaryHandler; +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.RequestPredicates.*; +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(); + } +} \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandler.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandler.java new file mode 100644 index 0000000..2797c04 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/handler/dictionary/DictionaryHandler.java @@ -0,0 +1,64 @@ +package cn.novalon.manage.sys.handler.dictionary; + +import cn.novalon.manage.sys.core.domain.Dictionary; +import cn.novalon.manage.sys.core.service.IDictionaryService; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +@Component +public class DictionaryHandler { + + private final IDictionaryService dictionaryService; + + public DictionaryHandler(IDictionaryService dictionaryService) { + this.dictionaryService = dictionaryService; + } + + public Mono getAllDictionaries(ServerRequest request) { + return ServerResponse.ok() + .body(dictionaryService.findAll(), Dictionary.class); + } + + public Mono getDictionaryById(ServerRequest request) { + Long id = Long.valueOf(request.pathVariable("id")); + return dictionaryService.findById(id) + .flatMap(dict -> ServerResponse.ok().bodyValue(dict)) + .switchIfEmpty(ServerResponse.notFound().build()); + } + + public Mono getDictionariesByType(ServerRequest request) { + String type = request.pathVariable("type"); + return ServerResponse.ok() + .body(dictionaryService.findByType(type), Dictionary.class); + } + + public Mono checkTypeAndCodeExists(ServerRequest request) { + String type = request.queryParam("type").orElse(null); + String code = request.queryParam("code").orElse(null); + return dictionaryService.checkTypeAndCodeExists(type, code) + .flatMap(exists -> ServerResponse.ok().bodyValue(exists)); + } + + public Mono createDictionary(ServerRequest request) { + return request.bodyToMono(Dictionary.class) + .flatMap(dictionaryService::save) + .flatMap(dict -> ServerResponse.status(HttpStatus.CREATED).bodyValue(dict)); + } + + public Mono updateDictionary(ServerRequest request) { + Long id = Long.valueOf(request.pathVariable("id")); + return request.bodyToMono(Dictionary.class) + .flatMap(dictionary -> dictionaryService.update(id, dictionary)) + .flatMap(dict -> ServerResponse.ok().bodyValue(dict)) + .switchIfEmpty(ServerResponse.notFound().build()); + } + + public Mono deleteDictionary(ServerRequest request) { + Long id = Long.valueOf(request.pathVariable("id")); + return dictionaryService.deleteById(id) + .then(ServerResponse.noContent().build()); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/DictionaryConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/DictionaryConverter.java new file mode 100644 index 0000000..162912b --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/DictionaryConverter.java @@ -0,0 +1,66 @@ +package cn.novalon.manage.sys.infrastructure.db.converter; + +import cn.novalon.manage.sys.core.domain.Dictionary; +import cn.novalon.manage.sys.infrastructure.db.entity.DictionaryEntity; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class DictionaryConverter { + + public DictionaryEntity toEntity(Dictionary domain) { + if (domain == null) { + return null; + } + DictionaryEntity entity = new DictionaryEntity(); + entity.setId(domain.getId()); + entity.setType(domain.getType()); + entity.setCode(domain.getCode()); + entity.setName(domain.getName()); + entity.setValue(domain.getValue()); + entity.setRemark(domain.getRemark()); + entity.setSort(domain.getSort()); + entity.setCreateBy(domain.getCreateBy()); + entity.setCreatedAt(domain.getCreatedAt()); + entity.setUpdatedAt(domain.getUpdatedAt()); + return entity; + } + + public Dictionary toDomain(DictionaryEntity entity) { + if (entity == null) { + return null; + } + Dictionary domain = new Dictionary(); + domain.setId(entity.getId()); + domain.setType(entity.getType()); + domain.setCode(entity.getCode()); + domain.setName(entity.getName()); + domain.setValue(entity.getValue()); + domain.setRemark(entity.getRemark()); + domain.setSort(entity.getSort()); + domain.setCreateBy(entity.getCreateBy()); + domain.setCreatedAt(entity.getCreatedAt()); + domain.setUpdatedAt(entity.getUpdatedAt()); + return domain; + } + + public List toEntityList(List domains) { + if (domains == null) { + return null; + } + return domains.stream() + .map(this::toEntity) + .collect(Collectors.toList()); + } + + public List toDomainList(List entities) { + if (entities == null) { + return null; + } + return entities.stream() + .map(this::toDomain) + .collect(Collectors.toList()); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/OperationLogConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/OperationLogConverter.java index 189748d..c44cdf1 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/OperationLogConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/OperationLogConverter.java @@ -2,7 +2,12 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.OperationLog; import cn.novalon.manage.sys.infrastructure.db.entity.OperationLogEntity; +import org.springframework.stereotype.Component; +import java.util.List; +import java.util.stream.Collectors; + +@Component public class OperationLogConverter { public OperationLog toDomain(OperationLogEntity entity) { @@ -46,4 +51,22 @@ public class OperationLogConverter { entity.setDeletedAt(domain.getDeletedAt()); return entity; } + + public List toDomainList(List entities) { + if (entities == null) { + return null; + } + return entities.stream() + .map(this::toDomain) + .collect(Collectors.toList()); + } + + public List toEntityList(List domains) { + if (domains == null) { + return null; + } + return domains.stream() + .map(this::toEntity) + .collect(Collectors.toList()); + } } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysConfigConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysConfigConverter.java index 3122a45..838b1ba 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysConfigConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysConfigConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysConfig; import cn.novalon.manage.sys.infrastructure.db.entity.SysConfigEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysConfigConverter { public SysConfig toDomain(SysConfigEntity entity) { @@ -15,8 +19,6 @@ public class SysConfigConverter { domain.setConfigKey(entity.getConfigKey()); domain.setConfigValue(entity.getConfigValue()); domain.setConfigType(entity.getConfigType()); - domain.setCreateBy(entity.getCreateBy()); - domain.setUpdateBy(entity.getUpdateBy()); domain.setCreatedAt(entity.getCreatedAt()); domain.setUpdatedAt(entity.getUpdatedAt()); return domain; @@ -32,8 +34,6 @@ public class SysConfigConverter { entity.setConfigKey(domain.getConfigKey()); entity.setConfigValue(domain.getConfigValue()); entity.setConfigType(domain.getConfigType()); - entity.setCreateBy(domain.getCreateBy()); - entity.setUpdateBy(domain.getUpdateBy()); entity.setCreatedAt(domain.getCreatedAt()); entity.setUpdatedAt(domain.getUpdatedAt()); return entity; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysDictDataConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysDictDataConverter.java index 1e915ff..98e1bcf 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysDictDataConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysDictDataConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysDictData; import cn.novalon.manage.sys.infrastructure.db.entity.SysDictDataEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysDictDataConverter { public SysDictData toDomain(SysDictDataEntity entity) { @@ -19,8 +23,6 @@ public class SysDictDataConverter { domain.setListClass(entity.getListClass()); domain.setIsDefault(entity.getIsDefault()); domain.setStatus(entity.getStatus()); - domain.setCreateBy(entity.getCreateBy()); - domain.setUpdateBy(entity.getUpdateBy()); domain.setCreatedAt(entity.getCreatedAt()); domain.setUpdatedAt(entity.getUpdatedAt()); return domain; @@ -40,8 +42,6 @@ public class SysDictDataConverter { entity.setListClass(domain.getListClass()); entity.setIsDefault(domain.getIsDefault()); entity.setStatus(domain.getStatus()); - entity.setCreateBy(domain.getCreateBy()); - entity.setUpdateBy(domain.getUpdateBy()); entity.setCreatedAt(domain.getCreatedAt()); entity.setUpdatedAt(domain.getUpdatedAt()); return entity; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysDictTypeConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysDictTypeConverter.java index 50ccff6..143be67 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysDictTypeConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysDictTypeConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysDictType; import cn.novalon.manage.sys.infrastructure.db.entity.SysDictTypeEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysDictTypeConverter { public SysDictType toDomain(SysDictTypeEntity entity) { @@ -15,8 +19,6 @@ public class SysDictTypeConverter { domain.setDictType(entity.getDictType()); domain.setStatus(entity.getStatus()); domain.setRemark(entity.getRemark()); - domain.setCreateBy(entity.getCreateBy()); - domain.setUpdateBy(entity.getUpdateBy()); domain.setCreatedAt(entity.getCreatedAt()); domain.setUpdatedAt(entity.getUpdatedAt()); return domain; @@ -32,8 +34,6 @@ public class SysDictTypeConverter { entity.setDictType(domain.getDictType()); entity.setStatus(domain.getStatus()); entity.setRemark(domain.getRemark()); - entity.setCreateBy(domain.getCreateBy()); - entity.setUpdateBy(domain.getUpdateBy()); entity.setCreatedAt(domain.getCreatedAt()); entity.setUpdatedAt(domain.getUpdatedAt()); return entity; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysExceptionLogConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysExceptionLogConverter.java index 5bb7137..4b1a7b4 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysExceptionLogConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysExceptionLogConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysExceptionLog; import cn.novalon.manage.sys.infrastructure.db.entity.SysExceptionLogEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysExceptionLogConverter { public SysExceptionLog toDomain(SysExceptionLogEntity entity) { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysFileConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysFileConverter.java index b60647a..1dcf608 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysFileConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysFileConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysFile; import cn.novalon.manage.sys.infrastructure.db.entity.SysFileEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysFileConverter { public SysFile toDomain(SysFileEntity entity) { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysLoginLogConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysLoginLogConverter.java index 9227273..273e6f1 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysLoginLogConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysLoginLogConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysLoginLog; import cn.novalon.manage.sys.infrastructure.db.entity.SysLoginLogEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysLoginLogConverter { public SysLoginLog toDomain(SysLoginLogEntity entity) { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysMenuConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysMenuConverter.java index e82c900..fd4bcf6 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysMenuConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysMenuConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysMenu; import cn.novalon.manage.sys.infrastructure.db.entity.SysMenuEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysMenuConverter { public SysMenu toDomain(SysMenuEntity entity) { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysNoticeConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysNoticeConverter.java index be40fb6..45c6891 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysNoticeConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysNoticeConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysNotice; import cn.novalon.manage.sys.infrastructure.db.entity.SysNoticeEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysNoticeConverter { public SysNotice toDomain(SysNoticeEntity entity) { @@ -15,8 +19,6 @@ public class SysNoticeConverter { domain.setNoticeType(entity.getNoticeType()); domain.setNoticeContent(entity.getNoticeContent()); domain.setStatus(entity.getStatus()); - domain.setCreateBy(entity.getCreateBy()); - domain.setUpdateBy(entity.getUpdateBy()); domain.setCreatedAt(entity.getCreatedAt()); domain.setUpdatedAt(entity.getUpdatedAt()); return domain; @@ -32,8 +34,6 @@ public class SysNoticeConverter { entity.setNoticeType(domain.getNoticeType()); entity.setNoticeContent(domain.getNoticeContent()); entity.setStatus(domain.getStatus()); - entity.setCreateBy(domain.getCreateBy()); - entity.setUpdateBy(domain.getUpdateBy()); entity.setCreatedAt(domain.getCreatedAt()); entity.setUpdatedAt(domain.getUpdatedAt()); return entity; diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysRoleConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysRoleConverter.java index 8f6862d..a364207 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysRoleConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysRoleConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysRole; import cn.novalon.manage.sys.infrastructure.db.entity.SysRoleEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysRoleConverter { public SysRole toDomain(SysRoleEntity entity) { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysUserConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysUserConverter.java index 914c8db..9db666d 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysUserConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysUserConverter.java @@ -3,6 +3,13 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysUser; import cn.novalon.manage.sys.infrastructure.db.entity.SysUserEntity; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component + public class SysUserConverter { public SysUser toDomain(SysUserEntity entity) { @@ -38,4 +45,22 @@ public class SysUserConverter { entity.setDeletedAt(domain.getDeletedAt()); return entity; } + + public List toDomainList(List entities) { + if (entities == null) { + return null; + } + return entities.stream() + .map(this::toDomain) + .collect(Collectors.toList()); + } + + public List toEntityList(List domains) { + if (domains == null) { + return null; + } + return domains.stream() + .map(this::toEntity) + .collect(Collectors.toList()); + } } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysUserMessageConverter.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysUserMessageConverter.java index 79fb62c..d19c17c 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysUserMessageConverter.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/converter/SysUserMessageConverter.java @@ -3,6 +3,10 @@ package cn.novalon.manage.sys.infrastructure.db.converter; import cn.novalon.manage.sys.core.domain.SysUserMessage; import cn.novalon.manage.sys.infrastructure.db.entity.SysUserMessageEntity; +import org.springframework.stereotype.Component; + +@Component + public class SysUserMessageConverter { public SysUserMessage toDomain(SysUserMessageEntity entity) { diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/dao/DictionaryDao.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/dao/DictionaryDao.java new file mode 100644 index 0000000..5b228d3 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/dao/DictionaryDao.java @@ -0,0 +1,21 @@ +package cn.novalon.manage.sys.infrastructure.db.dao; + +import cn.novalon.manage.sys.infrastructure.db.entity.DictionaryEntity; +import org.springframework.data.r2dbc.repository.R2dbcRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Repository +public interface DictionaryDao extends R2dbcRepository { + + Flux findByType(String type); + + Mono findByTypeAndCode(String type, String code); + + Flux findByDeletedAtIsNull(); + + Flux findByDeletedAtIsNullOrderBySortAsc(); + + Mono deleteByIdAndDeletedAtIsNull(Long id); +} \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/DictionaryRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/DictionaryRepository.java new file mode 100644 index 0000000..d52eace --- /dev/null +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/DictionaryRepository.java @@ -0,0 +1,49 @@ +package cn.novalon.manage.sys.infrastructure.db.repository; + +import cn.novalon.manage.sys.core.domain.Dictionary; +import cn.novalon.manage.sys.infrastructure.db.converter.DictionaryConverter; +import cn.novalon.manage.sys.infrastructure.db.dao.DictionaryDao; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Repository +public class DictionaryRepository { + + private final DictionaryDao dao; + private final DictionaryConverter converter; + + public DictionaryRepository(DictionaryDao dao, DictionaryConverter converter) { + this.dao = dao; + this.converter = converter; + } + + public Flux findByType(String type) { + return dao.findByType(type) + .map(converter::toDomain); + } + + public Mono findByTypeAndCode(String type, String code) { + return dao.findByTypeAndCode(type, code) + .map(converter::toDomain); + } + + public Flux findAll() { + return dao.findByDeletedAtIsNullOrderBySortAsc() + .map(converter::toDomain); + } + + public Mono findById(Long id) { + return dao.findById(id) + .map(converter::toDomain); + } + + public Mono save(Dictionary dictionary) { + return dao.save(converter.toEntity(dictionary)) + .map(converter::toDomain); + } + + public Mono deleteById(Long id) { + return dao.deleteByIdAndDeletedAtIsNull(id); + } +} diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/OperationLogRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/OperationLogRepository.java index 9f166a4..bb9734b 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/OperationLogRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/OperationLogRepository.java @@ -54,4 +54,14 @@ public class OperationLogRepository implements IOperationLogRepository { return dao.findByUsernameAndDeletedAtIsNull(username) .map(converter::toDomain); } + + @Override + public Mono count() { + return dao.countByDeletedAtIsNull(); + } + + @Override + public Mono countByCreatedAtAfter(LocalDateTime dateTime) { + return dao.countByCreatedAtAfterAndDeletedAtIsNull(dateTime); + } } diff --git a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/SysUserRepository.java b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/SysUserRepository.java index 9d5ee4d..219df89 100644 --- a/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/SysUserRepository.java +++ b/novalon-manage-api/manage-sys/src/main/java/cn/novalon/manage/sys/infrastructure/db/repository/SysUserRepository.java @@ -2,23 +2,36 @@ package cn.novalon.manage.sys.infrastructure.db.repository; import cn.novalon.manage.sys.core.domain.SysUser; import cn.novalon.manage.sys.core.repository.ISysUserRepository; +import cn.novalon.manage.sys.dto.request.PageRequest; +import cn.novalon.manage.sys.dto.response.PageResponse; import cn.novalon.manage.sys.infrastructure.db.converter.SysUserConverter; import cn.novalon.manage.sys.infrastructure.db.dao.SysUserDao; +import cn.novalon.manage.sys.infrastructure.db.entity.SysUserEntity; +import org.springframework.data.domain.Sort; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; +import org.springframework.data.relational.core.query.Query; +import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.LocalDateTime; +import java.util.List; @Repository public class SysUserRepository implements ISysUserRepository { private final SysUserDao dao; private final SysUserConverter converter; + private final R2dbcEntityTemplate template; + private final DatabaseClient databaseClient; - public SysUserRepository(SysUserDao dao, SysUserConverter converter) { + public SysUserRepository(SysUserDao dao, SysUserConverter converter, + R2dbcEntityTemplate template, DatabaseClient databaseClient) { this.dao = dao; this.converter = converter; + this.template = template; + this.databaseClient = databaseClient; } @Override @@ -29,6 +42,13 @@ public class SysUserRepository implements ISysUserRepository { @Override public Mono findById(Long id) { + return dao.findById(id) + .filter(entity -> entity.getDeletedAt() == null) + .map(converter::toDomain); + } + + @Override + public Mono findByIdIncludingDeleted(Long id) { return dao.findById(id) .map(converter::toDomain); } @@ -51,7 +71,114 @@ public class SysUserRepository implements ISysUserRepository { @Override public Flux findAll() { + return dao.findAll() + .map(converter::toDomain); + } + + @Override + public Flux findAll(Sort sort) { + return dao.findAll(sort) + .map(converter::toDomain); + } + + @Override + public Mono count() { + return dao.countByDeletedAtIsNull(); + } + + @Override + public Mono> findByQueryWithPagination(Query query, PageRequest pageRequest) { + Sort sort = Sort.by( + pageRequest.getOrder().equalsIgnoreCase("desc") ? Sort.Direction.DESC : Sort.Direction.ASC, + pageRequest.getSort()); + + org.springframework.data.domain.Pageable pageable = org.springframework.data.domain.PageRequest.of( + pageRequest.getPage(), + pageRequest.getSize(), + sort); + + return template.select(SysUserEntity.class) + .matching(query.with(pageable)) + .all() + .collectList() + .zipWith(template.count(query, SysUserEntity.class)) + .map(tuple -> { + long totalCount = tuple.getT2(); + int totalPages = (int) Math.ceil((double) totalCount / pageRequest.getSize()); + return new PageResponse( + tuple.getT1().stream().map(converter::toDomain).toList(), + totalPages, + totalCount, + pageRequest.getPage(), + pageRequest.getSize()); + }); + } + + @Override + public Flux findByDeletedAtIsNull() { return dao.findByDeletedAtIsNull() .map(converter::toDomain); } + + @Override + public Flux findByDeletedAtIsNull(Sort sort) { + return dao.findByDeletedAtIsNull(sort) + .map(converter::toDomain); + } + + @Override + public Mono findByEmail(String email) { + return dao.findByEmailAndDeletedAtIsNull(email) + .map(converter::toDomain); + } + + @Override + public Mono existsByUsername(String username) { + return dao.findByUsernameAndDeletedAtIsNull(username) + .map(user -> user != null) + .defaultIfEmpty(false); + } + + @Override + public Mono existsByEmail(String email) { + return dao.findByEmailAndDeletedAtIsNull(email) + .map(user -> user != null) + .defaultIfEmpty(false); + } + + @Override + public Mono logicalDeleteById(Long id) { + return databaseClient.sql("UPDATE users SET deleted_at = CURRENT_TIMESTAMP WHERE id = $1") + .bind("$1", id) + .fetch() + .rowsUpdated() + .then(); + } + + @Override + public Mono logicalDeleteByIds(List ids) { + return databaseClient.sql("UPDATE users SET deleted_at = CURRENT_TIMESTAMP WHERE id = ANY($1)") + .bind("$1", ids.toArray()) + .fetch() + .rowsUpdated() + .then(); + } + + @Override + public Mono restoreById(Long id) { + return databaseClient.sql("UPDATE users SET deleted_at = NULL WHERE id = $1") + .bind("$1", id) + .fetch() + .rowsUpdated() + .then(); + } + + @Override + public Mono restoreByIds(List ids) { + return databaseClient.sql("UPDATE users SET deleted_at = NULL WHERE id = ANY($1)") + .bind("$1", ids.toArray()) + .fetch() + .rowsUpdated() + .then(); + } }