From 7e089c66bd55f8eb9dfad64ebdc9b8c1a0d4ac58 Mon Sep 17 00:00:00 2001 From: luke Date: Mon, 9 Jun 2025 00:40:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7=C3=A6?= =?UTF-8?q?=C2=A9=E8=A7=92=E8=89=B2=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 5 + .../base/application/filter/AuthFilter.java | 6 +- .../application/service/UserAppService.java | 50 +++++++ .../service/UserAppServiceImpl.java | 139 ++++++++++++++++++ .../schedule/ImportScheduler.java | 4 +- .../doc/repository/iface/FileRepository.java | 14 ++ .../base/domain/doc/repository/po/File.java | 28 ++++ .../{ => service}/iface/DocumentImporter.java | 2 +- .../doc/service/iface/FileDomainService.java | 15 ++ .../impl/AbstractBaseFileImporter.java | 4 +- .../doc/{ => service}/impl/ExcelImporter.java | 2 +- .../service/impl/FileDomainServiceImpl.java | 47 ++++++ .../{ => service}/impl/MarkdownImporter.java | 2 +- .../doc/{ => service}/impl/PdfImporter.java | 2 +- .../doc/{ => service}/impl/WordImporter.java | 2 +- .../iface/RoleFileRuleRepository.java | 14 ++ .../user/repository/iface/RoleRepository.java | 13 ++ .../repository/iface/UserFileRepository.java | 15 ++ .../user/repository/iface/UserRepository.java | 15 +- .../repository/iface/UserRoleRepository.java | 15 ++ .../repository/iface/UserTokenRepository.java | 15 +- .../base/domain/user/repository/po/Role.java | 27 ++++ .../user/repository/po/RoleFileRule.java | 29 ++++ .../domain/user/repository/po/UserFile.java | 27 ++++ .../domain/user/repository/po/UserRole.java | 27 ++++ .../base/domain/user/service/UserService.java | 20 --- .../domain/user/service/UserServiceImpl.java | 80 ---------- .../user/service/iface/RoleDomainSupport.java | 14 ++ .../iface/RoleFileRuleDomainSupport.java | 11 ++ .../service/iface/UserAuthDomainSupport.java | 13 ++ .../user/service/iface/UserDomainService.java | 43 ++++++ .../service/iface/UserFileDomainSupport.java | 11 ++ .../iface/UserProfileDomainSupport.java | 15 ++ .../service/iface/UserRoleDomainSupport.java | 11 ++ .../service/impl/RoleDomainSupportImpl.java | 42 ++++++ .../impl/RoleFileRuleDomainSupportImpl.java | 31 ++++ .../impl/UserAuthDomainSupportImpl.java | 60 ++++++++ .../service/impl/UserDomainServiceImpl.java | 133 +++++++++++++++++ .../impl/UserFileDomainSupportImpl.java | 34 +++++ .../impl/UserProfileDomainSupportImpl.java | 53 +++++++ .../impl/UserRoleDomainSupportImpl.java | 34 +++++ .../north/controller/ImportController.java | 2 +- .../north/controller/UserController.java | 18 +-- .../infrastructure/north/dto/RegisterReq.java | 10 ++ .../repository/mapper/doc/FileMapper.java | 12 ++ .../mapper/user/RoleFileRuleMapper.java | 12 ++ .../repository/mapper/user/RoleMapper.java | 9 ++ .../mapper/user/UserFileMapper.java | 12 ++ .../mapper/{ => user}/UserMapper.java | 2 +- .../mapper/user/UserRoleMapper.java | 9 ++ .../mapper/{ => user}/UserTokenMapper.java | 2 +- .../persistence/UserTokenRepositoryImpl.java | 50 ------- .../persistence/doc/FileRepositoryImpl.java | 48 ++++++ .../user/RoleFileRuleRepositoryImpl.java | 47 ++++++ .../persistence/user/RoleRepositoryImpl.java | 41 ++++++ .../user/UserFileRepositoryImpl.java | 54 +++++++ .../{ => user}/UserRepositoryImpl.java | 41 +++--- .../user/UserRoleRepositoryImpl.java | 54 +++++++ .../user/UserTokenRepositoryImpl.java | 50 +++++++ ...ceTest.java => UserDomainServiceTest.java} | 7 +- 60 files changed, 1392 insertions(+), 212 deletions(-) create mode 100644 src/main/java/com/knowledge/base/application/service/UserAppService.java create mode 100644 src/main/java/com/knowledge/base/application/service/UserAppServiceImpl.java rename src/main/java/com/knowledge/base/domain/{ => common}/schedule/ImportScheduler.java (95%) create mode 100644 src/main/java/com/knowledge/base/domain/doc/repository/iface/FileRepository.java create mode 100644 src/main/java/com/knowledge/base/domain/doc/repository/po/File.java rename src/main/java/com/knowledge/base/domain/doc/{ => service}/iface/DocumentImporter.java (83%) create mode 100644 src/main/java/com/knowledge/base/domain/doc/service/iface/FileDomainService.java rename src/main/java/com/knowledge/base/domain/doc/{ => service}/impl/AbstractBaseFileImporter.java (98%) rename src/main/java/com/knowledge/base/domain/doc/{ => service}/impl/ExcelImporter.java (97%) create mode 100644 src/main/java/com/knowledge/base/domain/doc/service/impl/FileDomainServiceImpl.java rename src/main/java/com/knowledge/base/domain/doc/{ => service}/impl/MarkdownImporter.java (94%) rename src/main/java/com/knowledge/base/domain/doc/{ => service}/impl/PdfImporter.java (95%) rename src/main/java/com/knowledge/base/domain/doc/{ => service}/impl/WordImporter.java (96%) create mode 100644 src/main/java/com/knowledge/base/domain/user/repository/iface/RoleFileRuleRepository.java create mode 100644 src/main/java/com/knowledge/base/domain/user/repository/iface/RoleRepository.java create mode 100644 src/main/java/com/knowledge/base/domain/user/repository/iface/UserFileRepository.java create mode 100644 src/main/java/com/knowledge/base/domain/user/repository/iface/UserRoleRepository.java create mode 100644 src/main/java/com/knowledge/base/domain/user/repository/po/Role.java create mode 100644 src/main/java/com/knowledge/base/domain/user/repository/po/RoleFileRule.java create mode 100644 src/main/java/com/knowledge/base/domain/user/repository/po/UserFile.java create mode 100644 src/main/java/com/knowledge/base/domain/user/repository/po/UserRole.java delete mode 100644 src/main/java/com/knowledge/base/domain/user/service/UserService.java delete mode 100644 src/main/java/com/knowledge/base/domain/user/service/UserServiceImpl.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/iface/RoleDomainSupport.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/iface/RoleFileRuleDomainSupport.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/iface/UserAuthDomainSupport.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/iface/UserDomainService.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/iface/UserFileDomainSupport.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/iface/UserProfileDomainSupport.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/iface/UserRoleDomainSupport.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/impl/RoleDomainSupportImpl.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/impl/RoleFileRuleDomainSupportImpl.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/impl/UserAuthDomainSupportImpl.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/impl/UserDomainServiceImpl.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/impl/UserFileDomainSupportImpl.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/impl/UserProfileDomainSupportImpl.java create mode 100644 src/main/java/com/knowledge/base/domain/user/service/impl/UserRoleDomainSupportImpl.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/north/dto/RegisterReq.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/mapper/doc/FileMapper.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/RoleFileRuleMapper.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/RoleMapper.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserFileMapper.java rename src/main/java/com/knowledge/base/infrastructure/repository/mapper/{ => user}/UserMapper.java (77%) create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserRoleMapper.java rename src/main/java/com/knowledge/base/infrastructure/repository/mapper/{ => user}/UserTokenMapper.java (78%) delete mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/persistence/UserTokenRepositoryImpl.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/persistence/doc/FileRepositoryImpl.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/RoleFileRuleRepositoryImpl.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/RoleRepositoryImpl.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserFileRepositoryImpl.java rename src/main/java/com/knowledge/base/infrastructure/repository/persistence/{ => user}/UserRepositoryImpl.java (57%) create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRoleRepositoryImpl.java create mode 100644 src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserTokenRepositoryImpl.java rename src/test/java/com/knowledge/base/domain/user/service/{UserServiceTest.java => UserDomainServiceTest.java} (75%) diff --git a/Readme.md b/Readme.md index c3ee5e3..384ac95 100644 --- a/Readme.md +++ b/Readme.md @@ -5,5 +5,10 @@ |:-----:|:----------:|:-------:|:-------------------:| | 1.0.0 | 2025-06-05 | Luke.Ye | 添加修订记录(新增token校验接口) | | 1.0.1 | 2025-06-06 | Luke.Ye | 重构登录Token校验逻辑, | +| 1.0.2 | 2025-06-09 | Luke.Ye | 添加用户角色相关逻辑,重构代码 | + +## 开发顺序 + +PO ---> Mapper ---> iface ---> persistence \ No newline at end of file diff --git a/src/main/java/com/knowledge/base/application/filter/AuthFilter.java b/src/main/java/com/knowledge/base/application/filter/AuthFilter.java index 2561844..0a2a450 100644 --- a/src/main/java/com/knowledge/base/application/filter/AuthFilter.java +++ b/src/main/java/com/knowledge/base/application/filter/AuthFilter.java @@ -1,7 +1,7 @@ package com.knowledge.base.application.filter; import cn.hutool.core.util.StrUtil; -import com.knowledge.base.domain.user.service.UserService; +import com.knowledge.base.domain.user.service.iface.UserDomainService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -19,7 +19,7 @@ import java.io.IOException; public class AuthFilter implements Filter { @Autowired - private UserService userService; + private UserDomainService userDomainService; private static final String COOKIE_KEY = "auth_token"; @@ -50,7 +50,7 @@ public class AuthFilter implements Filter { } } - if (token == null || !userService.isValidToken(token)) { + if (token == null || !userDomainService.isValidToken(token)) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.getWriter().write("Invalid or expired token"); return; diff --git a/src/main/java/com/knowledge/base/application/service/UserAppService.java b/src/main/java/com/knowledge/base/application/service/UserAppService.java new file mode 100644 index 0000000..506f1e3 --- /dev/null +++ b/src/main/java/com/knowledge/base/application/service/UserAppService.java @@ -0,0 +1,50 @@ +package com.knowledge.base.application.service; + +import com.knowledge.base.domain.user.repository.po.User; +import com.knowledge.base.domain.user.repository.po.UserToken; +import com.knowledge.base.domain.user.repository.po.UserRole; +import com.knowledge.base.domain.user.repository.po.UserFile; +import com.knowledge.base.domain.user.repository.po.Role; +import com.knowledge.base.domain.user.repository.po.RoleFileRule; + +import java.util.List; +import java.util.Optional; + +public interface UserAppService { + // 用户注册 + boolean registerUser(String username, String password, List roleIds); + boolean verifyPassword(String username, String plainText); + + // 用户资料 + Optional findByUsername(String username); + Optional findById(Long id); + List findAll(); + + // Token 相关 + UserToken createToken(Long userId, long expireMs); + void removeToken(String token); + boolean isValidToken(String token); + Optional findToken(String token); + + // 用户角色 + List listUserRoles(Long userId); + boolean addUserRole(Long userId, Long roleId); + boolean removeUserRole(Long userId, Long roleId); + + // 用户特殊授权 + List listUserFiles(Long userId); + boolean addUserFileAuth(Long userId, Long fileId); + boolean removeUserFileAuth(Long userId, Long fileId); + + // 角色 + List listRoles(); + Optional getRoleById(Long roleId); + boolean addRole(Role role); + boolean updateRole(Role role); + boolean deleteRole(Long id); + + // 角色授权信息 + List listRoleFileRules(Long roleId); + boolean addRoleFileRule(RoleFileRule rule); + boolean removeRoleFileRule(Long id); +} diff --git a/src/main/java/com/knowledge/base/application/service/UserAppServiceImpl.java b/src/main/java/com/knowledge/base/application/service/UserAppServiceImpl.java new file mode 100644 index 0000000..246ec78 --- /dev/null +++ b/src/main/java/com/knowledge/base/application/service/UserAppServiceImpl.java @@ -0,0 +1,139 @@ +package com.knowledge.base.application.service; + +import com.knowledge.base.domain.user.repository.po.*; +import com.knowledge.base.domain.user.service.iface.UserDomainService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class UserAppServiceImpl implements UserAppService { + + private final UserDomainService userDomainService; + + @Override + public boolean registerUser(String username, String password, List roleIds) { + boolean ok = userDomainService.registerUser(username, password); + if (!ok) return false; + Optional userOpt = userDomainService.findByUsername(username); + if (userOpt.isEmpty()) return false; + Long userId = userOpt.get().getId(); + for (Long roleId : roleIds) { + userDomainService.addUserRole(userId, roleId); + } + return true; + } + + @Override + public boolean verifyPassword(String username, String plainText) { + return userDomainService.verifyPassword(username, plainText); + } + + @Override + public Optional findByUsername(String username) { + return userDomainService.findByUsername(username); + } + + @Override + public Optional findById(Long id) { + return userDomainService.findById(id); + } + + @Override + public List findAll() { + return userDomainService.findAllUsers(); + } + + @Override + public UserToken createToken(Long userId, long expireMs) { + return userDomainService.createToken(userId, expireMs); + } + + @Override + public void removeToken(String token) { + userDomainService.removeToken(token); + } + + @Override + public boolean isValidToken(String token) { + return userDomainService.isValidToken(token); + } + + @Override + public Optional findToken(String token) { + return userDomainService.findToken(token); + } + + @Override + public List listUserRoles(Long userId) { + return userDomainService.findRolesByUserId(userId); + } + + @Override + public boolean addUserRole(Long userId, Long roleId) { + return userDomainService.addUserRole(userId, roleId); + } + + @Override + public boolean removeUserRole(Long userId, Long roleId) { + return userDomainService.removeUserRole(userId, roleId); + } + + @Override + public List listUserFiles(Long userId) { + return userDomainService.findUserFiles(userId); + } + + @Override + public boolean addUserFileAuth(Long userId, Long fileId) { + return userDomainService.addUserFileAuth(userId, fileId); + } + + @Override + public boolean removeUserFileAuth(Long userId, Long fileId) { + return userDomainService.removeUserFileAuth(userId, fileId); + } + + @Override + public List listRoles() { + return userDomainService.findAllRoles(); + } + + @Override + public Optional getRoleById(Long roleId) { + return userDomainService.findRoleById(roleId); + } + + @Override + public boolean addRole(Role role) { + return userDomainService.addRole(role); + } + + @Override + public boolean updateRole(Role role) { + return userDomainService.updateRole(role); + } + + @Override + public boolean deleteRole(Long id) { + return userDomainService.deleteRole(id); + } + + @Override + public List listRoleFileRules(Long roleId) { + return userDomainService.findRoleFileRules(roleId); + } + + @Override + public boolean addRoleFileRule(RoleFileRule rule) { + return userDomainService.addRoleFileRule(rule); + } + + @Override + public boolean removeRoleFileRule(Long id) { + return userDomainService.removeRoleFileRule(id); + } +} diff --git a/src/main/java/com/knowledge/base/domain/schedule/ImportScheduler.java b/src/main/java/com/knowledge/base/domain/common/schedule/ImportScheduler.java similarity index 95% rename from src/main/java/com/knowledge/base/domain/schedule/ImportScheduler.java rename to src/main/java/com/knowledge/base/domain/common/schedule/ImportScheduler.java index cba5dd8..133a548 100644 --- a/src/main/java/com/knowledge/base/domain/schedule/ImportScheduler.java +++ b/src/main/java/com/knowledge/base/domain/common/schedule/ImportScheduler.java @@ -1,6 +1,6 @@ -package com.knowledge.base.domain.schedule; +package com.knowledge.base.domain.common.schedule; -import com.knowledge.base.domain.doc.iface.DocumentImporter; +import com.knowledge.base.domain.doc.service.iface.DocumentImporter; import com.knowledge.base.infrastructure.config.DynamicConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/knowledge/base/domain/doc/repository/iface/FileRepository.java b/src/main/java/com/knowledge/base/domain/doc/repository/iface/FileRepository.java new file mode 100644 index 0000000..5926831 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/doc/repository/iface/FileRepository.java @@ -0,0 +1,14 @@ +package com.knowledge.base.domain.doc.repository.iface; + +import com.knowledge.base.domain.doc.repository.po.File; + +import java.util.List; + +public interface FileRepository { + boolean save(File file); + boolean update(File file); + boolean deleteById(Long id); + File findById(Long id); + List findAll(); + List findByFileNameLike(String pattern); +} diff --git a/src/main/java/com/knowledge/base/domain/doc/repository/po/File.java b/src/main/java/com/knowledge/base/domain/doc/repository/po/File.java new file mode 100644 index 0000000..3488140 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/doc/repository/po/File.java @@ -0,0 +1,28 @@ +package com.knowledge.base.domain.doc.repository.po; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 知识库文件表 + * @author Luke.Ye + */ +@Data +@TableName("file") +public class File { + + @TableId(type = IdType.AUTO) + private Long id; + + private String fileName; + + private String filePath; + + @TableField(fill = FieldFill.INSERT) + private LocalDateTime addTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; +} diff --git a/src/main/java/com/knowledge/base/domain/doc/iface/DocumentImporter.java b/src/main/java/com/knowledge/base/domain/doc/service/iface/DocumentImporter.java similarity index 83% rename from src/main/java/com/knowledge/base/domain/doc/iface/DocumentImporter.java rename to src/main/java/com/knowledge/base/domain/doc/service/iface/DocumentImporter.java index f13c0b9..4ad35e6 100644 --- a/src/main/java/com/knowledge/base/domain/doc/iface/DocumentImporter.java +++ b/src/main/java/com/knowledge/base/domain/doc/service/iface/DocumentImporter.java @@ -1,4 +1,4 @@ -package com.knowledge.base.domain.doc.iface; +package com.knowledge.base.domain.doc.service.iface; import com.knowledge.base.domain.common.enums.DocTypeEnum; diff --git a/src/main/java/com/knowledge/base/domain/doc/service/iface/FileDomainService.java b/src/main/java/com/knowledge/base/domain/doc/service/iface/FileDomainService.java new file mode 100644 index 0000000..f4a0a1f --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/doc/service/iface/FileDomainService.java @@ -0,0 +1,15 @@ +package com.knowledge.base.domain.doc.service.iface; + +import com.knowledge.base.domain.doc.repository.po.File; + +import java.util.List; +import java.util.Optional; + +public interface FileDomainService { + boolean save(File file); + boolean update(File file); + boolean deleteById(Long id); + Optional findById(Long id); + List findAll(); + List findByFileNameLike(String pattern); +} diff --git a/src/main/java/com/knowledge/base/domain/doc/impl/AbstractBaseFileImporter.java b/src/main/java/com/knowledge/base/domain/doc/service/impl/AbstractBaseFileImporter.java similarity index 98% rename from src/main/java/com/knowledge/base/domain/doc/impl/AbstractBaseFileImporter.java rename to src/main/java/com/knowledge/base/domain/doc/service/impl/AbstractBaseFileImporter.java index a0456a6..5034813 100644 --- a/src/main/java/com/knowledge/base/domain/doc/impl/AbstractBaseFileImporter.java +++ b/src/main/java/com/knowledge/base/domain/doc/service/impl/AbstractBaseFileImporter.java @@ -1,6 +1,6 @@ -package com.knowledge.base.domain.doc.impl; +package com.knowledge.base.domain.doc.service.impl; -import com.knowledge.base.domain.doc.iface.DocumentImporter; +import com.knowledge.base.domain.doc.service.iface.DocumentImporter; import com.knowledge.base.infrastructure.cache.FileCacheService; import com.knowledge.base.infrastructure.util.SafeIdUtil; import com.knowledge.base.infrastructure.util.ThreadPoolUtil; diff --git a/src/main/java/com/knowledge/base/domain/doc/impl/ExcelImporter.java b/src/main/java/com/knowledge/base/domain/doc/service/impl/ExcelImporter.java similarity index 97% rename from src/main/java/com/knowledge/base/domain/doc/impl/ExcelImporter.java rename to src/main/java/com/knowledge/base/domain/doc/service/impl/ExcelImporter.java index 25a4f3b..6462b50 100644 --- a/src/main/java/com/knowledge/base/domain/doc/impl/ExcelImporter.java +++ b/src/main/java/com/knowledge/base/domain/doc/service/impl/ExcelImporter.java @@ -1,4 +1,4 @@ -package com.knowledge.base.domain.doc.impl; +package com.knowledge.base.domain.doc.service.impl; /** * @author Luke.ye diff --git a/src/main/java/com/knowledge/base/domain/doc/service/impl/FileDomainServiceImpl.java b/src/main/java/com/knowledge/base/domain/doc/service/impl/FileDomainServiceImpl.java new file mode 100644 index 0000000..19f5fc3 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/doc/service/impl/FileDomainServiceImpl.java @@ -0,0 +1,47 @@ +package com.knowledge.base.domain.doc.service.impl; + +import com.knowledge.base.domain.doc.repository.iface.FileRepository; +import com.knowledge.base.domain.doc.repository.po.File; +import com.knowledge.base.domain.doc.service.iface.FileDomainService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class FileDomainServiceImpl implements FileDomainService { + + private final FileRepository fileRepository; + + @Override + public boolean save(File file) { + return fileRepository.save(file); + } + + @Override + public boolean update(File file) { + return fileRepository.update(file); + } + + @Override + public boolean deleteById(Long id) { + return fileRepository.deleteById(id); + } + + @Override + public Optional findById(Long id) { + return Optional.ofNullable(fileRepository.findById(id)); + } + + @Override + public List findAll() { + return fileRepository.findAll(); + } + + @Override + public List findByFileNameLike(String pattern) { + return fileRepository.findByFileNameLike(pattern); + } +} diff --git a/src/main/java/com/knowledge/base/domain/doc/impl/MarkdownImporter.java b/src/main/java/com/knowledge/base/domain/doc/service/impl/MarkdownImporter.java similarity index 94% rename from src/main/java/com/knowledge/base/domain/doc/impl/MarkdownImporter.java rename to src/main/java/com/knowledge/base/domain/doc/service/impl/MarkdownImporter.java index eadfa42..660990a 100644 --- a/src/main/java/com/knowledge/base/domain/doc/impl/MarkdownImporter.java +++ b/src/main/java/com/knowledge/base/domain/doc/service/impl/MarkdownImporter.java @@ -1,4 +1,4 @@ -package com.knowledge.base.domain.doc.impl; +package com.knowledge.base.domain.doc.service.impl; import com.knowledge.base.domain.common.enums.DocTypeEnum; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/com/knowledge/base/domain/doc/impl/PdfImporter.java b/src/main/java/com/knowledge/base/domain/doc/service/impl/PdfImporter.java similarity index 95% rename from src/main/java/com/knowledge/base/domain/doc/impl/PdfImporter.java rename to src/main/java/com/knowledge/base/domain/doc/service/impl/PdfImporter.java index 6fb9ec8..b4ed8b3 100644 --- a/src/main/java/com/knowledge/base/domain/doc/impl/PdfImporter.java +++ b/src/main/java/com/knowledge/base/domain/doc/service/impl/PdfImporter.java @@ -1,4 +1,4 @@ -package com.knowledge.base.domain.doc.impl; +package com.knowledge.base.domain.doc.service.impl; import com.knowledge.base.domain.common.enums.DocTypeEnum; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/knowledge/base/domain/doc/impl/WordImporter.java b/src/main/java/com/knowledge/base/domain/doc/service/impl/WordImporter.java similarity index 96% rename from src/main/java/com/knowledge/base/domain/doc/impl/WordImporter.java rename to src/main/java/com/knowledge/base/domain/doc/service/impl/WordImporter.java index ba26920..034bf7e 100644 --- a/src/main/java/com/knowledge/base/domain/doc/impl/WordImporter.java +++ b/src/main/java/com/knowledge/base/domain/doc/service/impl/WordImporter.java @@ -1,4 +1,4 @@ -package com.knowledge.base.domain.doc.impl; +package com.knowledge.base.domain.doc.service.impl; import com.knowledge.base.domain.common.enums.DocTypeEnum; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/knowledge/base/domain/user/repository/iface/RoleFileRuleRepository.java b/src/main/java/com/knowledge/base/domain/user/repository/iface/RoleFileRuleRepository.java new file mode 100644 index 0000000..3405591 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/repository/iface/RoleFileRuleRepository.java @@ -0,0 +1,14 @@ +package com.knowledge.base.domain.user.repository.iface; + +import com.knowledge.base.domain.user.repository.po.RoleFileRule; + +import java.util.List; + +public interface RoleFileRuleRepository { + boolean save(RoleFileRule rule); + boolean update(RoleFileRule rule); + boolean deleteById(Long id); + RoleFileRule findById(Long id); + List findByRoleId(Long roleId); + List findAll(); +} diff --git a/src/main/java/com/knowledge/base/domain/user/repository/iface/RoleRepository.java b/src/main/java/com/knowledge/base/domain/user/repository/iface/RoleRepository.java new file mode 100644 index 0000000..f4224b2 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/repository/iface/RoleRepository.java @@ -0,0 +1,13 @@ +package com.knowledge.base.domain.user.repository.iface; + +import com.knowledge.base.domain.user.repository.po.Role; + +import java.util.List; + +public interface RoleRepository { + boolean save(Role role); + boolean update(Role role); + boolean deleteById(Long id); + Role findById(Long id); + List findAll(); +} diff --git a/src/main/java/com/knowledge/base/domain/user/repository/iface/UserFileRepository.java b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserFileRepository.java new file mode 100644 index 0000000..e051fa8 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserFileRepository.java @@ -0,0 +1,15 @@ +package com.knowledge.base.domain.user.repository.iface; + +import com.knowledge.base.domain.user.repository.po.UserFile; + +import java.util.List; + +public interface UserFileRepository { + boolean save(UserFile userFile); + boolean update(UserFile userFile); + boolean deleteById(Long id); + boolean deleteByUserIdAndFileId(Long userId, Long fileId); + UserFile findById(Long id); + List findByUserId(Long userId); + List findAll(); +} diff --git a/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRepository.java b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRepository.java index 71b97bc..71a69a7 100644 --- a/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRepository.java +++ b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRepository.java @@ -3,16 +3,13 @@ package com.knowledge.base.domain.user.repository.iface; import com.knowledge.base.domain.user.repository.po.User; import java.util.Optional; - -/** - * @author Luke.ye - * @date 2025/6/6 12:20 - */ - +import java.util.List; public interface UserRepository { - Optional findByUsername(String username); - void save(User user); - + boolean save(User user); + boolean update(User user); + boolean deleteById(Long id); Optional findById(Long id); + Optional findByUsername(String username); + List findAll(); } diff --git a/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRoleRepository.java b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRoleRepository.java new file mode 100644 index 0000000..a1eacb8 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserRoleRepository.java @@ -0,0 +1,15 @@ +package com.knowledge.base.domain.user.repository.iface; + +import com.knowledge.base.domain.user.repository.po.UserRole; + +import java.util.List; + +public interface UserRoleRepository { + boolean save(UserRole userRole); + boolean update(UserRole userRole); + boolean deleteById(Long id); + boolean deleteByUserIdAndRoleId(Long userId, Long roleId); + UserRole findById(Long id); + List findByUserId(Long userId); + List findAll(); +} diff --git a/src/main/java/com/knowledge/base/domain/user/repository/iface/UserTokenRepository.java b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserTokenRepository.java index b1aa25b..fbf5a1d 100644 --- a/src/main/java/com/knowledge/base/domain/user/repository/iface/UserTokenRepository.java +++ b/src/main/java/com/knowledge/base/domain/user/repository/iface/UserTokenRepository.java @@ -3,16 +3,13 @@ package com.knowledge.base.domain.user.repository.iface; import com.knowledge.base.domain.user.repository.po.UserToken; import java.util.Optional; - -/** - * @author Luke.ye - * @date 2025/6/6 12:20 - */ +import java.util.List; public interface UserTokenRepository { - void save(UserToken token); + boolean save(UserToken userToken); + boolean deleteById(Long id); + void removeByToken(String token); + Optional findById(Long id); Optional findByToken(String token); - void deleteByToken(String token); - void deleteByUserId(Long userId); + List findByUserId(Long userId); } - diff --git a/src/main/java/com/knowledge/base/domain/user/repository/po/Role.java b/src/main/java/com/knowledge/base/domain/user/repository/po/Role.java new file mode 100644 index 0000000..1aae4fb --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/repository/po/Role.java @@ -0,0 +1,27 @@ +package com.knowledge.base.domain.user.repository.po; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 角色表 + */ +@Data +@TableName("role") +public class Role { + + @TableId(type = IdType.AUTO) + private Long id; + + private String roleCode; + + private String roleName; + + @TableField(fill = FieldFill.INSERT) + private LocalDateTime addTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; +} diff --git a/src/main/java/com/knowledge/base/domain/user/repository/po/RoleFileRule.java b/src/main/java/com/knowledge/base/domain/user/repository/po/RoleFileRule.java new file mode 100644 index 0000000..f913186 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/repository/po/RoleFileRule.java @@ -0,0 +1,29 @@ +package com.knowledge.base.domain.user.repository.po; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 角色-文件可访问规则表 + */ +@Data +@TableName("role_file_rule") +public class RoleFileRule { + + @TableId(type = IdType.AUTO) + private Long id; + + private Long roleId; + + private String filePattern; + + private String remark; + + @TableField(fill = FieldFill.INSERT) + private LocalDateTime addTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; +} diff --git a/src/main/java/com/knowledge/base/domain/user/repository/po/UserFile.java b/src/main/java/com/knowledge/base/domain/user/repository/po/UserFile.java new file mode 100644 index 0000000..0d35428 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/repository/po/UserFile.java @@ -0,0 +1,27 @@ +package com.knowledge.base.domain.user.repository.po; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 用户-文件直接授权关联表 + */ +@Data +@TableName("user_file") +public class UserFile { + + @TableId(type = IdType.AUTO) + private Long id; + + private Long userId; + + private Long fileId; + + @TableField(fill = FieldFill.INSERT) + private LocalDateTime addTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; +} diff --git a/src/main/java/com/knowledge/base/domain/user/repository/po/UserRole.java b/src/main/java/com/knowledge/base/domain/user/repository/po/UserRole.java new file mode 100644 index 0000000..027b200 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/repository/po/UserRole.java @@ -0,0 +1,27 @@ +package com.knowledge.base.domain.user.repository.po; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 用户-角色关联表 + */ +@Data +@TableName("user_role") +public class UserRole { + + @TableId(type = IdType.AUTO) + private Long id; + + private Long userId; + + private Long roleId; + + @TableField(fill = FieldFill.INSERT) + private LocalDateTime addTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/UserService.java b/src/main/java/com/knowledge/base/domain/user/service/UserService.java deleted file mode 100644 index bf51882..0000000 --- a/src/main/java/com/knowledge/base/domain/user/service/UserService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.knowledge.base.domain.user.service; - -import com.knowledge.base.domain.user.repository.po.User; -import com.knowledge.base.domain.user.repository.po.UserToken; - -import java.util.Optional; - -public interface UserService { - Optional findByUsername(String username); - boolean verifyPassword(User user, String plainText); - boolean registerUser(String username, String plainPassword); - UserToken createToken(Long userId, long expireMs); - Optional findToken(String token); - void removeToken(String token); - boolean isValidToken(String token); - - Optional findById(Long id); - - -} diff --git a/src/main/java/com/knowledge/base/domain/user/service/UserServiceImpl.java b/src/main/java/com/knowledge/base/domain/user/service/UserServiceImpl.java deleted file mode 100644 index 8039f52..0000000 --- a/src/main/java/com/knowledge/base/domain/user/service/UserServiceImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.knowledge.base.domain.user.service; - -import cn.hutool.crypto.digest.SM3; -import com.knowledge.base.domain.user.repository.iface.UserRepository; -import com.knowledge.base.domain.user.repository.iface.UserTokenRepository; -import com.knowledge.base.domain.user.repository.po.User; -import com.knowledge.base.domain.user.repository.po.UserToken; -import com.knowledge.base.infrastructure.util.crypto.SM3Util; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.Optional; -import java.util.UUID; - -@Service -@RequiredArgsConstructor -public class UserServiceImpl implements UserService { - - private final UserRepository userRepository; - private final UserTokenRepository tokenRepository; - - @Override - public Optional findByUsername(String username) { - return userRepository.findByUsername(username); - } - - @Override - public boolean verifyPassword(User user, String plainText) { - return user.getPassword().equalsIgnoreCase(new SM3().digestHex(plainText)); - } - - @Override - public boolean registerUser(String username, String plainPassword) { - if (userRepository.findByUsername(username).isPresent()) { - return false; - } - User user = new User(); - user.setUsername(username); - user.setPassword(SM3Util.digest(plainPassword)); - userRepository.save(user); - return true; - } - - @Override - public UserToken createToken(Long userId, long expireMs) { - String token = UUID.randomUUID().toString().replace("-", ""); - LocalDateTime now = LocalDateTime.now(); - UserToken userToken = new UserToken(); - userToken.setUserId(userId); - userToken.setToken(token); - userToken.setLoginAt(now); - userToken.setExpiredAt(now.plusNanos(expireMs * 1_000_000)); - tokenRepository.save(userToken); - return userToken; - } - - @Override - public Optional findToken(String token) { - return tokenRepository.findByToken(token); - } - - @Override - public void removeToken(String token) { - tokenRepository.deleteByToken(token); - } - - @Override - public boolean isValidToken(String token) { - return tokenRepository.findByToken(token) - .filter(t -> LocalDateTime.now().isBefore(t.getExpiredAt())) - .isPresent(); - } - - @Override - public Optional findById(Long id) { - return userRepository.findById(id); - } - -} diff --git a/src/main/java/com/knowledge/base/domain/user/service/iface/RoleDomainSupport.java b/src/main/java/com/knowledge/base/domain/user/service/iface/RoleDomainSupport.java new file mode 100644 index 0000000..7936cd4 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/iface/RoleDomainSupport.java @@ -0,0 +1,14 @@ +package com.knowledge.base.domain.user.service.iface; + +import com.knowledge.base.domain.user.repository.po.Role; + +import java.util.List; +import java.util.Optional; + +public interface RoleDomainSupport { + Optional findById(Long id); + List findAll(); + boolean addRole(Role role); + boolean updateRole(Role role); + boolean deleteRole(Long id); +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/iface/RoleFileRuleDomainSupport.java b/src/main/java/com/knowledge/base/domain/user/service/iface/RoleFileRuleDomainSupport.java new file mode 100644 index 0000000..0cd1d41 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/iface/RoleFileRuleDomainSupport.java @@ -0,0 +1,11 @@ +package com.knowledge.base.domain.user.service.iface; + +import com.knowledge.base.domain.user.repository.po.RoleFileRule; + +import java.util.List; + +public interface RoleFileRuleDomainSupport { + List findByRoleId(Long roleId); + boolean addRoleFileRule(RoleFileRule rule); + boolean removeRoleFileRule(Long ruleId); +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/iface/UserAuthDomainSupport.java b/src/main/java/com/knowledge/base/domain/user/service/iface/UserAuthDomainSupport.java new file mode 100644 index 0000000..43a8857 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/iface/UserAuthDomainSupport.java @@ -0,0 +1,13 @@ +package com.knowledge.base.domain.user.service.iface; + +import com.knowledge.base.domain.user.repository.po.UserToken; + +import java.util.Optional; + +public interface UserAuthDomainSupport { + boolean verifyPassword(String username, String plainText); + UserToken createToken(Long userId, long expireMs); + boolean isValidToken(String token); + void removeToken(String token); + Optional findToken(String token); +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/iface/UserDomainService.java b/src/main/java/com/knowledge/base/domain/user/service/iface/UserDomainService.java new file mode 100644 index 0000000..4ff9d6b --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/iface/UserDomainService.java @@ -0,0 +1,43 @@ +package com.knowledge.base.domain.user.service.iface; + +import com.knowledge.base.domain.user.repository.po.*; + +import java.util.List; +import java.util.Optional; + +public interface UserDomainService { + // 用户资料 + Optional findByUsername(String username); + Optional findById(Long id); + List findAllUsers(); + boolean registerUser(String username, String plainPassword); + + // 认证/Token + Optional findToken(String token); + boolean verifyPassword(String username, String plainText); + UserToken createToken(Long userId, long expireMs); + boolean isValidToken(String token); + void removeToken(String token); + + // 角色 + List findAllRoles(); + Optional findRoleById(Long id); + boolean addRole(Role role); + boolean updateRole(Role role); + boolean deleteRole(Long id); + + // 用户-角色 + List findRolesByUserId(Long userId); + boolean addUserRole(Long userId, Long roleId); + boolean removeUserRole(Long userId, Long roleId); + + // 角色-文件规则 + List findRoleFileRules(Long roleId); + boolean addRoleFileRule(RoleFileRule rule); + boolean removeRoleFileRule(Long ruleId); + + // 用户特殊授权 + List findUserFiles(Long userId); + boolean addUserFileAuth(Long userId, Long fileId); + boolean removeUserFileAuth(Long userId, Long fileId); +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/iface/UserFileDomainSupport.java b/src/main/java/com/knowledge/base/domain/user/service/iface/UserFileDomainSupport.java new file mode 100644 index 0000000..4200932 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/iface/UserFileDomainSupport.java @@ -0,0 +1,11 @@ +package com.knowledge.base.domain.user.service.iface; + +import com.knowledge.base.domain.user.repository.po.UserFile; + +import java.util.List; + +public interface UserFileDomainSupport { + List findByUserId(Long userId); + boolean addUserFileAuth(Long userId, Long fileId); + boolean removeUserFileAuth(Long userId, Long fileId); +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/iface/UserProfileDomainSupport.java b/src/main/java/com/knowledge/base/domain/user/service/iface/UserProfileDomainSupport.java new file mode 100644 index 0000000..f205b02 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/iface/UserProfileDomainSupport.java @@ -0,0 +1,15 @@ +package com.knowledge.base.domain.user.service.iface; + +import com.knowledge.base.domain.user.repository.po.User; + +import java.util.Optional; +import java.util.List; + +public interface UserProfileDomainSupport { + Optional findByUsername(String username); + Optional findById(Long id); + List findAll(); + boolean registerUser(String username, String plainPassword); + boolean updateUser(User user); + boolean deleteUser(Long id); +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/iface/UserRoleDomainSupport.java b/src/main/java/com/knowledge/base/domain/user/service/iface/UserRoleDomainSupport.java new file mode 100644 index 0000000..ac847b2 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/iface/UserRoleDomainSupport.java @@ -0,0 +1,11 @@ +package com.knowledge.base.domain.user.service.iface; + +import com.knowledge.base.domain.user.repository.po.UserRole; + +import java.util.List; + +public interface UserRoleDomainSupport { + List findByUserId(Long userId); + boolean addUserRole(Long userId, Long roleId); + boolean removeUserRole(Long userId, Long roleId); +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/impl/RoleDomainSupportImpl.java b/src/main/java/com/knowledge/base/domain/user/service/impl/RoleDomainSupportImpl.java new file mode 100644 index 0000000..e3db652 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/impl/RoleDomainSupportImpl.java @@ -0,0 +1,42 @@ +package com.knowledge.base.domain.user.service.impl; + +import com.knowledge.base.domain.user.repository.iface.RoleRepository; +import com.knowledge.base.domain.user.repository.po.Role; +import com.knowledge.base.domain.user.service.iface.RoleDomainSupport; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class RoleDomainSupportImpl implements RoleDomainSupport { + + private final RoleRepository roleRepository; + + @Override + public Optional findById(Long id) { + return Optional.ofNullable(roleRepository.findById(id)); + } + + @Override + public List findAll() { + return roleRepository.findAll(); + } + + @Override + public boolean addRole(Role role) { + return roleRepository.save(role); + } + + @Override + public boolean updateRole(Role role) { + return roleRepository.update(role); + } + + @Override + public boolean deleteRole(Long id) { + return roleRepository.deleteById(id); + } +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/impl/RoleFileRuleDomainSupportImpl.java b/src/main/java/com/knowledge/base/domain/user/service/impl/RoleFileRuleDomainSupportImpl.java new file mode 100644 index 0000000..73180e0 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/impl/RoleFileRuleDomainSupportImpl.java @@ -0,0 +1,31 @@ +package com.knowledge.base.domain.user.service.impl; + +import com.knowledge.base.domain.user.repository.iface.RoleFileRuleRepository; +import com.knowledge.base.domain.user.repository.po.RoleFileRule; +import com.knowledge.base.domain.user.service.iface.RoleFileRuleDomainSupport; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class RoleFileRuleDomainSupportImpl implements RoleFileRuleDomainSupport { + + private final RoleFileRuleRepository roleFileRuleRepository; + + @Override + public List findByRoleId(Long roleId) { + return roleFileRuleRepository.findByRoleId(roleId); + } + + @Override + public boolean addRoleFileRule(RoleFileRule rule) { + return roleFileRuleRepository.save(rule); + } + + @Override + public boolean removeRoleFileRule(Long ruleId) { + return roleFileRuleRepository.deleteById(ruleId); + } +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/impl/UserAuthDomainSupportImpl.java b/src/main/java/com/knowledge/base/domain/user/service/impl/UserAuthDomainSupportImpl.java new file mode 100644 index 0000000..3598c60 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/impl/UserAuthDomainSupportImpl.java @@ -0,0 +1,60 @@ +package com.knowledge.base.domain.user.service.impl; + +import com.knowledge.base.domain.user.repository.iface.UserRepository; +import com.knowledge.base.domain.user.repository.iface.UserTokenRepository; +import com.knowledge.base.domain.user.repository.po.User; +import com.knowledge.base.domain.user.repository.po.UserToken; +import com.knowledge.base.domain.user.service.iface.UserAuthDomainSupport; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.util.Optional; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class UserAuthDomainSupportImpl implements UserAuthDomainSupport { + + private final UserRepository userRepository; + private final UserTokenRepository userTokenRepository; + + @Override + public boolean verifyPassword(String username, String plainText) { + Optional userOpt = userRepository.findByUsername(username); + if (userOpt.isEmpty()) return false; + User user = userOpt.get(); + String inputHash = DigestUtils.md5DigestAsHex(plainText.getBytes(StandardCharsets.UTF_8)); + return inputHash.equals(user.getPassword()); + } + + @Override + public UserToken createToken(Long userId, long expireMs) { + String token = UUID.randomUUID().toString().replace("-", ""); + UserToken userToken = new UserToken(); + userToken.setUserId(userId); + userToken.setToken(token); + userToken.setLoginAt(LocalDateTime.now()); + userToken.setExpiredAt(LocalDateTime.now().plusSeconds(expireMs / 1000)); + userTokenRepository.save(userToken); + return userToken; + } + + @Override + public boolean isValidToken(String token) { + Optional userTokenOpt = userTokenRepository.findByToken(token); + return userTokenOpt.filter(tk -> tk.getExpiredAt().isAfter(LocalDateTime.now())).isPresent(); + } + + @Override + public void removeToken(String token) { + userTokenRepository.removeByToken(token); + } + + @Override + public Optional findToken(String token) { + return userTokenRepository.findByToken(token); + } +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/impl/UserDomainServiceImpl.java b/src/main/java/com/knowledge/base/domain/user/service/impl/UserDomainServiceImpl.java new file mode 100644 index 0000000..fd79eca --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/impl/UserDomainServiceImpl.java @@ -0,0 +1,133 @@ +package com.knowledge.base.domain.user.service.impl; + +import com.knowledge.base.domain.user.repository.po.*; +import com.knowledge.base.domain.user.service.iface.*; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class UserDomainServiceImpl implements UserDomainService { + + private final UserProfileDomainSupport userProfileDomainSupport; + private final UserAuthDomainSupport userAuthDomainSupport; + private final UserRoleDomainSupport userRoleDomainSupport; + private final RoleDomainSupport roleDomainSupport; + private final RoleFileRuleDomainSupport roleFileRuleDomainSupport; + private final UserFileDomainSupport userFileDomainSupport; + + // 用户资料 + @Override + public Optional findByUsername(String username) { + return userProfileDomainSupport.findByUsername(username); + } + + @Override + public Optional findById(Long id) { + return userProfileDomainSupport.findById(id); + } + + @Override + public List findAllUsers() { + return userProfileDomainSupport.findAll(); + } + + @Override + public boolean registerUser(String username, String plainPassword) { + userProfileDomainSupport.registerUser(username, plainPassword); + return true; + } + + // 认证/Token + @Override + public Optional findToken(String token) { + return userAuthDomainSupport.findToken(token); + } + + @Override + public boolean verifyPassword(String username, String plainText) { + return userAuthDomainSupport.verifyPassword(username, plainText); + } + @Override + public UserToken createToken(Long userId, long expireMs) { + return userAuthDomainSupport.createToken(userId, expireMs); + } + @Override + public boolean isValidToken(String token) { + return userAuthDomainSupport.isValidToken(token); + } + @Override + public void removeToken(String token) { + userAuthDomainSupport.removeToken(token); + } + + // 角色 + @Override + public List findAllRoles() { + return roleDomainSupport.findAll(); + } + @Override + public Optional findRoleById(Long id) { + return roleDomainSupport.findById(id); + } + + @Override + public boolean addRole(Role role) { + return roleDomainSupport.addRole(role); + } + + @Override + public boolean updateRole(Role role) { + return roleDomainSupport.updateRole(role); + } + + @Override + public boolean deleteRole(Long id) { + return roleDomainSupport.deleteRole(id); + } + + // 用户-角色 + @Override + public List findRolesByUserId(Long userId) { + return userRoleDomainSupport.findByUserId(userId); + } + @Override + public boolean addUserRole(Long userId, Long roleId) { + return userRoleDomainSupport.addUserRole(userId, roleId); + } + @Override + public boolean removeUserRole(Long userId, Long roleId) { + return userRoleDomainSupport.removeUserRole(userId, roleId); + } + + // 角色-文件规则 + @Override + public List findRoleFileRules(Long roleId) { + return roleFileRuleDomainSupport.findByRoleId(roleId); + } + @Override + public boolean addRoleFileRule(RoleFileRule rule) { + return roleFileRuleDomainSupport.addRoleFileRule(rule); + } + @Override + public boolean removeRoleFileRule(Long ruleId) { + return roleFileRuleDomainSupport.removeRoleFileRule(ruleId); + } + + // 用户特殊授权 + @Override + public List findUserFiles(Long userId) { + return userFileDomainSupport.findByUserId(userId); + } + @Override + public boolean addUserFileAuth(Long userId, Long fileId) { + return userFileDomainSupport.addUserFileAuth(userId, fileId); + } + @Override + public boolean removeUserFileAuth(Long userId, Long fileId) { + return userFileDomainSupport.removeUserFileAuth(userId, fileId); + } +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/impl/UserFileDomainSupportImpl.java b/src/main/java/com/knowledge/base/domain/user/service/impl/UserFileDomainSupportImpl.java new file mode 100644 index 0000000..759b829 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/impl/UserFileDomainSupportImpl.java @@ -0,0 +1,34 @@ +package com.knowledge.base.domain.user.service.impl; + +import com.knowledge.base.domain.user.repository.iface.UserFileRepository; +import com.knowledge.base.domain.user.repository.po.UserFile; +import com.knowledge.base.domain.user.service.iface.UserFileDomainSupport; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class UserFileDomainSupportImpl implements UserFileDomainSupport { + + private final UserFileRepository userFileRepository; + + @Override + public List findByUserId(Long userId) { + return userFileRepository.findByUserId(userId); + } + + @Override + public boolean addUserFileAuth(Long userId, Long fileId) { + UserFile userFile = new UserFile(); + userFile.setUserId(userId); + userFile.setFileId(fileId); + return userFileRepository.save(userFile); + } + + @Override + public boolean removeUserFileAuth(Long userId, Long fileId) { + return userFileRepository.deleteByUserIdAndFileId(userId, fileId); + } +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/impl/UserProfileDomainSupportImpl.java b/src/main/java/com/knowledge/base/domain/user/service/impl/UserProfileDomainSupportImpl.java new file mode 100644 index 0000000..45a78f0 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/impl/UserProfileDomainSupportImpl.java @@ -0,0 +1,53 @@ +package com.knowledge.base.domain.user.service.impl; + +import com.knowledge.base.domain.user.repository.iface.UserRepository; +import com.knowledge.base.domain.user.repository.po.User; +import com.knowledge.base.domain.user.service.iface.UserProfileDomainSupport; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class UserProfileDomainSupportImpl implements UserProfileDomainSupport { + + private final UserRepository userRepository; + + @Override + public Optional findByUsername(String username) { + return userRepository.findByUsername(username); + } + + @Override + public Optional findById(Long id) { + return userRepository.findById(id); + } + + @Override + public List findAll() { + return userRepository.findAll(); + } + + @Override + public boolean registerUser(String username, String plainPassword) { + if (userRepository.findByUsername(username).isPresent()) return false; + User user = new User(); + user.setUsername(username); + user.setPassword(DigestUtils.md5DigestAsHex(plainPassword.getBytes(StandardCharsets.UTF_8))); + return userRepository.save(user); + } + + @Override + public boolean updateUser(User user) { + return userRepository.update(user); + } + + @Override + public boolean deleteUser(Long id) { + return userRepository.deleteById(id); + } +} diff --git a/src/main/java/com/knowledge/base/domain/user/service/impl/UserRoleDomainSupportImpl.java b/src/main/java/com/knowledge/base/domain/user/service/impl/UserRoleDomainSupportImpl.java new file mode 100644 index 0000000..557f314 --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/user/service/impl/UserRoleDomainSupportImpl.java @@ -0,0 +1,34 @@ +package com.knowledge.base.domain.user.service.impl; + +import com.knowledge.base.domain.user.repository.iface.UserRoleRepository; +import com.knowledge.base.domain.user.repository.po.UserRole; +import com.knowledge.base.domain.user.service.iface.UserRoleDomainSupport; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class UserRoleDomainSupportImpl implements UserRoleDomainSupport { + + private final UserRoleRepository userRoleRepository; + + @Override + public List findByUserId(Long userId) { + return userRoleRepository.findByUserId(userId); + } + + @Override + public boolean addUserRole(Long userId, Long roleId) { + UserRole userRole = new UserRole(); + userRole.setUserId(userId); + userRole.setRoleId(roleId); + return userRoleRepository.save(userRole); + } + + @Override + public boolean removeUserRole(Long userId, Long roleId) { + return userRoleRepository.deleteByUserIdAndRoleId(userId, roleId); + } +} diff --git a/src/main/java/com/knowledge/base/infrastructure/north/controller/ImportController.java b/src/main/java/com/knowledge/base/infrastructure/north/controller/ImportController.java index 1d09f3a..a2c7e4f 100644 --- a/src/main/java/com/knowledge/base/infrastructure/north/controller/ImportController.java +++ b/src/main/java/com/knowledge/base/infrastructure/north/controller/ImportController.java @@ -1,6 +1,6 @@ package com.knowledge.base.infrastructure.north.controller; -import com.knowledge.base.domain.doc.iface.DocumentImporter; +import com.knowledge.base.domain.doc.service.iface.DocumentImporter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/knowledge/base/infrastructure/north/controller/UserController.java b/src/main/java/com/knowledge/base/infrastructure/north/controller/UserController.java index 7890282..b0945bb 100644 --- a/src/main/java/com/knowledge/base/infrastructure/north/controller/UserController.java +++ b/src/main/java/com/knowledge/base/infrastructure/north/controller/UserController.java @@ -1,8 +1,8 @@ package com.knowledge.base.infrastructure.north.controller; +import com.knowledge.base.application.service.UserAppService; import com.knowledge.base.domain.user.repository.po.User; import com.knowledge.base.domain.user.repository.po.UserToken; -import com.knowledge.base.domain.user.service.UserService; import com.knowledge.base.infrastructure.config.ConstantConfig; import com.knowledge.base.infrastructure.config.DynamicConfig; import lombok.RequiredArgsConstructor; @@ -19,7 +19,7 @@ import java.util.Optional; @RequiredArgsConstructor public class UserController { - private final UserService userService; + private final UserAppService userAppService; private final DynamicConfig dynamicConfig; @PostMapping("/login") @@ -27,14 +27,14 @@ public class UserController { String username = body.getOrDefault("username", "").trim(); String password = body.getOrDefault("password", "").trim(); - Optional userOpt = userService.findByUsername(username); - if (userOpt.isEmpty() || !userService.verifyPassword(userOpt.get(), password)) { + Optional userOpt = userAppService.findByUsername(username); + if (userOpt.isEmpty() || !userAppService.verifyPassword(userOpt.get().getUsername(), password)) { return ResponseEntity.status(401).body(Map.of("message", "用户名或密码错误")); } User user = userOpt.get(); long expireMs = dynamicConfig.getTokenExpireTime(); - UserToken token = userService.createToken(user.getId(), expireMs); + UserToken token = userAppService.createToken(user.getId(), expireMs); Cookie cookie = new Cookie(ConstantConfig.COOKIE_KEY, token.getToken()); cookie.setPath("/"); @@ -57,7 +57,7 @@ public class UserController { ) { String token = headerToken != null ? headerToken : cookieToken; if (token != null) { - userService.removeToken(token); + userAppService.removeToken(token); } Cookie cookie = new Cookie(ConstantConfig.COOKIE_KEY, ""); @@ -76,7 +76,7 @@ public class UserController { @RequestHeader(value = "Authorization", required = false) String headerToken ) { String token = headerToken != null ? headerToken : cookieToken; - if (userService.isValidToken(token)) { + if (userAppService.isValidToken(token)) { return ResponseEntity.ok(Map.of("code", 0, "msg", "校验成功")); } return ResponseEntity.status(401).body(Map.of("code", 401, "msg", "未授权")); @@ -88,10 +88,10 @@ public class UserController { @RequestHeader(value = "Authorization", required = false) String headerToken ) { String token = headerToken != null ? headerToken : cookieToken; - Optional userTokenOpt = userService.findToken(token); + Optional userTokenOpt = userAppService.findToken(token); if (userTokenOpt.isPresent()) { Long userId = userTokenOpt.get().getUserId(); - Optional userOpt = userService.findById(userId); + Optional userOpt = userAppService.findById(userId); if (userOpt.isPresent()) { return ResponseEntity.ok(Map.of("username", userOpt.get().getUsername())); } diff --git a/src/main/java/com/knowledge/base/infrastructure/north/dto/RegisterReq.java b/src/main/java/com/knowledge/base/infrastructure/north/dto/RegisterReq.java new file mode 100644 index 0000000..ca237b3 --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/north/dto/RegisterReq.java @@ -0,0 +1,10 @@ +package com.knowledge.base.infrastructure.north.dto; + +import lombok.Data; + +@Data +public class RegisterReq { + private String username; + private String password; + private Long[] roleIds; +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/mapper/doc/FileMapper.java b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/doc/FileMapper.java new file mode 100644 index 0000000..5db75ff --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/doc/FileMapper.java @@ -0,0 +1,12 @@ +package com.knowledge.base.infrastructure.repository.mapper.doc; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.knowledge.base.domain.doc.repository.po.File; +import org.apache.ibatis.annotations.Mapper; + +/** + * 知识库文件表Mapper + */ +@Mapper +public interface FileMapper extends BaseMapper { +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/RoleFileRuleMapper.java b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/RoleFileRuleMapper.java new file mode 100644 index 0000000..f9edcdc --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/RoleFileRuleMapper.java @@ -0,0 +1,12 @@ +package com.knowledge.base.infrastructure.repository.mapper.user; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.knowledge.base.domain.user.repository.po.RoleFileRule; +import org.apache.ibatis.annotations.Mapper; + +/** + * 角色-文件可见规则表Mapper + */ +@Mapper +public interface RoleFileRuleMapper extends BaseMapper { +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/RoleMapper.java b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/RoleMapper.java new file mode 100644 index 0000000..6430700 --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/RoleMapper.java @@ -0,0 +1,9 @@ +package com.knowledge.base.infrastructure.repository.mapper.user; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.knowledge.base.domain.user.repository.po.Role; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RoleMapper extends BaseMapper { +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserFileMapper.java b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserFileMapper.java new file mode 100644 index 0000000..09a0dae --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserFileMapper.java @@ -0,0 +1,12 @@ +package com.knowledge.base.infrastructure.repository.mapper.user; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.knowledge.base.domain.user.repository.po.UserFile; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户-文件直接授权关联表Mapper + */ +@Mapper +public interface UserFileMapper extends BaseMapper { +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/mapper/UserMapper.java b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserMapper.java similarity index 77% rename from src/main/java/com/knowledge/base/infrastructure/repository/mapper/UserMapper.java rename to src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserMapper.java index a0b803d..344abaa 100644 --- a/src/main/java/com/knowledge/base/infrastructure/repository/mapper/UserMapper.java +++ b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserMapper.java @@ -1,4 +1,4 @@ -package com.knowledge.base.infrastructure.repository.mapper; +package com.knowledge.base.infrastructure.repository.mapper.user; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.knowledge.base.domain.user.repository.po.User; diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserRoleMapper.java b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserRoleMapper.java new file mode 100644 index 0000000..949ca2b --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserRoleMapper.java @@ -0,0 +1,9 @@ +package com.knowledge.base.infrastructure.repository.mapper.user; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.knowledge.base.domain.user.repository.po.UserRole; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserRoleMapper extends BaseMapper { +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/mapper/UserTokenMapper.java b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserTokenMapper.java similarity index 78% rename from src/main/java/com/knowledge/base/infrastructure/repository/mapper/UserTokenMapper.java rename to src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserTokenMapper.java index 5373c7e..df36879 100644 --- a/src/main/java/com/knowledge/base/infrastructure/repository/mapper/UserTokenMapper.java +++ b/src/main/java/com/knowledge/base/infrastructure/repository/mapper/user/UserTokenMapper.java @@ -1,4 +1,4 @@ -package com.knowledge.base.infrastructure.repository.mapper; +package com.knowledge.base.infrastructure.repository.mapper.user; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.knowledge.base.domain.user.repository.po.UserToken; diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/UserTokenRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/UserTokenRepositoryImpl.java deleted file mode 100644 index e81f1f3..0000000 --- a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/UserTokenRepositoryImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.knowledge.base.infrastructure.repository.persistence; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.knowledge.base.domain.user.repository.iface.UserTokenRepository; -import com.knowledge.base.domain.user.repository.po.UserToken; -import com.knowledge.base.infrastructure.repository.mapper.UserTokenMapper; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public class UserTokenRepositoryImpl implements UserTokenRepository { - - private final UserTokenMapper tokenMapper; - - public UserTokenRepositoryImpl(UserTokenMapper tokenMapper) { - this.tokenMapper = tokenMapper; - } - - @Override - public void save(UserToken token) { - tokenMapper.insert(token); - } - - @Override - public Optional findByToken(String token) { - return Optional.ofNullable( - tokenMapper.selectOne( - new QueryWrapper() - .eq("token", token) - ) - ); - } - - @Override - public void deleteByToken(String token) { - tokenMapper.delete( - new QueryWrapper() - .eq("token", token) - ); - } - - @Override - public void deleteByUserId(Long userId) { - tokenMapper.delete( - new QueryWrapper() - .eq("user_id", userId) - ); - } -} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/doc/FileRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/doc/FileRepositoryImpl.java new file mode 100644 index 0000000..72dc7aa --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/doc/FileRepositoryImpl.java @@ -0,0 +1,48 @@ +package com.knowledge.base.infrastructure.repository.persistence.doc; + +import com.knowledge.base.domain.doc.repository.iface.FileRepository; +import com.knowledge.base.domain.doc.repository.po.File; +import com.knowledge.base.infrastructure.repository.mapper.doc.FileMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class FileRepositoryImpl implements FileRepository { + + private final FileMapper fileMapper; + + @Override + public boolean save(File file) { + return fileMapper.insert(file) > 0; + } + + @Override + public boolean update(File file) { + return fileMapper.updateById(file) > 0; + } + + @Override + public boolean deleteById(Long id) { + return fileMapper.deleteById(id) > 0; + } + + @Override + public File findById(Long id) { + return fileMapper.selectById(id); + } + + @Override + public List findAll() { + return fileMapper.selectList(null); + } + + @Override + public List findByFileNameLike(String pattern) { + // pattern 例:%xxx% + return fileMapper.selectList(new QueryWrapper().like("file_name", pattern)); + } +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/RoleFileRuleRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/RoleFileRuleRepositoryImpl.java new file mode 100644 index 0000000..bf11a12 --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/RoleFileRuleRepositoryImpl.java @@ -0,0 +1,47 @@ +package com.knowledge.base.infrastructure.repository.persistence.user; + +import com.knowledge.base.domain.user.repository.iface.RoleFileRuleRepository; +import com.knowledge.base.domain.user.repository.po.RoleFileRule; +import com.knowledge.base.infrastructure.repository.mapper.user.RoleFileRuleMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class RoleFileRuleRepositoryImpl implements RoleFileRuleRepository { + + private final RoleFileRuleMapper roleFileRuleMapper; + + @Override + public boolean save(RoleFileRule rule) { + return roleFileRuleMapper.insert(rule) > 0; + } + + @Override + public boolean update(RoleFileRule rule) { + return roleFileRuleMapper.updateById(rule) > 0; + } + + @Override + public boolean deleteById(Long id) { + return roleFileRuleMapper.deleteById(id) > 0; + } + + @Override + public RoleFileRule findById(Long id) { + return roleFileRuleMapper.selectById(id); + } + + @Override + public List findByRoleId(Long roleId) { + return roleFileRuleMapper.selectList(new QueryWrapper().eq("role_id", roleId)); + } + + @Override + public List findAll() { + return roleFileRuleMapper.selectList(null); + } +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/RoleRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/RoleRepositoryImpl.java new file mode 100644 index 0000000..8dc011c --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/RoleRepositoryImpl.java @@ -0,0 +1,41 @@ +package com.knowledge.base.infrastructure.repository.persistence.user; + +import com.knowledge.base.domain.user.repository.iface.RoleRepository; +import com.knowledge.base.domain.user.repository.po.Role; +import com.knowledge.base.infrastructure.repository.mapper.user.RoleMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class RoleRepositoryImpl implements RoleRepository { + + private final RoleMapper roleMapper; + + @Override + public boolean save(Role role) { + return roleMapper.insert(role) > 0; + } + + @Override + public boolean update(Role role) { + return roleMapper.updateById(role) > 0; + } + + @Override + public boolean deleteById(Long id) { + return roleMapper.deleteById(id) > 0; + } + + @Override + public Role findById(Long id) { + return roleMapper.selectById(id); + } + + @Override + public List findAll() { + return roleMapper.selectList(null); + } +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserFileRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserFileRepositoryImpl.java new file mode 100644 index 0000000..c074b5b --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserFileRepositoryImpl.java @@ -0,0 +1,54 @@ +package com.knowledge.base.infrastructure.repository.persistence.user; + +import com.knowledge.base.domain.user.repository.iface.UserFileRepository; +import com.knowledge.base.domain.user.repository.po.UserFile; +import com.knowledge.base.infrastructure.repository.mapper.user.UserFileMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class UserFileRepositoryImpl implements UserFileRepository { + + private final UserFileMapper userFileMapper; + + @Override + public boolean save(UserFile userFile) { + return userFileMapper.insert(userFile) > 0; + } + + @Override + public boolean update(UserFile userFile) { + return userFileMapper.updateById(userFile) > 0; + } + + @Override + public boolean deleteById(Long id) { + return userFileMapper.deleteById(id) > 0; + } + + @Override + public boolean deleteByUserIdAndFileId(Long userId, Long fileId) { + return userFileMapper.delete( + new QueryWrapper().eq("user_id", userId).eq("file_id", fileId) + ) > 0; + } + + @Override + public UserFile findById(Long id) { + return userFileMapper.selectById(id); + } + + @Override + public List findByUserId(Long userId) { + return userFileMapper.selectList(new QueryWrapper().eq("user_id", userId)); + } + + @Override + public List findAll() { + return userFileMapper.selectList(null); + } +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/UserRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRepositoryImpl.java similarity index 57% rename from src/main/java/com/knowledge/base/infrastructure/repository/persistence/UserRepositoryImpl.java rename to src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRepositoryImpl.java index 4a759a9..279957f 100644 --- a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/UserRepositoryImpl.java +++ b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRepositoryImpl.java @@ -1,18 +1,15 @@ -package com.knowledge.base.infrastructure.repository.persistence; +package com.knowledge.base.infrastructure.repository.persistence.user; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.knowledge.base.domain.user.repository.iface.UserRepository; import com.knowledge.base.domain.user.repository.po.User; -import com.knowledge.base.infrastructure.repository.mapper.UserMapper; +import com.knowledge.base.infrastructure.repository.mapper.user.UserMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; -/** - * @author Luke.ye - * @date 2025/6/6 12:21 - */ @Repository @RequiredArgsConstructor public class UserRepositoryImpl implements UserRepository { @@ -20,18 +17,18 @@ public class UserRepositoryImpl implements UserRepository { private final UserMapper userMapper; @Override - public Optional findByUsername(String username) { - return Optional.ofNullable( - userMapper.selectOne( - new QueryWrapper() - .eq("username", username) - ) - ); + public boolean save(User user) { + return userMapper.insert(user) > 0; } @Override - public void save(User user) { - userMapper.insert(user); + public boolean update(User user) { + return userMapper.updateById(user) > 0; + } + + @Override + public boolean deleteById(Long id) { + return userMapper.deleteById(id) > 0; } @Override @@ -39,5 +36,15 @@ public class UserRepositoryImpl implements UserRepository { return Optional.ofNullable(userMapper.selectById(id)); } -} + @Override + public Optional findByUsername(String username) { + return Optional.ofNullable( + userMapper.selectOne(new QueryWrapper().eq("username", username)) + ); + } + @Override + public List findAll() { + return userMapper.selectList(null); + } +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRoleRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRoleRepositoryImpl.java new file mode 100644 index 0000000..e5d0148 --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserRoleRepositoryImpl.java @@ -0,0 +1,54 @@ +package com.knowledge.base.infrastructure.repository.persistence.user; + +import com.knowledge.base.domain.user.repository.iface.UserRoleRepository; +import com.knowledge.base.domain.user.repository.po.UserRole; +import com.knowledge.base.infrastructure.repository.mapper.user.UserRoleMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class UserRoleRepositoryImpl implements UserRoleRepository { + + private final UserRoleMapper userRoleMapper; + + @Override + public boolean save(UserRole userRole) { + return userRoleMapper.insert(userRole) > 0; + } + + @Override + public boolean update(UserRole userRole) { + return userRoleMapper.updateById(userRole) > 0; + } + + @Override + public boolean deleteById(Long id) { + return userRoleMapper.deleteById(id) > 0; + } + + @Override + public boolean deleteByUserIdAndRoleId(Long userId, Long roleId) { + return userRoleMapper.delete( + new QueryWrapper().eq("user_id", userId).eq("role_id", roleId) + ) > 0; + } + + @Override + public UserRole findById(Long id) { + return userRoleMapper.selectById(id); + } + + @Override + public List findByUserId(Long userId) { + return userRoleMapper.selectList(new QueryWrapper().eq("user_id", userId)); + } + + @Override + public List findAll() { + return userRoleMapper.selectList(null); + } +} diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserTokenRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserTokenRepositoryImpl.java new file mode 100644 index 0000000..c54ffef --- /dev/null +++ b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/user/UserTokenRepositoryImpl.java @@ -0,0 +1,50 @@ +package com.knowledge.base.infrastructure.repository.persistence.user; + +import com.knowledge.base.domain.user.repository.iface.UserTokenRepository; +import com.knowledge.base.domain.user.repository.po.UserToken; +import com.knowledge.base.infrastructure.repository.mapper.user.UserTokenMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +@RequiredArgsConstructor +public class UserTokenRepositoryImpl implements UserTokenRepository { + + private final UserTokenMapper userTokenMapper; + + @Override + public boolean save(UserToken userToken) { + return userTokenMapper.insert(userToken) > 0; + } + + @Override + public boolean deleteById(Long id) { + return userTokenMapper.deleteById(id) > 0; + } + + @Override + public void removeByToken(String token) { + userTokenMapper.delete(new QueryWrapper().eq("token", token)); + } + + @Override + public Optional findById(Long id) { + return Optional.ofNullable(userTokenMapper.selectById(id)); + } + + @Override + public Optional findByToken(String token) { + return Optional.ofNullable( + userTokenMapper.selectOne(new QueryWrapper().eq("token", token)) + ); + } + + @Override + public List findByUserId(Long userId) { + return userTokenMapper.selectList(new QueryWrapper().eq("user_id", userId)); + } +} diff --git a/src/test/java/com/knowledge/base/domain/user/service/UserServiceTest.java b/src/test/java/com/knowledge/base/domain/user/service/UserDomainServiceTest.java similarity index 75% rename from src/test/java/com/knowledge/base/domain/user/service/UserServiceTest.java rename to src/test/java/com/knowledge/base/domain/user/service/UserDomainServiceTest.java index dc83af0..8146b7c 100644 --- a/src/test/java/com/knowledge/base/domain/user/service/UserServiceTest.java +++ b/src/test/java/com/knowledge/base/domain/user/service/UserDomainServiceTest.java @@ -1,6 +1,7 @@ package com.knowledge.base.domain.user.service; import com.google.common.collect.Lists; +import com.knowledge.base.domain.user.service.iface.UserDomainService; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -12,18 +13,18 @@ import java.util.List; "spring.profiles.active=dev-windows" }) @Slf4j -public class UserServiceTest { +public class UserDomainServiceTest { private static final List USER_NAMES = Lists.newArrayList( "Luke.Ye", "WangRui", "HuangHuang", "LiFang", "QiHui"); @Autowired - private UserService userService; + private UserDomainService userDomainService; @Test public void testBatchRegisterUsers() { USER_NAMES.forEach(username -> { - boolean success = userService.registerUser(username, username); + boolean success = userDomainService.registerUser(username, username); log.info("注册用户 [{}] -> {}", username, success ? "成功" : "已存在"); }); }