添加用户æ©角色相关逻辑

This commit is contained in:
luke 2025-06-09 00:40:26 +08:00
parent cb0883bcda
commit 7e089c66bd
60 changed files with 1392 additions and 212 deletions

View File

@ -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

View File

@ -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;

View File

@ -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<Long> roleIds);
boolean verifyPassword(String username, String plainText);
// 用户资料
Optional<User> findByUsername(String username);
Optional<User> findById(Long id);
List<User> findAll();
// Token 相关
UserToken createToken(Long userId, long expireMs);
void removeToken(String token);
boolean isValidToken(String token);
Optional<UserToken> findToken(String token);
// 用户角色
List<UserRole> listUserRoles(Long userId);
boolean addUserRole(Long userId, Long roleId);
boolean removeUserRole(Long userId, Long roleId);
// 用户特殊授权
List<UserFile> listUserFiles(Long userId);
boolean addUserFileAuth(Long userId, Long fileId);
boolean removeUserFileAuth(Long userId, Long fileId);
// 角色
List<Role> listRoles();
Optional<Role> getRoleById(Long roleId);
boolean addRole(Role role);
boolean updateRole(Role role);
boolean deleteRole(Long id);
// 角色授权信息
List<RoleFileRule> listRoleFileRules(Long roleId);
boolean addRoleFileRule(RoleFileRule rule);
boolean removeRoleFileRule(Long id);
}

View File

@ -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<Long> roleIds) {
boolean ok = userDomainService.registerUser(username, password);
if (!ok) return false;
Optional<User> 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<User> findByUsername(String username) {
return userDomainService.findByUsername(username);
}
@Override
public Optional<User> findById(Long id) {
return userDomainService.findById(id);
}
@Override
public List<User> 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<UserToken> findToken(String token) {
return userDomainService.findToken(token);
}
@Override
public List<UserRole> 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<UserFile> 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<Role> listRoles() {
return userDomainService.findAllRoles();
}
@Override
public Optional<Role> 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<RoleFileRule> 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);
}
}

View File

@ -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;

View File

@ -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<File> findAll();
List<File> findByFileNameLike(String pattern);
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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<File> findById(Long id);
List<File> findAll();
List<File> findByFileNameLike(String pattern);
}

View File

@ -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;

View File

@ -1,4 +1,4 @@
package com.knowledge.base.domain.doc.impl;
package com.knowledge.base.domain.doc.service.impl;
/**
* @author Luke.ye

View File

@ -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<File> findById(Long id) {
return Optional.ofNullable(fileRepository.findById(id));
}
@Override
public List<File> findAll() {
return fileRepository.findAll();
}
@Override
public List<File> findByFileNameLike(String pattern) {
return fileRepository.findByFileNameLike(pattern);
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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<RoleFileRule> findByRoleId(Long roleId);
List<RoleFileRule> findAll();
}

View File

@ -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<Role> findAll();
}

View File

@ -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<UserFile> findByUserId(Long userId);
List<UserFile> findAll();
}

View File

@ -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<User> findByUsername(String username);
void save(User user);
boolean save(User user);
boolean update(User user);
boolean deleteById(Long id);
Optional<User> findById(Long id);
Optional<User> findByUsername(String username);
List<User> findAll();
}

View File

@ -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<UserRole> findByUserId(Long userId);
List<UserRole> findAll();
}

View File

@ -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<UserToken> findById(Long id);
Optional<UserToken> findByToken(String token);
void deleteByToken(String token);
void deleteByUserId(Long userId);
List<UserToken> findByUserId(Long userId);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<User> findByUsername(String username);
boolean verifyPassword(User user, String plainText);
boolean registerUser(String username, String plainPassword);
UserToken createToken(Long userId, long expireMs);
Optional<UserToken> findToken(String token);
void removeToken(String token);
boolean isValidToken(String token);
Optional<User> findById(Long id);
}

View File

@ -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<User> 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<UserToken> 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<User> findById(Long id) {
return userRepository.findById(id);
}
}

View File

@ -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<Role> findById(Long id);
List<Role> findAll();
boolean addRole(Role role);
boolean updateRole(Role role);
boolean deleteRole(Long id);
}

View File

@ -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<RoleFileRule> findByRoleId(Long roleId);
boolean addRoleFileRule(RoleFileRule rule);
boolean removeRoleFileRule(Long ruleId);
}

View File

@ -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<UserToken> findToken(String token);
}

View File

@ -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<User> findByUsername(String username);
Optional<User> findById(Long id);
List<User> findAllUsers();
boolean registerUser(String username, String plainPassword);
// 认证/Token
Optional<UserToken> findToken(String token);
boolean verifyPassword(String username, String plainText);
UserToken createToken(Long userId, long expireMs);
boolean isValidToken(String token);
void removeToken(String token);
// 角色
List<Role> findAllRoles();
Optional<Role> findRoleById(Long id);
boolean addRole(Role role);
boolean updateRole(Role role);
boolean deleteRole(Long id);
// 用户-角色
List<UserRole> findRolesByUserId(Long userId);
boolean addUserRole(Long userId, Long roleId);
boolean removeUserRole(Long userId, Long roleId);
// 角色-文件规则
List<RoleFileRule> findRoleFileRules(Long roleId);
boolean addRoleFileRule(RoleFileRule rule);
boolean removeRoleFileRule(Long ruleId);
// 用户特殊授权
List<UserFile> findUserFiles(Long userId);
boolean addUserFileAuth(Long userId, Long fileId);
boolean removeUserFileAuth(Long userId, Long fileId);
}

View File

@ -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<UserFile> findByUserId(Long userId);
boolean addUserFileAuth(Long userId, Long fileId);
boolean removeUserFileAuth(Long userId, Long fileId);
}

View File

@ -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<User> findByUsername(String username);
Optional<User> findById(Long id);
List<User> findAll();
boolean registerUser(String username, String plainPassword);
boolean updateUser(User user);
boolean deleteUser(Long id);
}

View File

@ -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<UserRole> findByUserId(Long userId);
boolean addUserRole(Long userId, Long roleId);
boolean removeUserRole(Long userId, Long roleId);
}

View File

@ -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<Role> findById(Long id) {
return Optional.ofNullable(roleRepository.findById(id));
}
@Override
public List<Role> 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);
}
}

View File

@ -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<RoleFileRule> 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);
}
}

View File

@ -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<User> 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<UserToken> 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<UserToken> findToken(String token) {
return userTokenRepository.findByToken(token);
}
}

View File

@ -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<User> findByUsername(String username) {
return userProfileDomainSupport.findByUsername(username);
}
@Override
public Optional<User> findById(Long id) {
return userProfileDomainSupport.findById(id);
}
@Override
public List<User> findAllUsers() {
return userProfileDomainSupport.findAll();
}
@Override
public boolean registerUser(String username, String plainPassword) {
userProfileDomainSupport.registerUser(username, plainPassword);
return true;
}
// 认证/Token
@Override
public Optional<UserToken> 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<Role> findAllRoles() {
return roleDomainSupport.findAll();
}
@Override
public Optional<Role> 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<UserRole> 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<RoleFileRule> 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<UserFile> 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);
}
}

View File

@ -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<UserFile> 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);
}
}

View File

@ -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<User> findByUsername(String username) {
return userRepository.findByUsername(username);
}
@Override
public Optional<User> findById(Long id) {
return userRepository.findById(id);
}
@Override
public List<User> 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);
}
}

View File

@ -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<UserRole> 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);
}
}

View File

@ -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.*;

View File

@ -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<User> userOpt = userService.findByUsername(username);
if (userOpt.isEmpty() || !userService.verifyPassword(userOpt.get(), password)) {
Optional<User> 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<UserToken> userTokenOpt = userService.findToken(token);
Optional<UserToken> userTokenOpt = userAppService.findToken(token);
if (userTokenOpt.isPresent()) {
Long userId = userTokenOpt.get().getUserId();
Optional<User> userOpt = userService.findById(userId);
Optional<User> userOpt = userAppService.findById(userId);
if (userOpt.isPresent()) {
return ResponseEntity.ok(Map.of("username", userOpt.get().getUsername()));
}

View File

@ -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;
}

View File

@ -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<File> {
}

View File

@ -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<RoleFileRule> {
}

View File

@ -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<Role> {
}

View File

@ -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<UserFile> {
}

View File

@ -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;

View File

@ -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<UserRole> {
}

View File

@ -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;

View File

@ -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<UserToken> findByToken(String token) {
return Optional.ofNullable(
tokenMapper.selectOne(
new QueryWrapper<UserToken>()
.eq("token", token)
)
);
}
@Override
public void deleteByToken(String token) {
tokenMapper.delete(
new QueryWrapper<UserToken>()
.eq("token", token)
);
}
@Override
public void deleteByUserId(Long userId) {
tokenMapper.delete(
new QueryWrapper<UserToken>()
.eq("user_id", userId)
);
}
}

View File

@ -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<File> findAll() {
return fileMapper.selectList(null);
}
@Override
public List<File> findByFileNameLike(String pattern) {
// pattern 例:%xxx%
return fileMapper.selectList(new QueryWrapper<File>().like("file_name", pattern));
}
}

View File

@ -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<RoleFileRule> findByRoleId(Long roleId) {
return roleFileRuleMapper.selectList(new QueryWrapper<RoleFileRule>().eq("role_id", roleId));
}
@Override
public List<RoleFileRule> findAll() {
return roleFileRuleMapper.selectList(null);
}
}

View File

@ -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<Role> findAll() {
return roleMapper.selectList(null);
}
}

View File

@ -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<UserFile>().eq("user_id", userId).eq("file_id", fileId)
) > 0;
}
@Override
public UserFile findById(Long id) {
return userFileMapper.selectById(id);
}
@Override
public List<UserFile> findByUserId(Long userId) {
return userFileMapper.selectList(new QueryWrapper<UserFile>().eq("user_id", userId));
}
@Override
public List<UserFile> findAll() {
return userFileMapper.selectList(null);
}
}

View File

@ -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<User> findByUsername(String username) {
return Optional.ofNullable(
userMapper.selectOne(
new QueryWrapper<User>()
.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<User> findByUsername(String username) {
return Optional.ofNullable(
userMapper.selectOne(new QueryWrapper<User>().eq("username", username))
);
}
@Override
public List<User> findAll() {
return userMapper.selectList(null);
}
}

View File

@ -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<UserRole>().eq("user_id", userId).eq("role_id", roleId)
) > 0;
}
@Override
public UserRole findById(Long id) {
return userRoleMapper.selectById(id);
}
@Override
public List<UserRole> findByUserId(Long userId) {
return userRoleMapper.selectList(new QueryWrapper<UserRole>().eq("user_id", userId));
}
@Override
public List<UserRole> findAll() {
return userRoleMapper.selectList(null);
}
}

View File

@ -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<UserToken>().eq("token", token));
}
@Override
public Optional<UserToken> findById(Long id) {
return Optional.ofNullable(userTokenMapper.selectById(id));
}
@Override
public Optional<UserToken> findByToken(String token) {
return Optional.ofNullable(
userTokenMapper.selectOne(new QueryWrapper<UserToken>().eq("token", token))
);
}
@Override
public List<UserToken> findByUserId(Long userId) {
return userTokenMapper.selectList(new QueryWrapper<UserToken>().eq("user_id", userId));
}
}

View File

@ -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<String> 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 ? "成功" : "已存在");
});
}