Vue3 CodeMirror组件实现日志查看与模糊匹配自定义查询高亮功能

【日志显示】vue实现前端展示后端带颜色的日志 通过loki获取项目产生的日志,并且在前端显示出来,一开始在没有经过处理的数据会显示一些乱码,使用ansi_up来对日志进行操作颜色代码进行转化。 阅读详情

需求:展示日志,将每一行日志文本加上序号标识,展示为类似编辑器代码高亮文本,顶部为文本过滤搜索输入框与刷新日志按钮

实现效果图:

输入框可以输入模糊字符模糊匹配高亮,右侧有个刷新按钮实现日志刷新

思路:

1、基于vue3引入vue-codemirror及相关依赖

vue-codemirror 版本:"vue-codemirror": "^6.1.1",

"@codemirror/commands": "^6.8.1",

    "@codemirror/lang-javascript": "^6.2.4",

    "@codemirror/search": "^6.5.11",

    "@codemirror/state": "^6.5.2",

    "@codemirror/view": "^6.38.1",

2、引入代码

3、调用插件内部search实例方法实现搜索功能

4、整体代码如下(接口获取根据接口加入调整getLog方法,后端接口直接返回日志就行,codemirror会自动把日志展示为带序号并且格式化展示):

<template>
<div class="log-content">
      <div class="top-content">
        <a-input-search
          v-model="filterValue"
          placeholder="请输入搜索内容"
          allow-clear
          style="width: 200px"
          @search="filterLog"
          @change="filterLog"
        />
        <div class="refresh-btn" @click="refreshLog">
          <icon-refresh />
        </div>
      </div>
      <div class="inner-content">
        <a-spin
          v-if="detailLoading"
          class="spin-center"
          :size="32"
          :tip="'加载中...'"
        ></a-spin>
        <Codemirror
          v-show="!detailLoading"
          v-model="logContent"
          :extensions="extensions"
          :style="{ height: '100%' }"
          readOnly="nocursor"
          :placeholder="'日志内容加载中...'"
          @ready="handleReady"
          ref="cmEditor"
        />
      </div>
    </div>
</template>

<script setup>
import { Codemirror } from 'vue-codemirror'
import { javascript } from '@codemirror/lang-javascript'
import { EditorView } from '@codemirror/view'
import { EditorSelection } from '@codemirror/state'
import {SearchQuery, setSearchQuery } from '@codemirror/search'
import { search, highlightSelectionMatches } from '@codemirror/search'
import { ref, watch, onMounted, shallowRef, computed } from 'vue'
import { Message } from '@arco-design/web-vue'

const view = shallowRef()
const handleReady = (payload) => {
  view.value = payload.view
}

let myTheme = EditorView.theme(
  {
    '&': {
      height: '100%',
      width: '100%',
    },
    '.cm-content': {
      fontSize: '14px',
      lineHeight: '1.5',
    },
    '.cm-selectionMatch': {
      backgroundColor: '#ffdd33',
    },
  },
  { dark: false },
)

const extensions = computed(() => {
  return [
    javascript(),
    myTheme,
    highlightSelectionMatches(),
    search({
      createPanel: () => null, // 禁用默认搜索面板
    }),
  ]
})

const filterValue = ref('')
const detailLoading = ref(false)
const cmEditor = ref(null)
const logContent = ref('')
// 从接口获取渲染的日志
const getLog = () => {
  detailLoading.value = true
  // 将从接口返回的数据返回logContent渲染日志
  let data = 'test'
  logContent.value = data || ''
      // 滚动到顶部
      if (view.value) {
        view.value.dispatch({
          effects: EditorView.scrollIntoView(0, { y: 'start' }),
        })
      }
}
// 首次进入调用
getLog()
// 搜索并高亮文本
const filterLog = () => {
  if (!view.value) {
    Message.warning('编辑器未准备好,请稍后再试')
    return
  }
  const searchValue = filterValue.value.trim()
  if (!searchValue) {
    // 清空搜索框内容和日志高亮文本样式
    filterValue.value = ''
    view.value.dispatch({
      effects: setSearchQuery.of(new SearchQuery({ search: '' })),
    })
    view.value.dispatch({
      selection: EditorSelection.single(0), // 重置选择到文档开头
    })
    return
  }

  // 设置搜索查询
  const query = new SearchQuery({
    search: searchValue,
    caseSensitive: false,
    regexp: false,
  })

  view.value.dispatch({
    effects: setSearchQuery.of(query),
  })

  // 定位到第一个匹配项
  const cursor = query.getCursor(view.value.state)
  if (cursor.next().done) {
    Message.warning('未找到匹配的日志内容')
  } else {
    view.value.dispatch({
      selection: EditorSelection.single(cursor.value.from, cursor.value.to),
      effects: EditorView.scrollIntoView(cursor.value.from, { y: 'start' }),
    })
  }
}

// 刷新日志
const refreshLog = () => {
  filterValue.value = '' // 清空过滤条件
  logContent.value = ''
  getLog()
}
</script>

<style lang="less" scoped>
.log-content {
  height: 70vh;
  display: flex;
  flex-direction: column;
}
.top-content {
  display: flex;
  justify-content: space-between;
  margin-bottom: 17px;
  .refresh-btn {
    width: 32px;
    height: 32px;
    line-height: 32px;
    font-size: 18px;
    text-align: center;
    cursor: pointer;
    background: #f2f3f5;
    border-radius: 2px;
  }
}
.inner-content {
  border: 1px solid #ebebeb;
  flex: 1;
  overflow: auto;
  min-height: 0;
  position: relative;
}

.spin-center {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 1;

  :deep(.arco-spin) {
    display: flex;
    align-items: center;
    justify-content: center;
  }
}
</style>

vue后台管理系统之日志管理模块 前端的后台管理系统的日志管理 阅读详情

相关推荐

Vue学习日记(13)组件

组件定义、非单文件组件、组件的嵌套

GZN的博客 523

SpringCloud微服务项目实战Vue版

适用人群Java开发人员, Vue开发人员, 前后端分离开发人员, 权限管理和配置开发人员,微服务SpringCloud版本开发人员课程概述微服务SpringCloud前后端分离Vue企业项目实战,微服务脚手架,具有统一授权、认证后台管理系统;SpringCloud+Nacos+ SpringBoot+OAuth2+Jwt+Swagger等,核心技术采用Nacos、Fegin、Ribbon、Gateway、Hystrix、JWT Token、Mybatis、SpringBoot、Redis等主要框架和中间件。详细如下:

js计算时间为刚刚、几分钟前、几小时前、几天前··_js计算几天前(1)

/计算时间差的分,时,天,周,月。//获取当前时间毫秒。result = " " + parseInt(monthC) + “月前”result = " " + parseInt(hourC) + “小时前”result = " " + parseInt(weekC) + “周前”result = " " + parseInt(dayC) + “天前”result =" " + parseInt(minC) + “分钟前”

2401_84434880的博客 629

vue(2)

vue的计算属性、侦听器、模板语法、指令、组件的创建、脚手架的创建

温涛的博客 1852

Skidder:使用便捷的Vue内置日志查看器

综上所述,Skidder是一个易于使用的Vue内置日志查看器,它提供了强大的日志记录、过滤和搜索功能,帮助开发人员更高效地调试和监视Vue应用程序的日志。Skidder是一个基于Java语言开发的Vue内置日志查看器,它提供了一个简单直观的用户界面,帮助开发人员快速查看和分析Vue应用程序的运行日志。除了基本的日志记录功能外,Skidder还提供了强大的过滤和搜索功能,以帮助开发人员更方便地定位和查看特定类型的日志消息。第一条日志消息是在发送异步请求之前记录的,而第二条日志消息是在请求成功后记录的。

HackWhisper的博客 748

Skidder易于使用的 Vue 内置日志查看器

Skidder是一个易于使用的Vue内置日志查看器,可让您轻松打开、查看和搜索多种类型的日志文件。Skidder的当前实现是一个独立的Web应用程序,它允许用户将日志文件拖放到站点上并查看其内容。如果将日志文件传递给非本机格式的Skidder,它将尝试使用此包解析文件,然后将其显示给用户。Skidder设计用于处理多种不同类型的日志文件,但它最适合使用自定义标头的.csv文件。日志文件的第一行是一个标题,它告诉Skidder列名以及如何解析文件的其余部分。lints和修复文件。...

隔壁老瓦的专栏 2085

Vue 日志监控自动滚屏

mounted () { this.scrollToBottom(); }, //每次页面渲染完之后滚动条在最底部 updated:function(){ this.scrollToBottom(); }, methods:{ scrollToBottom: function () { this.$nextTick(() => { var container = this.$el.querySelector(".chatBox-content-demo");

swinm的博客 2901

js:使用vue-codemirror实现一个语法高亮的网页代码编辑器

译文:@vuejs的codemirror代码编辑器组件。完整依赖 package.json。封装一个自定义的编辑器。

彭世瑜的博客 2335

massCode 版本演进全解析:从 v2.0 到 v3.11 的核心功能、修复与架构变迁

本文以 massCode 官方变更日志 [CHANGELOG.md](https://link.gitcode.com/i/387102fcec9149013dca5652eb7810b3) 为主线,结合仓库源码,系统梳理这款基于 Electron + Vue + CodeMirror 的本地优先代码片段管理工具从 v2.0.0-beta.1 到 v3.11.0 的完整演进脉络。读完本文,你将掌握

gitblog_00995的博客 99

Qt5开发从入门到精通——第一篇概述

Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形用户界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。在Qt程序开发过程中,除可以通过手写代码实现软件开发功能外,还可以通过Qt的GUI界面设计器(QtDesigner)进行界面的绘制和布局。该工具提供了Qt的基本可绘制窗口部件,如QWidget、QLabel、QPushButton和QVBoxLayout等。•对象查看器•属性编辑器。.........

weixin_44759598的博客 9514

STM32开发实战--解决STM32CubeMX生成代码时钟初始化卡死问题

本文详细分析了STM32CubeMX生成代码在时钟初始化阶段卡死的问题,提供了多种解决方案,包括简单修改和稳健的等待机制。通过深入探讨HAL库的时钟初始化陷阱及硬件层面的根本原因,帮助开发者快速定位并解决STM32开发中的常见问题。

weixin_26965807的博客 443

Hoppscotch:开源API测试工具如何改变你的开发流程?[特殊字符]

在当今API驱动的开发世界中,找到一款真正高效、灵活且开源的API测试工具是每个开发者的梦想。Hoppscotch正是这样一款开源API开发生态系统,它不仅提供了强大的HTTP请求测试功能,还支持WebSocket、GraphQL、MQTT等现代协议,成为Postman和Insomnia的有力替代品。这款工具的核心价值在于其完整的生态系统——Web端、桌面应用和CLI工具三位一体,让你在任何场景下

gitblog_00847的博客 453

别再只会用QTcpSocket了!手把手教你用QSslSocket为你的Qt网络应用加上SSL/TLS加密(附完整代码示例)

本文详细介绍了如何将Qt网络应用从QTcpSocket迁移到QSslSocket,实现SSL/TLS加密传输。通过对比API差异、解析核心机制和提供完整代码示例,帮助开发者快速掌握安全网络编程技巧,有效防范数据窃听和中间人攻击等安全风险。

weixin_30654583的博客 401

GitHub 9100+ Star!这款 Rust 写的数据库管理工具杀疯了:20MB 体积,60+ 数据库,还自带 AI 助手

DBX是一款轻量级开源数据库管理工具,采用Rust+Tauri技术栈,仅20MB体积,支持60+数据库(包括主流及国产数据库)。核心亮点:跨平台(macOS/Windows/Linux)、无需Java依赖、内置AI SQL助手(支持本地模型)、支持MCP协议与AI工具集成。提供专业功能如ER图、Schema对比、数据网格、Redis/MongoDB专用浏览器,并确保数据安全(无遥测、可离线使用)。相比DBeaver和TablePlus,DBX在轻量化、AI集成和跨平台方面表现突出,GitHub获9100+星

m0_73939789的博客 699

数字电路逻辑与设计实验三 译码器和数据选择器

1. 译码器功能测试 将 74LS139 按图 3.1 接线,按表 3.2 输入电平分别置位,填输出状态表。 2. 译码器转换 将双 2-4 线译码器转换为 3-8 线译码器。 (1)画出转换电路图。 (2)在实验箱上接线并验证设计是否正确。 (3)设计并填表写该 3-8 线译码器功能表,画出输入、输出波形。 3. 数据选择器的测试及应用 (1) 将双 4 选 1 数据选择器 74LS153 参照图 3.2 接线,测试其功能并填写功能表 3.3。 (2)将实验箱脉冲信号源中固定连续脉冲 4 个不

欢迎交流学习心得 3088

哨兵1号回波数据(L0级)FDBAQ压缩算法详解

本文介绍哨兵1号用的FDBAQ算法,它实现非整数可变bit压缩,大部分数据仅需 3bit输出,少数高反射率数据需4bit输出,使得平均输出比特率刚超过3bit,比熵约束分块自适应量化 (ECBAQ)压缩算法所需的3.7bit更低。也就是说FDBAQ压缩完,除了要记录分块尺寸和各块的均值码(对应哨兵1号数据包里的THIDX)外,还需要记录霍夫曼码字的长度(对应哨兵1号数据包里的BRC)。唯一不同的就是量化后的编码规则使用了霍夫曼编码,相当于在传统的BAQ压缩流程的后面又加了一个步骤。

2305

vue2-ace-editor做代码编辑器展示服务器日志的使用基本步骤

五、代码编辑器样式editorOptions,在data里面设置。三、在页面上设置<editor></editor>四、设置editorInit方法。

cxmfly11的博客 1070

Python 对接钉钉获取员工上一篇日报或周报内容

摘要:本文介绍使用Python对接钉钉API获取员工日报/周报的方法。首先需创建钉钉应用并开通日志权限,获取员工UserID。通过获取AccessToken进行鉴权,调用topapi/report/list查询日志记录,筛选最新日报/周报后,使用topapi/report/details获取详细内容。需注意权限控制、时间范围筛选和模板匹配等问题。文末提供完整代码示例,并建议扩展自动化触发、数据存储等功能。该方法适用于企业自动化获取员工工作日志的场景。

从技术实践立足,从项目管理方法论延伸思考 814

Vue3开发日记

vue3日记

Z_Joker_J的博客 753

YOLOv11改进 ,YOLOv11改进主干网络为MobileNetV3,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。本文开始探讨了自动化搜索算法与网络设计如何协同工作,以利用互补方法来提升整体技术水平。通过这一过程,创建了两个新的MobileNet模型:MobileNetV3-Large和MobileNetV3-Small,分别针对高资源和低资源使用场景。这些模型随后被适配并应用于目标检测和语义分割任务。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1940

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

前台查看日志功能

【代码】前台查看日志功能。

ghx123456ghx的博客 835

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Vue3项目搭建监控日志

在前端项目中,经常会遇到各种各样的报错,在错误复现的时候,往往需要反复console.log才能找到问题的原因。那么,我们可以通过封装一个日志,用来记录用户的各种行为及各种接口请求,用来查找错误所在。系统中用户在浏览哪个页面页面上,用户点击了什么地方请求了哪些接口,返回值是什么报错信息在Vue3项目中,配合pinia,以数组的形式来记录,每产生一条数据,push到数组中就可以了在页面刷新或者关闭页面的时候 上传至服务器。

weixin_58421147的博客 3766

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【React】利用modal、codemirror实现日志查看并且实时展示功能

一、前言 最近,被分配了一个需求要完成展示日志并且做到实时刷新展示。在此记录一下完成时的思路、遇到的困难以及解决方法 以下界面展示: 二、解决思路 1、展示界面:Modal 点击查看会进行日志展示,以弹窗的形式进行展示 2、日志展示:codemirror 毕竟是展示日志,所以使用代码编辑codemirror 3、实时更新数据:定时器 三、实现过程及遇到问题解决 1、在Table中添加查看一列 { title: 'XX日志', ...

all_might1的博客 4897

codeMirror装载日志定位到最新内容

react项目使用装载日志时需要使滚动内容定位到展示最新日志内容的地方。

hang_zh的博客 599
上一篇: element日期控件获取起始时间差相差多少月多少天
下一篇: 新手如何搭建配置Android Studio并成功运行React Native项目(使用自带的虚拟机运行)
小简GoGo
博客等级 码龄10年 50粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值