用three.js+echarts给公司写了一个站点数据大屏系统经验总结


时间过的好快,参加公司的新项目研发快一年了,五一机器人项目首秀,我们遇到了高并发集中下单情景,然后海量数据处理场景来了,给我在后端领域的高并发实践业务上画上了漂亮的一笔经验。人都是在磨练中成长,我很感谢这次给我的机会,虽然有点累,但也有点小成就。正好现在有空,我先聊聊首秀后给领导们做的大屏数据展示吧,领导等着看漂亮数据呢!

大屏重点是贼啦炫酷的动态特效加持

业务核心运营场景:各大地上地下停车场

这里我用的是three.js去实现的实际业务场景的场站模拟三维图,废话不多说,直接上图吧!先说一下,这里截图是看起来像2维,但实际是3维的,可以滑动翻转地图的。

截屏2024-05-07 18.35.07.png

如图所示,这是p4停车场的全景图,整个停车场的鸟瞰图一览无余,可以滚动鼠标放大看====》

这是我用three.js渲染的每个停车位的车位标记,这里记录了这个车场的每个车位的坐标点,方便后期,观察我们投放的100台机器人智能驾驶实时模拟。听起来是不是很牛逼plus?我告诉你,事情没那么简单!由于数据太多,既要有3D-map,也要有实时动态数据滚动展示和各种echarts图表,比如:

4A71FC88-CCB1-4DD4-82B9-612DE98328B8.png
ps:不好意思,本人还要严格遵守劳动合同执行公司数据保密,相关数据已经打码。

然后一堆实时数据数据和图上来后,不出意外的意外来了,性能出现了问题,我遇到了内存泄漏的情况。这还怎么继续二期的机器人动态运行场景研发呢?别慌,一步一步排查代码。

1.先介绍下大屏顶部的总数统计动态数字翻牌器

这里我用了第三方插件:动态数字翻牌器vue-count-to,只要有数据变化,就会实时看到动态增长的效果

首先要在框架中安装npm install vue-count-to,并在项目入口文件中引入

import CountTo from 'vue-count-to';
Vue.use(CountTo)
new Vue({el: '#app',router,store,render: h => h(App)
})

实际业务开发模块中代码:

                <count-toclass="count-to":startVal="0" //开始数值:endVal="687573.74" //结束数值:duration="500000" //动态变化的时间设定:decimals="1"  //每次动态增长的数量></count-to>

2.然后在大屏的左侧,我写了一个实时从下到上无限滚动的动态订单列表,可以让领导看到最新的订单情况。


<template><div class="scrolling-list" :style="{ transform: `translate(0px,-${scrollTop}px)` }"><ul ref="scrollItemBox"><li v-for="(item, index) in items" :key="index" class="item-li"><div><span class="name">订单编号:</span><span class="content"><i class="el-icon-receiving">  {{ item.order_id }}</i></span></div><div><span class="name">订单金额:</span><span class="content"><i class="el-icon-s-finance" style="color:#1989fa" >  {{ item.pre_total_amount }}</i></span><span class="name">手机号:</span><span class="content"><i class="el-icon-mobile-phone" style="color:#1989fa">  {{ item.phone }}</i></span></div><div><span class="name">车牌号:</span><span class="content"> <i class="el-icon-truck" style="color:#1989fa">  {{ item.vehicle_no }}</i></span><span class="name">车位号:</span><span class="content"><i class="el-icon-map-location" style="color:#1989fa">  {{ item.target_slot_no }}</i></span></div><div><span class="name">订单来源:</span><span class="content">{{ item.order_from == 1 ? '小程序' : 'APP' }}</span><span class="name">下单时间:</span><span class="content"><i class="el-icon-time">  {{ item.created_at }}</i></span></div></li></ul><div v-html="copyHtml"></div></div>
</template>
<script>export default {data() {return {name: "InfiniteScroll",scrollTop: 0, //列表滚动高度speed: 15, //滚动的速度copyHtml: '',items:[],intervalId: null};},mounted() {this.initScroll()},beforeDestroy() {// 清除定时任务clearInterval(this.intervalId);},methods: {initScroll() {this.$nextTick(() => {this.copyHtml = this.$refs.scrollItemBox.innerHTMLthis.startScroll()})},// 开始滚动startScroll() {setInterval(this.scroll, this.speed);},// 滚动处理方法scroll() {this.scrollTop++// 获取需要滚动的盒子的高度let scrollItemBox = this.$refs.scrollItemBox?.offsetHeight || 1000// 当判断滚动的高度大于等于盒子高度时,从头开始滚动if (this.scrollTop >= scrollItemBox) {this.scrollTop = 0}}}};</script>

3.然后在大屏的右侧,用echarts写了两个饼图和折线图表,可以直观的的看到数据统计


export const timeStaticsOption = (xData,tipsArr) => {return {title: {text: '',subtext:'当天时间段充电订单数',subtextStyle:{color:'#fff',}},tooltip: {trigger: 'axis',axisPointer: {type: 'cross'}},xAxis: {type: 'category',data: xData,boundaryGap: false,axisLine: {show: false,lineStyle: {color: '#73B131',type: 'dashed'}},},yAxis: {type: 'value',axisPointer: {snap: true}},series: [{name: '时间段充电订单数',type: 'line',smooth: true,data: tipsArr,}]}
}
export const botDataPieEcharts = (total,a,b)=>{console.log(total,a,b)return {title: {text: '',subtext: "Bot总数:"+ total+ '台',left: 'center',subtextStyle:{color:'#fff',}},tooltip: {trigger: 'item'},// legend: {//   orient: 'vertical',//   left: 'left'// },series: [{name: 'Bot数量',type: 'pie',radius: '50%',data: [{ value: a, name: '在线:'+ a +'台' },{ value: b, name: '空闲:'+ b +'台'},],emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]}
}

4.最后也是最耗性能的部分,用three.js写的停车场模拟实景鸟瞰图,3d-map

这里我直接把相关的方法和类,全部封装好,单独引入文件,用到以下文件,

import '../public/threejs/controls/OrbitControls.js'; 
import '../public/threejs/lines/LineSegmentsGeometry.js';
import '../public/threejs/lines/LineGeometry.js';
import '../public/threejs/lines/LineMaterial.js';
import '../public/threejs/lines/LineSegments2.js';
import '../public/threejs/lines/Line2.js';

在业务中相关代码写好工具方法,

import myWorker from './map.worker';
import FONT_JSON_DATA from './helvetiker_bold.typeface.json';
class basicThree {constructor(props) {this.from = props.fromthis.callbackSlotNo = props.callbackconsole.log(props, 'props')this.LineGeometry// three 3要素this.renderer; //渲染器this.camera; //摄像头this.scene; //场景//光源this.ambientLight; //环境光this.pointLight; //平行光this.DirectionalLight//触屏开始时间this.touchTime = 0//摄像头控制this.controls;this.init()this.onmousedbclick = this.onMouseDblclick.bind(this);this.selectObjectthis.rawOptionthis.materialLine = Object()this.box = document.createElement("div")this.donXthis.donYthis.dataNumberthis.originX; // 偏移量x坐标this.originZ; // 偏移量z坐标this.thinLine;this.wideLine;// 定义模型组this.initModalGroup();this.mapParams;this.drawModalFunc = {'0': {'func': this.RoadLineSigns.bind(this),'group': 'RoadLineSigns_group','z': 0},'1': {'func': this.RoadLineSigns.bind(this),'group': 'RoadLineSigns_group','z': 0},'2': {'func': this.RoadLineSigns.bind(this),'group': 'RoadLineSigns_group','z': 2},'3': {'func': this.initNoAndArea.bind(this),'group': null,'z': 3},'4': {'func': this.basicWall.bind(this),'group': 'barrier_group','z': 3},'5': {'func': this.initSlotLine.bind(this),'group': 'initSlotLine_group','z': 3},'6': {'func': this.RoadLineSigns.bind(this),'group': 'RoadLineSigns_group','z': 3},'7': {'func': this.RoadLineSigns.bind(this),'group': 'RoadLineSigns_group','z': 3},'8': {'func': this.RoadLineSigns.bind(this),'group': 'RoadLineSigns_group','z': 3},'9': {'func': this.initSlotLine.bind(this),'group': 'initSlotLine_group','z': 3},'10': {'func': this.initSlotLine.bind(this),'group': 'initSlotLine_group','z': 3},'11': {'func': this.RoadLineSigns.bind(this),'group': 'RoadLineSigns_group','z': 3},'13': {'func': this.initSlotLine.bind(this),'group': 'initSlotLine_group',

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

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

相关文章

AGI系列(1):掌握AI大模型提示词优化术,提问准确率飙升秘籍

当我们向AI大模型提问时&#xff0c;通常人们的做法是有什么问题&#xff0c;就直接去问&#xff0c;得到大模型的回复结果&#xff0c;时好时坏&#xff0c;完全没有可控性。 那么有没有一种方式或是一套方法&#xff0c;可以让我们向大模型提问时&#xff0c;得到的结果更准确…

nacos 2.3.3 Windows系统安装详细版

1&#xff0c;下载 https://github.com/alibaba/nacos/releases 2&#xff0c;解压 3&#xff0c;将nacos的内置库(derby)&#xff0c;修改为我们自己的 mysql 3.1 创建一个数据库 3.2 连接数据库 3.3 执行mysql 脚本&#xff0c;在nacos的conf 目录下 mysql-schema.sql 执…

深入了解 Golang 多架构编译:交叉编译最佳实践

随着软件开发领域的不断发展&#xff0c;我们面临着越来越多的挑战&#xff0c;其中之一是如何在不同的平台和架构上部署我们的应用程序。Golang&#xff08;Go&#xff09;作为一种现代化的编程语言&#xff0c;具有出色的跨平台支持&#xff0c;通过其强大的多架构编译功能&a…

刷代码随想录有感(79):回溯算法——N皇后问题

题干: 代码&#xff1a; class Solution { public:vector<vector<string>> res;void backtracking(vector<string>& chessboard, int n, int row){if(row n){res.push_back(chessboard);return;}for(int col 0; col < n; col){if(isvalid(chessboa…

将3D检测的box框投影到BEV图片上

前言 点云数据作为一种丰富的三维空间信息表达方式&#xff0c;通常用于自动驾驶、机器人导航和三维建模等领域。然而&#xff0c;点云数据的直观性不如二维图像&#xff0c;这限制了它在一些需要快速视觉反馈的应用场景中的使用。本文将探讨如何将点云数据转换为二维图像&…

公共代理IP和独享代理IP之间的区别?

公共代理IP和独享代理IP在网络应用中扮演着不同的角色&#xff0c;它们之间的区别主要体现在使用方式、性能、安全性以及隐私保护等方面。以下是对这两种代理IP的详细对比和分析。 第一点就是使用的方式以及成本上的不同&#xff0c;公共代理IP&#xff0c;顾名思义&#xff0…

python基于深度学习的聊天机器人设计

python基于深度学习的聊天机器人设计 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 登录注册功能 用户在没有登录自己的用户名之前只能浏览本网站的首页&#xff0c;想要使用其他功能都…

服务器被黑?快速检测和识别系统中的恶意进程

在管理和维护服务器时,检测和识别系统中的恶意进程是非常重要的。本文将详细介绍几种常用方法和工具,帮助您有效地检测和处理恶意进程,确保系统的安全性。 方法一:使用系统监控工具 1.1. 使用 ps 命令 ps 命令可以列出系统中所有正在运行的进程。使用以下命令查看特定用户…

SpringBoo+vue3整合讯飞星火3.5通过webscoket实现聊天功能(全网首发)附带展示效果

API版本&#xff1a;Spring Boot 整合讯飞星火3.5通过接口Api接口实现聊天功能&#xff08;首发&#xff09;复制粘贴即可使用&#xff0c;后续更新WebSocket实现聊天功能_讯飞星火web聊天-CSDN博客https://blog.csdn.net/qq_53722480/article/details/138865508?csdn_share_t…

STL库 —— unordered_set与unordered_map的封装

这里要对 unordered_set 与 unordered_map 进行封装&#xff0c;封装时使用的是上一篇中学的 HashBucket 。不仅要完成封装&#xff0c;同时要写入迭代器。 一、HashBucket 的修改 1.1 节点的修改 T 首先来认识一下使用 unordered_set 和 ordered_map 时的区别&#xff1a; …

深入浅出MySQL事务实现底层原理

重要概念 事务的ACID 原子性&#xff08;Atomicity&#xff09;&#xff1a;即不可分割性&#xff0c;事务中的操作要么全不做&#xff0c;要么全做一致性&#xff08;Consistency&#xff09;&#xff1a;一个事务在执行前后&#xff0c;数据库都必须处于正确的状态&#xf…

Java开发大厂面试第17讲:MySQL 的优化方案有哪些?数据库设计、查询优化、索引优化、硬件和配置优化等

性能优化&#xff08;Optimize&#xff09;指的是在保证系统正确性的前提下&#xff0c;能够更快速响应请求的一种手段。而且有些性能问题&#xff0c;比如慢查询等&#xff0c;如果积累到一定的程度或者是遇到急速上升的并发请求之后&#xff0c;会导致严重的后果&#xff0c;…

变分自动编码器(VAE)深入理解与总结

本文导航 0 引言1 起源1.1 自编码器的任务定义1.2 自编码器存在的问题1.3 VAE的核心思路 2 VAE的建模过程2.1 VAE的任务定义2.2 真实分布 ϕ \phi ϕ是什么&#xff0c;为什么要逼近这个分布的参数&#xff0c;如何做&#xff1f;2.3 “重参数化&#xff08;Reparameterization…

互联网十万个为什么之 什么是Kubernetes(K8s)?

Kubernetes&#xff08;通常简称为K8s&#xff09;是一款用于自动部署、扩缩和管理容器化应用程序的开源容器编排平台。Kubernetes已发展为现代企业实现敏捷开发、快速迭代、资源优化及灵活扩展的关键技术组件之一。它拥有庞大的开源社区和丰富的生态系统。围绕Kubernetes已经形…

.lib .a .dll库互转

编译 mingw工具&#xff0c;gendef.exe转换dll为a&#xff0c;reimp转换lib为adlltool.exe --dllname python38.dll --def python38.def --output-lib libpython38.adlltool -k -d crypto.lib -l crypto.a 创作不易&#xff0c; 小小的支持一下吧&#xff01;

QT之常用控件

一个图形化界面当然需要有各种各样的控件&#xff0c;QT也不例外&#xff0c;在QT designer中就有提供各种各样的控件&#xff0c;用以开发图形化界面。 而想使用好一个QT控件&#xff0c;就需要了解这些控件。 QWidget 在QT中&#xff0c;所有控件都继承自 QWidget 类&…

推荐10款优秀的组件库(一)

1.Ant Desgin UI 网址&#xff1a; https://ant-design-mobile.antgroup.com/zh Ant Design - 一套企业级 UI 设计语言和 React 组件库 "Ant Design Mobile"是一个在线的移动端Web体验平台&#xff0c;让你探索移动端Web的体验极限。 添加图片注释&#xff0c;不…

622.设计循环队列

typedef struct {int* a;int head;int tail;int k; } MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj); bool myCircularQueueIsFull(MyCircularQueue* obj);//初始化 MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj(MyCircularQue…

探索python列表处理:偶数筛选的两种方法

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、不使用列表生成式的偶数筛选 1. 读取输入列表 2. 筛选偶数 三、使用列表生…

重学java 46.集合 ① Collection集合

事常与人违&#xff0c;事总在人为 —— 24.5.26 集合 知识导航 1.集合的特点以及作用 2.使用collection接口中的方法 3.使用迭代器迭代集合 4.ArrayList以及LinkedList的使用 5.使用增强for遍历集合 一、单列集合框架的介绍 1.长度可变的容器&#xff1a;集合 2.集合的特点 a.…