You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

169 lines
3.8 KiB

<template>
<view>
<div ref="terminalContainer" style="height: auto;width: 100%;"></div>
<view class="imagesBox">
<image :src="imgbas64" mode=""></image>
</view>
</view>
</template>
<script>
import {
Terminal
} from 'xterm';
import {
FitAddon
} from 'xterm-addon-fit';
import 'xterm/css/xterm.css'
import {
fileTail
} from '@/config/api.js'
import {
LOG_TAIL_STATUS
} from './logConfig.js'
export default {
props: ['relId'],
data() {
return {
imgbas64: '',
terminal: null,
fitAddon: null,
token: '',
socketTask: null,
termConfig: {
rightClickSelectsWord: true,
disableStdin: true,
cursorStyle: 'bar',
cursorBlink: false,
fastScrollModifier: 'shift',
fontSize: 13,
rendererType: 'canvas',
fontFamily: 'courier-new, courier, monospace',
lineHeight: 1.08,
convertEol: true,
theme: {
foreground: '#FFFFFF',
background: '#212529'
}
},
};
},
mounted(options) {
this.fileTailFn()
},
methods: {
async fileTailFn() {
let obj = {
relId: this.relId,
type: 10
}
const {
data: res
} = await fileTail(obj)
this.token = res.token
this.$nextTick(() => {
this.initializeTerminal();
})
},
initializeTerminal() {
// 创建终端实例
this.terminal = new Terminal({
...this.termConfig
});
// 创建适应插件
this.fitAddon = new FitAddon();
this.terminal.loadAddon(this.fitAddon);
// 将终端挂载到页面
this.terminal.open(this.$refs.terminalContainer);
// 设置终端大小适应窗口
this.fitAddon.fit();
// 你可以添加其他配置,例如主题等
// this.terminal.setOption('theme', { background: '#282c34' });
// ...
this.terminal.write('\x1b[?25l')
// 示例:在终端中输出一行文本
// this.terminal.write('Hello, UniApp xterm!');
this.initSocket()
},
initSocket(data) {
// 打开websocket
// let wsUrl =`${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${window.location.host}/orion/keep-alive/tail/${this.token}`
let wsUrl = `ws://192.168.1.15:35/orion/keep-alive/tail/${this.token}`
console.log(wsUrl)
let _this = this
this.socketTask = uni.connectSocket({
url: wsUrl,
header: {
'content-type': 'application/json'
},
responseType: 'String',
success: (res) => {
console.log('1,链接已建立')
console.log(res)
},
complete: () => {
console.log('WebSocket connected');
},
});
uni.onSocketOpen(function(res) {
console.log('WebSocket连接已打开!');
});
uni.onSocketMessage(async (event) => {
let data = event.data
let bob = new Blob([data])
console.log(bob)
console.log(data)
// console.log(await bob.text())
_this.terminal.write(await bob.text())
_this.terminal.scrollToBottom()
});
uni.onSocketError(function(res) {
console.log(res)
console.log('WebSocket连接打开失败,请检查!');
});
return
this.client = new WebSocket(wsUrl)
this.client.onopen = () => {
this.status = LOG_TAIL_STATUS.RUNNABLE.value
this.$emit('open')
}
this.client.onerror = () => {
this.status = LOG_TAIL_STATUS.ERROR.value
}
this.client.onclose = (e) => {
this.status = LOG_TAIL_STATUS.CLOSE.value
if (e.code > 4000 && e.code < 5000) {
// 自定义错误信息
this.term.write(`\x1b[93m${e.reason}\x1b[0m`)
}
this.$emit('close')
}
this.client.onmessage = async event => {
console.log('来这了吗?')
this.term.write(await event.data.text())
if (!this.fixedLog) {
this.term.scrollToBottom()
}
}
},
},
};
</script>
<style>
/* @import 'xterm/dist/xterm.css'; */
.imagesBox {
width: 450rpx;
height: 450rpx;
}
</style>