视频可回溯系统技术方案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_DIR
  const fileArr = zipFileFunc(videoPath)
  setTimeout(async () => {
    const deviceIdArr = []
    if (!fileArr.length) return false
    for (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) return
    for (let i = 0; i < videoList.length; i++) {
      const txtFileName = videoList[i].deviceId + this.config.video_file_suffix
      const zipFileName = videoList[i].deviceId + this.config.video_zip_file_suffix
      const txtFileInfo = this.config.recordEventDir + Constant.SCREEN_RECORD_VIDEO_DIR + txtFileName
      const fileInfo = this.config.recordEventDir + Constant.SCREEN_RECORD_VIDEO_DIR + zipFileName
      if (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.url
         videoProgress: ''
        }
        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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python的scripts文件夹作用

Windows系统&#xff1a; Scripts文件夹通常位于Python的安装目录下&#xff0c;如C:\Python\Scripts。该文件夹内包含了各种有用的工具&#xff0c;例如pip、virtualenv等&#xff0c;这些工具有助于管理和配置Python环境和依赖包。 Linux系统&#xff1a; 在Linux系统中&…

vivado管理实施、

管理实施 Vivado设计套件包括各种设计流程&#xff0c;并支持一系列设计来源。为了生成可以下载到AMD设备上的比特流&#xff0c;设计必须通过实施。实现是采取逻辑网表并将其映射到物理网表的一系列步骤目标AMD设备的阵列。实施包括&#xff1a; •逻辑优化 •逻辑单元的放…

Django添加app

Django添加App python manage.py startapp [app_name]快速上手 注册app&#xff0c;setting.py 编写url和视图的对应关系 添加视图函数 命令行启动 python manage.py runserver页面模板

Windows下安装pip

一、下载pip 官网地址&#xff1a;https://pypi.org/project/pip/#files 1.1、pip工具查找方法 单击官网首页“PyPi”选项 在弹出来的搜索框中输入“pip” 选择最新的pip版本&#xff0c;点进去 下载pip安装包包 二、安装pip 解压“pip-24.0.tar.gz”&#xff0c;进…

AI绘画提示词案例(宠物

目录 1. 雪地猫猫&#xff1a;1.1 提示词&#xff1a;1.2 效果&#xff1a; 2. 趴地猫猫&#xff1a;2.1 提示词&#xff1a;2.2 效果&#xff1a; 3. 长城萨摩耶&#xff1a;3.1 提示词&#xff1a;3.2 效果&#xff1a; 4. 沙发猫猫&#xff1a;4.1 提示词&#xff1a;4.2 效…

Unity基础学习

目录 基础知识点3D数学——基础Mathf三角函数坐标系 3D数学——向量向量模长和单位向量向量的加减乘除向量点乘向量叉乘向量插值运算 3D数学——四元数为何使用四元数四元数是什么四元数常用方法四元数计算 MonoBehavior中的重要内容延迟函数协同程序协同程序原理 Resources资源…

Linux——权限的理解

Linux——权限的理解 文章目录 Linux——权限的理解一、shell命令以及运行原理二、Linux权限的概念切换用户对指令提权 三、Linux权限管理1. 文件访问者的分类&#xff08;人&#xff09;2. 文件类型和访问权限&#xff08;事物属性&#xff09;文件类型基本权限文件权限值的表…

准备系统运行的先决条件

知识点&#xff1a; 大数据基础环境准备 重 点&#xff1a; SSH免密码连接 安装配置JDK 安装配置Scala 项目开发测试环境为分布式集群环境&#xff0c;在当前项目中使用多台基于CentOS 64bit 的虚拟机来模拟生产环境。在生产环境中建议使用高性能物理主机或云主机搭建集…

el根据需求合并列

将 列分为 3 3 1 的格式 以下是vue代码&#xff1a; <el-table:data"dataSource":border"true":header-cell-style"{ font-weight: normal, text-align: center }":cell-style"{ text-align: center }"size"mini"style…

枚举赋值及强制转换问题

对枚举进行字符赋值&#xff0c;需要进行强制类型转换之后&#xff0c;才能得到想要的值&#xff0c;如下 typedef enum data {DIRECTION_X X,DIRECTION_Y Y,DIRECTION_Z Z,DIRECTION_T T }NumData;int main() {NumData numdata DIRECTION_Y;count <<"num is&…

消息服务--Kafka的简介和使用

消息服务--Kafka的简介和使用 前言异步解耦削峰缓存1、消息队列2、kafka工作原理3、springBoot KafKa整合3.1 添加插件3.2 kafKa的自动配置类3.21 配置kafka地址3.22 如果需要发送对象配置kafka值的序列化器3.3 测试发送消息3.31 在发送测试消息的时候由于是开发环境中会遇到的…

Vue+OpenLayers7入门到实战:OpenLayers7点聚合(聚散点)功能,地图缩小显示聚集数量,点击聚集点散开和地图放大后显示要素图片

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上实现地图点聚合(聚散点)功能,实现地图缩小显示聚集数量,点击聚集点和地图放大后显示要素对应icon图片的功能。 二、依赖和使用 "ol": "7.5.2"…

计算机找不到msvcr120.dll的五种修复方法,轻松搞定msvcr120.dll丢失问题

当计算机系统中msvcr120.dll文件丢失时&#xff0c;可能会引发一系列运行问题和故障现象。msvcr120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多Windows应用程序的正常运行至关重要。由于msvcr120.dll是许多软件在运行过程中依赖的重要动态链…

Pytest+Selenium UI自动化测试实战实例(全)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 今天来说说pytest吧&#xff0c;经过几周的时间学习&#xff0c…

AI给开发经验3-5年的程序员的一些建议

Q: 你是一名CTO&#xff0c;请你给开发经验3-5年的程序员一些职业和生活方面的建议&#xff0c;1500字。 A: 作为一名有着丰富经验的CTO&#xff0c;我深知程序员在职业道路上的成长并非一帆风顺。针对开发经验在3-5年的程序员&#xff0c;我想从职业和生活两个方面&#xff0…

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

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

webhook详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 webhook简介 在当今高度连接的网络世界中,没有什么可以孤立地发挥最佳作用。完成一项任务(几乎)总是需要多个实体的参与。电子商务应用程序需要与支付系统通信,支付…

数论<1>——数论基础

这期博客是一个数论入门介绍&#xff0c;dalao们可以自动忽略。 Part 1:素数(质数) 说到数论&#xff0c;小学奥数里也有。我最先想到的就是质数了。素数就是一个只能被1和它自己整除的数。判断的方法也很简单&#xff0c;可以扫一遍就结束了&#xff0c;但是没必要。由于一个…

剑指offer JZ23链表中环的入口节点 C++

1、题目描述 2、在VS2019上运行 #include <iostream>using namespace std;struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(NULL) {} };class Solution { public:// 判断链表是否有环&#xff0c;返回相遇的地方ListNode* hasCycle(ListNode* …

Unity 采用自定义通道ShaderGraph实现FullScreen的窗户雨滴效果

效果如下 ShaderGraph实现 N21 随机化 DragLayer分层 将DragLayer分成四层&#xff0c;分别调整每层的缩放和大小 Shader实现的链接&#xff08;Unity 雨水滴到屏幕效果&#xff09; 我也是参考这个实现Shader Graph