Vue命令行终端插件使用——vue-web-terminal

2023-10-31

今天分享一个用Vue写的网页端终端插件,可以在web页面模拟原生命令行终端实现一些高级的操作。

插件地址:https://github.com/tzfun/vue-web-terminal
npm地址:https://www.npmjs.com/package/vue-web-terminal

下面是演示图:
vue-web-terminal

使用

npm安装插件

npm install vue-web-terminal --save

在入口函数中载入

import Vue from 'vue'
import App from './App.vue'
import Terminal from 'vue-web-terminal'

Vue.config.productionTip = false
Vue.use(Terminal)

new Vue({
  render: h => h(App),
}).$mount('#app')

在App.vue中使用,当你在Terminal中输入命令并回车时会触发 execCmd方法,这个方法有四个参数:

  1. key 是命令行的关键字,比如平时使用的 cd /home/user/data命令key就是cd;
  2. 第二个参数command是完整的命令行,交给你自己解析
  3. successfailed是成功和失败的回调,无论处理成功还是失败都必须调用其中一回调,否则你敲完回车后就没有回显了
<template>
  <div id="app">
    <terminal name="my-terminal" @execCmd="onExecCmd"></terminal>
  </div>
</template>

<script>

export default {
  name: 'App',
  methods: {
    onExecCmd(key, command, success, failed) {
      success({
        type: 'normal',
        class: 'success',
        tag: '成功',
        content: command
      })
    },
  }
}
</script>

<style>
body,html{
  margin: 0;
  padding: 0;
}
</style>

到这你就成功使用这个插件了,不过想更溜的使用它还得去看官方的插件文档,下面介绍一此插件支持的几种消息类型。

多种类型消息

这个插件支持了四种消息类型:普通文本、表格、json、代码(多行文本),下面分别介绍使用方法

普通文本

普通文本支持显示时间、标签等,普通文本的消息 type 为 normal,class为消息级别,tag为自定义的消息标签,如果不传tag默认以class作为tag

onExecCmd(key, command, success, failed) {
 if(key === 'success') {
   success({
     type: 'normal',
     class: 'success',
     content: '这是一条 success 级别的消息'
   })
 } else if (key === 'system') {
   success({
     type: 'normal',
     class: 'system',
     content: '这是一条 system 级别的消息'
   })
 } else if (key === 'info') {
   success({
     type: 'normal',
     class: 'info',
     content: '这是一条 info 级别的消息'
   })
 } else if (key === 'warning') {
   success({
     type: 'normal',
     class: 'warning',
     content: '这是一条 warning 级别的消息'
   })
 } else if (key === 'error') {
   success({
     type: 'normal',
     class: 'error',
     content: '这是一条 error 级别的消息'
   })
 } else if (key === 'setTag') {
   success({
     type: 'normal',
     class: 'success',
     tag: command.split(' ')[1],
     content: '这是一条 success 级别的消息,并自定义了tag内容'
   })
 } else {
   failed('无法解析的命令!')
 }
}

普通文本示例
插件默认会显示时间的,如果你不想显示时间可以这样关闭:

<terminal name="my-terminal" @execCmd="onExecCmd" :show-log-time="false"></terminal>

表格

当消息显示类型为表格时,type 为 table,content定义表格内容,示例代码:

onExecCmd(key, command, success, failed) {
  if (key === 'table') {
    success({
      type: 'table',
      content: {
        head: ['列1', '列2', '列3', '列4', '列5'],
        rows: [
          ['h', 'e', 'l', 'l', 'o'],
          ['w', 'o', 'r', 'l', 'd']
        ]
      }
    })
  } else {
    failed('无法解析的命令!')
  }
}

表格示例

Json

插件也支持json显示,并可选择层级,type为json,content为你想要展示的json即可

onExecCmd(key, command, success, failed) {
  if (key === 'json') {
    success({
      type: 'json',
      content: {
        k1: 'welcome to vue-web-terminal',
        k2: 120,
        k3: ['h', 'e', 'l', 'l', 'o'],
        k4: {k41: 2, k42: '200'}
      }
    })
  } else {
    failed('无法解析的命令!')
  }
}

Json示例

显示代码 / 多行文本

插件也支持代码显示,type为code,content为你要显示的代码内容即可,上代码:

onExecCmd(key, command, success, failed) {
  if (key === 'code') {
    success({
      type: 'code',
      content: 'export function _screenType(width) {\n' +
          '    let result = {}\n' +
          '    if (width < 600) {\n' +
          '        result.xs = true\n' +
          '    } else if (width >= 600 && width < 960) {\n' +
          '        result.sm = true\n' +
          '    } else if (width >= 960 && width < 1264) {\n' +
          '        result.md = true\n' +
          '    } else if (width >= 1264 && width < 1904) {\n' +
          '        result.lg = true\n' +
          '    } else {\n' +
          '        result.xl = true\n' +
          '    }\n' +
          '    return result\n' +
          '}'
    })
  } else {
    failed('无法解析的命令!')
  }
}

代码显示示例

Highlight代码高亮

如果你想你的代码高亮显示,可以接入Highlight,Terminal插件支持Highlight!

首先你需要定义解析规则,创建一个Highlight.js文件

import Hljs from 'highlight.js';
import 'highlight.js/styles/tomorrow-night-bright.css';

let Highlight = {};
Highlight.install = function (Vue) {
    Vue.directive('highlight', {
        inserted: function (el) {
            let blocks = el.querySelectorAll('pre code');
            blocks.forEach(block => {
                let ul = document.createElement("ul");
                let rowCount = block.outerHTML.split('\n').length;
                for (let i = 1; i <= rowCount; i++) {
                    let li = document.createElement("li")
                    let text = document.createTextNode(i)
                    li.appendChild(text)
                    ul.appendChild(li)
                }
                ul.className = 'pre-numbering'
                block.parentNode.appendChild(ul)
                Hljs.highlightBlock(block)
            })
        },
        componentUpdated: function (el) {
            let blocks = el.querySelectorAll('pre code');
            for (let i = 0; i < blocks.length; i++) {
                Hljs.highlightBlock(blocks[i]);
            }
        }
    })
};

export default Highlight;

然后再在载入Terminal处添加参数 { highlight: true }

import Vue from 'vue'
import App from './App.vue'
import Terminal from 'vue-web-terminal'
import Highlight from '@/Highlight'

Vue.config.productionTip = false

Vue.use(Highlight)
Vue.use(Terminal, { highlight: true})

new Vue({
  render: h => h(App),
}).$mount('#app')

结果:
代码高亮显示

Js API

插件提供了两个API:主动推送消息和修改上下文

主动推送消息

当某一个命令需要显示多个提示时可以使用以下方式:

onExecCmd(key, command, success, failed) {
  if(key === 'multiMsg') {
    let count = parseInt(command.split(' ')[1])
    for (let i = 0; i < count; i++) {
      this.$terminal.pushMessage('my-terminal', {
        type: 'normal',
        class: 'system',
        content: `push message ${i + 1}`
      })
    }
    success({
      type: 'normal',
      class: 'success',
      content: `成功推送${count}条消息`
    })
  } else {
    failed('无法解析的命令!')
  }
}

主动推送消息示例

修改上下文

默认上下文为插件名,一般我们都需要自定义插件上下文,比如模拟服务器连接切换路径

<template>
  <div id="app">
    <terminal :name="terminalName" @execCmd="onExecCmd" :context.sync="context"></terminal>
  </div>
</template>

<script>

export default {
  name: 'App',
  data() {
    return {
      terminalName: 'my-terminal',
      context: '/home/user'
    }
  },
  methods: {
    onExecCmd(key, command, success, failed) {
      if (key === 'cd') {
        let newCtx = command.split(' ')[1]
        this.$terminal.updateContext(this.terminalName, newCtx)
        success()
      } else {
        failed('无法解析的命令!')
      }
    },
  }
}
</script>

修改上下文示例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue命令行终端插件使用——vue-web-terminal 的相关文章

  • Javascript拆分正则表达式问题

    你好 我正在尝试我认为在 Javascript 中相当简单的正则表达式 但给我带来了很多麻烦 我希望能够通过 javascript 通过 和 分割日期 var date 02 25 2010 var myregexp2 new RegExp
  • 在 Nodejs/javascript 中的 Excel 中创建动态数量的列或标题

    我用过exceljsNodejs中用于将json数据导出到excel的模块 它工作正常 但必须在添加行之前预定义标题 列的名称 即列是固定的 添加行后 我无法动态添加列 我尝试了许多通过 npm 提供的模块 但它们都具有相同的功能 那么 有
  • 从一个页面导航到另一个页面时,JavaScript 不会执行

    我正在构建我的第一个 Ruby on Rails 应用程序 并尝试创建一个动画导航栏 我正在使用 jQuery 和 Turbolink 这是我的application js under app assets javascripts docu
  • 如何清除画布元素中的多边形区域?

    我使用过clearRect函数 但没有看到多边形的等效函数 我天真地尝试过 ctx fillStyle transparent ctx beginPath ctx moveTo 0 0 ctx lineTo 100 50 ctx lineT
  • 如何在html中创建字体选择栏

    我想创建一个下拉菜单 在其中我们可以看到所有可用的字体 并且可以选择我们选择的任何字体 我还想创建一个字体颜色选择小部件 存在大量的字体样式 我想知道如何获取所有这些字体以及如何创建一个小部件 用户可以使用该小部件选择他选择的颜色 为了创建
  • flexslider 中的 GIF 滑块,如何仅在滑块上时开始 gif

    现在我有一个带有四个幻灯片的 Flexslider 第三个滑块是 gif 而不是像其他滑块一样是 jpg 我遇到的问题是 第三个 gif 滑块显然在到达页面时立即启动 而不是在您实际到达该滑块时启动 当点击前两个滑块时 gif 就快完成了
  • 代理递归函数

    想象一个简单的递归函数 我们试图包装它以检测输入和输出 A simple recursive function const count n gt n 1 count n 1 Wrap a function in a proxy to ins
  • 在 Angular JS 中撤消重做

    我有一个大对象排列在 rootScope 中 比如说 gt 100 个对象 每个对象又具有对象 数组的层次结构 我想使用 deepWatching watch 整个 rootScope 即将 watch 的第三个参数设置为 TRUE 但这里
  • 从画布保存/转换后文件质量下降的问题

    这是我正在使用的代码 代码位于这篇文章的底部 但这里是链接GitHubGist Noitidart ff addon snippet browseForBadgeThenCreateSaveAnApply js https gist git
  • 名称属性的 CSS 选择器?

    这可能是一个愚蠢的问题 但是属性的 CSS 选择器是什么 a 那是 名字 document body innerHTML myString anchor HTML String 这段 JavaScript 创建了一个 a 带有名称的元素 H
  • 从变量值动态设置 ng-controller

    我正在使用 AngularJs 和 NodeJS 开发一个应用程序 我对将控制器的名称设置为主控制器中的变量的值感到震惊 为了更好地解释它 我的 index html 看起来像这样 tbody tr td td td member task
  • Meteor JS:存储特定模板实例状态的最佳方法是什么?

    我正在学习 Meteor JS 中的会话和反应式数据源 它们非常适合设置全局 UI 状态 但是 我不知道如何将它们的范围限制到模板的特定实例 这就是我想做的 我的页面上有多个可内容编辑的元素 每个下面都有一个 编辑 按钮 当用户单击 编辑
  • javascript 函数后面括号中的值

    我正在尝试重新利用我在 SO 的答案中找到的一些 Javascript 代码 但我想首先更好地理解它的语法 其大纲是 function root ns factory some code window detectZoom function
  • 谷歌绘制具有相同比例的多个系列的图表

    我正在寻找一种在图形上显示多个系列的方法 这些系列具有相同的比例但仅显示一次 正如你在这里看到的 http jsfiddle net Youkoal d3xwnqdu http jsfiddle net Youkoal d3xwnqdu 我
  • 如何优化 Three.js 中多个 sphereGeometry 的渲染?

    我想优化 Three js 中 sphereGeometry 的渲染 因为它成为我的程序的瓶颈 javascript程序如下所示 var sphereThree for var idSphere 0 idSphere lt numSpher
  • D3.js - 更改鼠标悬停时元素的不透明度 IF 条件 = false

    我正在制作一个带有过滤器的交互式 D3 js 图表 当用户单击选定的复选框时 该过滤器会显示点 此外 在鼠标悬停事件上 所选点旁边将出现一个弹出窗口 其中包含一些信息 由于图表上的点数量相对较多 因此我选择在取消选中相应复选框时使相关点变得
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet
  • 跨浏览器相当于explicitOriginalTarget事件参数

    有谁知道跨浏览器等价于explicitOriginalTarget事件参数 该参数是 Mozilla 特定的 它为我提供了导致模糊的元素 假设我的页面上有一个文本输入和一个链接 文本输入具有焦点 如果我点击链接 文本输入的模糊事件会通过ex
  • React 嵌入脚本标签不可样式化

    我打算将 SurveyMonkey 调查嵌入到我的网站中 用 React 制作 只是让它工作起来很麻烦 但最终这段代码工作了 let script let extractScript
  • Fancybox修改。如何修改 fancybox 以停止在每个画廊的最后一项? (画廊 1 画廊 2 等)[重复]

    这个问题在这里已经有答案了 我正在为我的照片库使用 fancybox 插件 我有多个包含更多项目 照片 的画廊 我想知道如何在点击每个画廊的最后一个项目时停止幻灯片放映 我的 fancybox js 没有被修改 谢谢 您需要添加该选项loo

随机推荐

  • linux、windows命令行设置环境变量(增删改查)

    linux windows命令行设置环境变量 增删改查 1 windows下设置环境变量 1 1 环境变量优先级 1 2 查看环境变量 1 3 设置或修改环境变量 1 4 删除环境变量 1 5 给系统变量追加内容 2 linux下设置环境变
  • 深入剖析HTTP和HTTPS代理在爬虫中的应用价值

    目录 什么是HTTP和HTTPS代理 HTTP和HTTPS代理如何运作 HTTP代理的工作流程如下 HTTPS代理工作流程 网络爬虫使用HTTP代理的好处 网络爬虫使用HTTPS代理的好处 代码示例 总结 在当今互联网时代 网络爬虫作为一种
  • 使用深度学习打造智能聊天机器人

    版权声明 可以任意转载 转载时请标明文章原始出处和作者信息 author 张俊林 聊天机器人 也可以称为语音助手 聊天助手 对话机器人等 是目前非常热的一个人工智能研发与产品方向 很多大的互联网公司重金投入研发相关技术 并陆续推出了相关产品
  • 别逗了!知识付费能支撑起喜马拉雅的200亿估值?

    近日 据消息称喜马拉雅FM已经完成VIE架构搭建 并已完成新一轮4 6亿美元融资 投资方包括春华资本 腾讯 泛大西洋投资 华泰证券 高盛和新天域 投后估值34亿美元 将于明年上半年赴美IPO 对于半年多次传出要上市的喜马拉雅 此时官方并没有
  • YOLOV8改进:更换PoolFormer主干网络

    1 该文章属于YOLOV5 YOLOV7 YOLOV8改进专栏 包含大量的改进方式 主要以2023年的最新文章和2022年的文章提出改进方式 2 提供更加详细的改进方法 如将注意力机制添加到网络的不同位置 便于做实验 也可以当做论文的创新点
  • Linux操作系统简介

    文章目录 Linux发行版简介 学习Linux的必备硬件知识 关键硬件器件 CPU 关键硬件器件 存储 关键硬件器件 内存 其他一些查看硬件信息的命令 Linux开机过程 以Ubuntu16 04为例 阶段1 BIOS 阶段2 boot L
  • 技术人修炼之道阅读笔记(一)让自己更值钱的5个能力

    如何让自己更值钱 回答这个问题 需要使用黄金圈理论 黄金圈理论是一种由内而外的思维模式 提倡 why 为什么这么做 how 如何做 what 做什么 三个圈来思考或决策 首先是 why 你因为什么而值钱 要值钱 就要时刻保持稀缺性 别人不会
  • Python网络爬虫学习笔记(四)解析库的使用

    解析库的使用 使用正则表达式 比较烦琐 而且万一有地方写错了 可能导致匹配失败 对于网页的节点来说 有 id class 或其他属性 而且节点之间还有层次关系 在网页中可以通过 XPath 或 css 选择器来定位一个或多个节点 利用 XP
  • Halcon Qt 环境一次性配置

    新建 halcon pri文件 halcon pri 内容 INCLUDEPATH C Program Files MVTec HALCON 20 11 Steady include INCLUDEPATH C Program Files
  • 六、操作系统之文件管理

    六 文件管理 文件系统的概念 文件系统时OS与用户关系最紧密的一部分 对用户来说 它是OS中最直观的部分 能否方便使用OS 以及OS的可信赖程度往往取决于文件系统的功能和性能 1 文件和文件系统 2 文件系统的功能 3
  • 18 回文字符串 (后续用动态规划再做一下)

    题目 思路 题解 方法1 思路都在代码里了 class Solution public int countSubstrings string s 每个值都作为中心值 左右两个指针 但是要考虑奇偶的情况bb 和 aba gt i前面的字符串是
  • sql_mode设置(临时or永久)

    临时和永久设置MySQL sql mode非容器方式和容器方式 MySQL 文章目录 临时和永久设置MySQL sql mode 前言 查看sql mode 临时修改sql mode 永久修改sql mode 永久修改sql mode 容器
  • 工业操作系统不是ARM吗?鸿蒙是

    未来工厂如何建 工厂要怎样的数字化平台 褚健认为 面向未来的数字化工厂建议 需要走一条大规模 低成本 生态化之路 正如移动互联时代需要安卓 iOS APP 智能工厂时代需要工厂操作系统 工业APP 工厂操作系统的基础理念包括统一的数据底座
  • ykhmi是什么触摸屏软件_一体机使用中常见问题-中达优控

    1 一体机的屏在组态软件中选择的型号 4 3寸一体机选S430A 5寸一体机选S500A 7寸一体机选S700A 10寸一体机选S1001A 2 一体机发脉冲的Y点用法 A 步进电机驱动器 伺服电机驱动器可以直接接 B 可以用来驱动指示灯
  • Java程序员不得不会的124道面试题(含答案)

    专注于编程 互联网动态 最终将总结的技术 心得 经验 数据结构与算法 源码分析等 享给大家 这里不只限于技术 还有职场心得 生活感悟 以及面经 点击上方 关注按钮 第一时间送达 多线程 并发及线程的基础问题 1 Java 中能创建 vola
  • Chandy-Lamport快照算法仿真实现

    Chandy Lamport快照算法仿真实现 分布式系统中存在的问题 在简单的非分布式环境中发现的问题 如互斥 饿死和死锁等 它们都有可能出现在分布式环境中 实际上 后一种环境下出现这些问题的可能性更大 因为它涉及到很多的实体 它们会引起混
  • 《Java基础教程案例》读书心得

    建议新入门的Java程序猿观看 书籍里面共包含 11 章内容 涵盖了Java基础的全部知识 配备了 20 个任务案例 22到思考题 这本书在我读完以后觉得还是挺不错的一本书 每章的知识点讲的还是挺详细的 最主要的还是你学过此章节的知识点后
  • 传统制造业进行转型过程当中所要面临的主要难点

    在历史上 人类经历了四次工业革命 每一次工业革命都会伴随着一个标志性事物的出现 比如蒸汽机 这标志着人类进入了蒸汽时代 这也是第一次工业革命的开始 第二次工业革命以电力的出现为代表 标志着人类进入了电力时代 以计算机的出现为代表的第三次工业
  • 使用 Kotlin Compose Desktop 实现了一个简易的"手机助手"

    1一 adbd connector adbd connector 是一个实现 adb server 和 adb daemon 之间的通信协议的库 使用 Kotlin 编写 支持 PC 端直接连接 Android 设备操作 adb 相关的指令
  • Vue命令行终端插件使用——vue-web-terminal

    今天分享一个用Vue写的网页端终端插件 可以在web页面模拟原生命令行终端实现一些高级的操作 插件地址 https github com tzfun vue web terminal npm地址 https www npmjs com pa