Vue xtermjs 终端

Vue xtermjs 终端

安装步骤如下
安装xtermjs所需要的插件

npm install --save xterm
npm install --save xterm-addon-fit
npm install --save xterm-addon-attach

HTML代码片段

<template><div><a-drawertitle="终端"placement="right":closable="false":visible="visible":width="1000"@close="onClose"><div id="xterm" class="xterm" style="height:800px" /></a-drawer></div></template><script>
import "xterm/css/xterm.css";
import { Terminal } from "xterm";
import { FitAddon } from "xterm-addon-fit";export default {data() {return {visible: false,term: "",//terminal 黑窗口容器prefix: "[root@serverip ~]# ",//前缀inputText: "",//输入内容,每次回车后进行ws通信然后清空此数据};},methods: {//初始化黑窗口async initTerm() {const fitAddon = new FitAddon();this.term = new Terminal({fontSize: 14,cursorBlink: true,allowProposedApi: true,disableStdin: false,LogLevel: "debug",});this.term.loadAddon(fitAddon);//开启Xterm终端this.term.open(document.getElementById("xterm"));this.term.writeln("\x1b[1;1;32mwellcom to web terminal!\x1b[0m");this.term.write(this.prefix); //黑窗口 前缀await this.termPromt(); //term.promtawait this.termKeyCode(); //事件fitAddon.fit(); //黑窗口适应实际div宽高this.term.focus(); //自动聚焦},//事件termKeyCode() {const TERMINAL_INPUT_KEY = {BACK: 8, // 退格删除键ENTER: 13, // 回车键UP: 38, // 方向盘上键DOWN: 40, // 方向盘键LEFT: 37, // 方向盘左键RIGHT: 39, // 方向盘右键};// const { eqpCode, server } = this.selectObj;let inputText = "";let currentIndex = 0;let inputTextList = [];this.term.onKey((e) => {const { key, domEvent } = e;const { keyCode, altKey, altGraphKey, ctrlKey, metaKey } = domEvent;const printAble = !(altKey || altGraphKey || ctrlKey || metaKey); // 禁止相关按键const totalOffsetLength = inputText.length + this.prefix.length; // 总偏移量const currentOffsetLength = this.term._core.buffer.x; // 当前x偏移量switch (keyCode) {//删除case TERMINAL_INPUT_KEY.BACK:if (currentOffsetLength > this.prefix.length) {const cursorOffSetLength = this.getCursorOffsetLength(totalOffsetLength - currentOffsetLength, "\x1b[D"); // 保留原来光标位置this.term._core.buffer.x = currentOffsetLength - 1;this.term.write("\x1b[?K" + inputText.slice(currentOffsetLength - this.prefix.length));this.term.write(cursorOffSetLength);inputText = `${inputText.slice(0, currentOffsetLength - this.prefix.length - 1)}${inputText.slice(currentOffsetLength - this.prefix.length)}`;}break;//回车case TERMINAL_INPUT_KEY.ENTER: {this.term.write("\r\n");console.log("inputText", inputText);//ws 通信参数// let wsParams = { EqpCode: eqpCode, Action: "terminal", Data: inputText };// this.$emit("websocketSend", wsParams, server);if (!inputText.trim()) {this.term.prompt();return;}if (inputTextList.indexOf(inputText) === -1) {inputTextList.push(inputText);currentIndex = inputTextList.length;}this.term.prompt();inputText = "";break;}case TERMINAL_INPUT_KEY.UP: {if (!inputTextList[currentIndex - 1]) break;const offsetLength = this.getCursorOffsetLength(inputText.length, "\x1b[D");inputText = inputTextList[currentIndex - 1];this.term.write(offsetLength + "\x1b[?K");this.term.write(inputTextList[currentIndex - 1]);this.term._core.buffer.x = totalOffsetLength;currentIndex--;break;}case TERMINAL_INPUT_KEY.LEFT:if (currentOffsetLength > this.prefix.length) {this.term.write(key); // '\x1b[D'}break;case TERMINAL_INPUT_KEY.RIGHT:if (currentOffsetLength < totalOffsetLength) {this.term.write(key); // '\x1b[C'}break;default: {// 在当前的坐标写上 key 和坐标后面的字符// 移动停留在当前位置的光标if (!printAble) break;if (totalOffsetLength >= this.term.cols) break;if (currentOffsetLength >= totalOffsetLength) {this.term.write(key);inputText += key;break;}let cursorOffSetLength = this.getCursorOffsetLength(totalOffsetLength - currentOffsetLength, "\x1b[D");this.term.write("\x1b[?K" + `${key}${inputText.slice(currentOffsetLength - this.prefix.length)}`);this.term.write(cursorOffSetLength);inputText = inputText.slice(0, currentOffsetLength) + key + inputText.slice(totalOffsetLength - currentOffsetLength);break;}}});},//限制和后端交互,只有输入回车键才显示结果termPromt() {this.term.prompt = () => {this.term.write(this.prefix);};},//获取光标当前位置getCursorOffsetLength(offsetLength, subString) {let cursorOffsetLength = "";for (let offset = 0; offset < offsetLength; offset++) {cursorOffsetLength += subString;}return cursorOffsetLength;},//写入黑窗口wirteTerm(data) {console.log("写入黑窗口", data);this.term.writeln(data);this.term.prompt();},//加载基础数据pageLoad(data) {this.selectObj = data;this.drawerFlag = true;this.$nextTick(() => {this.initTerm();});},cancelClick() {this.drawerFlag = false;//关闭弹框this.term.dispose(document.getElementById("xterm"));},showDrawer() {this.visible = true;this.$nextTick(()=>{this.initTerm()})},onClose() {this.visible = false;},},};</script><style>#terminal{width:100%;height:800px;}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频数据卡设计方案:120-基于PCIe的视频数据卡

一、产品概述 基于PCIe的一款视频数据收发卡&#xff0c;并通过PCIe传输到存储计算服务器&#xff0c;实现信号的采集、分析、模拟输出&#xff0c;存储。 产品固化FPGA逻辑&#xff0c;实现PCIe的连续采集&#xff0c;单次采集容量2GB&#xff0c;开源的PCIe QT客…

安卓11添加切换以太网动态静态方法

客户要在app中自由切换动态&#xff0c;静态方法&#xff0c;直接把系统jar-api给他搞了半天搞不定&#xff0c;只有在系统里给他实现一个接口&#xff0c;方法如下&#xff1a; Index: packages/apps/Settings/AndroidManifest.xml--- packages/apps/Settings/AndroidManifes…

11.仿简道云公式函数实战-逻辑函数-TRUE

1. TRUE函数 TRUE 函数可直接返回逻辑值 true。 2. 函数用法 TRUE() 3. 函数示例 TRUE 函数一般不会作为函数单独使用&#xff0c;可与其他函数一起使用&#xff0c;或作为判断逻辑的结果。如&#xff0c;判断字段值是否为空时&#xff0c;设置公式为IF(ISEMPTY(方案选择)…

接口使用@requestMapping应用场景

父类&#xff1a; public class BaseController<T> {PostMappingpublic ResponseValue add(HttpServletRequest req, Validated({DeleteValid.class}) T entity) throws Exception {return service.add(req, entity);}GetMappingpublic ResponseValue searchList(HttpSe…

02 python语句判断

2.1 布尔类型与比较运算符 演示bool类型的定义 比较运算符的应用# 定义变量储存布尔类型的数据 bool1True bool2False print(fbool1变量的内容是&#xff1a;{bool1},其类型是{type(bool1)}) print(fbool2变量的内容是&#xff1a;{bool2},其类型是{type(bool2)})# 比较运算符的…

“以赛促创”火正旺! 诸暨海归小镇逐梦“天空之城”

大雪节气已过&#xff0c;寒意渐浓&#xff0c;海归小镇却涌动着一股热潮。12月13日&#xff0c;以“海归智汇新时代 聚力创赢新发展”为主题的欧美同学会第三届“双创”大赛空天装备产业赛区决赛在浙江诸暨举行。作为全国唯一一个落地此项赛事的县级城市&#xff0c;诸暨将以赛…

c++用#define宏定义来批量实例化对象

参考自 PX4-Autopilot/platforms/common/include/px4_platform_common/param.h 正常实例化一个类Myclass Myclass obj 实例化多个类&#xff1a; Myclass1 obj1; Myclass2 obj2; Myclass3 obj3; ... 如果之后还要对这些对象都进行统一的一系列操作&#xff0c;比如obj1.up…

面试题-反转链表

反转链表的java写法&#xff0c;熟能生巧。 目录 一、题目描述 数据范围 样例 二、实现代码&#xff08;java&#xff09; 一、题目描述 定义一个函数&#xff0c;输入一个链表的头结点&#xff0c;反转该链表并输出反转后链表的头结点。 思考题&#xff1a; 请同时实现迭代…

【PostgreSQL】从零开始:(三)PgAdmin4下载与安装

【PostgreSQL】从零开始:&#xff08;三&#xff09;PgAdmin4下载与安装 pgAdmin简介liunx下部署通过yum部署pgAdmin4&#xff08;6.21&#xff09;1.安装依赖包2.永久停止防火墙3.配置pgadmin4项目源4.下载并安装pgAdmin45.执行初始化命令6.访问我们的网站 liunx下通过python方…

Linux install manual 1Panel

前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定;高效管理:通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等;安全可…

利用机器学习实现客户细分的实战

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下机器学习实战中的案例&#xff1a;创建客户细分&#xff0c;在此过程中也会补充很多重要的知识点&#xff0c;欢迎大家一起前来探讨学习~ 一、导入数据 在此项目中&#xff0c;我们使用 UCI 机器学习代码库…

Mysql研学-SQL语言基础

一 DDL语句:数据定义语言 1 作用:操作表 2 常用关键字 CREATE(创建) DROP(删除(销毁)) ALTER修改 3 格式 -- 单行注释/* 多行注释 */删除表:DROP TABLE [IF EXISTS] 表名;括号内为查看该表是否存在有则删创建表:参考JavaBean中定义有参构造器 &#xff08;最后一列不写逗…

如何创建逼真的3D模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 1、如何创建逼真的3D模型 通过调整默认的表面贴图&#xff0c;可以为…

DNSLog漏洞探测(七)之SQL注入漏洞实战

DNSLog漏洞探测(七)之SQL注入漏洞实战 在前面的文章之中&#xff0c;我们已经学习了XSS、RCE、XXE、SSRF漏洞中有关于DNSLog平台的使用。这些漏洞本身在执行时就有解析URL地址&#xff0c;发起网络请求的操作&#xff0c;所以只要我们把DNSLog平台获取的子域名地址发送到存在漏…

电脑监控软件丨你能接受在电脑上安装吗

很多人说自己是不能接受老板在电脑上安装电脑监控软件的&#xff0c;怎么说呢&#xff0c;我自己本身是没有任何意见的。 我是可以接受的。 先来说说我的理由&#xff1a; 我是站在企业管理者的角度上&#xff0c;来思考这个问题的。老板花钱雇佣员工不是来公司来上网聊天打游…

docker-harbor私有仓库

docker 三大组件 镜像 容器 仓库 仓库&#xff1a;保存镜像 私有&#xff0c;自定义用户的形式登录仓库&#xff0c;拉去或者上传镜像&#xff08;内部管理的用户&#xff09; harbor&#xff1a;是由VMware公司开发的&#xff0c;开源的企业级的docker registry 项目 。 帮…

阿里云国际DDOS设置流量清洗阈值

当您的公网IP资产的业务流量超过正常流量基线时&#xff0c;DDoS防护会对攻击流量进行清洗&#xff0c;并尽可能保障您的业务可用。本文介绍了设置流量清洗阈值的方法。 背景信息 DDoS原生防护在清洗判定中采用了AI智能分析的方法。您可以根据正常业务流量基线&#xff0c;设…

图像特征提取-角点

角点特征 大多数人都玩过拼图游戏。首先拿到完整图像的碎片&#xff0c;然后把这些碎片以正确的方式排列起来从而重建这幅图像。如果把拼图游戏的原理写成计算机程序&#xff0c;那计算机就也会玩拼图游戏了。 在拼图时&#xff0c;我们要寻找一些唯一的特征&#xff0c;这些…

数据结构之---- 图

数据结构之---- 图 什么是图&#xff1f; 图是一种非线性数据结构&#xff0c;由顶点和边组成。我们可以将图 &#x1d43a; 抽象地表示为一组顶点 &#x1d449; 和一组边 &#x1d438; 的集合。 以下示例展示了一个包含 5 个顶点和 7 条边的图。 如果将顶点看作节点&…

Java研学-druid连接池

一 连接池 1 概述 JDBC 数据库连接(Connectiond对象)使用 DriverManager 来获取&#xff0c;每次向数据库建立连接的时候都要将 Connection 加载到内存中&#xff0c;再验证用户名和密码得花费 0.05s&#xff5e;1s 的时间&#xff0c;执行完成后再断开连接。这样的方式将会消…