2024-04-06 04:03:38 +00:00
|
|
|
|
<template>
|
|
|
|
|
|
<div class="rdpDialog" ref="dialogRef">
|
|
|
|
|
|
<el-dialog
|
|
|
|
|
|
v-model="dialogVisible"
|
|
|
|
|
|
:before-close="handleClose"
|
|
|
|
|
|
:close-on-click-modal="false"
|
|
|
|
|
|
:destroy-on-close="true"
|
|
|
|
|
|
:close-on-press-escape="false"
|
|
|
|
|
|
:show-close="false"
|
|
|
|
|
|
width="1024"
|
|
|
|
|
|
@open="connect()"
|
|
|
|
|
|
>
|
|
|
|
|
|
<template #header>
|
|
|
|
|
|
<div class="terminal-title-wrapper">
|
|
|
|
|
|
<!-- 左侧 -->
|
|
|
|
|
|
<div class="title-left-fixed">
|
|
|
|
|
|
<!-- title信息 -->
|
|
|
|
|
|
<div>
|
|
|
|
|
|
{{ title }}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 右侧 -->
|
|
|
|
|
|
<div class="title-right-fixed">
|
|
|
|
|
|
<el-popconfirm @confirm="connect(true)" title="确认重新连接?">
|
|
|
|
|
|
<template #reference>
|
|
|
|
|
|
<div class="mr10 pointer">
|
|
|
|
|
|
<el-tag v-if="state.status == TerminalStatus.Connected" type="success" effect="light" round> 已连接 </el-tag>
|
|
|
|
|
|
<el-tag v-else type="danger" effect="light" round> 未连接,点击重连 </el-tag>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</el-popconfirm>
|
|
|
|
|
|
|
|
|
|
|
|
<el-popconfirm @confirm="handleClose" title="确认关闭?">
|
|
|
|
|
|
<template #reference>
|
|
|
|
|
|
<SvgIcon name="Close" class="pointer-icon" title="关闭" :size="20" />
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</el-popconfirm>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
2024-04-12 14:39:08 +00:00
|
|
|
|
<machine-rdp ref="rdpRef" :machine-id="machineId" :auth-cert="authCert" @status-change="handleStatusChange" />
|
2024-04-06 04:03:38 +00:00
|
|
|
|
</el-dialog>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
|
|
|
import { reactive, ref, toRefs, watch } from 'vue';
|
|
|
|
|
|
import MachineRdp from '@/components/terminal-rdp/MachineRdp.vue';
|
|
|
|
|
|
import { TerminalStatus } from '@/components/terminal/common';
|
|
|
|
|
|
import SvgIcon from '@/components/svgIcon/index.vue';
|
|
|
|
|
|
|
|
|
|
|
|
const rdpRef = ref({} as any);
|
|
|
|
|
|
const dialogRef = ref({} as any);
|
|
|
|
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
|
visible: { type: Boolean },
|
2024-04-12 14:39:08 +00:00
|
|
|
|
machineId: {
|
|
|
|
|
|
type: Number,
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
},
|
|
|
|
|
|
authCert: {
|
|
|
|
|
|
type: String,
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
},
|
2024-04-06 04:03:38 +00:00
|
|
|
|
title: { type: String },
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const emit = defineEmits(['update:visible', 'cancel', 'update:machineId']);
|
|
|
|
|
|
|
|
|
|
|
|
const state = reactive({
|
|
|
|
|
|
dialogVisible: false,
|
|
|
|
|
|
title: '',
|
|
|
|
|
|
status: TerminalStatus.NoConnected,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const { dialogVisible } = toRefs(state);
|
|
|
|
|
|
|
|
|
|
|
|
watch(props, async (newValue: any) => {
|
|
|
|
|
|
const visible = newValue.visible;
|
|
|
|
|
|
state.dialogVisible = visible;
|
|
|
|
|
|
if (visible) {
|
|
|
|
|
|
state.title = newValue.title;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const connect = (force = false) => {
|
|
|
|
|
|
rdpRef.value?.disconnect();
|
|
|
|
|
|
|
|
|
|
|
|
let width = 1024;
|
|
|
|
|
|
let height = 710;
|
|
|
|
|
|
rdpRef.value?.connect(width, height, force);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleStatusChange = (status: TerminalStatus) => {
|
|
|
|
|
|
state.status = status;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 关闭取消按钮触发的事件
|
|
|
|
|
|
*/
|
|
|
|
|
|
const handleClose = () => {
|
|
|
|
|
|
emit('update:visible', false);
|
|
|
|
|
|
emit('update:machineId', null);
|
|
|
|
|
|
emit('cancel');
|
|
|
|
|
|
rdpRef.value?.disconnect();
|
|
|
|
|
|
};
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
|
|
.rdpDialog {
|
|
|
|
|
|
.el-dialog {
|
|
|
|
|
|
padding: 0;
|
|
|
|
|
|
.el-dialog__header {
|
|
|
|
|
|
padding: 10px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.el-overlay .el-overlay-dialog .el-dialog .el-dialog__body {
|
|
|
|
|
|
max-height: 100% !important;
|
|
|
|
|
|
padding: 0 !important;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.terminal-title-wrapper {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
|
|
|
|
|
|
|
.title-right-fixed {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
font-size: 20px;
|
|
|
|
|
|
text-align: end;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|