bricks/docs/ai.old/wterm.md
2025-11-18 14:59:26 +08:00

108 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Wterm
Wterm 是一个基于 Web Terminal 的控件,用于在浏览器中嵌入一个可交互的终端界面(如 SSH、Shell 等),通过 WebSocket 与后端服务通信。该控件继承自 `bricks.JsWidget`,属于**普通控件**(非容器控件),不支持包含子控件。
---
## 主要方法
| 方法名 | 参数说明 | 功能描述 |
|---------------------|---------|--------|
| `open()` | 无 | 异步初始化终端实例并建立 WebSocket 连接,加载 FitAddon 并绑定事件 |
| `destroy()` | 无 | 销毁控件时调用,清理定时任务、解绑事件、关闭 WebSocket 和终端实例 |
| `close_websocket()` | 无 | 安全关闭 WebSocket 连接,清除事件监听器 |
| `close_terminal()` | 无 | 销毁 xterm.js 终端实例 |
| `send_data(d)` | `d`: 要发送的数据字符串 | 向服务器发送输入数据(键盘输入) |
| `send_term_size()` | 无 | 向服务器发送当前终端尺寸(行、列、宽高) |
| `send_heartbeat()` | 无 | 发送心跳消息以维持连接 |
| `heartbeat()` | 无 | 心跳逻辑:若连接正常则发送心跳,并递归调度下一次心跳 |
| `term_resize()` | 无 | 响应元素大小变化事件,调整终端布局 |
| `charsize_sizing()` | 无 | 根据全局字体大小设置终端字号 |
---
## 主要事件
| 事件名 | 触发时机 | 携带数据 | 备注 |
|------------------|--------|--------|------|
| `domon` | 控件被挂载到 DOM 时触发 | 无 | 自动调用 `send_term_size()` |
| `domoff` | 控件从 DOM 卸载前触发 | 无 | 自动调用 `destroy()` 清理资源 |
| `element_resize` | 控件所在 DOM 元素尺寸改变时触发 | 无 | 绑定后自动调整终端显示 |
| `terminal-data` | (未显式派发)终端收到服务器数据时 | 解析后的消息对象 | 在 `onmessage` 中处理 |
---
## 源码例子
```json
{
"id": "my_terminal",
"widgettype": "Wterm",
"options": {
"ws_url": "wss://example.com/api/terminal", // WebSocket 地址
"ping_timeout": 19, // 心跳间隔秒数默认19秒
"term_options": { // 传递给 xterm.js 的配置项
"cursorBlink": true,
"theme": {
"background": "#1e1e1e",
"foreground": "#ffffff"
}
}
},
"binds": [
{
"actiontype": "method",
"wid": "btn_connect",
"event": "click",
"target": "my_terminal",
"method": "open",
"params": {}
},
{
"actiontype": "method",
"wid": "btn_disconnect",
"event": "click",
"target": "my_terminal",
"method": "close_websocket",
"params": {}
},
{
"actiontype": "script",
"wid": "my_terminal",
"event": "domon",
"target": "my_terminal",
"script": "console.log('Terminal mounted and ready.');",
"params": {}
},
{
"actiontype": "event",
"wid": "my_terminal",
"event": "domoff",
"target": "global_event_bus",
"dispatch_event": "terminal_closed",
"params": {
"terminal_id": "my_terminal"
}
}
]
}
```
### 注释说明:
- `"id"`: 控件唯一标识符。
- `"widgettype": "Wterm"`: 使用已注册的 `Wterm` 控件类型。
- `"options.ws_url"`: 必须为有效的 WebSocket URL服务端需支持文本协议通信。
- `"options.ping_timeout"`: 设置心跳频率(秒),防止连接超时断开。
- `"term_options"`: 可选地传递给 xterm.js 的渲染和行为参数。
- `binds`:
- 当按钮 `"btn_connect"` 被点击时,调用终端的 `open()` 方法启动连接。
-`"btn_disconnect"` 点击时,主动关闭 WebSocket。
- 控件挂载时输出日志信息(可用于调试)。
- 控件卸载时向全局事件总线派发 `terminal_closed` 事件,通知其他模块。
> ⚠️ 注意:使用此控件前需确保页面已引入 [xterm.js](https://xtermjs.org/) 及其 FitAddon 插件,并正确配置路径。
---
**适用场景**远程终端访问、Web SSH 客户端、运行日志流展示、运维操作面板等需要终端交互功能的系统。