From f1ade4e1826b7b52e7f3dc376c3829fa1c042101 Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Mon, 4 Mar 2024 22:27:39 +0800 Subject: [PATCH] =?UTF-8?q?:lipstick:=20=E4=BC=98=E5=8C=96=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E6=A0=B7=E5=BC=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/about/change-log.md | 17 ++++++++++-- .../orion-vue-views-components-table.vue.vm | 1 - .../host/terminal/enums/OutputTypeEnum.java | 2 +- .../model/response/TerminalCloseResponse.java | 3 +++ .../host/terminal/session/SshSession.java | 19 ++----------- .../terminal/session/TerminalSession.java | 27 +++++++++++++++++++ .../impl/HostConnectLogServiceImpl.java | 25 ++++++++++++----- .../infra/convert/OperatorLogConvert.java | 2 -- .../module/infra/entity/vo/OperatorLogVO.java | 3 +-- .../service/impl/OperatorLogServiceImpl.java | 6 +---- .../meta/history/history-value-modal.vue | 1 - .../components/host-identity-table.vue | 1 - .../host-key/components/host-key-table.vue | 1 - .../asset/host-list/components/host-table.vue | 1 - .../components/connect-log-table.vue | 1 - .../components/sftp/sftp-table-header.vue | 20 +++++++++++--- .../terminal/components/sftp/sftp-view.vue | 13 +++++++++ .../handler/terminal-output-processor.ts | 5 ++-- .../host/terminal/types/terminal.protocol.ts | 2 +- .../host/terminal/types/terminal.type.ts | 2 ++ .../dict-key/components/dict-key-table.vue | 1 - .../components/dict-value-table.vue | 1 - .../components/operator-log-clear-modal.vue | 9 +++---- .../components/operator-log-query-header.vue | 11 ++++---- .../components/operator-log-simple-table.vue | 25 +++++++++++++++-- .../components/operator-log-table.vue | 22 ++++++++++++++- .../views/user/operator-log/types/const.ts | 2 +- .../user/operator-log/types/table.columns.ts | 7 +++++ .../views/user/role/components/role-table.vue | 1 - .../views/user/user/components/user-table.vue | 1 - 30 files changed, 166 insertions(+), 66 deletions(-) diff --git a/docs/about/change-log.md b/docs/about/change-log.md index 37f53d48..fa57b6da 100644 --- a/docs/about/change-log.md +++ b/docs/about/change-log.md @@ -1,12 +1,25 @@ > 版本号严格遵循 Semver 规范。 -[//]: # (🐞修复) +## v1.0.1 + +`2024-03-` `release` + +🐞 修复 用户操作日志条件重置后类型框数据不正常的问题 +🩰 修改 主机连接日志 UI +🌈 新增 SFTP 使用日志列表 +🌈 新增 主机连接日志强制下线会话 +🌈 新增 主机连接日志删除/清理 +🌈 新增 用户操作日志日志删除/清理 +🌈 新增 用户操作日志日志删除/清理 +🔨 优化 用户锁定次数/时间可配置 + +[如何升级](/about/update.md?id=_v101) ## v1.0.0 `2024-03-01` `release` -🌈 用户自定义终端标签颜色 +🌈 新增 用户自定义终端标签颜色 🔨 拓展数据模块添加缓存 [如何升级](/about/update.md?id=_v100) diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm index 1be07f5f..24d32c87 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm @@ -80,7 +80,6 @@ partial) { // 更新 HostConnectLogDO update = new HostConnectLogDO(); update.setId(record.getId()); @@ -151,20 +164,20 @@ public class HostConnectLogServiceImpl implements HostConnectLogService { public Integer forceOffline(HostConnectLogQueryRequest request) { Long id = request.getId(); // 查询数据是否存在 - HostConnectLogDO connect = hostConnectLogDAO.selectById(id); - Valid.notNull(connect, ErrorMessage.LOG_ABSENT); - Valid.eq(connect.getStatus(), HostConnectStatusEnum.CONNECTING.name(), ErrorMessage.ILLEGAL_STATUS); + HostConnectLogDO record = hostConnectLogDAO.selectById(id); + Valid.notNull(record, ErrorMessage.LOG_ABSENT); + Valid.eq(record.getStatus(), HostConnectStatusEnum.CONNECTING.name(), ErrorMessage.ILLEGAL_STATUS); // 设置日志参数 - OperatorLogs.add(OperatorLogs.HOST_NAME, connect.getHostName()); + OperatorLogs.add(OperatorLogs.HOST_NAME, record.getHostName()); // 获取会话 - HostConnectLogExtraDTO extra = JSON.parseObject(connect.getExtraInfo(), HostConnectLogExtraDTO.class); + HostConnectLogExtraDTO extra = JSON.parseObject(record.getExtraInfo(), HostConnectLogExtraDTO.class); ITerminalSession session = terminalManager.getSession(extra.getChannelId(), extra.getSessionId()); if (session != null) { // 关闭会话 session.forceOffline(); } // 更新状态 - return this.updateStatusByToken(connect.getToken(), HostConnectStatusEnum.FORCE_OFFLINE, null); + return this.updateStatus(record, HostConnectStatusEnum.FORCE_OFFLINE, null); } /** diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/OperatorLogConvert.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/OperatorLogConvert.java index a2f557dd..cd3448b2 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/OperatorLogConvert.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/OperatorLogConvert.java @@ -6,7 +6,6 @@ import com.orion.ops.module.infra.entity.request.operator.OperatorLogQueryReques import com.orion.ops.module.infra.entity.vo.LoginHistoryVO; import com.orion.ops.module.infra.entity.vo.OperatorLogVO; import org.mapstruct.Mapper; -import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; /** @@ -25,7 +24,6 @@ public interface OperatorLogConvert { OperatorLogDO to(OperatorLogQueryRequest request); - @Mapping(target = "extra", ignore = true) OperatorLogVO to(OperatorLogDO domain); LoginHistoryVO toLoginHistory(OperatorLogDO domain); diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/OperatorLogVO.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/OperatorLogVO.java index e8bea981..ec49e46f 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/OperatorLogVO.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/OperatorLogVO.java @@ -8,7 +8,6 @@ import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.Date; -import java.util.Map; /** * 操作日志 视图响应对象 @@ -60,7 +59,7 @@ public class OperatorLogVO implements Serializable { private String logInfo; @Schema(description = "参数") - private Map extra; + private String extra; @Schema(description = "操作结果 0失败 1成功") private Integer result; diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/OperatorLogServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/OperatorLogServiceImpl.java index 787a0b4a..c7538dba 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/OperatorLogServiceImpl.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/OperatorLogServiceImpl.java @@ -50,11 +50,7 @@ public class OperatorLogServiceImpl implements OperatorLogService { // 查询 return operatorLogDAO.of(wrapper) .page(request) - .dataGrid(s -> { - OperatorLogVO vo = OperatorLogConvert.MAPPER.to(s); - vo.setExtra(JSON.parseObject(s.getExtra())); - return vo; - }); + .dataGrid(OperatorLogConvert.MAPPER::to); } @Override diff --git a/orion-ops-ui/src/components/meta/history/history-value-modal.vue b/orion-ops-ui/src/components/meta/history/history-value-modal.vue index f97ac6c0..15f6ab1f 100644 --- a/orion-ops-ui/src/components/meta/history/history-value-modal.vue +++ b/orion-ops-ui/src/components/meta/history/history-value-modal.vue @@ -29,7 +29,6 @@ + +
+ {{ closeMessage }} +
- + + session: ISftpSession | undefined; + selectedFiles: Array; }>(); const emits = defineEmits(['update:selectedFiles', 'loadFile', 'download']); @@ -322,6 +328,14 @@ } } + .close-message { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding-left: 16px; + color: rgb(var(--red-6)); + } + .header-action-icon { font-size: 16px; padding: 4px; diff --git a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue index 459ced7a..cdc2cd4c 100644 --- a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue +++ b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue @@ -12,6 +12,8 @@ >([]); const selectFiles = ref>([]); const splitSize = ref(1); + const closed = ref(false); + const closeMessage = ref(''); const editorView = ref(false); const editorRef = ref(); const editorFileName = ref(''); @@ -184,6 +188,14 @@ return success; }; + // 关闭回调 + const onClose = (forceClose: string, msg: string) => { + console.log(forceClose); + console.log(msg); + closed.value = true; + closeMessage.value = msg; + }; + // 接收列表回调 const resolveList = (result: string, path: string, list: Array) => { setTableLoading(false); @@ -240,6 +252,7 @@ session.value = await sessionManager.openSftp(props.tab, { setLoading: setTableLoading, connectCallback, + onClose, resolveList, resolveSftpMkdir: resolveFileAction, resolveSftpTouch: resolveFileAction, diff --git a/orion-ops-ui/src/views/host/terminal/handler/terminal-output-processor.ts b/orion-ops-ui/src/views/host/terminal/handler/terminal-output-processor.ts index a7fba33f..def2aa51 100644 --- a/orion-ops-ui/src/views/host/terminal/handler/terminal-output-processor.ts +++ b/orion-ops-ui/src/views/host/terminal/handler/terminal-output-processor.ts @@ -81,9 +81,9 @@ export default class TerminalOutputProcessor implements ITerminalOutputProcessor } // 处理关闭消息 - processClose({ sessionId, msg }: OutputPayload): void { + processClose({ sessionId, msg, forceClose }: OutputPayload): void { const session = this.sessionManager.getSession(sessionId); - // 无需处理 (直接关闭 tab ) + // 无需处理 (直接关闭 tab) if (!session) { return; } @@ -98,6 +98,7 @@ export default class TerminalOutputProcessor implements ITerminalOutputProcessor } else if (session instanceof SftpSession) { // sftp 设置状态 session.connected = false; + session.resolver?.onClose(forceClose, msg); } } diff --git a/orion-ops-ui/src/views/host/terminal/types/terminal.protocol.ts b/orion-ops-ui/src/views/host/terminal/types/terminal.protocol.ts index 37396696..a56a3142 100644 --- a/orion-ops-ui/src/views/host/terminal/types/terminal.protocol.ts +++ b/orion-ops-ui/src/views/host/terminal/types/terminal.protocol.ts @@ -94,7 +94,7 @@ export const OutputProtocol = { // 主机连接关闭 CLOSE: { type: 'cl', - template: ['type', 'sessionId', 'msg'], + template: ['type', 'sessionId', 'forceClose', 'msg'], processMethod: 'processClose' }, // pong diff --git a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts index 48d74218..426c79d0 100644 --- a/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts +++ b/orion-ops-ui/src/views/host/terminal/types/terminal.type.ts @@ -347,6 +347,8 @@ export interface ISftpSessionResolver { setLoading: (loading: boolean) => void; // 连接后回调 connectCallback: () => void; + // 关闭回调 + onClose: (forceClose: string, msg: string) => void; // 接受文件列表响应 resolveList: (result: string, path: string, list: Array) => void; // 接收创建文件夹响应 diff --git a/orion-ops-ui/src/views/system/dict-key/components/dict-key-table.vue b/orion-ops-ui/src/views/system/dict-key/components/dict-key-table.vue index 018efcc1..88e2af43 100644 --- a/orion-ops-ui/src/views/system/dict-key/components/dict-key-table.vue +++ b/orion-ops-ui/src/views/system/dict-key/components/dict-key-table.vue @@ -57,7 +57,6 @@ @@ -81,7 +80,7 @@ diff --git a/orion-ops-ui/src/views/user/operator-log/components/operator-log-table.vue b/orion-ops-ui/src/views/user/operator-log/components/operator-log-table.vue index a26742be..da225b58 100644 --- a/orion-ops-ui/src/views/user/operator-log/components/operator-log-table.vue +++ b/orion-ops-ui/src/views/user/operator-log/components/operator-log-table.vue @@ -46,7 +46,6 @@ + +