+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+ {{ message.title }}
+
+
+
+
+
+ {{ getDictValue(messageTypeKey, message.type, 'tagLabel') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
emits('load')">
+ 加载更多
+
+
+
+
+
+
+
diff --git a/orion-ops-ui/src/components/system/message-box/modal.vue b/orion-ops-ui/src/components/system/message-box/modal.vue
new file mode 100644
index 00000000..17909f5a
--- /dev/null
+++ b/orion-ops-ui/src/components/system/message-box/modal.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/orion-ops-ui/src/views/exec/batch-upload/index.vue b/orion-ops-ui/src/views/exec/batch-upload/index.vue
index ec372558..7c67d048 100644
--- a/orion-ops-ui/src/views/exec/batch-upload/index.vue
+++ b/orion-ops-ui/src/views/exec/batch-upload/index.vue
@@ -28,10 +28,14 @@
await dictStore.loadKeys(dictKeys);
});
+ // 跳转日志
onMounted(async () => {
const idParam = route.query.id;
+ const keyParam = route.query.key;
if (idParam) {
await panel.value?.openLog(Number.parseInt(idParam as string));
+ } else if (keyParam) {
+ await panel.value?.openLog(Number.parseInt(keyParam as string));
}
});
diff --git a/orion-ops-ui/src/views/exec/exec-command/index.vue b/orion-ops-ui/src/views/exec/exec-command/index.vue
index 2af0d7d3..d1329e65 100644
--- a/orion-ops-ui/src/views/exec/exec-command/index.vue
+++ b/orion-ops-ui/src/views/exec/exec-command/index.vue
@@ -26,10 +26,13 @@
import useVisible from '@/hooks/visible';
import { useDictStore } from '@/store';
import { dictKeys } from '@/components/exec/log/const';
+ import { useRoute } from 'vue-router';
+ import { getExecCommandLog } from '@/api/exec/exec-command-log';
import ExecCommandPanel from './components/exec-command-panel.vue';
import ExecLogPanel from '@/components/exec/log/panel/index.vue';
const { visible: logVisible, setVisible: setLogVisible } = useVisible();
+ const route = useRoute();
const log = ref();
@@ -41,12 +44,30 @@
});
};
+ // 打开日志
+ const openLogWithId = async (id: number) => {
+ setLogVisible(true);
+ // 查询日志
+ const { data } = await getExecCommandLog(id);
+ openLog(data);
+ };
+
// 加载字典值
onMounted(async () => {
const dictStore = useDictStore();
await dictStore.loadKeys(dictKeys);
});
+ // 跳转日志
+ onMounted(async () => {
+ const idParam = route.query.id;
+ const keyParam = route.query.key;
+ if (idParam) {
+ await openLogWithId(Number.parseInt(idParam as string));
+ } else if (keyParam) {
+ await openLogWithId(Number.parseInt(keyParam as string));
+ }
+ });
diff --git a/orion-ops-ui/src/views/exec/exec-command-log/index.vue b/orion-ops-ui/src/views/exec/exec-command-log/index.vue
index 1c305a02..6869de2e 100644
--- a/orion-ops-ui/src/views/exec/exec-command-log/index.vue
+++ b/orion-ops-ui/src/views/exec/exec-command-log/index.vue
@@ -69,7 +69,7 @@
if (newWindow) {
// 跳转新页面
openNewRoute({
- name: 'execCommandLogView',
+ name: 'execCommand',
query: {
id
}
From 4fe6208d0e81fd0c52d76f4072ad24cfb623e306 Mon Sep 17 00:00:00 2001
From: lijiahang
Date: Tue, 14 May 2024 19:17:12 +0800
Subject: [PATCH 6/8] =?UTF-8?q?:sparkles:=20=E7=AB=99=E5=86=85=E6=B6=88?=
=?UTF-8?q?=E6=81=AF.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/about/change-log.md | 2 +
.../framework/common/constant/FieldConst.java | 4 ++
.../define/message/ExecMessageDefine.java | 53 ++++++++++++++++
.../define/message/UploadMessageDefine.java | 53 ++++++++++++++++
.../host/exec/command/dto/ExecCommandDTO.java | 2 +-
.../handler/BaseExecCommandHandler.java | 4 ++
.../exec/command/handler/ExecTaskHandler.java | 60 ++++++++++++++++---
.../command/handler/IExecCommandHandler.java | 7 +++
.../host/upload/task/FileUploadTask.java | 43 +++++++++++--
.../module/infra/api/SystemMessageApi.java | 13 +++-
.../infra/define/SystemMessageDefine.java | 47 +++++++++++++++
.../dto/message/SystemMessageCreateDTO.java | 5 ++
.../entity/dto/message/SystemMessageDTO.java | 46 ++++++++++++++
.../infra/api/impl/SystemMessageApiImpl.java | 25 ++++++--
.../impl/SystemMessageServiceImpl.java | 2 +
.../src/components/app/navbar/index.vue | 7 +--
.../components/system/message-box/index.vue | 14 ++---
.../components/system/message-box/list.vue | 46 ++++++++------
.../components/system/message-box/modal.vue | 4 +-
19 files changed, 385 insertions(+), 52 deletions(-)
create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/message/ExecMessageDefine.java
create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/message/UploadMessageDefine.java
create mode 100644 orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/define/SystemMessageDefine.java
create mode 100644 orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/entity/dto/message/SystemMessageDTO.java
diff --git a/docs/about/change-log.md b/docs/about/change-log.md
index ba930ca5..e400c15b 100644
--- a/docs/about/change-log.md
+++ b/docs/about/change-log.md
@@ -12,6 +12,8 @@
`2024-05-15` `release`
* 🌈 新增 站内信模块
+* 🔨 优化 执行命令日志跳转逻辑
+* 🔨 修改 `exitStatus` 改为 `exitCode`
[如何升级](/update/v1.0.8.md)
diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FieldConst.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FieldConst.java
index 5c48f978..505b777f 100644
--- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FieldConst.java
+++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FieldConst.java
@@ -55,6 +55,10 @@ public interface FieldConst {
String COUNT = "count";
+ String DATE = "date";
+
+ String TIME = "time";
+
String LOCATION = "location";
String USER_AGENT = "userAgent";
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/message/ExecMessageDefine.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/message/ExecMessageDefine.java
new file mode 100644
index 00000000..b850f79d
--- /dev/null
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/message/ExecMessageDefine.java
@@ -0,0 +1,53 @@
+package com.orion.ops.module.asset.define.message;
+
+import com.orion.ops.module.infra.define.SystemMessageDefine;
+import com.orion.ops.module.infra.enums.MessageClassifyEnum;
+import lombok.Getter;
+
+/**
+ * 命令执行 系统消息定义
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/5/14 17:23
+ */
+@Getter
+public enum ExecMessageDefine implements SystemMessageDefine {
+
+ /**
+ * 命令执行部分失败
+ */
+ EXEC_FAILED(MessageClassifyEnum.NOTICE,
+ "命令执行失败",
+ "您在 ${time} 执行的命令部分失败, 或者返回了非零的 exitCode。点击查看详情 #${id} >>>"),
+
+ ;
+
+ ExecMessageDefine(MessageClassifyEnum classify, String title, String content) {
+ this.classify = classify;
+ this.type = this.name();
+ this.title = title;
+ this.content = content;
+ }
+
+ /**
+ * 消息分类
+ */
+ private final MessageClassifyEnum classify;
+
+ /**
+ * 消息类型
+ */
+ private final String type;
+
+ /**
+ * 标题
+ */
+ private final String title;
+
+ /**
+ * 内容
+ */
+ private final String content;
+
+}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/message/UploadMessageDefine.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/message/UploadMessageDefine.java
new file mode 100644
index 00000000..bd02296c
--- /dev/null
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/message/UploadMessageDefine.java
@@ -0,0 +1,53 @@
+package com.orion.ops.module.asset.define.message;
+
+import com.orion.ops.module.infra.define.SystemMessageDefine;
+import com.orion.ops.module.infra.enums.MessageClassifyEnum;
+import lombok.Getter;
+
+/**
+ * 上传任务 系统消息定义
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/5/14 17:23
+ */
+@Getter
+public enum UploadMessageDefine implements SystemMessageDefine {
+
+ /**
+ * 上传任务部分失败
+ */
+ UPLOAD_FAILED(MessageClassifyEnum.NOTICE,
+ "批量上传失败",
+ "您在 ${time} 提交的上传任务中, 有部分主机文件上传失败。点击查看详情 #${id} >>>"),
+
+ ;
+
+ UploadMessageDefine(MessageClassifyEnum classify, String title, String content) {
+ this.classify = classify;
+ this.type = this.name();
+ this.title = title;
+ this.content = content;
+ }
+
+ /**
+ * 消息分类
+ */
+ private final MessageClassifyEnum classify;
+
+ /**
+ * 消息类型
+ */
+ private final String type;
+
+ /**
+ * 标题
+ */
+ private final String title;
+
+ /**
+ * 内容
+ */
+ private final String content;
+
+}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/dto/ExecCommandDTO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/dto/ExecCommandDTO.java
index 909c9dd1..6a239c13 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/dto/ExecCommandDTO.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/dto/ExecCommandDTO.java
@@ -22,7 +22,7 @@ import java.util.List;
@Schema(name = "ExecCommandDTO", description = "批量执行启动对象")
public class ExecCommandDTO {
- @Schema(description = "hostId")
+ @Schema(description = "logId")
private Long logId;
@Schema(description = "用户id")
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/BaseExecCommandHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/BaseExecCommandHandler.java
index dde24a38..78c3c1da 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/BaseExecCommandHandler.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/BaseExecCommandHandler.java
@@ -67,6 +67,9 @@ public abstract class BaseExecCommandHandler implements IExecCommandHandler {
private CommandExecutor executor;
+ @Getter
+ private Integer exitCode;
+
private volatile boolean closed;
private volatile boolean interrupted;
@@ -228,6 +231,7 @@ public abstract class BaseExecCommandHandler implements IExecCommandHandler {
// 完成
updateRecord.setFinishTime(new Date());
updateRecord.setExitStatus(executor.getExitCode());
+ this.exitCode = executor.getExitCode();
} else if (ExecHostStatusEnum.FAILED.equals(status)) {
// 失败
updateRecord.setFinishTime(new Date());
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java
index 93d8ed93..53f58d58 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java
@@ -7,20 +7,29 @@ import com.orion.lang.utils.Booleans;
import com.orion.lang.utils.Threads;
import com.orion.lang.utils.collect.Lists;
import com.orion.lang.utils.io.Streams;
+import com.orion.lang.utils.time.Dates;
+import com.orion.net.host.ssh.ExitCode;
+import com.orion.ops.framework.common.constant.ExtraFieldConst;
import com.orion.ops.module.asset.dao.ExecLogDAO;
import com.orion.ops.module.asset.define.AssetThreadPools;
import com.orion.ops.module.asset.define.config.AppExecLogConfig;
+import com.orion.ops.module.asset.define.message.ExecMessageDefine;
import com.orion.ops.module.asset.entity.domain.ExecLogDO;
+import com.orion.ops.module.asset.enums.ExecHostStatusEnum;
import com.orion.ops.module.asset.enums.ExecStatusEnum;
import com.orion.ops.module.asset.handler.host.exec.command.dto.ExecCommandDTO;
import com.orion.ops.module.asset.handler.host.exec.command.dto.ExecCommandHostDTO;
import com.orion.ops.module.asset.handler.host.exec.command.manager.ExecTaskManager;
+import com.orion.ops.module.infra.api.SystemMessageApi;
+import com.orion.ops.module.infra.entity.dto.message.SystemMessageDTO;
import com.orion.spring.SpringHolder;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* 命令执行任务
@@ -38,6 +47,8 @@ public class ExecTaskHandler implements IExecTaskHandler {
private static final AppExecLogConfig appExecLogConfig = SpringHolder.getBean(AppExecLogConfig.class);
+ private static final SystemMessageApi systemMessageApi = SpringHolder.getBean(SystemMessageApi.class);
+
private final ExecCommandDTO execCommand;
private TimeoutChecker timeoutChecker;
@@ -45,6 +56,8 @@ public class ExecTaskHandler implements IExecTaskHandler {
@Getter
private final List handlers;
+ private Date startTime;
+
public ExecTaskHandler(ExecCommandDTO execCommand) {
this.execCommand = execCommand;
this.handlers = Lists.newList();
@@ -56,9 +69,9 @@ public class ExecTaskHandler implements IExecTaskHandler {
// 添加任务
execTaskManager.addTask(id, this);
log.info("ExecTaskHandler.run start id: {}", id);
- // 更新状态
- this.updateStatus(ExecStatusEnum.RUNNING);
try {
+ // 更新状态
+ this.updateStatus(ExecStatusEnum.RUNNING);
// 执行命令
this.runHostCommand();
// 更新状态-执行完成
@@ -69,10 +82,12 @@ public class ExecTaskHandler implements IExecTaskHandler {
this.updateStatus(ExecStatusEnum.FAILED);
log.error("ExecTaskHandler.run error id: {}", id, e);
} finally {
- // 释放资源
- Streams.close(this);
+ // 检查是否发送消息
+ this.checkSendMessage();
// 移除任务
execTaskManager.removeTask(id);
+ // 释放资源
+ this.close();
}
}
@@ -82,6 +97,13 @@ public class ExecTaskHandler implements IExecTaskHandler {
handlers.forEach(IExecCommandHandler::interrupt);
}
+ @Override
+ public void close() {
+ log.info("ExecTaskHandler-close id: {}", execCommand.getLogId());
+ Streams.close(timeoutChecker);
+ this.handlers.forEach(Streams::close);
+ }
+
/**
* 执行主机命令
*
@@ -139,6 +161,7 @@ public class ExecTaskHandler implements IExecTaskHandler {
update.setStatus(statusName);
if (ExecStatusEnum.RUNNING.equals(status)) {
// 执行中
+ this.startTime = new Date();
update.setStartTime(new Date());
} else if (ExecStatusEnum.COMPLETED.equals(status)) {
// 执行完成
@@ -151,11 +174,30 @@ public class ExecTaskHandler implements IExecTaskHandler {
log.info("ExecTaskHandler-updateStatus finish id: {}, effect: {}", id, effect);
}
- @Override
- public void close() {
- log.info("ExecTaskHandler-close id: {}", execCommand.getLogId());
- Streams.close(timeoutChecker);
- this.handlers.forEach(Streams::close);
+ /**
+ * 检查是否发送消息
+ */
+ private void checkSendMessage() {
+ // 检查是否执行失败/exitCode
+ boolean hasError = handlers.stream().anyMatch(s ->
+ ExecHostStatusEnum.FAILED.equals(s.getStatus())
+ || ExecHostStatusEnum.TIMEOUT.equals(s.getStatus())
+ || !ExitCode.isSuccess(s.getExitCode()));
+ if (!hasError) {
+ return;
+ }
+ // 参数
+ Map params = new HashMap<>();
+ params.put(ExtraFieldConst.ID, execCommand.getLogId());
+ params.put(ExtraFieldConst.TIME, Dates.format(this.startTime, Dates.MD_HM));
+ SystemMessageDTO message = SystemMessageDTO.builder()
+ .receiverId(execCommand.getUserId())
+ .receiverUsername(execCommand.getUsername())
+ .relKey(String.valueOf(execCommand.getLogId()))
+ .params(params)
+ .build();
+ // 发送
+ systemMessageApi.create(ExecMessageDefine.EXEC_FAILED, message);
}
}
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/IExecCommandHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/IExecCommandHandler.java
index 79f2c579..6e6ae93c 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/IExecCommandHandler.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/exec/command/handler/IExecCommandHandler.java
@@ -31,6 +31,13 @@ public interface IExecCommandHandler extends Runnable, SafeCloseable {
*/
ExecHostStatusEnum getStatus();
+ /**
+ * 获取退出码
+ *
+ * @return exit code
+ */
+ Integer getExitCode();
+
/**
* 获取主机 id
*
diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/upload/task/FileUploadTask.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/upload/task/FileUploadTask.java
index 504e5d66..a893e422 100644
--- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/upload/task/FileUploadTask.java
+++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/upload/task/FileUploadTask.java
@@ -3,10 +3,13 @@ package com.orion.ops.module.asset.handler.host.upload.task;
import com.orion.lang.utils.Threads;
import com.orion.lang.utils.io.Files1;
import com.orion.lang.utils.io.Streams;
+import com.orion.lang.utils.time.Dates;
import com.orion.ops.framework.common.constant.Const;
+import com.orion.ops.framework.common.constant.ExtraFieldConst;
import com.orion.ops.module.asset.dao.UploadTaskDAO;
import com.orion.ops.module.asset.dao.UploadTaskFileDAO;
import com.orion.ops.module.asset.define.AssetThreadPools;
+import com.orion.ops.module.asset.define.message.UploadMessageDefine;
import com.orion.ops.module.asset.entity.domain.UploadTaskDO;
import com.orion.ops.module.asset.entity.domain.UploadTaskFileDO;
import com.orion.ops.module.asset.enums.UploadTaskFileStatusEnum;
@@ -16,14 +19,13 @@ import com.orion.ops.module.asset.handler.host.upload.manager.FileUploadTaskMana
import com.orion.ops.module.asset.handler.host.upload.uploader.FileUploader;
import com.orion.ops.module.asset.handler.host.upload.uploader.IFileUploader;
import com.orion.ops.module.asset.service.UploadTaskService;
+import com.orion.ops.module.infra.api.SystemMessageApi;
+import com.orion.ops.module.infra.entity.dto.message.SystemMessageDTO;
import com.orion.spring.SpringHolder;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -42,6 +44,8 @@ public class FileUploadTask implements IFileUploadTask {
private static final UploadTaskService uploadTaskService = SpringHolder.getBean(UploadTaskService.class);
+ private static final SystemMessageApi systemMessageApi = SpringHolder.getBean(SystemMessageApi.class);
+
private static final FileUploadTaskManager fileUploadTaskManager = SpringHolder.getBean(FileUploadTaskManager.class);
private final Long id;
@@ -91,6 +95,8 @@ public class FileUploadTask implements IFileUploadTask {
} else {
this.updateStatus(UploadTaskStatusEnum.FINISHED);
}
+ // 检查是否发送消息
+ this.checkSendMessage();
// 移除任务
fileUploadTaskManager.removeTask(id);
// 释放资源
@@ -187,4 +193,33 @@ public class FileUploadTask implements IFileUploadTask {
uploadTaskDAO.updateById(update);
}
+ /**
+ * 检查是否发送消息
+ */
+ private void checkSendMessage() {
+ if (canceled) {
+ return;
+ }
+ // 检查是否上传失败
+ boolean hasError = uploaderList.stream()
+ .map(IFileUploader::getFiles)
+ .flatMap(Collection::stream)
+ .anyMatch(s -> UploadTaskFileStatusEnum.FAILED.name().equals(s.getStatus()));
+ if (!hasError) {
+ return;
+ }
+ // 参数
+ Map params = new HashMap<>();
+ params.put(ExtraFieldConst.ID, record.getId());
+ params.put(ExtraFieldConst.TIME, Dates.format(record.getCreateTime(), Dates.MD_HM));
+ SystemMessageDTO message = SystemMessageDTO.builder()
+ .receiverId(record.getUserId())
+ .receiverUsername(record.getUsername())
+ .relKey(String.valueOf(record.getId()))
+ .params(params)
+ .build();
+ // 发送
+ systemMessageApi.create(UploadMessageDefine.UPLOAD_FAILED, message);
+ }
+
}
diff --git a/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/api/SystemMessageApi.java b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/api/SystemMessageApi.java
index 17a5c01c..0ecd4add 100644
--- a/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/api/SystemMessageApi.java
+++ b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/api/SystemMessageApi.java
@@ -1,6 +1,8 @@
package com.orion.ops.module.infra.api;
+import com.orion.ops.module.infra.define.SystemMessageDefine;
import com.orion.ops.module.infra.entity.dto.message.SystemMessageCreateDTO;
+import com.orion.ops.module.infra.entity.dto.message.SystemMessageDTO;
import com.orion.ops.module.infra.enums.MessageClassifyEnum;
/**
@@ -12,6 +14,15 @@ import com.orion.ops.module.infra.enums.MessageClassifyEnum;
*/
public interface SystemMessageApi {
+ /**
+ * 创建系统消息
+ *
+ * @param define define
+ * @param dto dto
+ * @return id
+ */
+ Long create(SystemMessageDefine define, SystemMessageDTO dto);
+
/**
* 创建系统消息
*
@@ -19,6 +30,6 @@ public interface SystemMessageApi {
* @param dto dto
* @return id
*/
- Long createSystemMessage(MessageClassifyEnum classify, SystemMessageCreateDTO dto);
+ Long create(MessageClassifyEnum classify, SystemMessageCreateDTO dto);
}
diff --git a/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/define/SystemMessageDefine.java b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/define/SystemMessageDefine.java
new file mode 100644
index 00000000..b2e836a9
--- /dev/null
+++ b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/define/SystemMessageDefine.java
@@ -0,0 +1,47 @@
+package com.orion.ops.module.infra.define;
+
+import com.orion.lang.utils.Strings;
+import com.orion.ops.module.infra.enums.MessageClassifyEnum;
+
+import java.util.Map;
+
+/**
+ * 系统消息定义
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/5/14 17:06
+ */
+public interface SystemMessageDefine {
+
+ /**
+ * @return 消息分类
+ */
+ MessageClassifyEnum getClassify();
+
+ /**
+ * @return 消息类型
+ */
+ String getType();
+
+ /**
+ * @return 标题
+ */
+ String getTitle();
+
+ /**
+ * @return 内容
+ */
+ String getContent();
+
+ /**
+ * 格式化内容
+ *
+ * @param params params
+ * @return content
+ */
+ default String formatContent(Map params) {
+ return Strings.format(this.getContent(), params);
+ }
+
+}
diff --git a/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/entity/dto/message/SystemMessageCreateDTO.java b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/entity/dto/message/SystemMessageCreateDTO.java
index 9ab2c708..c3ea71e9 100644
--- a/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/entity/dto/message/SystemMessageCreateDTO.java
+++ b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/entity/dto/message/SystemMessageCreateDTO.java
@@ -27,6 +27,11 @@ public class SystemMessageCreateDTO implements Serializable {
private static final long serialVersionUID = 1L;
+ @NotBlank
+ @Size(max = 10)
+ @Schema(description = "消息分类")
+ private String classify;
+
@NotBlank
@Size(max = 32)
@Schema(description = "消息类型")
diff --git a/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/entity/dto/message/SystemMessageDTO.java b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/entity/dto/message/SystemMessageDTO.java
new file mode 100644
index 00000000..c11e05a1
--- /dev/null
+++ b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/entity/dto/message/SystemMessageDTO.java
@@ -0,0 +1,46 @@
+package com.orion.ops.module.infra.entity.dto.message;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 系统消息 请求业务对象
+ *
+ * @author Jiahang Li
+ * @version 1.0.8
+ * @since 2024-5-11 16:29
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "SystemMessageDTO", description = "系统消息 请求业务对象")
+public class SystemMessageDTO implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @NotBlank
+ @Size(max = 64)
+ @Schema(description = "消息关联")
+ private String relKey;
+
+ @NotNull
+ @Schema(description = "接收人id")
+ private Long receiverId;
+
+ @Schema(description = "接收人用户名")
+ private String receiverUsername;
+
+ @Schema(description = "参数")
+ private Map params;
+
+}
diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/api/impl/SystemMessageApiImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/api/impl/SystemMessageApiImpl.java
index 8c427d85..b839b23b 100644
--- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/api/impl/SystemMessageApiImpl.java
+++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/api/impl/SystemMessageApiImpl.java
@@ -1,10 +1,11 @@
package com.orion.ops.module.infra.api.impl;
-import com.alibaba.fastjson.JSON;
import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.module.infra.api.SystemMessageApi;
import com.orion.ops.module.infra.convert.SystemMessageProviderConvert;
+import com.orion.ops.module.infra.define.SystemMessageDefine;
import com.orion.ops.module.infra.entity.dto.message.SystemMessageCreateDTO;
+import com.orion.ops.module.infra.entity.dto.message.SystemMessageDTO;
import com.orion.ops.module.infra.entity.request.message.SystemMessageCreateRequest;
import com.orion.ops.module.infra.enums.MessageClassifyEnum;
import com.orion.ops.module.infra.service.SystemMessageService;
@@ -28,12 +29,28 @@ public class SystemMessageApiImpl implements SystemMessageApi {
private SystemMessageService systemMessageService;
@Override
- public Long createSystemMessage(MessageClassifyEnum classify, SystemMessageCreateDTO dto) {
- log.info("SystemMessageApi.createSystemMessage dto: {}", JSON.toJSONString(dto));
+ public Long create(SystemMessageDefine define, SystemMessageDTO dto) {
+ Valid.valid(dto);
+ // 转换
+ SystemMessageCreateRequest request = SystemMessageCreateRequest.builder()
+ .classify(define.getClassify().name())
+ .type(define.getType())
+ .title(define.getTitle())
+ .content(define.formatContent(dto.getParams()))
+ .relKey(dto.getRelKey())
+ .receiverId(dto.getReceiverId())
+ .receiverUsername(dto.getReceiverUsername())
+ .build();
+ // 创建
+ return systemMessageService.createSystemMessage(request);
+ }
+
+ @Override
+ public Long create(MessageClassifyEnum classify, SystemMessageCreateDTO dto) {
+ dto.setClassify(classify.name());
Valid.valid(dto);
// 转换
SystemMessageCreateRequest request = SystemMessageProviderConvert.MAPPER.toRequest(dto);
- request.setClassify(classify.name());
// 创建
return systemMessageService.createSystemMessage(request);
}
diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemMessageServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemMessageServiceImpl.java
index d1fa51c4..0fb367b4 100644
--- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemMessageServiceImpl.java
+++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemMessageServiceImpl.java
@@ -1,5 +1,6 @@
package com.orion.ops.module.infra.service.impl;
+import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.orion.lang.function.Functions;
import com.orion.lang.utils.Booleans;
@@ -44,6 +45,7 @@ public class SystemMessageServiceImpl implements SystemMessageService {
@Override
public Long createSystemMessage(SystemMessageCreateRequest request) {
+ log.info("SystemMessageService.createSystemMessage request: {}", JSON.toJSONString(request));
// 设置接收人用户名
if (request.getReceiverUsername() == null) {
Optional.ofNullable(request.getReceiverId())
diff --git a/orion-ops-ui/src/components/app/navbar/index.vue b/orion-ops-ui/src/components/app/navbar/index.vue
index 7ed5b09d..b40813dd 100644
--- a/orion-ops-ui/src/components/app/navbar/index.vue
+++ b/orion-ops-ui/src/components/app/navbar/index.vue
@@ -99,7 +99,8 @@
position="br"
:show-arrow="false"
:popup-style="{ marginLeft: '198px' }"
- :content-style="{ padding: 0, width: '498px' }">
+ :content-style="{ padding: 0, width: '428px' }"
+ @hide="pullHasUnreadMessage">
@@ -310,10 +311,6 @@
// 获取是否有未读的消息
const pullHasUnreadMessage = () => {
- // 有未读的消息直接返回
- if (messageCount.value) {
- return;
- }
// 查询
checkHasUnreadMessage().then(({ data }) => {
messageCount.value = data ? 1 : 0;
diff --git a/orion-ops-ui/src/components/system/message-box/index.vue b/orion-ops-ui/src/components/system/message-box/index.vue
index 54055a62..c634fe58 100644
--- a/orion-ops-ui/src/components/system/message-box/index.vue
+++ b/orion-ops-ui/src/components/system/message-box/index.vue
@@ -26,13 +26,6 @@
checked-text="未读"
unchecked-text="全部"
@change="reloadAllMessage" />
-
-
+
+
diff --git a/orion-ops-ui/src/components/system/message-box/list.vue b/orion-ops-ui/src/components/system/message-box/list.vue
index f1ac3ce1..815e2250 100644
--- a/orion-ops-ui/src/components/system/message-box/list.vue
+++ b/orion-ops-ui/src/components/system/message-box/list.vue
@@ -6,7 +6,7 @@
@@ -56,17 +56,21 @@