2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 11:27:17 +08:00

feat: 终端支持字体缩放

This commit is contained in:
耗子
2024-10-20 05:14:48 +08:00
parent 47b92a8b2a
commit 480a6a829d
2 changed files with 50 additions and 37 deletions

View File

@@ -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
}

View File

@@ -23,6 +23,16 @@ const model = ref({
password: ''
})
const terminal = ref<HTMLElement | null>(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(() => {
</n-button>
</n-form-item>
</n-form>
<div
id="terminal"
style="width: 100%; height: 70vh; background-color: #000000; margin-top: 20px"
></div>
<n-card>
<div ref="terminal" @wheel="onTermWheel" h-600></div>
</n-card>
</n-space>
</common-page>
</template>