添加用户æ©角色相关逻辑
This commit is contained in:
parent
cb0883bcda
commit
7e089c66bd
@ -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
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
@ -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);
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -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;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.knowledge.base.domain.doc.impl;
|
||||
package com.knowledge.base.domain.doc.service.impl;
|
||||
|
||||
/**
|
||||
* @author Luke.ye
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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();
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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);
|
||||
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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.*;
|
||||
|
||||
@ -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()));
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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> {
|
||||
}
|
||||
@ -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> {
|
||||
}
|
||||
@ -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> {
|
||||
}
|
||||
@ -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> {
|
||||
}
|
||||
@ -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;
|
||||
@ -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> {
|
||||
}
|
||||
@ -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;
|
||||
@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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 ? "成功" : "已存在");
|
||||
});
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user