添加用户æ©角色相关逻辑
This commit is contained in:
parent
cb0883bcda
commit
7e089c66bd
@ -5,5 +5,10 @@
|
|||||||
|:-----:|:----------:|:-------:|:-------------------:|
|
|:-----:|:----------:|:-------:|:-------------------:|
|
||||||
| 1.0.0 | 2025-06-05 | Luke.Ye | 添加修订记录(新增token校验接口) |
|
| 1.0.0 | 2025-06-05 | Luke.Ye | 添加修订记录(新增token校验接口) |
|
||||||
| 1.0.1 | 2025-06-06 | 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;
|
package com.knowledge.base.application.filter;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
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.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ import java.io.IOException;
|
|||||||
public class AuthFilter implements Filter {
|
public class AuthFilter implements Filter {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserService userService;
|
private UserDomainService userDomainService;
|
||||||
|
|
||||||
private static final String COOKIE_KEY = "auth_token";
|
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.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||||
response.getWriter().write("Invalid or expired token");
|
response.getWriter().write("Invalid or expired token");
|
||||||
return;
|
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 com.knowledge.base.infrastructure.config.DynamicConfig;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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;
|
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.cache.FileCacheService;
|
||||||
import com.knowledge.base.infrastructure.util.SafeIdUtil;
|
import com.knowledge.base.infrastructure.util.SafeIdUtil;
|
||||||
import com.knowledge.base.infrastructure.util.ThreadPoolUtil;
|
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
|
* @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 com.knowledge.base.domain.common.enums.DocTypeEnum;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
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 com.knowledge.base.domain.common.enums.DocTypeEnum;
|
||||||
import org.springframework.stereotype.Component;
|
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 com.knowledge.base.domain.common.enums.DocTypeEnum;
|
||||||
import org.springframework.stereotype.Component;
|
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 com.knowledge.base.domain.user.repository.po.User;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.List;
|
||||||
/**
|
|
||||||
* @author Luke.ye
|
|
||||||
* @date 2025/6/6 12:20
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
public interface UserRepository {
|
public interface UserRepository {
|
||||||
Optional<User> findByUsername(String username);
|
boolean save(User user);
|
||||||
void save(User user);
|
boolean update(User user);
|
||||||
|
boolean deleteById(Long id);
|
||||||
Optional<User> findById(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 com.knowledge.base.domain.user.repository.po.UserToken;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.List;
|
||||||
/**
|
|
||||||
* @author Luke.ye
|
|
||||||
* @date 2025/6/6 12:20
|
|
||||||
*/
|
|
||||||
|
|
||||||
public interface UserTokenRepository {
|
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);
|
Optional<UserToken> findByToken(String token);
|
||||||
void deleteByToken(String token);
|
List<UserToken> findByUserId(Long userId);
|
||||||
void deleteByUserId(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;
|
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.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
package com.knowledge.base.infrastructure.north.controller;
|
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.User;
|
||||||
import com.knowledge.base.domain.user.repository.po.UserToken;
|
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.ConstantConfig;
|
||||||
import com.knowledge.base.infrastructure.config.DynamicConfig;
|
import com.knowledge.base.infrastructure.config.DynamicConfig;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -19,7 +19,7 @@ import java.util.Optional;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class UserController {
|
public class UserController {
|
||||||
|
|
||||||
private final UserService userService;
|
private final UserAppService userAppService;
|
||||||
private final DynamicConfig dynamicConfig;
|
private final DynamicConfig dynamicConfig;
|
||||||
|
|
||||||
@PostMapping("/login")
|
@PostMapping("/login")
|
||||||
@ -27,14 +27,14 @@ public class UserController {
|
|||||||
String username = body.getOrDefault("username", "").trim();
|
String username = body.getOrDefault("username", "").trim();
|
||||||
String password = body.getOrDefault("password", "").trim();
|
String password = body.getOrDefault("password", "").trim();
|
||||||
|
|
||||||
Optional<User> userOpt = userService.findByUsername(username);
|
Optional<User> userOpt = userAppService.findByUsername(username);
|
||||||
if (userOpt.isEmpty() || !userService.verifyPassword(userOpt.get(), password)) {
|
if (userOpt.isEmpty() || !userAppService.verifyPassword(userOpt.get().getUsername(), password)) {
|
||||||
return ResponseEntity.status(401).body(Map.of("message", "用户名或密码错误"));
|
return ResponseEntity.status(401).body(Map.of("message", "用户名或密码错误"));
|
||||||
}
|
}
|
||||||
|
|
||||||
User user = userOpt.get();
|
User user = userOpt.get();
|
||||||
long expireMs = dynamicConfig.getTokenExpireTime();
|
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 cookie = new Cookie(ConstantConfig.COOKIE_KEY, token.getToken());
|
||||||
cookie.setPath("/");
|
cookie.setPath("/");
|
||||||
@ -57,7 +57,7 @@ public class UserController {
|
|||||||
) {
|
) {
|
||||||
String token = headerToken != null ? headerToken : cookieToken;
|
String token = headerToken != null ? headerToken : cookieToken;
|
||||||
if (token != null) {
|
if (token != null) {
|
||||||
userService.removeToken(token);
|
userAppService.removeToken(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
Cookie cookie = new Cookie(ConstantConfig.COOKIE_KEY, "");
|
Cookie cookie = new Cookie(ConstantConfig.COOKIE_KEY, "");
|
||||||
@ -76,7 +76,7 @@ public class UserController {
|
|||||||
@RequestHeader(value = "Authorization", required = false) String headerToken
|
@RequestHeader(value = "Authorization", required = false) String headerToken
|
||||||
) {
|
) {
|
||||||
String token = headerToken != null ? headerToken : cookieToken;
|
String token = headerToken != null ? headerToken : cookieToken;
|
||||||
if (userService.isValidToken(token)) {
|
if (userAppService.isValidToken(token)) {
|
||||||
return ResponseEntity.ok(Map.of("code", 0, "msg", "校验成功"));
|
return ResponseEntity.ok(Map.of("code", 0, "msg", "校验成功"));
|
||||||
}
|
}
|
||||||
return ResponseEntity.status(401).body(Map.of("code", 401, "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
|
@RequestHeader(value = "Authorization", required = false) String headerToken
|
||||||
) {
|
) {
|
||||||
String token = headerToken != null ? headerToken : cookieToken;
|
String token = headerToken != null ? headerToken : cookieToken;
|
||||||
Optional<UserToken> userTokenOpt = userService.findToken(token);
|
Optional<UserToken> userTokenOpt = userAppService.findToken(token);
|
||||||
if (userTokenOpt.isPresent()) {
|
if (userTokenOpt.isPresent()) {
|
||||||
Long userId = userTokenOpt.get().getUserId();
|
Long userId = userTokenOpt.get().getUserId();
|
||||||
Optional<User> userOpt = userService.findById(userId);
|
Optional<User> userOpt = userAppService.findById(userId);
|
||||||
if (userOpt.isPresent()) {
|
if (userOpt.isPresent()) {
|
||||||
return ResponseEntity.ok(Map.of("username", userOpt.get().getUsername()));
|
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.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.knowledge.base.domain.user.repository.po.User;
|
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.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.knowledge.base.domain.user.repository.po.UserToken;
|
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.iface.UserRepository;
|
||||||
import com.knowledge.base.domain.user.repository.po.User;
|
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 lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Luke.ye
|
|
||||||
* @date 2025/6/6 12:21
|
|
||||||
*/
|
|
||||||
@Repository
|
@Repository
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class UserRepositoryImpl implements UserRepository {
|
public class UserRepositoryImpl implements UserRepository {
|
||||||
@ -20,18 +17,18 @@ public class UserRepositoryImpl implements UserRepository {
|
|||||||
private final UserMapper userMapper;
|
private final UserMapper userMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<User> findByUsername(String username) {
|
public boolean save(User user) {
|
||||||
return Optional.ofNullable(
|
return userMapper.insert(user) > 0;
|
||||||
userMapper.selectOne(
|
|
||||||
new QueryWrapper<User>()
|
|
||||||
.eq("username", username)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void save(User user) {
|
public boolean update(User user) {
|
||||||
userMapper.insert(user);
|
return userMapper.updateById(user) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deleteById(Long id) {
|
||||||
|
return userMapper.deleteById(id) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -39,5 +36,15 @@ public class UserRepositoryImpl implements UserRepository {
|
|||||||
return Optional.ofNullable(userMapper.selectById(id));
|
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;
|
package com.knowledge.base.domain.user.service;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.knowledge.base.domain.user.service.iface.UserDomainService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -12,18 +13,18 @@ import java.util.List;
|
|||||||
"spring.profiles.active=dev-windows"
|
"spring.profiles.active=dev-windows"
|
||||||
})
|
})
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class UserServiceTest {
|
public class UserDomainServiceTest {
|
||||||
|
|
||||||
private static final List<String> USER_NAMES = Lists.newArrayList(
|
private static final List<String> USER_NAMES = Lists.newArrayList(
|
||||||
"Luke.Ye", "WangRui", "HuangHuang", "LiFang", "QiHui");
|
"Luke.Ye", "WangRui", "HuangHuang", "LiFang", "QiHui");
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserService userService;
|
private UserDomainService userDomainService;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBatchRegisterUsers() {
|
public void testBatchRegisterUsers() {
|
||||||
USER_NAMES.forEach(username -> {
|
USER_NAMES.forEach(username -> {
|
||||||
boolean success = userService.registerUser(username, username);
|
boolean success = userDomainService.registerUser(username, username);
|
||||||
log.info("注册用户 [{}] -> {}", username, success ? "成功" : "已存在");
|
log.info("注册用户 [{}] -> {}", username, success ? "成功" : "已存在");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user