• vue-显示linux日志乱码,web终端组


    工具

    vue2.x + xterm.js

    文档传送门:Xterm.js

    问题描述:

    系统中有要显示linux端日志的功能,后台去抓取,并用接口反回即可,但是它会有一些无符号字符串(\u001b),需要转换,可是又有一些类似"[1A"(linux平台下,用于控制颜色,格式等字符)特殊的字符,结果,我的输出内容就如下图所示,有些乱码

    下图是应用了xterm.js后的对比,好在是没有乱码了。

    1 安装   

    注意:我是用cnpm方法安装的,有时候,Npm方法安装可能会报错,其实就是依赖中的某些版本问题,但还是根据自己的项目走即可

    npm install xterm -s

    插件:

    fit:格式化插件,xterm.js本身是依赖于【列,行】的设置来控制宽度与高度且是固定死的,fit插件可以根据父元素来自适应你的界面

    npm iinstall xterm-addon-fit -s

    初始化代码,仅提取关键代码,后面组件里有完整代码

    1. 1 HTML部分
    2. <div class="vi-console">
    3.         <!-- terminal -->
    4.         <div class="console" id="terminal"></div>
    5. </div>
    6. ....
    7. ==============================================================
    8. 2 加载默认资源
    9. import { Terminal } from 'xterm'
    10. import { FitAddon } from 'xterm-addon-fit';
    11. import 'Xterm/css/xterm.css'
    12. ....
    13. ==============================================================
    14. 3 terminal窗体初始化,及自适应插件,初始化文字提示
    15. const term = new Terminal() //初始化
    16. const fitAddon = new FitAddon();//加载fit插件,仅用于窗口自适应
    17.  term.loadAddon(fitAddon);
    18. const myTerminal = document.getElementById('terminal') // DOM
    19. term.open(myTerminal);
    20. fitAddon.fit();//自适应界面
    21. term.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ')//初始化显示字符串
    22. term.focus();
    23. ==============================================================

    以上代码搞定后,你会得到如下界面,文字是write(”“)方法内的文字,有些字符你得去官网看是什么含义,但基本就是转义字符 

     ======================猥琐发育,别浪================================

    2 组件代码

    1. <template>
    2. <div class="vi-console">
    3. <!-- terminal窗体 -->
    4. <div class="console" id="terminal"></div>
    5. </div>
    6. </template>
    7. <script>
    8. import { Terminal } from 'xterm'
    9. import { FitAddon } from 'xterm-addon-fit';
    10. import 'Xterm/css/xterm.css'
    11. export default {
    12. name: 'ViConsole',
    13. props: {
    14. terminalOptions: {
    15. type: Object,
    16. default () {
    17. return {
    18. pid: 1,
    19. name: 'terminal',
    20. //cols: 140,//总列宽度,会影响到整体宽度
    21. logLevel: 'error',
    22. windowsMode: true,
    23. fontWeight: '300',
    24. //lineHeight: 2,//行高
    25. cursorStyle: 'underline',
    26. wordSeparator: '……',
    27. theme: {
    28. //terminal窗体样式设置
    29. background: '#0c0c0c',//背景
    30. foreground:'#c2c2c2',//所有文字颜色
    31. cursor: '#fff',//光标颜色
    32. selection: '#868686'//选择后背景颜色
    33. }
    34. }
    35. }
    36. },
    37. log: {
    38. type: String,
    39. default: ""//传入的日志字符串,linux日志
    40. },
    41. },
    42. data () {
    43. let _this = this
    44. return {
    45. term: new Terminal(_this.terminalOptions)
    46. }
    47. },
    48. mounted () {
    49. let _this = this
    50. // 我的项目排版有点小问题,如果不加settimeout,样式会跑偏,默认情况下,_this.initTerm()即可
    51. setTimeout(() => {
    52. _this.initTerm()
    53. }, 200);
    54. },
    55. watch: {
    56. log (newVal, oldVal) {
    57. let _this = this
    58. if (newVal && newVal.length != 0) {
    59. //写入内容
    60. _this.writeTerm(newVal)
    61. }
    62. }
    63. },
    64. methods: {
    65. writeTerm (str) {
    66. //写入内容
    67. let _this = this
    68. _this.term.write(str)
    69. },
    70. initTerm () {
    71. let _this = this
    72. const fitAddon = new FitAddon();
    73. _this.term.loadAddon(fitAddon);
    74. const myTerminal = document.getElementById('terminal')
    75. _this.term.open(myTerminal);
    76. fitAddon.fit();
    77. _this.writeTerm('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ')
    78. _this.term.focus();
    79. // window.addEventListener('resize', _this.initTerm );
    80. },
    81. },
    82. beforeDestroy () {
    83. let _this = this
    84. //this.terminalSocket.close()
    85. _this.term.dispose()
    86. }
    87. }
    88. </script>
    89. <style scoped>
    90. .vi-console {
    91. width: 100%;
    92. min-height: 240px;
    93. }
    94. </style>

    3 应用组件

    log:是你的linux日志字符串,接入你自己的API

    1. <vi-consoleVue :log="你的日志代码"></vi-consoleVue>
    2. //示例字符串,自己改下即可
    3. log: "\n\u001b[1A\r\r正在节点 peer0.jgr.llkj.com 查询已安装链码...................................../成功.\r\u001b[1B\u001b[1A\r\r正在节点 peer0.jgr.llkj.com 查询已安装链码..................................... 成功.\r\u001b[1B\n\u001b[1A\rLabel: cclabel0.6.4 PackageID: cclabel0.6.4:8836beb355d04f846b2ccad8c5c2788a79f1e99a5523abab67cb22a37c31960d\r\u001b[1B\n\u001b[1A\r\r正在节点 peer0.qy1.llkj.com 查询已安装链码...................................../成功.\r\u001b[1B\u001b[1A\r\r正在节点 peer0.qy1.llkj.com 查询已安装链码..................................... 成功.\r\u001b[1B\n\u001b[1A\rLabel: cclabel0.6.4 PackageID: cclabel0.6.4:8836beb355d04f846b2ccad8c5c2788a79f1e99a5523abab67cb22a37c31960d\r\u001b[1B\n\u001b[1A\r\r正在节点 peer0.qy2.llkj.com 查询已安装链码...................................../成功.\r\u001b[1B\u001b[1A\r\r正在节点 peer0.qy2.llkj.com 查询已安装链码..................................... 成功.\r\u001b[1B\n\u001b[1A\rLabel: cclabel0.6.4 PackageID: cclabel0.6.4:8836beb355d04f846b2ccad8c5c2788a79f1e99a5523abab67cb22a37c31960d\r\u001b[1B\n\u001b[1A\r\r正在节点 peer0.qy3.llkj.com 查询已安装链码...................................../成功.\r\u001b[1B\u001b[1A\r\r正在节点 peer0.qy3.llkj.com 查询已安装链码..................................... 成功.\r\u001b[1B\n\u001b[1A\rLabel: cclabel0.6.4 PackageID: cclabel0.6.4:8836beb355d04f846b2ccad8c5c2788a79f1e99a5523abab67cb22a37c31960d\r\u001b[1B"

    结论:

            我这个组件仅是显示一些Linux日志字符串功能,其实它还有很多方法,我暂时没应用上,如果你要开发web-shell组件,你就去官网好好看看其它API,开发完了记得共享哈!

  • 相关阅读:
    如何在3DMAX中使用tyFlow粒子模拟插件创建样条线网格模型
    C++ continue 语句
    学习servlet【续】
    项目管理之八大绩效域------笔记(五)
    【Java+SpringBoot】监考任务分配系统(源码+远程部署+项目定制开发+代码讲解+毕业设计+答辩教学)
    java 面试题汇总整理
    2022上半年系统集成项目管理师客观题参考答题解析(4)
    2022/7/27 考试总结
    NPDP如何续证?操作指南来了!
    qt 汉字输出 中文输出 显示乱码 qDebug() 乱码 解决
  • 原文地址:https://blog.csdn.net/tdjqqq/article/details/125496331