视频可回溯系统技术方案vue3+ts+tegg+mysql+redis+oss

一、 项目背景

保险、基金、银行等众多行业在做技术平台时都会需要一种能够准确了解用户操作行为的方式方法。诸如通过埋点、平台监控、视频可回溯等,通过技术手段,保存用户操作轨迹,以此规范安全销售、平台健康检查、出现纠纷时可追溯、问题出现有证据。 为规范保险行业销售行为,zf出台相关政策:

image.png

了解政策原文

在本人开发系统之前,全网似乎也有几家公司已经在推广销售双录系统,但是介于价格较高,且本人有兴趣挑战这种比较大型的平台系统。对未知领域充满无限好奇心的驱动力使我一步一步将一套完整的视频可回溯项目比较完整的实现了。在此先给自己鼓个掌!👍👍😁

image.png

二、前期准备

  • 行业研究:

    • 怎么将用户在web前端应用(pc端、h5移动端等)的操作轨迹通过视频的形式保存下来可以说是一个比较难实现的技术要求。
    • 最初想法:寻找录屏插件、通过轮询截图,最后生成视频、等等不太可行的方案都想过。后来经过各种问度娘,搜github, 技术论坛;
    • 最终锁定到了github一个非常优秀的开源框架rrweb上。一句话,这个框架核心思想就是,将用户操作的行为通过mutationObseverjs原生方法将dom按照时间顺序保存成对象数组,数组里是包含唯一的dom、value、事件等。实现原理可以看这篇文章戳这里
  • 功能要素:

    • 该开源框架提供了核心部分,但是怎么利用这个底层框架,开发一套完整的系统也是一件不简单的事;
    • 该系统需要包含以下几个大模块:
      1. 放在web项目的录屏sdk(应具备无代码浸入方式接入)
      1. 需要一套后台管理系统,分为前端界面和后端服务
      1. 数据存储方法论,数据治理、数据清洗等
      1. 系统应具备安全稳定,方便部署应用的能力
  • 技术方案:

    • 本人前端出身,对宇宙后端第一大语言Java学习的还不够,自知学海无涯、无心无力边学边用,java就果断放弃。
    • 选择了同样优秀但是目前仍然比较新的后端开发框架tegg, tegg是eggjs的升级版本,加入了ts元素和注解方式,约定优于配置是其灵魂,加入respository我认为是最好用的,扯远了。
    • 技术核心如下:
    • 探针sdk(录屏)(vue3+ts+vite+pako+loadsh-es等,也包括打包所用工具css、js文件注入,js混淆加密等)
    • 后端管理系统(前端)(vue2+ant-design-vue+vue全家桶+rrweb+loadsh+store等)
    • 后端管理系统(后端)(tegg框架相关+ali-oss+mysql+egg-redis+pako+puppeteer+rrweb+rrweb-player等)
    • 项目管理:本项目采用pnpm monorepo微前端管理体系。eslint+pretter+commitlint提交规范配置+stylelint样式规范等前端基础工程化配置。
    • 存储:使用mysql数据库+redis缓存数据库+阿里云oss永久存储
    • 部署:采用Dockerfile及docker-compose.yml配合docker容器部署
    • 发布:使用jenkins代码发布工具+gitee版本仓库
    • 服务器: 云服务器

三、 项目开发

1. 录屏sdk

  • sdk应具备的能力:

    1. 视频文件events的收集上报
    2. sdk鉴权方式
    3. sdk与使用方业务关联(例如,绑定订单id,通过订单id查询此视频)
    4. 业务方需主动触发结束录屏动作
    5. 需要配置业务web哪个页面需要录屏
    6. 功能上考虑节流防抖,click、scroll、keyup页面事件操作时的上报策略等
  • sdk服务于sdk探针:

    1. 本项目使用sdk与sdk服务(node)相互配合达到一行代码注入使用的能力。
    2. js混淆加密使项目更加安全。
<script defer src="http://127.0.0.1:8085/snail_record_wr_start?id='6c9415b0db6811eeb301858cecb0709b'&source='时光机可回溯系统'&version='2.0.0'"></script>

image.png

2. 后端管理系统

- 功能模块:

-  权限管理:菜单管理、角色管理、用户管理
-  可回溯管理:商户配置、录屏配置、视频列表、视频播放、sdk版本管理

image.png

- 后端核心

项目采用tegg微服务方式,权限模块,公共模块,录屏模块,html模版view模块

最最核心是如何存储视频文件数据,思想和方法论是最关键的,前端只要用户操作每隔1s调一次接口,然后后端保存缓存文件。
本项目采取三段式分片定时任务处理数据存储,合并和压缩上传功能。

在不频繁处理数据库操作的基础思想下,定时任务分批处理。

这个地方,想了比较久,甚至过年开车回家,在路上就一直在想方案,也没想出来,年后回来,在某一刻想通了哈哈哈。就是这么神奇

贴一段核心代码

/**
** @Author: wangke
** @Date: 2024/02/08 20:03:59
** @Description: 查询videoProgress=2时 将 screenRecordVideos 视频txt文件压缩归档,场景就是,用户在订单完成后,迟迟没有支付,或者,很长时间才到达结束页,这时,结束页要再次归档
*/
async scheduleVideoFileZip(searchParams, type: number) {const videoPath = this.config.recordEventDir + Constant.SCREEN_RECORD_VIDEO_DIRconst fileArr = zipFileFunc(videoPath)setTimeout(async () => {const deviceIdArr = []if (!fileArr.length) return falsefor (let i = 0; i < fileArr.length; i++) {deviceIdArr.push(fileArr[i].split('.')[0] as never)}// 查找数据,然后将zip文件归档云存储searchParams = { deviceId: deviceIdArr, ...searchParams } // 当数据库里有设备id时才存到oss上,避免脏数据归档const videoList = await this.VideoListRepository.queryAll(searchParams)if (videoList.length <= 0) returnfor (let i = 0; i < videoList.length; i++) {const txtFileName = videoList[i].deviceId + this.config.video_file_suffixconst zipFileName = videoList[i].deviceId + this.config.video_zip_file_suffixconst txtFileInfo = this.config.recordEventDir + Constant.SCREEN_RECORD_VIDEO_DIR + txtFileNameconst fileInfo = this.config.recordEventDir + Constant.SCREEN_RECORD_VIDEO_DIR + zipFileNameif (await isExistFileFunc(txtFileInfo)) {await Oss.ossPut('zip/' + dateFileDirFunc() + zipFileName, fileInfo)const videoSize = getFileSize(fileInfo)let videoParams = {videoSize,videoStatus: Constant.VIDEO_HAVE_MAKE,videoUrl: 'zip/' + dateFileDirFunc() + zipFileName,// videoUrl: ossRes.urlvideoProgress: ''}if (type === 2) {videoParams = { ...videoParams, videoProgress: '3' }}const updateRes = await this.VideoListRepository.update(videoList[i].deviceId, videoParams)if (updateRes) {fsync.unlinkSync(fileInfo)type === 2 && fsync.unlinkSync(txtFileInfo)}}}}, 1000)
}

四、 项目打包

  • sdk通过vite打包成可插拔式的插件,并且进行加密处理
  • 时光机后管系统前端用vue-cli脚手架打包
  • 后管的服务端使用egg eggctl
  • 每个单独项目使用docker 部署

五、项目部署

  • 云服务器

六、项目架构图

image.png

七、视频截图

25cb3a254d7a05e70db00f8fc6b6b70.png

微信图片_20240309210635.png

有感兴趣的小伙伴点个赞,关注下, 下期针对项目代码具体实现进行详细解剖,欢迎点赞评论。一起成长,一起进步,一起探索大前端等技术。

远离喧闹的城市,远离熙攘的人群,沉浸在代码的海洋里,忘乎所以地在自己的世界里狂欢。

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

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

相关文章

chrome插件开发的几种展现页面形式,3分钟看完

想要开发一个chrome浏览器插件&#xff0c;还是很有必要清楚插件都可以在哪些地方显示出来的&#xff0c;比如只想在pop页面弹出&#xff0c;还是添加右键菜单&#xff0c;还是提示桌面通知&#xff1f;还是在哪里展示&#xff1f;有哪些展示方式等 browserAction(浏览器右上角…

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频!

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频&#xff01; Corel Video Studio 2024免费下载Keygen 你厌倦了在视频编辑软件上花大钱吗&#xff1f;别再看了&#xff01;我们为您提供了完美的解决方案——Corel Video Studio 2024。最棒的部分是什么&#xff1f;…

分享MDN前端结构化技能、实践指南、学习资源

前言 MDN课程为成为一名成功的前端开发人员提供了一个结构化的基本技能和实践指南&#xff0c;以及推荐的学习资源。 先看下让人不得不服的书《宝宝的网页设计》&#xff08;套装共3册&#xff09; 宝宝的HTML、宝宝的CSS、宝宝的JavaScript 全球首套中英文宝宝编程启蒙书&a…

计算机网络 八股

计算机网络体系结构 OSI&#xff1a;物理层、数据链路层、网络层、运输层、会话层、表示层、应用层

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Gauge)

数据量规图表组件&#xff0c;用于将数据展示为环形图表。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 说明&#xff1a; 建议使用文本组件构建当前数值文本和辅…

【xv6操作系统】xv6 启动过程分析

一、调试用到的汇编代码 为了方便&#xff0c; Makefile 会创建.asm 文件&#xff0c;可以通过它来定位究竟是哪个指令导致了 bug。 可以看到&#xff0c; kernel 从 80000000 地址处开始执行&#xff0c;第二列为相应指令&#xff08;如 auipc&#xff09; 的 16 进制表示&a…

缩放算法优化步骤详解

添加链接描述 背景 假设数据存放在在unsigned char* m_pData 里面&#xff0c;宽和高分别是&#xff1a;m_nDataWidth m_nDataHeight 给定缩放比例&#xff1a;fXZoom fYZoom&#xff0c;返回缩放后的unsigned char* dataZoom 这里采用最简单的缩放算法即&#xff1a; 根据比…

猫头虎分享已解决Bug || 系统监控故障:MonitoringServiceDown, MetricsCollectionError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

如何在一个pycharm项目中创建jupyter notebook文件,并切换到conda环境中

1、第一步可以直接在pycharm项目中创建jupyter notebook文件 2、假若想要切换成pytorch环境做实验例子&#xff0c;会发现报这个错误 Jupyter server process exited with code 1 C:\Users\12430\.conda\envs\pytorch3.11\python.exe: No module named jupyter在这里&#xff…

Python快速入门系列-2(Python的安装与环境设置)

第二章&#xff1a;Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境&#xff08;IDE&#xff09;的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…

jvm堆概述

《java虚拟机规范》中对java堆的描述是&#xff1a;所有的对象实例以及数组都应当在运行时分配在堆上。 一个JVM实例只存在一个堆内存(就是new 出来一个对象)&#xff0c;java内存管理的核心区域 java堆区在jvm启动的时候就被创建&#xff0c;空间大小确定。是jvm管理的最大一…

力扣--滑动窗口438.找到字符串中所有字母异位词

思路分析&#xff1a; 使用两个数组snum和pnum分别记录字符串s和p中各字符出现的次数。遍历字符串p&#xff0c;统计其中各字符的出现次数&#xff0c;存储在pnum数组中。初始化snum数组&#xff0c;统计s的前m-1个字符的出现次数。从第m个字符开始遍历s&#xff0c;通过滑动窗…

STM32_3-1点亮LED灯与蜂鸣器发声

STM32之GPIO GPIO在输出模式时可以控制端口输出高低电平&#xff0c;用以驱动Led蜂鸣器等外设&#xff0c;以及模拟通信协议输出时序等。 输入模式时可以读取端口的高低电平或电压&#xff0c;用于读取按键输入&#xff0c;外接模块电平信号输入&#xff0c;ADC电压采集灯 GP…

C# WinForm AndtUI第三方库 Table控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Table控件至窗体。 使用方法集合 1.单元格点击事件 获取被点击记录特定列内容 private void dgv_CellClick(object sender, MouseEventArgs args, object record, int rowIndex, int columnIn…

一篇搞懂什么是LRU缓存|一篇搞懂LRU缓存的实现|LRUCache详解和实现

LRUCache 文章目录 LRUCache前言项目代码仓库什么时候会用到缓存(Cache)缓存满了&#xff0c;怎么办&#xff1f;什么是LRUCacheLRUCache的实现LRUCache对应的OJ题实现LRUCache对应的STL风格实现 前言 这里分享我的一些博客专栏&#xff0c;都是干货满满的。 手撕数据结构专栏…

解决ts报错:类型“entry”上不存在属性“$AppTools”

uniapp ts 项目&#xff0c;已经将AppTools挂在了vue的原型上&#xff0c;但是在vue页面使用时报错&#xff0c;如图&#xff1a; 解决&#xff1a; 在项目根目录下的tsconfig.json文件添加如下配置&#xff1a; "include": ["src/**/*"],这样报错就消失…

ChatGPT数据分析应用——热力图分析

ChatGPT数据分析应用——热力图分析 ​ 热力图分析既可以算作一种可视化方法&#xff0c;也可以算作一种分析方法&#xff0c;主要用于直观地展示数据的分布情况。接下来我们让ChatGPT解释这个方法的概念并提供相应的案例。发送如下内容给ChatGPT。 ​ ChatGPT收到上述内容后&…

云计算科学与工程实践指南--章节引言收集

云计算科学与工程实践指南–章节引言收集 //本文收集 【云计算科学与工程实践指南】 书中每一章节的引言。 我已厌倦了在一本书中阅读云的定义。难道你不失望吗&#xff1f;你正在阅读一个很好的故事&#xff0c;突然间作者必须停下来介绍云。谁在乎云是什么&#xff1f; 通…

opengl 学习(二)-----你好,三角形

你好&#xff0c;三角形 分类demo效果解析 分类 opengl c demo #include "glad/glad.h" #include "glfw3.h" #include <iostream> #include <cmath> #include <vector>using namespace std;/** * 在学习此节之前&#xff0c;建议将这…

MIT6.828操作系统工程实验学习笔记(二)

前言 这篇文章是接上文的内容&#xff0c;依然是对Lab1的记录 如何启动保护模式 要启动保护模式&#xff0c;需要完成以下三个步骤&#xff1a; 在内存中加载GDT&#xff0c;设置GDTR设置CR0寄存器的PE&#xff08;Protected Enable&#xff09;位&#xff0c;启用保护模式…