From 480a6a829d351dd6ff560d74cc768df31893ad16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Sun, 20 Oct 2024 05:14:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=88=E7=AB=AF=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=AD=97=E4=BD=93=E7=BC=A9=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/ssh/turn.go | 2 +- web/src/views/ssh/IndexView.vue | 85 +++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 37 deletions(-) diff --git a/pkg/ssh/turn.go b/pkg/ssh/turn.go index 7e8e83e5..1314ab01 100644 --- a/pkg/ssh/turn.go +++ b/pkg/ssh/turn.go @@ -54,7 +54,7 @@ func NewTurn(ws *websocket.Conn, client *ssh.Client) (*Turn, error) { } func (t *Turn) Write(p []byte) (n int, err error) { - writer, err := t.ws.NextWriter(websocket.BinaryMessage) + writer, err := t.ws.NextWriter(websocket.TextMessage) if err != nil { return 0, err } diff --git a/web/src/views/ssh/IndexView.vue b/web/src/views/ssh/IndexView.vue index 672da0c1..518c9a36 100644 --- a/web/src/views/ssh/IndexView.vue +++ b/web/src/views/ssh/IndexView.vue @@ -23,6 +23,16 @@ const model = ref({ password: '' }) +const terminal = ref(null) +const term = ref() +const protocol = window.location.protocol === 'https:' ? 'wss' : 'ws' +const ws = new WebSocket(`${protocol}://${window.location.host}/api/ssh/session`) +const attachAddon = new AttachAddon(ws) +const fitAddon = new FitAddon() +const clipboardAddon = new ClipboardAddon() +const webLinksAddon = new WebLinksAddon() +const webglAddon = new WebglAddon() + const handleSave = () => { ssh .saveInfo(model.value.host, model.value.port, model.value.user, model.value.password) @@ -41,56 +51,54 @@ const getInfo = () => { } const openSession = () => { - const term = new Terminal({ + term.value = new Terminal({ lineHeight: 1.2, fontSize: 14, fontFamily: "Monaco, Menlo, Consolas, 'Courier New', monospace", cursorBlink: true, cursorStyle: 'underline', - scrollback: 1000, - scrollSensitivity: 15, tabStopWidth: 4, theme: { background: '#111', foreground: '#fff' } }) - const protocol = window.location.protocol === 'https:' ? 'wss' : 'ws' - const ws = new WebSocket(`${protocol}://${window.location.host}/api/ssh/session`) - - const attachAddon = new AttachAddon(ws) - term.loadAddon(attachAddon) - const fitAddon = new FitAddon() - term.loadAddon(fitAddon) - const clipboardAddon = new ClipboardAddon() - term.loadAddon(clipboardAddon) - const webLinksAddon = new WebLinksAddon() - term.loadAddon(webLinksAddon) - const webglAddon = new WebglAddon() - term.loadAddon(webglAddon) + term.value.loadAddon(attachAddon) + term.value.loadAddon(fitAddon) + term.value.loadAddon(clipboardAddon) + term.value.loadAddon(webLinksAddon) + term.value.loadAddon(webglAddon) webglAddon.onContextLoss(() => { webglAddon.dispose() }) ws.onopen = () => { - term.open(document.getElementById('terminal') as HTMLElement) + term.value.open(terminal.value!) fitAddon.fit() - term.write('\r\n欢迎来到耗子面板 SSH,连接成功。') - term.write('\r\nWelcome to Rat Panel SSH. Connection success.\r\n') - term.focus() + term.value.focus() + window.addEventListener( + 'resize', + () => { + fitAddon.fit() + }, + false + ) } ws.onclose = () => { - term.write('\r\nSSH连接已关闭,请刷新页面。') - term.write('\r\nSSH connection closed. Please refresh the page.\r\n') + term.value.write('\r\n连接已关闭,请刷新重试。') + term.value.write('\r\nConnection closed. Please refresh.') + window.removeEventListener('resize', () => { + fitAddon.fit() + }) } ws.onerror = (event) => { - term.write('\r\nSSH连接发生错误,请刷新页面。') - term.write('\r\nSSH connection error. Please refresh the page.\r\n') + term.value.write('\r\n连接发生错误,请刷新重试。') + term.value.write('\r\nConnection error. Please refresh .') console.error(event) ws.close() } - term.onResize(({ cols, rows }) => { + term.value.onResize(({ cols, rows }: { cols: number; rows: number }) => { if (ws.readyState === 1) { ws.send( JSON.stringify({ @@ -101,14 +109,20 @@ const openSession = () => { ) } }) +} - window.addEventListener( - 'resize', - () => { - fitAddon.fit() - }, - false - ) +const onTermWheel = (event: WheelEvent) => { + if (event.ctrlKey) { + event.preventDefault() + if (event.deltaY > 0) { + if (term.value.options.fontSize > 12) { + term.value.options.fontSize = term.value.options.fontSize - 1 + } + } else { + term.value.options.fontSize = term.value.options.fontSize + 1 + } + fitAddon.fit() + } } onMounted(() => { @@ -159,10 +173,9 @@ onMounted(() => { -
+ +
+