feat: 添加系统配置、审计中心、通知中心、文件管理模块

This commit is contained in:
张翔
2026-03-11 12:11:59 +08:00
commit 52c66444a5
264 changed files with 10109 additions and 0 deletions
@@ -0,0 +1,11 @@
package cn.novalon.manage.sys;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ManageSysApplication {
public static void main(String[] args) {
SpringApplication.run(ManageSysApplication.class, args);
}
}
@@ -0,0 +1,31 @@
package cn.novalon.manage.sys.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.server.SecurityWebFilterChain;
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
return http
.csrf(ServerHttpSecurity.CsrfSpec::disable)
.authorizeExchange(exchanges -> exchanges
.pathMatchers("/api/auth/**").permitAll()
.pathMatchers("/api/public/**").permitAll()
.anyExchange().authenticated()
)
.build();
}
}
@@ -0,0 +1,54 @@
package cn.novalon.manage.sys.config;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class SystemWebSocketHandler extends TextWebSocketHandler {
private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.put(session.getId(), session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session.getId());
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
// Handle incoming messages if needed
}
public void sendMessageToUser(String userId, String message) {
sessions.values().forEach(session -> {
try {
if (session.isOpen()) {
session.sendMessage(new TextMessage(message));
}
} catch (IOException e) {
}
});
}
public void broadcast(String message) {
sessions.values().forEach(session -> {
try {
if (session.isOpen()) {
session.sendMessage(new TextMessage(message));
}
} catch (IOException e) {
}
});
}
}
@@ -0,0 +1,23 @@
package cn.novalon.manage.sys.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
private final SystemWebSocketHandler webSocketHandler;
public WebSocketConfig(SystemWebSocketHandler webSocketHandler) {
this.webSocketHandler = webSocketHandler;
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler, "/ws")
.setAllowedOrigins("*");
}
}
@@ -0,0 +1,43 @@
package cn.novalon.manage.sys.core.domain;
import java.time.LocalDateTime;
public abstract class BaseDomain {
private Long id;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private LocalDateTime deletedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public LocalDateTime getDeletedAt() {
return deletedAt;
}
public void setDeletedAt(LocalDateTime deletedAt) {
this.deletedAt = deletedAt;
}
}
@@ -0,0 +1,86 @@
package cn.novalon.manage.sys.core.domain;
public class OperationLog extends BaseDomain {
private String username;
private String operation;
private String method;
private String params;
private String result;
private String ip;
private Long duration;
private String status;
private String errorMsg;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getParams() {
return params;
}
public void setParams(String params) {
this.params = params;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Long getDuration() {
return duration;
}
public void setDuration(Long duration) {
this.duration = duration;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
@@ -0,0 +1,35 @@
package cn.novalon.manage.sys.core.domain;
import java.time.LocalDateTime;
public class SysConfig {
private Long id;
private String configName;
private String configKey;
private String configValue;
private String configType;
private String createBy;
private String updateBy;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getConfigName() { return configName; }
public void setConfigName(String configName) { this.configName = configName; }
public String getConfigKey() { return configKey; }
public void setConfigKey(String configKey) { this.configKey = configKey; }
public String getConfigValue() { return configValue; }
public void setConfigValue(String configValue) { this.configValue = configValue; }
public String getConfigType() { return configType; }
public void setConfigType(String configType) { this.configType = configType; }
public String getCreateBy() { return createBy; }
public void setCreateBy(String createBy) { this.createBy = createBy; }
public String getUpdateBy() { return updateBy; }
public void setUpdateBy(String updateBy) { this.updateBy = updateBy; }
public LocalDateTime getCreatedAt() { return createdAt; }
public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
public LocalDateTime getUpdatedAt() { return updatedAt; }
public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; }
}
@@ -0,0 +1,50 @@
package cn.novalon.manage.sys.core.domain;
import java.time.LocalDateTime;
public class SysDictData {
private Long id;
private Long dictTypeId;
private String dictLabel;
private String dictValue;
private Integer dictSort;
private String dictType;
private String cssClass;
private String listClass;
private String isDefault;
private String status;
private String createBy;
private String updateBy;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public Long getDictTypeId() { return dictTypeId; }
public void setDictTypeId(Long dictTypeId) { this.dictTypeId = dictTypeId; }
public String getDictLabel() { return dictLabel; }
public void setDictLabel(String dictLabel) { this.dictLabel = dictLabel; }
public String getDictValue() { return dictValue; }
public void setDictValue(String dictValue) { this.dictValue = dictValue; }
public Integer getDictSort() { return dictSort; }
public void setDictSort(Integer dictSort) { this.dictSort = dictSort; }
public String getDictType() { return dictType; }
public void setDictType(String dictType) { this.dictType = dictType; }
public String getCssClass() { return cssClass; }
public void setCssClass(String cssClass) { this.cssClass = cssClass; }
public String getListClass() { return listClass; }
public void setListClass(String listClass) { this.listClass = listClass; }
public String getIsDefault() { return isDefault; }
public void setIsDefault(String isDefault) { this.isDefault = isDefault; }
public String getStatus() { return status; }
public void setStatus(String status) { this.status = status; }
public String getCreateBy() { return createBy; }
public void setCreateBy(String createBy) { this.createBy = createBy; }
public String getUpdateBy() { return updateBy; }
public void setUpdateBy(String updateBy) { this.updateBy = updateBy; }
public LocalDateTime getCreatedAt() { return createdAt; }
public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
public LocalDateTime getUpdatedAt() { return updatedAt; }
public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; }
}
@@ -0,0 +1,35 @@
package cn.novalon.manage.sys.core.domain;
import java.time.LocalDateTime;
public class SysDictType {
private Long id;
private String dictName;
private String dictType;
private String status;
private String remark;
private String createBy;
private String updateBy;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getDictName() { return dictName; }
public void setDictName(String dictName) { this.dictName = dictName; }
public String getDictType() { return dictType; }
public void setDictType(String dictType) { this.dictType = dictType; }
public String getStatus() { return status; }
public void setStatus(String status) { this.status = status; }
public String getRemark() { return remark; }
public void setRemark(String remark) { this.remark = remark; }
public String getCreateBy() { return createBy; }
public void setCreateBy(String createBy) { this.createBy = createBy; }
public String getUpdateBy() { return updateBy; }
public void setUpdateBy(String updateBy) { this.updateBy = updateBy; }
public LocalDateTime getCreatedAt() { return createdAt; }
public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
public LocalDateTime getUpdatedAt() { return updatedAt; }
public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; }
}
@@ -0,0 +1,38 @@
package cn.novalon.manage.sys.core.domain;
import java.time.LocalDateTime;
public class SysExceptionLog {
private Long id;
private String username;
private String title;
private String exceptionName;
private String methodName;
private String methodParams;
private String exceptionMsg;
private String exceptionStack;
private String ip;
private LocalDateTime createTime;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getExceptionName() { return exceptionName; }
public void setExceptionName(String exceptionName) { this.exceptionName = exceptionName; }
public String getMethodName() { return methodName; }
public void setMethodName(String methodName) { this.methodName = methodName; }
public String getMethodParams() { return methodParams; }
public void setMethodParams(String methodParams) { this.methodParams = methodParams; }
public String getExceptionMsg() { return exceptionMsg; }
public void setExceptionMsg(String exceptionMsg) { this.exceptionMsg = exceptionMsg; }
public String getExceptionStack() { return exceptionStack; }
public void setExceptionStack(String exceptionStack) { this.exceptionStack = exceptionStack; }
public String getIp() { return ip; }
public void setIp(String ip) { this.ip = ip; }
public LocalDateTime getCreateTime() { return createTime; }
public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
}
@@ -0,0 +1,32 @@
package cn.novalon.manage.sys.core.domain;
import java.time.LocalDateTime;
public class SysFile {
private Long id;
private String fileName;
private String filePath;
private String fileSize;
private String fileType;
private String storageType;
private String createBy;
private LocalDateTime createdAt;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getFileName() { return fileName; }
public void setFileName(String fileName) { this.fileName = fileName; }
public String getFilePath() { return filePath; }
public void setFilePath(String filePath) { this.filePath = filePath; }
public String getFileSize() { return fileSize; }
public void setFileSize(String fileSize) { this.fileSize = fileSize; }
public String getFileType() { return fileType; }
public void setFileType(String fileType) { this.fileType = fileType; }
public String getStorageType() { return storageType; }
public void setStorageType(String storageType) { this.storageType = storageType; }
public String getCreateBy() { return createBy; }
public void setCreateBy(String createBy) { this.createBy = createBy; }
public LocalDateTime getCreatedAt() { return createdAt; }
public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
}
@@ -0,0 +1,35 @@
package cn.novalon.manage.sys.core.domain;
import java.time.LocalDateTime;
public class SysLoginLog {
private Long id;
private String username;
private String ip;
private String location;
private String browser;
private String os;
private String status;
private String message;
private LocalDateTime loginTime;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getIp() { return ip; }
public void setIp(String ip) { this.ip = ip; }
public String getLocation() { return location; }
public void setLocation(String location) { this.location = location; }
public String getBrowser() { return browser; }
public void setBrowser(String browser) { this.browser = browser; }
public String getOs() { return os; }
public void setOs(String os) { this.os = os; }
public String getStatus() { return status; }
public void setStatus(String status) { this.status = status; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
public LocalDateTime getLoginTime() { return loginTime; }
public void setLoginTime(LocalDateTime loginTime) { this.loginTime = loginTime; }
}
@@ -0,0 +1,79 @@
package cn.novalon.manage.sys.core.domain;
import java.util.List;
public class SysMenu extends BaseDomain {
private String menuName;
private Long parentId;
private Integer orderNum;
private String menuType;
private String perms;
private String component;
private String status;
private List<SysMenu> children;
public String getMenuName() {
return menuName;
}
public void setMenuName(String menuName) {
this.menuName = menuName;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public Integer getOrderNum() {
return orderNum;
}
public void setOrderNum(Integer orderNum) {
this.orderNum = orderNum;
}
public String getMenuType() {
return menuType;
}
public void setMenuType(String menuType) {
this.menuType = menuType;
}
public String getPerms() {
return perms;
}
public void setPerms(String perms) {
this.perms = perms;
}
public String getComponent() {
return component;
}
public void setComponent(String component) {
this.component = component;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List<SysMenu> getChildren() {
return children;
}
public void setChildren(List<SysMenu> children) {
this.children = children;
}
}
@@ -0,0 +1,35 @@
package cn.novalon.manage.sys.core.domain;
import java.time.LocalDateTime;
public class SysNotice {
private Long id;
private String noticeTitle;
private String noticeType;
private String noticeContent;
private String status;
private String createBy;
private String updateBy;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getNoticeTitle() { return noticeTitle; }
public void setNoticeTitle(String noticeTitle) { this.noticeTitle = noticeTitle; }
public String getNoticeType() { return noticeType; }
public void setNoticeType(String noticeType) { this.noticeType = noticeType; }
public String getNoticeContent() { return noticeContent; }
public void setNoticeContent(String noticeContent) { this.noticeContent = noticeContent; }
public String getStatus() { return status; }
public void setStatus(String status) { this.status = status; }
public String getCreateBy() { return createBy; }
public void setCreateBy(String createBy) { this.createBy = createBy; }
public String getUpdateBy() { return updateBy; }
public void setUpdateBy(String updateBy) { this.updateBy = updateBy; }
public LocalDateTime getCreatedAt() { return createdAt; }
public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
public LocalDateTime getUpdatedAt() { return updatedAt; }
public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; }
}
@@ -0,0 +1,41 @@
package cn.novalon.manage.sys.core.domain;
public class SysRole extends BaseDomain {
private String roleName;
private String roleKey;
private Integer roleSort;
private Integer status;
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleKey() {
return roleKey;
}
public void setRoleKey(String roleKey) {
this.roleKey = roleKey;
}
public Integer getRoleSort() {
return roleSort;
}
public void setRoleSort(Integer roleSort) {
this.roleSort = roleSort;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
@@ -0,0 +1,50 @@
package cn.novalon.manage.sys.core.domain;
public class SysUser extends BaseDomain {
private String username;
private String password;
private String email;
private Long roleId;
private Integer status;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
@@ -0,0 +1,29 @@
package cn.novalon.manage.sys.core.domain;
import java.time.LocalDateTime;
public class SysUserMessage {
private Long id;
private Long userId;
private String title;
private String content;
private String messageType;
private String isRead;
private LocalDateTime createTime;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public Long getUserId() { return userId; }
public void setUserId(Long userId) { this.userId = userId; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public String getMessageType() { return messageType; }
public void setMessageType(String messageType) { this.messageType = messageType; }
public String getIsRead() { return isRead; }
public void setIsRead(String isRead) { this.isRead = isRead; }
public LocalDateTime getCreateTime() { return createTime; }
public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
}
@@ -0,0 +1,18 @@
package cn.novalon.manage.sys.core.repository;
import cn.novalon.manage.sys.core.domain.OperationLog;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface IOperationLogRepository {
Mono<OperationLog> findById(Long id);
Mono<OperationLog> save(OperationLog operationLog);
Mono<Void> deleteById(Long id);
Flux<OperationLog> findAll();
Flux<OperationLog> findByUsername(String username);
}
@@ -0,0 +1,18 @@
package cn.novalon.manage.sys.core.repository;
import cn.novalon.manage.sys.core.domain.SysMenu;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysMenuRepository {
Mono<SysMenu> findById(Long id);
Flux<SysMenu> findAll();
Flux<SysMenu> findByParentId(Long parentId);
Mono<SysMenu> save(SysMenu sysMenu);
Mono<Void> deleteById(Long id);
}
@@ -0,0 +1,16 @@
package cn.novalon.manage.sys.core.repository;
import cn.novalon.manage.sys.core.domain.SysRole;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysRoleRepository {
Mono<SysRole> findById(Long id);
Mono<SysRole> save(SysRole sysRole);
Mono<Void> deleteById(Long id);
Flux<SysRole> findAll();
}
@@ -0,0 +1,18 @@
package cn.novalon.manage.sys.core.repository;
import cn.novalon.manage.sys.core.domain.SysUser;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysUserRepository {
Mono<SysUser> findByUsername(String username);
Mono<SysUser> findById(Long id);
Mono<SysUser> save(SysUser sysUser);
Mono<Void> deleteById(Long id);
Flux<SysUser> findAll();
}
@@ -0,0 +1,11 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.OperationLog;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface IOperationLogService {
Mono<OperationLog> save(OperationLog log);
Flux<OperationLog> findAll();
Flux<OperationLog> findByUsername(String username);
}
@@ -0,0 +1,14 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysConfig;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysConfigService {
Flux<SysConfig> findAll();
Mono<SysConfig> findById(Long id);
Mono<SysConfig> findByConfigKey(String configKey);
Mono<SysConfig> save(SysConfig config);
Mono<Void> deleteById(Long id);
Mono<String> getConfigValue(String configKey);
}
@@ -0,0 +1,14 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysDictData;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysDictDataService {
Flux<SysDictData> findAll();
Flux<SysDictData> findByDictType(String dictType);
Flux<SysDictData> findByDictTypeAndStatus(String dictType, String status);
Mono<SysDictData> findById(Long id);
Mono<SysDictData> save(SysDictData dictData);
Mono<Void> deleteById(Long id);
}
@@ -0,0 +1,13 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysDictType;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysDictTypeService {
Flux<SysDictType> findAll();
Mono<SysDictType> findById(Long id);
Mono<SysDictType> findByDictType(String dictType);
Mono<SysDictType> save(SysDictType dictType);
Mono<Void> deleteById(Long id);
}
@@ -0,0 +1,14 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysExceptionLog;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
public interface ISysExceptionLogService {
Flux<SysExceptionLog> findAll();
Flux<SysExceptionLog> findByUsername(String username);
Flux<SysExceptionLog> findByCreateTimeBetween(LocalDateTime startTime, LocalDateTime endTime);
Mono<SysExceptionLog> save(SysExceptionLog exceptionLog);
}
@@ -0,0 +1,14 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysFile;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.web.multipart.MultipartFile;
public interface ISysFileService {
Flux<SysFile> findAll();
Flux<SysFile> findByCreateBy(String createBy);
Mono<SysFile> findById(Long id);
Mono<SysFile> upload(MultipartFile file, String createBy);
Mono<Void> deleteById(Long id);
}
@@ -0,0 +1,14 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysLoginLog;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
public interface ISysLoginLogService {
Flux<SysLoginLog> findAll();
Flux<SysLoginLog> findByUsername(String username);
Flux<SysLoginLog> findByLoginTimeBetween(LocalDateTime startTime, LocalDateTime endTime);
Mono<SysLoginLog> save(SysLoginLog loginLog);
}
@@ -0,0 +1,15 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysMenu;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysMenuService {
Mono<SysMenu> findById(Long id);
Flux<SysMenu> findAll();
Flux<SysMenu> findByParentId(Long parentId);
Mono<SysMenu> createMenu(SysMenu menu);
Mono<SysMenu> updateMenu(SysMenu menu);
Mono<Void> deleteMenu(Long id);
Flux<SysMenu> buildMenuTree(Flux<SysMenu> menus);
}
@@ -0,0 +1,13 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysNotice;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysNoticeService {
Flux<SysNotice> findAll();
Flux<SysNotice> findByStatus(String status);
Mono<SysNotice> findById(Long id);
Mono<SysNotice> save(SysNotice notice);
Mono<Void> deleteById(Long id);
}
@@ -0,0 +1,13 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysRole;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysRoleService {
Mono<SysRole> findById(Long id);
Flux<SysRole> findAll();
Mono<SysRole> createRole(SysRole role);
Mono<SysRole> updateRole(SysRole role);
Mono<Void> deleteRole(Long id);
}
@@ -0,0 +1,13 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysUserMessage;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ISysUserMessageService {
Flux<SysUserMessage> findByUserId(Long userId);
Flux<SysUserMessage> findByUserIdAndIsRead(Long userId, String isRead);
Mono<Long> countUnread(Long userId);
Mono<SysUserMessage> save(SysUserMessage message);
Mono<Void> markAsRead(Long id);
}
@@ -0,0 +1,13 @@
package cn.novalon.manage.sys.core.service;
import cn.novalon.manage.sys.core.domain.SysUser;
import reactor.core.publisher.Mono;
public interface ISysUserService {
Mono<SysUser> findById(Long id);
Mono<SysUser> findByUsername(String username);
Mono<SysUser> createUser(SysUser user);
Mono<SysUser> updateUser(SysUser user);
Mono<Void> deleteUser(Long id);
Mono<SysUser> changePassword(Long userId, String oldPassword, String newPassword);
}
@@ -0,0 +1,36 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.OperationLog;
import cn.novalon.manage.sys.core.repository.IOperationLogRepository;
import cn.novalon.manage.sys.core.service.IOperationLogService;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@Service
public class OperationLogService implements IOperationLogService {
private final IOperationLogRepository logRepository;
public OperationLogService(IOperationLogRepository logRepository) {
this.logRepository = logRepository;
}
@Override
public Mono<OperationLog> save(OperationLog log) {
log.setCreatedAt(LocalDateTime.now());
return logRepository.save(log);
}
@Override
public Flux<OperationLog> findAll() {
return logRepository.findAll();
}
@Override
public Flux<OperationLog> findByUsername(String username) {
return logRepository.findByUsername(username);
}
}
@@ -0,0 +1,56 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysConfig;
import cn.novalon.manage.sys.core.service.ISysConfigService;
import cn.novalon.manage.sys.infrastructure.db.converter.SysConfigConverter;
import cn.novalon.manage.sys.infrastructure.db.dao.SysConfigDao;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Service
public class SysConfigServiceImpl implements ISysConfigService {
private final SysConfigDao dao;
private final SysConfigConverter converter;
public SysConfigServiceImpl(SysConfigDao dao, SysConfigConverter converter) {
this.dao = dao;
this.converter = converter;
}
@Override
public Flux<SysConfig> findAll() {
return dao.findByDeletedAtIsNull()
.map(converter::toDomain);
}
@Override
public Mono<SysConfig> findById(Long id) {
return dao.findById(id)
.map(converter::toDomain);
}
@Override
public Mono<SysConfig> findByConfigKey(String configKey) {
return dao.findByConfigKeyAndDeletedAtIsNull(configKey)
.map(converter::toDomain);
}
@Override
public Mono<SysConfig> save(SysConfig config) {
return dao.save(converter.toEntity(config))
.map(converter::toDomain);
}
@Override
public Mono<Void> deleteById(Long id) {
return dao.deleteByIdAndDeletedAtIsNull(id);
}
@Override
public Mono<String> getConfigValue(String configKey) {
return findByConfigKey(configKey)
.map(SysConfig::getConfigValue);
}
}
@@ -0,0 +1,56 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysDictData;
import cn.novalon.manage.sys.core.service.ISysDictDataService;
import cn.novalon.manage.sys.infrastructure.db.converter.SysDictDataConverter;
import cn.novalon.manage.sys.infrastructure.db.dao.SysDictDataDao;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Service
public class SysDictDataServiceImpl implements ISysDictDataService {
private final SysDictDataDao dao;
private final SysDictDataConverter converter;
public SysDictDataServiceImpl(SysDictDataDao dao, SysDictDataConverter converter) {
this.dao = dao;
this.converter = converter;
}
@Override
public Flux<SysDictData> findAll() {
return dao.findByDeletedAtIsNull()
.map(converter::toDomain);
}
@Override
public Flux<SysDictData> findByDictType(String dictType) {
return dao.findByDictTypeAndDeletedAtIsNull(dictType)
.map(converter::toDomain);
}
@Override
public Flux<SysDictData> findByDictTypeAndStatus(String dictType, String status) {
return dao.findByDictTypeAndStatusAndDeletedAtIsNull(dictType, status)
.map(converter::toDomain);
}
@Override
public Mono<SysDictData> findById(Long id) {
return dao.findById(id)
.map(converter::toDomain);
}
@Override
public Mono<SysDictData> save(SysDictData dictData) {
return dao.save(converter.toEntity(dictData))
.map(converter::toDomain);
}
@Override
public Mono<Void> deleteById(Long id) {
return dao.deleteByIdAndDeletedAtIsNull(id);
}
}
@@ -0,0 +1,50 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysDictType;
import cn.novalon.manage.sys.core.service.ISysDictTypeService;
import cn.novalon.manage.sys.infrastructure.db.converter.SysDictTypeConverter;
import cn.novalon.manage.sys.infrastructure.db.dao.SysDictTypeDao;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Service
public class SysDictTypeServiceImpl implements ISysDictTypeService {
private final SysDictTypeDao dao;
private final SysDictTypeConverter converter;
public SysDictTypeServiceImpl(SysDictTypeDao dao, SysDictTypeConverter converter) {
this.dao = dao;
this.converter = converter;
}
@Override
public Flux<SysDictType> findAll() {
return dao.findByDeletedAtIsNull()
.map(converter::toDomain);
}
@Override
public Mono<SysDictType> findById(Long id) {
return dao.findById(id)
.map(converter::toDomain);
}
@Override
public Mono<SysDictType> findByDictType(String dictType) {
return dao.findByDictTypeAndDeletedAtIsNull(dictType)
.map(converter::toDomain);
}
@Override
public Mono<SysDictType> save(SysDictType dictType) {
return dao.save(converter.toEntity(dictType))
.map(converter::toDomain);
}
@Override
public Mono<Void> deleteById(Long id) {
return dao.deleteByIdAndDeletedAtIsNull(id);
}
}
@@ -0,0 +1,47 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysExceptionLog;
import cn.novalon.manage.sys.core.service.ISysExceptionLogService;
import cn.novalon.manage.sys.infrastructure.db.converter.SysExceptionLogConverter;
import cn.novalon.manage.sys.infrastructure.db.dao.SysExceptionLogDao;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@Service
public class SysExceptionLogServiceImpl implements ISysExceptionLogService {
private final SysExceptionLogDao dao;
private final SysExceptionLogConverter converter;
public SysExceptionLogServiceImpl(SysExceptionLogDao dao, SysExceptionLogConverter converter) {
this.dao = dao;
this.converter = converter;
}
@Override
public Flux<SysExceptionLog> findAll() {
return dao.findAllByOrderByCreateTimeDesc()
.map(converter::toDomain);
}
@Override
public Flux<SysExceptionLog> findByUsername(String username) {
return dao.findByUsernameOrderByCreateTimeDesc(username)
.map(converter::toDomain);
}
@Override
public Flux<SysExceptionLog> findByCreateTimeBetween(LocalDateTime startTime, LocalDateTime endTime) {
return dao.findByCreateTimeBetweenOrderByCreateTimeDesc(startTime, endTime)
.map(converter::toDomain);
}
@Override
public Mono<SysExceptionLog> save(SysExceptionLog exceptionLog) {
return dao.save(converter.toEntity(exceptionLog))
.map(converter::toDomain);
}
}
@@ -0,0 +1,78 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysFile;
import cn.novalon.manage.sys.core.service.ISysFileService;
import cn.novalon.manage.sys.infrastructure.db.converter.SysFileConverter;
import cn.novalon.manage.sys.infrastructure.db.dao.SysFileDao;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.util.UUID;
@Service
public class SysFileServiceImpl implements ISysFileService {
private final SysFileDao dao;
private final SysFileConverter converter;
private final Path uploadPath = Paths.get("./uploads");
public SysFileServiceImpl(SysFileDao dao, SysFileConverter converter) {
this.dao = dao;
this.converter = converter;
}
@Override
public Flux<SysFile> findAll() {
return dao.findByDeletedAtIsNullOrderByCreatedAtDesc()
.map(converter::toDomain);
}
@Override
public Flux<SysFile> findByCreateBy(String createBy) {
return dao.findByCreateByOrderByCreatedAtDesc(createBy)
.map(converter::toDomain);
}
@Override
public Mono<SysFile> findById(Long id) {
return dao.findById(id)
.map(converter::toDomain);
}
@Override
public Mono<SysFile> upload(MultipartFile file, String createBy) {
try {
if (!Files.exists(uploadPath)) {
Files.createDirectories(uploadPath);
}
String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename();
Path filePath = uploadPath.resolve(fileName);
Files.copy(file.getInputStream(), filePath);
SysFile sysFile = new SysFile();
sysFile.setFileName(file.getOriginalFilename());
sysFile.setFilePath("/api/files/download/" + fileName);
sysFile.setFileSize(String.valueOf(file.getSize()));
sysFile.setFileType(file.getContentType());
sysFile.setStorageType("local");
sysFile.setCreateBy(createBy);
sysFile.setCreatedAt(LocalDateTime.now());
return dao.save(converter.toEntity(sysFile))
.map(converter::toDomain);
} catch (Exception e) {
return Mono.error(new RuntimeException("文件上传失败: " + e.getMessage()));
}
}
@Override
public Mono<Void> deleteById(Long id) {
return dao.deleteByIdAndDeletedAtIsNull(id);
}
}
@@ -0,0 +1,47 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysLoginLog;
import cn.novalon.manage.sys.core.service.ISysLoginLogService;
import cn.novalon.manage.sys.infrastructure.db.converter.SysLoginLogConverter;
import cn.novalon.manage.sys.infrastructure.db.dao.SysLoginLogDao;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@Service
public class SysLoginLogServiceImpl implements ISysLoginLogService {
private final SysLoginLogDao dao;
private final SysLoginLogConverter converter;
public SysLoginLogServiceImpl(SysLoginLogDao dao, SysLoginLogConverter converter) {
this.dao = dao;
this.converter = converter;
}
@Override
public Flux<SysLoginLog> findAll() {
return dao.findAllByOrderByLoginTimeDesc()
.map(converter::toDomain);
}
@Override
public Flux<SysLoginLog> findByUsername(String username) {
return dao.findByUsernameOrderByLoginTimeDesc(username)
.map(converter::toDomain);
}
@Override
public Flux<SysLoginLog> findByLoginTimeBetween(LocalDateTime startTime, LocalDateTime endTime) {
return dao.findByLoginTimeBetweenOrderByLoginTimeDesc(startTime, endTime)
.map(converter::toDomain);
}
@Override
public Mono<SysLoginLog> save(SysLoginLog loginLog) {
return dao.save(converter.toEntity(loginLog))
.map(converter::toDomain);
}
}
@@ -0,0 +1,69 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysMenu;
import cn.novalon.manage.sys.core.repository.ISysMenuRepository;
import cn.novalon.manage.sys.core.service.ISysMenuService;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class SysMenuService implements ISysMenuService {
private final ISysMenuRepository menuRepository;
public SysMenuService(ISysMenuRepository menuRepository) {
this.menuRepository = menuRepository;
}
@Override
public Mono<SysMenu> findById(Long id) {
return menuRepository.findById(id);
}
@Override
public Flux<SysMenu> findAll() {
return menuRepository.findAll();
}
@Override
public Flux<SysMenu> findByParentId(Long parentId) {
return menuRepository.findByParentId(parentId);
}
@Override
public Mono<SysMenu> createMenu(SysMenu menu) {
menu.setCreatedAt(LocalDateTime.now());
menu.setStatus("0");
return menuRepository.save(menu);
}
@Override
public Mono<SysMenu> updateMenu(SysMenu menu) {
menu.setUpdatedAt(LocalDateTime.now());
return menuRepository.save(menu);
}
@Override
public Mono<Void> deleteMenu(Long id) {
return menuRepository.deleteById(id);
}
@Override
public Flux<SysMenu> buildMenuTree(Flux<SysMenu> menus) {
return menus.collectList()
.map(list -> buildTree(list, 0L))
.flatMapMany(Flux::fromIterable);
}
private List<SysMenu> buildTree(List<SysMenu> menus, Long parentId) {
return menus.stream()
.filter(m -> m.getParentId().equals(parentId))
.peek(m -> m.setChildren(buildTree(menus, m.getId())))
.collect(Collectors.toList());
}
}
@@ -0,0 +1,50 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysNotice;
import cn.novalon.manage.sys.core.service.ISysNoticeService;
import cn.novalon.manage.sys.infrastructure.db.converter.SysNoticeConverter;
import cn.novalon.manage.sys.infrastructure.db.dao.SysNoticeDao;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Service
public class SysNoticeServiceImpl implements ISysNoticeService {
private final SysNoticeDao dao;
private final SysNoticeConverter converter;
public SysNoticeServiceImpl(SysNoticeDao dao, SysNoticeConverter converter) {
this.dao = dao;
this.converter = converter;
}
@Override
public Flux<SysNotice> findAll() {
return dao.findByDeletedAtIsNull()
.map(converter::toDomain);
}
@Override
public Flux<SysNotice> findByStatus(String status) {
return dao.findByStatusAndDeletedAtIsNull(status)
.map(converter::toDomain);
}
@Override
public Mono<SysNotice> findById(Long id) {
return dao.findById(id)
.map(converter::toDomain);
}
@Override
public Mono<SysNotice> save(SysNotice notice) {
return dao.save(converter.toEntity(notice))
.map(converter::toDomain);
}
@Override
public Mono<Void> deleteById(Long id) {
return dao.deleteByIdAndDeletedAtIsNull(id);
}
}
@@ -0,0 +1,48 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysRole;
import cn.novalon.manage.sys.core.repository.ISysRoleRepository;
import cn.novalon.manage.sys.core.service.ISysRoleService;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@Service
public class SysRoleService implements ISysRoleService {
private final ISysRoleRepository roleRepository;
public SysRoleService(ISysRoleRepository roleRepository) {
this.roleRepository = roleRepository;
}
@Override
public Mono<SysRole> findById(Long id) {
return roleRepository.findById(id);
}
@Override
public Flux<SysRole> findAll() {
return roleRepository.findAll();
}
@Override
public Mono<SysRole> createRole(SysRole role) {
role.setCreatedAt(LocalDateTime.now());
role.setStatus(1);
return roleRepository.save(role);
}
@Override
public Mono<SysRole> updateRole(SysRole role) {
role.setUpdatedAt(LocalDateTime.now());
return roleRepository.save(role);
}
@Override
public Mono<Void> deleteRole(Long id) {
return roleRepository.deleteById(id);
}
}
@@ -0,0 +1,54 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysUserMessage;
import cn.novalon.manage.sys.core.service.ISysUserMessageService;
import cn.novalon.manage.sys.infrastructure.db.converter.SysUserMessageConverter;
import cn.novalon.manage.sys.infrastructure.db.dao.SysUserMessageDao;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Service
public class SysUserMessageServiceImpl implements ISysUserMessageService {
private final SysUserMessageDao dao;
private final SysUserMessageConverter converter;
public SysUserMessageServiceImpl(SysUserMessageDao dao, SysUserMessageConverter converter) {
this.dao = dao;
this.converter = converter;
}
@Override
public Flux<SysUserMessage> findByUserId(Long userId) {
return dao.findByUserIdOrderByCreateTimeDesc(userId)
.map(converter::toDomain);
}
@Override
public Flux<SysUserMessage> findByUserIdAndIsRead(Long userId, String isRead) {
return dao.findByUserIdAndIsReadOrderByCreateTimeDesc(userId, isRead)
.map(converter::toDomain);
}
@Override
public Mono<Long> countUnread(Long userId) {
return dao.countByUserIdAndIsRead(userId, "0");
}
@Override
public Mono<SysUserMessage> save(SysUserMessage message) {
return dao.save(converter.toEntity(message))
.map(converter::toDomain);
}
@Override
public Mono<Void> markAsRead(Long id) {
return dao.findById(id)
.flatMap(entity -> {
entity.setIsRead("1");
return dao.save(entity);
})
.then();
}
}
@@ -0,0 +1,64 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysUser;
import cn.novalon.manage.sys.core.repository.ISysUserRepository;
import cn.novalon.manage.sys.core.service.ISysUserService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@Service
public class SysUserService implements ISysUserService {
private final ISysUserRepository userRepository;
private final PasswordEncoder passwordEncoder;
public SysUserService(ISysUserRepository userRepository, PasswordEncoder passwordEncoder) {
this.userRepository = userRepository;
this.passwordEncoder = passwordEncoder;
}
@Override
public Mono<SysUser> findById(Long id) {
return userRepository.findById(id);
}
@Override
public Mono<SysUser> findByUsername(String username) {
return userRepository.findByUsername(username);
}
@Override
public Mono<SysUser> createUser(SysUser user) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
user.setCreatedAt(LocalDateTime.now());
user.setStatus(1);
return userRepository.save(user);
}
@Override
public Mono<SysUser> updateUser(SysUser user) {
user.setUpdatedAt(LocalDateTime.now());
return userRepository.save(user);
}
@Override
public Mono<Void> deleteUser(Long id) {
return userRepository.deleteById(id);
}
@Override
public Mono<SysUser> changePassword(Long userId, String oldPassword, String newPassword) {
return userRepository.findById(userId)
.flatMap(user -> {
if (!passwordEncoder.matches(oldPassword, user.getPassword())) {
return Mono.error(new RuntimeException("旧密码不正确"));
}
user.setPassword(passwordEncoder.encode(newPassword));
user.setUpdatedAt(LocalDateTime.now());
return userRepository.save(user);
});
}
}
@@ -0,0 +1,28 @@
package cn.novalon.manage.sys.dto.request;
import jakarta.validation.constraints.NotBlank;
public class LoginRequest {
@NotBlank(message = "用户名不能为空")
private String username;
@NotBlank(message = "密码不能为空")
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
@@ -0,0 +1,28 @@
package cn.novalon.manage.sys.dto.request;
import jakarta.validation.constraints.NotBlank;
public class PasswordChangeRequest {
@NotBlank(message = "旧密码不能为空")
private String oldPassword;
@NotBlank(message = "新密码不能为空")
private String newPassword;
public String getOldPassword() {
return oldPassword;
}
public void setOldPassword(String oldPassword) {
this.oldPassword = oldPassword;
}
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
}
@@ -0,0 +1,43 @@
package cn.novalon.manage.sys.dto.request;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
public class UserRegisterRequest {
@NotBlank(message = "用户名不能为空")
@Size(min = 3, max = 50, message = "用户名长度必须在3-50之间")
private String username;
@NotBlank(message = "密码不能为空")
@Size(min = 6, max = 100, message = "密码长度必须在6-100之间")
private String password;
@Email(message = "邮箱格式不正确")
private String email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
@@ -0,0 +1,37 @@
package cn.novalon.manage.sys.dto.request;
import jakarta.validation.constraints.Email;
public class UserUpdateRequest {
private String email;
private Integer status;
private Long roleId;
@Email(message = "邮箱格式不正确")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
}
@@ -0,0 +1,41 @@
package cn.novalon.manage.sys.dto.response;
public class AuthResponse {
private String token;
private Long userId;
private String username;
public AuthResponse() {
}
public AuthResponse(String token, Long userId, String username) {
this.token = token;
this.userId = userId;
this.username = username;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
@@ -0,0 +1,82 @@
package cn.novalon.manage.sys.dto.response;
import java.time.LocalDateTime;
public class UserResponse {
private Long id;
private String username;
private String email;
private Long roleId;
private Integer status;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public static UserResponse fromDomain(cn.novalon.manage.sys.core.domain.SysUser user) {
UserResponse response = new UserResponse();
response.setId(user.getId());
response.setUsername(user.getUsername());
response.setEmail(user.getEmail());
response.setRoleId(user.getRoleId());
response.setStatus(user.getStatus());
response.setCreatedAt(user.getCreatedAt());
response.setUpdatedAt(user.getUpdatedAt());
return response;
}
}
@@ -0,0 +1,78 @@
package cn.novalon.manage.sys.handler;
import cn.novalon.manage.sys.core.domain.SysExceptionLog;
import cn.novalon.manage.sys.core.service.ISysExceptionLogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
private final ISysExceptionLogService exceptionLogService;
public GlobalExceptionHandler(ISysExceptionLogService exceptionLogService) {
this.exceptionLogService = exceptionLogService;
}
@ExceptionHandler(Exception.class)
public ResponseEntity<Map<String, Object>> handleException(Exception ex, WebRequest request) {
logger.error("Exception occurred: ", ex);
SysExceptionLog exceptionLog = new SysExceptionLog();
exceptionLog.setTitle("System Exception");
exceptionLog.setExceptionName(ex.getClass().getSimpleName());
exceptionLog.setExceptionMsg(ex.getMessage());
exceptionLog.setMethodName(request.getDescription(false));
exceptionLog.setIp(getClientIp(request));
exceptionLog.setCreateTime(LocalDateTime.now());
StringBuilder stackTrace = new StringBuilder();
for (StackTraceElement element : ex.getStackTrace()) {
stackTrace.append(element.toString()).append("\n");
}
exceptionLog.setExceptionStack(stackTrace.toString());
exceptionLogService.save(exceptionLog).subscribe();
Map<String, Object> response = new HashMap<>();
response.put("code", HttpStatus.INTERNAL_SERVER_ERROR.value());
response.put("message", ex.getMessage());
response.put("timestamp", LocalDateTime.now());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<Map<String, Object>> handleIllegalArgumentException(IllegalArgumentException ex, WebRequest request) {
logger.warn("Illegal argument: ", ex);
Map<String, Object> response = new HashMap<>();
response.put("code", HttpStatus.BAD_REQUEST.value());
response.put("message", ex.getMessage());
response.put("timestamp", LocalDateTime.now());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
}
private String getClientIp(WebRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = "127.0.0.1";
}
return ip;
}
}
@@ -0,0 +1,59 @@
package cn.novalon.manage.sys.handler.auth;
import cn.novalon.manage.sys.dto.request.LoginRequest;
import cn.novalon.manage.sys.dto.request.UserRegisterRequest;
import cn.novalon.manage.sys.dto.response.AuthResponse;
import cn.novalon.manage.sys.security.JwtTokenProvider;
import cn.novalon.manage.sys.core.domain.SysUser;
import cn.novalon.manage.sys.core.service.ISysUserService;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/api/auth")
public class SysAuthHandler {
private final ISysUserService userService;
private final PasswordEncoder passwordEncoder;
private final JwtTokenProvider jwtTokenProvider;
public SysAuthHandler(ISysUserService userService, PasswordEncoder passwordEncoder, JwtTokenProvider jwtTokenProvider) {
this.userService = userService;
this.passwordEncoder = passwordEncoder;
this.jwtTokenProvider = jwtTokenProvider;
}
@PostMapping("/login")
public Mono<ResponseEntity<AuthResponse>> login(@Valid @RequestBody LoginRequest request) {
return userService.findByUsername(request.getUsername())
.filter(user -> passwordEncoder.matches(request.getPassword(), user.getPassword()))
.filter(user -> 1 == user.getStatus())
.map(user -> {
String token = jwtTokenProvider.generateToken(user.getUsername(), user.getId());
AuthResponse response = new AuthResponse(token, user.getId(), user.getUsername());
return ResponseEntity.ok(response);
})
.defaultIfEmpty(ResponseEntity.status(HttpStatus.UNAUTHORIZED).build());
}
@PostMapping("/register")
public Mono<ResponseEntity<SysUser>> register(@Valid @RequestBody UserRegisterRequest request) {
SysUser user = new SysUser();
user.setUsername(request.getUsername());
user.setPassword(request.getPassword());
user.setEmail(request.getEmail());
return userService.findByUsername(request.getUsername())
.flatMap(existing -> Mono.<ResponseEntity<SysUser>>error(new RuntimeException("用户名已存在")))
.switchIfEmpty(userService.createUser(user)
.map(u -> ResponseEntity.status(HttpStatus.CREATED).body(u)));
}
@PostMapping("/logout")
public Mono<ResponseEntity<Void>> logout() {
return Mono.just(ResponseEntity.ok().build());
}
}
@@ -0,0 +1,62 @@
package cn.novalon.manage.sys.handler.sys;
import cn.novalon.manage.sys.core.domain.SysConfig;
import cn.novalon.manage.sys.core.service.ISysConfigService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/api/config")
public class SysConfigHandler {
private final ISysConfigService configService;
public SysConfigHandler(ISysConfigService configService) {
this.configService = configService;
}
@GetMapping
public Flux<SysConfig> getAllConfigs() {
return configService.findAll();
}
@GetMapping("/{id}")
public Mono<ResponseEntity<SysConfig>> getConfigById(@PathVariable Long id) {
return configService.findById(id)
.map(config -> ResponseEntity.ok(config))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@GetMapping("/key/{configKey}")
public Mono<ResponseEntity<SysConfig>> getConfigByKey(@PathVariable String configKey) {
return configService.findByConfigKey(configKey)
.map(config -> ResponseEntity.ok(config))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@PostMapping
public Mono<ResponseEntity<SysConfig>> createConfig(@RequestBody SysConfig config) {
config.setConfigType("N");
config.setCreatedAt(LocalDateTime.now());
return configService.save(config)
.map(saved -> ResponseEntity.ok(saved));
}
@PutMapping("/{id}")
public Mono<ResponseEntity<SysConfig>> updateConfig(@PathVariable Long id, @RequestBody SysConfig config) {
config.setId(id);
config.setUpdatedAt(LocalDateTime.now());
return configService.save(config)
.map(saved -> ResponseEntity.ok(saved));
}
@DeleteMapping("/{id}")
public Mono<ResponseEntity<Void>> deleteConfig(@PathVariable Long id) {
return configService.deleteById(id)
.then(Mono.just(ResponseEntity.noContent().build()));
}
}
@@ -0,0 +1,62 @@
package cn.novalon.manage.sys.handler.sys;
import cn.novalon.manage.sys.core.domain.SysDictType;
import cn.novalon.manage.sys.core.service.ISysDictTypeService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/api/dict")
public class SysDictHandler {
private final ISysDictTypeService dictTypeService;
public SysDictHandler(ISysDictTypeService dictTypeService) {
this.dictTypeService = dictTypeService;
}
@GetMapping("/types")
public Flux<SysDictType> getAllDictTypes() {
return dictTypeService.findAll();
}
@GetMapping("/types/{id}")
public Mono<ResponseEntity<SysDictType>> getDictTypeById(@PathVariable Long id) {
return dictTypeService.findById(id)
.map(dictType -> ResponseEntity.ok(dictType))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@GetMapping("/types/type/{dictType}")
public Mono<ResponseEntity<SysDictType>> getDictTypeByDictType(@PathVariable String dictType) {
return dictTypeService.findByDictType(dictType)
.map(dictTypeResult -> ResponseEntity.ok(dictTypeResult))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@PostMapping("/types")
public Mono<ResponseEntity<SysDictType>> createDictType(@RequestBody SysDictType dictType) {
dictType.setStatus("0");
dictType.setCreatedAt(LocalDateTime.now());
return dictTypeService.save(dictType)
.map(saved -> ResponseEntity.ok(saved));
}
@PutMapping("/types/{id}")
public Mono<ResponseEntity<SysDictType>> updateDictType(@PathVariable Long id, @RequestBody SysDictType dictType) {
dictType.setId(id);
dictType.setUpdatedAt(LocalDateTime.now());
return dictTypeService.save(dictType)
.map(saved -> ResponseEntity.ok(saved));
}
@DeleteMapping("/types/{id}")
public Mono<ResponseEntity<Void>> deleteDictType(@PathVariable Long id) {
return dictTypeService.deleteById(id)
.then(Mono.just(ResponseEntity.noContent().build()));
}
}
@@ -0,0 +1,88 @@
package cn.novalon.manage.sys.handler.sys;
import cn.novalon.manage.sys.core.domain.SysFile;
import cn.novalon.manage.sys.core.service.ISysFileService;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@RestController
@RequestMapping("/api/files")
public class SysFileHandler {
private final ISysFileService fileService;
private final Path uploadPath = Paths.get("./uploads");
public SysFileHandler(ISysFileService fileService) {
this.fileService = fileService;
}
@GetMapping
public Flux<SysFile> getAllFiles() {
return fileService.findAll();
}
@GetMapping("/{id}")
public Mono<ResponseEntity<SysFile>> getFileById(@PathVariable Long id) {
return fileService.findById(id)
.map(file -> ResponseEntity.ok(file))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@PostMapping("/upload")
public Mono<ResponseEntity<SysFile>> uploadFile(@RequestParam("file") MultipartFile file,
@RequestParam(value = "createBy", required = false, defaultValue = "anonymous") String createBy) {
return fileService.upload(file, createBy)
.map(saved -> ResponseEntity.ok(saved));
}
@GetMapping("/download/{fileName}")
public Mono<Resource> downloadFile(@PathVariable String fileName) throws MalformedURLException {
Path filePath = uploadPath.resolve(fileName);
Resource resource = new UrlResource(filePath.toUri());
return Mono.just(resource);
}
@GetMapping("/preview/{fileName}")
public Mono<ResponseEntity<byte[]>> previewFile(@PathVariable String fileName) throws MalformedURLException {
return Mono.fromCallable(() -> {
Path filePath = uploadPath.resolve(fileName);
byte[] data = Files.readAllBytes(filePath);
return data;
}).map(data -> {
String contentType = "application/octet-stream";
try {
contentType = Files.probeContentType(uploadPath.resolve(fileName));
} catch (Exception e) {
}
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(contentType))
.body(data);
});
}
@DeleteMapping("/{id}")
public Mono<ResponseEntity<Void>> deleteFile(@PathVariable Long id) {
return fileService.findById(id)
.flatMap(file -> {
try {
String fileName = file.getFilePath().substring(file.getFilePath().lastIndexOf("/") + 1);
Files.deleteIfExists(uploadPath.resolve(fileName));
} catch (Exception e) {
}
return fileService.deleteById(id);
})
.then(Mono.just(ResponseEntity.noContent().build()));
}
}
@@ -0,0 +1,77 @@
package cn.novalon.manage.sys.handler.sys;
import cn.novalon.manage.sys.core.domain.SysLoginLog;
import cn.novalon.manage.sys.core.domain.SysExceptionLog;
import cn.novalon.manage.sys.core.service.ISysLoginLogService;
import cn.novalon.manage.sys.core.service.ISysExceptionLogService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/api/logs")
public class SysLogHandler {
private final ISysLoginLogService loginLogService;
private final ISysExceptionLogService exceptionLogService;
public SysLogHandler(ISysLoginLogService loginLogService, ISysExceptionLogService exceptionLogService) {
this.loginLogService = loginLogService;
this.exceptionLogService = exceptionLogService;
}
@GetMapping("/login")
public Flux<SysLoginLog> getLoginLogs() {
return loginLogService.findAll();
}
@GetMapping("/login/{id}")
public Mono<ResponseEntity<SysLoginLog>> getLoginLogById(@PathVariable Long id) {
return loginLogService.findAll()
.filter(log -> log.getId().equals(id))
.next()
.map(log -> ResponseEntity.ok(log))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@PostMapping("/login")
public Mono<ResponseEntity<SysLoginLog>> createLoginLog(@RequestBody SysLoginLog log) {
log.setLoginTime(LocalDateTime.now());
return loginLogService.save(log)
.map(saved -> ResponseEntity.ok(saved));
}
@GetMapping("/login/user/{username}")
public Flux<SysLoginLog> getLoginLogsByUsername(@PathVariable String username) {
return loginLogService.findByUsername(username);
}
@GetMapping("/exception")
public Flux<SysExceptionLog> getExceptionLogs() {
return exceptionLogService.findAll();
}
@GetMapping("/exception/{id}")
public Mono<ResponseEntity<SysExceptionLog>> getExceptionLogById(@PathVariable Long id) {
return exceptionLogService.findAll()
.filter(log -> log.getId().equals(id))
.next()
.map(log -> ResponseEntity.ok(log))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@GetMapping("/exception/user/{username}")
public Flux<SysExceptionLog> getExceptionLogsByUsername(@PathVariable String username) {
return exceptionLogService.findByUsername(username);
}
@PostMapping("/exception")
public Mono<ResponseEntity<SysExceptionLog>> createExceptionLog(@RequestBody SysExceptionLog log) {
log.setCreateTime(LocalDateTime.now());
return exceptionLogService.save(log)
.map(saved -> ResponseEntity.ok(saved));
}
}
@@ -0,0 +1,56 @@
package cn.novalon.manage.sys.handler.sys;
import cn.novalon.manage.sys.core.domain.SysMenu;
import cn.novalon.manage.sys.core.service.ISysMenuService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/api/menus")
public class SysMenuHandler {
private final ISysMenuService menuService;
public SysMenuHandler(ISysMenuService menuService) {
this.menuService = menuService;
}
@GetMapping
public Flux<SysMenu> getAllMenus() {
return menuService.findAll();
}
@GetMapping("/tree")
public Flux<SysMenu> getMenuTree() {
return menuService.buildMenuTree(menuService.findAll());
}
@GetMapping("/{id}")
public Mono<ResponseEntity<SysMenu>> getMenuById(@PathVariable Long id) {
return menuService.findById(id)
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@PostMapping
public Mono<ResponseEntity<SysMenu>> createMenu(@RequestBody SysMenu menu) {
return menuService.createMenu(menu)
.map(m -> ResponseEntity.status(HttpStatus.CREATED).body(m));
}
@PutMapping("/{id}")
public Mono<ResponseEntity<SysMenu>> updateMenu(@PathVariable Long id, @RequestBody SysMenu menu) {
menu.setId(id);
return menuService.updateMenu(menu)
.map(ResponseEntity::ok);
}
@DeleteMapping("/{id}")
public Mono<ResponseEntity<Void>> deleteMenu(@PathVariable Long id) {
return menuService.deleteMenu(id)
.then(Mono.just(ResponseEntity.noContent().build()));
}
}
@@ -0,0 +1,47 @@
package cn.novalon.manage.sys.handler.sys;
import cn.novalon.manage.sys.core.domain.SysUserMessage;
import cn.novalon.manage.sys.core.service.ISysUserMessageService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/api/messages")
public class SysMessageHandler {
private final ISysUserMessageService messageService;
public SysMessageHandler(ISysUserMessageService messageService) {
this.messageService = messageService;
}
@GetMapping("/user/{userId}")
public Flux<SysUserMessage> getMessagesByUserId(@PathVariable Long userId) {
return messageService.findByUserId(userId);
}
@GetMapping("/user/{userId}/unread")
public Mono<Long> getUnreadCount(@PathVariable Long userId) {
return messageService.countUnread(userId);
}
@GetMapping("/user/{userId}/unread/list")
public Flux<SysUserMessage> getUnreadMessages(@PathVariable Long userId) {
return messageService.findByUserIdAndIsRead(userId, "0");
}
@PostMapping
public Mono<ResponseEntity<SysUserMessage>> createMessage(@RequestBody SysUserMessage message) {
message.setIsRead("0");
return messageService.save(message)
.map(saved -> ResponseEntity.ok(saved));
}
@PutMapping("/{id}/read")
public Mono<ResponseEntity<Void>> markAsRead(@PathVariable Long id) {
return messageService.markAsRead(id)
.then(Mono.just(ResponseEntity.ok().<Void>build()));
}
}
@@ -0,0 +1,60 @@
package cn.novalon.manage.sys.handler.sys;
import cn.novalon.manage.sys.core.domain.SysNotice;
import cn.novalon.manage.sys.core.service.ISysNoticeService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/api/notices")
public class SysNoticeHandler {
private final ISysNoticeService noticeService;
public SysNoticeHandler(ISysNoticeService noticeService) {
this.noticeService = noticeService;
}
@GetMapping
public Flux<SysNotice> getAllNotices() {
return noticeService.findAll();
}
@GetMapping("/{id}")
public Mono<ResponseEntity<SysNotice>> getNoticeById(@PathVariable Long id) {
return noticeService.findById(id)
.map(notice -> ResponseEntity.ok(notice))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@GetMapping("/status/{status}")
public Flux<SysNotice> getNoticesByStatus(@PathVariable String status) {
return noticeService.findByStatus(status);
}
@PostMapping
public Mono<ResponseEntity<SysNotice>> createNotice(@RequestBody SysNotice notice) {
notice.setStatus("0");
notice.setCreatedAt(LocalDateTime.now());
return noticeService.save(notice)
.map(saved -> ResponseEntity.ok(saved));
}
@PutMapping("/{id}")
public Mono<ResponseEntity<SysNotice>> updateNotice(@PathVariable Long id, @RequestBody SysNotice notice) {
notice.setId(id);
notice.setUpdatedAt(LocalDateTime.now());
return noticeService.save(notice)
.map(saved -> ResponseEntity.ok(saved));
}
@DeleteMapping("/{id}")
public Mono<ResponseEntity<Void>> deleteNotice(@PathVariable Long id) {
return noticeService.deleteById(id)
.then(Mono.just(ResponseEntity.noContent().build()));
}
}
@@ -0,0 +1,51 @@
package cn.novalon.manage.sys.handler.sys;
import cn.novalon.manage.sys.core.domain.SysRole;
import cn.novalon.manage.sys.core.service.ISysRoleService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/api/roles")
public class SysRoleHandler {
private final ISysRoleService roleService;
public SysRoleHandler(ISysRoleService roleService) {
this.roleService = roleService;
}
@GetMapping
public Flux<SysRole> getAllRoles() {
return roleService.findAll();
}
@GetMapping("/{id}")
public Mono<ResponseEntity<SysRole>> getRoleById(@PathVariable Long id) {
return roleService.findById(id)
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@PostMapping
public Mono<ResponseEntity<SysRole>> createRole(@RequestBody SysRole role) {
return roleService.createRole(role)
.map(r -> ResponseEntity.status(HttpStatus.CREATED).body(r));
}
@PutMapping("/{id}")
public Mono<ResponseEntity<SysRole>> updateRole(@PathVariable Long id, @RequestBody SysRole role) {
role.setId(id);
return roleService.updateRole(role)
.map(ResponseEntity::ok);
}
@DeleteMapping("/{id}")
public Mono<ResponseEntity<Void>> deleteRole(@PathVariable Long id) {
return roleService.deleteRole(id)
.then(Mono.just(ResponseEntity.noContent().build()));
}
}
@@ -0,0 +1,75 @@
package cn.novalon.manage.sys.handler.user;
import cn.novalon.manage.sys.core.domain.SysUser;
import cn.novalon.manage.sys.core.service.ISysUserService;
import cn.novalon.manage.sys.dto.request.PasswordChangeRequest;
import cn.novalon.manage.sys.dto.request.UserUpdateRequest;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/api/users")
public class SysUserHandler {
private final ISysUserService userService;
public SysUserHandler(ISysUserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public Mono<ResponseEntity<SysUser>> getUserById(@PathVariable Long id) {
return userService.findById(id)
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@GetMapping("/username/{username}")
public Mono<ResponseEntity<SysUser>> getUserByUsername(@PathVariable String username) {
return userService.findByUsername(username)
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@PostMapping
public Mono<ResponseEntity<SysUser>> createUser(@RequestBody SysUser user) {
return userService.createUser(user)
.map(u -> ResponseEntity.status(HttpStatus.CREATED).body(u));
}
@PutMapping("/{id}")
public Mono<ResponseEntity<SysUser>> updateUser(@PathVariable Long id, @Valid @RequestBody UserUpdateRequest request) {
return userService.findById(id)
.flatMap(existing -> {
if (request.getEmail() != null) {
existing.setEmail(request.getEmail());
}
if (request.getStatus() != null) {
existing.setStatus(request.getStatus());
}
if (request.getRoleId() != null) {
existing.setRoleId(request.getRoleId());
}
return userService.updateUser(existing);
})
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@DeleteMapping("/{id}")
public Mono<ResponseEntity<Void>> deleteUser(@PathVariable Long id) {
return userService.deleteUser(id)
.then(Mono.just(ResponseEntity.noContent().build()));
}
@PostMapping("/{id}/password")
public Mono<ResponseEntity<SysUser>> changePassword(
@PathVariable Long id,
@Valid @RequestBody PasswordChangeRequest request) {
return userService.changePassword(id, request.getOldPassword(), request.getNewPassword())
.map(ResponseEntity::ok);
}
}
@@ -0,0 +1,49 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.OperationLog;
import cn.novalon.manage.sys.infrastructure.db.entity.OperationLogEntity;
public class OperationLogConverter {
public OperationLog toDomain(OperationLogEntity entity) {
if (entity == null) {
return null;
}
OperationLog domain = new OperationLog();
domain.setId(entity.getId());
domain.setUsername(entity.getUsername());
domain.setOperation(entity.getOperation());
domain.setMethod(entity.getMethod());
domain.setParams(entity.getParams());
domain.setResult(entity.getResult());
domain.setIp(entity.getIp());
domain.setDuration(entity.getDuration());
domain.setStatus(entity.getStatus());
domain.setErrorMsg(entity.getErrorMsg());
domain.setCreatedAt(entity.getCreatedAt());
domain.setUpdatedAt(entity.getUpdatedAt());
domain.setDeletedAt(entity.getDeletedAt());
return domain;
}
public OperationLogEntity toEntity(OperationLog domain) {
if (domain == null) {
return null;
}
OperationLogEntity entity = new OperationLogEntity();
entity.setId(domain.getId());
entity.setUsername(domain.getUsername());
entity.setOperation(domain.getOperation());
entity.setMethod(domain.getMethod());
entity.setParams(domain.getParams());
entity.setResult(domain.getResult());
entity.setIp(domain.getIp());
entity.setDuration(domain.getDuration());
entity.setStatus(domain.getStatus());
entity.setErrorMsg(domain.getErrorMsg());
entity.setCreatedAt(domain.getCreatedAt());
entity.setUpdatedAt(domain.getUpdatedAt());
entity.setDeletedAt(domain.getDeletedAt());
return entity;
}
}
@@ -0,0 +1,41 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysConfig;
import cn.novalon.manage.sys.infrastructure.db.entity.SysConfigEntity;
public class SysConfigConverter {
public SysConfig toDomain(SysConfigEntity entity) {
if (entity == null) {
return null;
}
SysConfig domain = new SysConfig();
domain.setId(entity.getId());
domain.setConfigName(entity.getConfigName());
domain.setConfigKey(entity.getConfigKey());
domain.setConfigValue(entity.getConfigValue());
domain.setConfigType(entity.getConfigType());
domain.setCreateBy(entity.getCreateBy());
domain.setUpdateBy(entity.getUpdateBy());
domain.setCreatedAt(entity.getCreatedAt());
domain.setUpdatedAt(entity.getUpdatedAt());
return domain;
}
public SysConfigEntity toEntity(SysConfig domain) {
if (domain == null) {
return null;
}
SysConfigEntity entity = new SysConfigEntity();
entity.setId(domain.getId());
entity.setConfigName(domain.getConfigName());
entity.setConfigKey(domain.getConfigKey());
entity.setConfigValue(domain.getConfigValue());
entity.setConfigType(domain.getConfigType());
entity.setCreateBy(domain.getCreateBy());
entity.setUpdateBy(domain.getUpdateBy());
entity.setCreatedAt(domain.getCreatedAt());
entity.setUpdatedAt(domain.getUpdatedAt());
return entity;
}
}
@@ -0,0 +1,49 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysDictData;
import cn.novalon.manage.sys.infrastructure.db.entity.SysDictDataEntity;
public class SysDictDataConverter {
public SysDictData toDomain(SysDictDataEntity entity) {
if (entity == null) {
return null;
}
SysDictData domain = new SysDictData();
domain.setId(entity.getId());
domain.setDictSort(entity.getDictSort());
domain.setDictLabel(entity.getDictLabel());
domain.setDictValue(entity.getDictValue());
domain.setDictType(entity.getDictType());
domain.setCssClass(entity.getCssClass());
domain.setListClass(entity.getListClass());
domain.setIsDefault(entity.getIsDefault());
domain.setStatus(entity.getStatus());
domain.setCreateBy(entity.getCreateBy());
domain.setUpdateBy(entity.getUpdateBy());
domain.setCreatedAt(entity.getCreatedAt());
domain.setUpdatedAt(entity.getUpdatedAt());
return domain;
}
public SysDictDataEntity toEntity(SysDictData domain) {
if (domain == null) {
return null;
}
SysDictDataEntity entity = new SysDictDataEntity();
entity.setId(domain.getId());
entity.setDictSort(domain.getDictSort());
entity.setDictLabel(domain.getDictLabel());
entity.setDictValue(domain.getDictValue());
entity.setDictType(domain.getDictType());
entity.setCssClass(domain.getCssClass());
entity.setListClass(domain.getListClass());
entity.setIsDefault(domain.getIsDefault());
entity.setStatus(domain.getStatus());
entity.setCreateBy(domain.getCreateBy());
entity.setUpdateBy(domain.getUpdateBy());
entity.setCreatedAt(domain.getCreatedAt());
entity.setUpdatedAt(domain.getUpdatedAt());
return entity;
}
}
@@ -0,0 +1,41 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysDictType;
import cn.novalon.manage.sys.infrastructure.db.entity.SysDictTypeEntity;
public class SysDictTypeConverter {
public SysDictType toDomain(SysDictTypeEntity entity) {
if (entity == null) {
return null;
}
SysDictType domain = new SysDictType();
domain.setId(entity.getId());
domain.setDictName(entity.getDictName());
domain.setDictType(entity.getDictType());
domain.setStatus(entity.getStatus());
domain.setRemark(entity.getRemark());
domain.setCreateBy(entity.getCreateBy());
domain.setUpdateBy(entity.getUpdateBy());
domain.setCreatedAt(entity.getCreatedAt());
domain.setUpdatedAt(entity.getUpdatedAt());
return domain;
}
public SysDictTypeEntity toEntity(SysDictType domain) {
if (domain == null) {
return null;
}
SysDictTypeEntity entity = new SysDictTypeEntity();
entity.setId(domain.getId());
entity.setDictName(domain.getDictName());
entity.setDictType(domain.getDictType());
entity.setStatus(domain.getStatus());
entity.setRemark(domain.getRemark());
entity.setCreateBy(domain.getCreateBy());
entity.setUpdateBy(domain.getUpdateBy());
entity.setCreatedAt(domain.getCreatedAt());
entity.setUpdatedAt(domain.getUpdatedAt());
return entity;
}
}
@@ -0,0 +1,43 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysExceptionLog;
import cn.novalon.manage.sys.infrastructure.db.entity.SysExceptionLogEntity;
public class SysExceptionLogConverter {
public SysExceptionLog toDomain(SysExceptionLogEntity entity) {
if (entity == null) {
return null;
}
SysExceptionLog domain = new SysExceptionLog();
domain.setId(entity.getId());
domain.setUsername(entity.getUsername());
domain.setTitle(entity.getTitle());
domain.setExceptionName(entity.getExceptionName());
domain.setMethodName(entity.getMethodName());
domain.setMethodParams(entity.getMethodParams());
domain.setExceptionMsg(entity.getExceptionMsg());
domain.setExceptionStack(entity.getExceptionStack());
domain.setIp(entity.getIp());
domain.setCreateTime(entity.getCreateTime());
return domain;
}
public SysExceptionLogEntity toEntity(SysExceptionLog domain) {
if (domain == null) {
return null;
}
SysExceptionLogEntity entity = new SysExceptionLogEntity();
entity.setId(domain.getId());
entity.setUsername(domain.getUsername());
entity.setTitle(domain.getTitle());
entity.setExceptionName(domain.getExceptionName());
entity.setMethodName(domain.getMethodName());
entity.setMethodParams(domain.getMethodParams());
entity.setExceptionMsg(domain.getExceptionMsg());
entity.setExceptionStack(domain.getExceptionStack());
entity.setIp(domain.getIp());
entity.setCreateTime(domain.getCreateTime());
return entity;
}
}
@@ -0,0 +1,39 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysFile;
import cn.novalon.manage.sys.infrastructure.db.entity.SysFileEntity;
public class SysFileConverter {
public SysFile toDomain(SysFileEntity entity) {
if (entity == null) {
return null;
}
SysFile domain = new SysFile();
domain.setId(entity.getId());
domain.setFileName(entity.getFileName());
domain.setFilePath(entity.getFilePath());
domain.setFileSize(entity.getFileSize());
domain.setFileType(entity.getFileType());
domain.setStorageType(entity.getStorageType());
domain.setCreateBy(entity.getCreateBy());
domain.setCreatedAt(entity.getCreatedAt());
return domain;
}
public SysFileEntity toEntity(SysFile domain) {
if (domain == null) {
return null;
}
SysFileEntity entity = new SysFileEntity();
entity.setId(domain.getId());
entity.setFileName(domain.getFileName());
entity.setFilePath(domain.getFilePath());
entity.setFileSize(domain.getFileSize());
entity.setFileType(domain.getFileType());
entity.setStorageType(domain.getStorageType());
entity.setCreateBy(domain.getCreateBy());
entity.setCreatedAt(domain.getCreatedAt());
return entity;
}
}
@@ -0,0 +1,41 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysLoginLog;
import cn.novalon.manage.sys.infrastructure.db.entity.SysLoginLogEntity;
public class SysLoginLogConverter {
public SysLoginLog toDomain(SysLoginLogEntity entity) {
if (entity == null) {
return null;
}
SysLoginLog domain = new SysLoginLog();
domain.setId(entity.getId());
domain.setUsername(entity.getUsername());
domain.setIp(entity.getIp());
domain.setLocation(entity.getLocation());
domain.setBrowser(entity.getBrowser());
domain.setOs(entity.getOs());
domain.setStatus(entity.getStatus());
domain.setMessage(entity.getMessage());
domain.setLoginTime(entity.getLoginTime());
return domain;
}
public SysLoginLogEntity toEntity(SysLoginLog domain) {
if (domain == null) {
return null;
}
SysLoginLogEntity entity = new SysLoginLogEntity();
entity.setId(domain.getId());
entity.setUsername(domain.getUsername());
entity.setIp(domain.getIp());
entity.setLocation(domain.getLocation());
entity.setBrowser(domain.getBrowser());
entity.setOs(domain.getOs());
entity.setStatus(domain.getStatus());
entity.setMessage(domain.getMessage());
entity.setLoginTime(domain.getLoginTime());
return entity;
}
}
@@ -0,0 +1,45 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysMenu;
import cn.novalon.manage.sys.infrastructure.db.entity.SysMenuEntity;
public class SysMenuConverter {
public SysMenu toDomain(SysMenuEntity entity) {
if (entity == null) {
return null;
}
SysMenu domain = new SysMenu();
domain.setId(entity.getId());
domain.setMenuName(entity.getMenuName());
domain.setParentId(entity.getParentId());
domain.setOrderNum(entity.getOrderNum());
domain.setMenuType(entity.getMenuType());
domain.setPerms(entity.getPerms());
domain.setComponent(entity.getComponent());
domain.setStatus(entity.getStatus());
domain.setCreatedAt(entity.getCreatedAt());
domain.setUpdatedAt(entity.getUpdatedAt());
domain.setDeletedAt(entity.getDeletedAt());
return domain;
}
public SysMenuEntity toEntity(SysMenu domain) {
if (domain == null) {
return null;
}
SysMenuEntity entity = new SysMenuEntity();
entity.setId(domain.getId());
entity.setMenuName(domain.getMenuName());
entity.setParentId(domain.getParentId());
entity.setOrderNum(domain.getOrderNum());
entity.setMenuType(domain.getMenuType());
entity.setPerms(domain.getPerms());
entity.setComponent(domain.getComponent());
entity.setStatus(domain.getStatus());
entity.setCreatedAt(domain.getCreatedAt());
entity.setUpdatedAt(domain.getUpdatedAt());
entity.setDeletedAt(domain.getDeletedAt());
return entity;
}
}
@@ -0,0 +1,41 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysNotice;
import cn.novalon.manage.sys.infrastructure.db.entity.SysNoticeEntity;
public class SysNoticeConverter {
public SysNotice toDomain(SysNoticeEntity entity) {
if (entity == null) {
return null;
}
SysNotice domain = new SysNotice();
domain.setId(entity.getId());
domain.setNoticeTitle(entity.getNoticeTitle());
domain.setNoticeType(entity.getNoticeType());
domain.setNoticeContent(entity.getNoticeContent());
domain.setStatus(entity.getStatus());
domain.setCreateBy(entity.getCreateBy());
domain.setUpdateBy(entity.getUpdateBy());
domain.setCreatedAt(entity.getCreatedAt());
domain.setUpdatedAt(entity.getUpdatedAt());
return domain;
}
public SysNoticeEntity toEntity(SysNotice domain) {
if (domain == null) {
return null;
}
SysNoticeEntity entity = new SysNoticeEntity();
entity.setId(domain.getId());
entity.setNoticeTitle(domain.getNoticeTitle());
entity.setNoticeType(domain.getNoticeType());
entity.setNoticeContent(domain.getNoticeContent());
entity.setStatus(domain.getStatus());
entity.setCreateBy(domain.getCreateBy());
entity.setUpdateBy(domain.getUpdateBy());
entity.setCreatedAt(domain.getCreatedAt());
entity.setUpdatedAt(domain.getUpdatedAt());
return entity;
}
}
@@ -0,0 +1,39 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysRole;
import cn.novalon.manage.sys.infrastructure.db.entity.SysRoleEntity;
public class SysRoleConverter {
public SysRole toDomain(SysRoleEntity entity) {
if (entity == null) {
return null;
}
SysRole domain = new SysRole();
domain.setId(entity.getId());
domain.setRoleName(entity.getRoleName());
domain.setRoleKey(entity.getRoleKey());
domain.setRoleSort(entity.getRoleSort());
domain.setStatus(entity.getStatus());
domain.setCreatedAt(entity.getCreatedAt());
domain.setUpdatedAt(entity.getUpdatedAt());
domain.setDeletedAt(entity.getDeletedAt());
return domain;
}
public SysRoleEntity toEntity(SysRole domain) {
if (domain == null) {
return null;
}
SysRoleEntity entity = new SysRoleEntity();
entity.setId(domain.getId());
entity.setRoleName(domain.getRoleName());
entity.setRoleKey(domain.getRoleKey());
entity.setRoleSort(domain.getRoleSort());
entity.setStatus(domain.getStatus());
entity.setCreatedAt(domain.getCreatedAt());
entity.setUpdatedAt(domain.getUpdatedAt());
entity.setDeletedAt(domain.getDeletedAt());
return entity;
}
}
@@ -0,0 +1,41 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysUser;
import cn.novalon.manage.sys.infrastructure.db.entity.SysUserEntity;
public class SysUserConverter {
public SysUser toDomain(SysUserEntity entity) {
if (entity == null) {
return null;
}
SysUser domain = new SysUser();
domain.setId(entity.getId());
domain.setUsername(entity.getUsername());
domain.setPassword(entity.getPassword());
domain.setEmail(entity.getEmail());
domain.setRoleId(entity.getRoleId());
domain.setStatus(entity.getStatus());
domain.setCreatedAt(entity.getCreatedAt());
domain.setUpdatedAt(entity.getUpdatedAt());
domain.setDeletedAt(entity.getDeletedAt());
return domain;
}
public SysUserEntity toEntity(SysUser domain) {
if (domain == null) {
return null;
}
SysUserEntity entity = new SysUserEntity();
entity.setId(domain.getId());
entity.setUsername(domain.getUsername());
entity.setPassword(domain.getPassword());
entity.setEmail(domain.getEmail());
entity.setRoleId(domain.getRoleId());
entity.setStatus(domain.getStatus());
entity.setCreatedAt(domain.getCreatedAt());
entity.setUpdatedAt(domain.getUpdatedAt());
entity.setDeletedAt(domain.getDeletedAt());
return entity;
}
}
@@ -0,0 +1,37 @@
package cn.novalon.manage.sys.infrastructure.db.converter;
import cn.novalon.manage.sys.core.domain.SysUserMessage;
import cn.novalon.manage.sys.infrastructure.db.entity.SysUserMessageEntity;
public class SysUserMessageConverter {
public SysUserMessage toDomain(SysUserMessageEntity entity) {
if (entity == null) {
return null;
}
SysUserMessage domain = new SysUserMessage();
domain.setId(entity.getId());
domain.setUserId(entity.getUserId());
domain.setTitle(entity.getTitle());
domain.setContent(entity.getContent());
domain.setMessageType(entity.getMessageType());
domain.setIsRead(entity.getIsRead());
domain.setCreateTime(entity.getCreateTime());
return domain;
}
public SysUserMessageEntity toEntity(SysUserMessage domain) {
if (domain == null) {
return null;
}
SysUserMessageEntity entity = new SysUserMessageEntity();
entity.setId(domain.getId());
entity.setUserId(domain.getUserId());
entity.setTitle(domain.getTitle());
entity.setContent(domain.getContent());
entity.setMessageType(domain.getMessageType());
entity.setIsRead(domain.getIsRead());
entity.setCreateTime(domain.getCreateTime());
return entity;
}
}
@@ -0,0 +1,14 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.OperationLogEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
@Repository
public interface OperationLogDao extends R2dbcRepository<OperationLogEntity, Long> {
Flux<OperationLogEntity> findByUsernameAndDeletedAtIsNull(String username);
Flux<OperationLogEntity> findByDeletedAtIsNull();
}
@@ -0,0 +1,17 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysConfigEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Repository
public interface SysConfigDao extends R2dbcRepository<SysConfigEntity, Long> {
Mono<SysConfigEntity> findByConfigKeyAndDeletedAtIsNull(String configKey);
Flux<SysConfigEntity> findByDeletedAtIsNull();
Mono<Void> deleteByIdAndDeletedAtIsNull(Long id);
}
@@ -0,0 +1,19 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysDictDataEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Repository
public interface SysDictDataDao extends R2dbcRepository<SysDictDataEntity, Long> {
Flux<SysDictDataEntity> findByDictTypeAndStatusAndDeletedAtIsNull(String dictType, String status);
Flux<SysDictDataEntity> findByDictTypeAndDeletedAtIsNull(String dictType);
Flux<SysDictDataEntity> findByDeletedAtIsNull();
Mono<Void> deleteByIdAndDeletedAtIsNull(Long id);
}
@@ -0,0 +1,17 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysDictTypeEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Repository
public interface SysDictTypeDao extends R2dbcRepository<SysDictTypeEntity, Long> {
Mono<SysDictTypeEntity> findByDictTypeAndDeletedAtIsNull(String dictType);
Flux<SysDictTypeEntity> findByDeletedAtIsNull();
Mono<Void> deleteByIdAndDeletedAtIsNull(Long id);
}
@@ -0,0 +1,18 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysExceptionLogEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import java.time.LocalDateTime;
@Repository
public interface SysExceptionLogDao extends R2dbcRepository<SysExceptionLogEntity, Long> {
Flux<SysExceptionLogEntity> findByUsernameOrderByCreateTimeDesc(String username);
Flux<SysExceptionLogEntity> findByCreateTimeBetweenOrderByCreateTimeDesc(LocalDateTime startTime, LocalDateTime endTime);
Flux<SysExceptionLogEntity> findAllByOrderByCreateTimeDesc();
}
@@ -0,0 +1,17 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysFileEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Repository
public interface SysFileDao extends R2dbcRepository<SysFileEntity, Long> {
Flux<SysFileEntity> findByCreateByOrderByCreatedAtDesc(String createBy);
Flux<SysFileEntity> findByDeletedAtIsNullOrderByCreatedAtDesc();
Mono<Void> deleteByIdAndDeletedAtIsNull(Long id);
}
@@ -0,0 +1,18 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysLoginLogEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import java.time.LocalDateTime;
@Repository
public interface SysLoginLogDao extends R2dbcRepository<SysLoginLogEntity, Long> {
Flux<SysLoginLogEntity> findByUsernameOrderByLoginTimeDesc(String username);
Flux<SysLoginLogEntity> findByLoginTimeBetweenOrderByLoginTimeDesc(LocalDateTime startTime, LocalDateTime endTime);
Flux<SysLoginLogEntity> findAllByOrderByLoginTimeDesc();
}
@@ -0,0 +1,17 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysMenuEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Repository
public interface SysMenuDao extends R2dbcRepository<SysMenuEntity, Long> {
Mono<SysMenuEntity> findByIdAndDeletedAtIsNull(Long id);
Flux<SysMenuEntity> findByParentIdAndDeletedAtIsNull(Long parentId);
Flux<SysMenuEntity> findByDeletedAtIsNull();
}
@@ -0,0 +1,17 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysNoticeEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Repository
public interface SysNoticeDao extends R2dbcRepository<SysNoticeEntity, Long> {
Flux<SysNoticeEntity> findByStatusAndDeletedAtIsNull(String status);
Flux<SysNoticeEntity> findByDeletedAtIsNull();
Mono<Void> deleteByIdAndDeletedAtIsNull(Long id);
}
@@ -0,0 +1,15 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysRoleEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Repository
public interface SysRoleDao extends R2dbcRepository<SysRoleEntity, Long> {
Mono<SysRoleEntity> findByRoleKeyAndDeletedAtIsNull(String roleKey);
Flux<SysRoleEntity> findByDeletedAtIsNull();
}
@@ -0,0 +1,15 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysUserEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Repository
public interface SysUserDao extends R2dbcRepository<SysUserEntity, Long> {
Mono<SysUserEntity> findByUsernameAndDeletedAtIsNull(String username);
Flux<SysUserEntity> findByDeletedAtIsNull();
}
@@ -0,0 +1,17 @@
package cn.novalon.manage.sys.infrastructure.db.dao;
import cn.novalon.manage.sys.infrastructure.db.entity.SysUserMessageEntity;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Repository
public interface SysUserMessageDao extends R2dbcRepository<SysUserMessageEntity, Long> {
Flux<SysUserMessageEntity> findByUserIdAndIsReadOrderByCreateTimeDesc(Long userId, String isRead);
Flux<SysUserMessageEntity> findByUserIdOrderByCreateTimeDesc(Long userId);
Mono<Long> countByUserIdAndIsRead(Long userId, String isRead);
}
@@ -0,0 +1,57 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.relational.core.mapping.Column;
import java.time.LocalDateTime;
public abstract class BaseEntity {
@Id
private Long id;
@CreatedDate
@Column("created_at")
private LocalDateTime createdAt;
@LastModifiedDate
@Column("updated_at")
private LocalDateTime updatedAt;
@Column("deleted_at")
private LocalDateTime deletedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public LocalDateTime getDeletedAt() {
return deletedAt;
}
public void setDeletedAt(LocalDateTime deletedAt) {
this.deletedAt = deletedAt;
}
}
@@ -0,0 +1,107 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
@Table("operation_log")
public class OperationLogEntity extends BaseEntity {
@Column("username")
private String username;
@Column("operation")
private String operation;
@Column("method")
private String method;
@Column("params")
private String params;
@Column("result")
private String result;
@Column("ip")
private String ip;
@Column("duration")
private Long duration;
@Column("status")
private String status;
@Column("error_msg")
private String errorMsg;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getParams() {
return params;
}
public void setParams(String params) {
this.params = params;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Long getDuration() {
return duration;
}
public void setDuration(Long duration) {
this.duration = duration;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
@@ -0,0 +1,121 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Table("sys_config")
public class SysConfigEntity {
@Id
private Long id;
@Column("config_name")
private String configName;
@Column("config_key")
private String configKey;
@Column("config_value")
private String configValue;
@Column("config_type")
private String configType;
@Column("create_by")
private String createBy;
@Column("update_by")
private String updateBy;
@Column("created_at")
private LocalDateTime createdAt;
@Column("updated_at")
private LocalDateTime updatedAt;
@Column("deleted_at")
private LocalDateTime deletedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getConfigName() {
return configName;
}
public void setConfigName(String configName) {
this.configName = configName;
}
public String getConfigKey() {
return configKey;
}
public void setConfigKey(String configKey) {
this.configKey = configKey;
}
public String getConfigValue() {
return configValue;
}
public void setConfigValue(String configValue) {
this.configValue = configValue;
}
public String getConfigType() {
return configType;
}
public void setConfigType(String configType) {
this.configType = configType;
}
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public LocalDateTime getDeletedAt() {
return deletedAt;
}
public void setDeletedAt(LocalDateTime deletedAt) {
this.deletedAt = deletedAt;
}
}
@@ -0,0 +1,165 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Table("sys_dict_data")
public class SysDictDataEntity {
@Id
private Long id;
@Column("dict_sort")
private Integer dictSort;
@Column("dict_label")
private String dictLabel;
@Column("dict_value")
private String dictValue;
@Column("dict_type")
private String dictType;
@Column("css_class")
private String cssClass;
@Column("list_class")
private String listClass;
@Column("is_default")
private String isDefault;
@Column("status")
private String status;
@Column("create_by")
private String createBy;
@Column("update_by")
private String updateBy;
@Column("created_at")
private LocalDateTime createdAt;
@Column("updated_at")
private LocalDateTime updatedAt;
@Column("deleted_at")
private LocalDateTime deletedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getDictSort() {
return dictSort;
}
public void setDictSort(Integer dictSort) {
this.dictSort = dictSort;
}
public String getDictLabel() {
return dictLabel;
}
public void setDictLabel(String dictLabel) {
this.dictLabel = dictLabel;
}
public String getDictValue() {
return dictValue;
}
public void setDictValue(String dictValue) {
this.dictValue = dictValue;
}
public String getDictType() {
return dictType;
}
public void setDictType(String dictType) {
this.dictType = dictType;
}
public String getCssClass() {
return cssClass;
}
public void setCssClass(String cssClass) {
this.cssClass = cssClass;
}
public String getListClass() {
return listClass;
}
public void setListClass(String listClass) {
this.listClass = listClass;
}
public String getIsDefault() {
return isDefault;
}
public void setIsDefault(String isDefault) {
this.isDefault = isDefault;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public LocalDateTime getDeletedAt() {
return deletedAt;
}
public void setDeletedAt(LocalDateTime deletedAt) {
this.deletedAt = deletedAt;
}
}
@@ -0,0 +1,121 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Table("sys_dict_type")
public class SysDictTypeEntity {
@Id
private Long id;
@Column("dict_name")
private String dictName;
@Column("dict_type")
private String dictType;
@Column("status")
private String status;
@Column("remark")
private String remark;
@Column("create_by")
private String createBy;
@Column("update_by")
private String updateBy;
@Column("created_at")
private LocalDateTime createdAt;
@Column("updated_at")
private LocalDateTime updatedAt;
@Column("deleted_at")
private LocalDateTime deletedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDictName() {
return dictName;
}
public void setDictName(String dictName) {
this.dictName = dictName;
}
public String getDictType() {
return dictType;
}
public void setDictType(String dictType) {
this.dictType = dictType;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public LocalDateTime getDeletedAt() {
return deletedAt;
}
public void setDeletedAt(LocalDateTime deletedAt) {
this.deletedAt = deletedAt;
}
}
@@ -0,0 +1,121 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Table("sys_exception_log")
public class SysExceptionLogEntity {
@Id
private Long id;
@Column("username")
private String username;
@Column("title")
private String title;
@Column("exception_name")
private String exceptionName;
@Column("method_name")
private String methodName;
@Column("method_params")
private String methodParams;
@Column("exception_msg")
private String exceptionMsg;
@Column("exception_stack")
private String exceptionStack;
@Column("ip")
private String ip;
@Column("create_time")
private LocalDateTime createTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getExceptionName() {
return exceptionName;
}
public void setExceptionName(String exceptionName) {
this.exceptionName = exceptionName;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public String getMethodParams() {
return methodParams;
}
public void setMethodParams(String methodParams) {
this.methodParams = methodParams;
}
public String getExceptionMsg() {
return exceptionMsg;
}
public void setExceptionMsg(String exceptionMsg) {
this.exceptionMsg = exceptionMsg;
}
public String getExceptionStack() {
return exceptionStack;
}
public void setExceptionStack(String exceptionStack) {
this.exceptionStack = exceptionStack;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
}
@@ -0,0 +1,110 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Table("sys_file")
public class SysFileEntity {
@Id
private Long id;
@Column("file_name")
private String fileName;
@Column("file_path")
private String filePath;
@Column("file_size")
private String fileSize;
@Column("file_type")
private String fileType;
@Column("storage_type")
private String storageType;
@Column("create_by")
private String createBy;
@Column("created_at")
private LocalDateTime createdAt;
@Column("deleted_at")
private LocalDateTime deletedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getFileSize() {
return fileSize;
}
public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public String getStorageType() {
return storageType;
}
public void setStorageType(String storageType) {
this.storageType = storageType;
}
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getDeletedAt() {
return deletedAt;
}
public void setDeletedAt(LocalDateTime deletedAt) {
this.deletedAt = deletedAt;
}
}
@@ -0,0 +1,110 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Table("sys_login_log")
public class SysLoginLogEntity {
@Id
private Long id;
@Column("username")
private String username;
@Column("ip")
private String ip;
@Column("location")
private String location;
@Column("browser")
private String browser;
@Column("os")
private String os;
@Column("status")
private String status;
@Column("message")
private String message;
@Column("login_time")
private LocalDateTime loginTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getBrowser() {
return browser;
}
public void setBrowser(String browser) {
this.browser = browser;
}
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public LocalDateTime getLoginTime() {
return loginTime;
}
public void setLoginTime(LocalDateTime loginTime) {
this.loginTime = loginTime;
}
}
@@ -0,0 +1,85 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
@Table("sys_menu")
public class SysMenuEntity extends BaseEntity {
@Column("menu_name")
private String menuName;
@Column("parent_id")
private Long parentId;
@Column("order_num")
private Integer orderNum;
@Column("menu_type")
private String menuType;
@Column("perms")
private String perms;
@Column("component")
private String component;
@Column("status")
private String status;
public String getMenuName() {
return menuName;
}
public void setMenuName(String menuName) {
this.menuName = menuName;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public Integer getOrderNum() {
return orderNum;
}
public void setOrderNum(Integer orderNum) {
this.orderNum = orderNum;
}
public String getMenuType() {
return menuType;
}
public void setMenuType(String menuType) {
this.menuType = menuType;
}
public String getPerms() {
return perms;
}
public void setPerms(String perms) {
this.perms = perms;
}
public String getComponent() {
return component;
}
public void setComponent(String component) {
this.component = component;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
@@ -0,0 +1,121 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Table("sys_notice")
public class SysNoticeEntity {
@Id
private Long id;
@Column("notice_title")
private String noticeTitle;
@Column("notice_type")
private String noticeType;
@Column("notice_content")
private String noticeContent;
@Column("status")
private String status;
@Column("create_by")
private String createBy;
@Column("update_by")
private String updateBy;
@Column("created_at")
private LocalDateTime createdAt;
@Column("updated_at")
private LocalDateTime updatedAt;
@Column("deleted_at")
private LocalDateTime deletedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNoticeTitle() {
return noticeTitle;
}
public void setNoticeTitle(String noticeTitle) {
this.noticeTitle = noticeTitle;
}
public String getNoticeType() {
return noticeType;
}
public void setNoticeType(String noticeType) {
this.noticeType = noticeType;
}
public String getNoticeContent() {
return noticeContent;
}
public void setNoticeContent(String noticeContent) {
this.noticeContent = noticeContent;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public LocalDateTime getDeletedAt() {
return deletedAt;
}
public void setDeletedAt(LocalDateTime deletedAt) {
this.deletedAt = deletedAt;
}
}
@@ -0,0 +1,52 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
@Table("roles")
public class SysRoleEntity extends BaseEntity {
@Column("role_name")
private String roleName;
@Column("role_key")
private String roleKey;
@Column("role_sort")
private Integer roleSort;
@Column("status")
private Integer status;
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleKey() {
return roleKey;
}
public void setRoleKey(String roleKey) {
this.roleKey = roleKey;
}
public Integer getRoleSort() {
return roleSort;
}
public void setRoleSort(Integer roleSort) {
this.roleSort = roleSort;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
@@ -0,0 +1,63 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
@Table("users")
public class SysUserEntity extends BaseEntity {
@Column("username")
private String username;
@Column("password")
private String password;
@Column("email")
private String email;
@Column("role_id")
private Long roleId;
@Column("status")
private Integer status;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
@@ -0,0 +1,88 @@
package cn.novalon.manage.sys.infrastructure.db.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;
@Table("sys_user_message")
public class SysUserMessageEntity {
@Id
private Long id;
@Column("user_id")
private Long userId;
@Column("title")
private String title;
@Column("content")
private String content;
@Column("message_type")
private String messageType;
@Column("is_read")
private String isRead;
@Column("create_time")
private LocalDateTime createTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getIsRead() {
return isRead;
}
public void setIsRead(String isRead) {
this.isRead = isRead;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
}
@@ -0,0 +1,57 @@
package cn.novalon.manage.sys.infrastructure.db.repository;
import cn.novalon.manage.sys.core.domain.OperationLog;
import cn.novalon.manage.sys.core.repository.IOperationLogRepository;
import cn.novalon.manage.sys.infrastructure.db.converter.OperationLogConverter;
import cn.novalon.manage.sys.infrastructure.db.dao.OperationLogDao;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
@Repository
public class OperationLogRepository implements IOperationLogRepository {
private final OperationLogDao dao;
private final OperationLogConverter converter;
public OperationLogRepository(OperationLogDao dao, OperationLogConverter converter) {
this.dao = dao;
this.converter = converter;
}
@Override
public Mono<OperationLog> findById(Long id) {
return dao.findById(id)
.map(converter::toDomain);
}
@Override
public Mono<OperationLog> save(OperationLog operationLog) {
return dao.save(converter.toEntity(operationLog))
.map(converter::toDomain);
}
@Override
public Mono<Void> deleteById(Long id) {
return dao.findById(id)
.flatMap(entity -> {
entity.setDeletedAt(LocalDateTime.now());
return dao.save(entity);
})
.then();
}
@Override
public Flux<OperationLog> findAll() {
return dao.findByDeletedAtIsNull()
.map(converter::toDomain);
}
@Override
public Flux<OperationLog> findByUsername(String username) {
return dao.findByUsernameAndDeletedAtIsNull(username)
.map(converter::toDomain);
}
}

Some files were not shown because too many files have changed in this diff Show More