echarts模板化开发,简易版配置大屏组件-根据配置文件输出图形和模板(vue2+echarts5.0)
实现结果

项目结构

根据我的目录和代码 复制到项目中
echartsTemplate-echarts图形
pie实例
<template><div :id="echartsId"></div>
</template>
<script>
export default {name: '',components: {},mixins: [],props: ['echartsId', 'echartsJsonData'],data() {return {};},computed: {},watch: {echartsJsonData: {handler(to) {// console.log(to, 'to');if (to) {let _this = this;this.$nextTick(() => {_this.getEcharts();});}},immediate: true,},},mounted() {},methods: {getEcharts() {const pieCharts = this.$echarts.init(document.querySelector('#' + this.echartsId));let chartData = [95.65, 96.15, 96.82, 97.45, 97.85, 99.23, 99.79, 100.77, 100.03,101.75, 101.42, 101.54, 101.24, 102.65, 103.08, 103.22, 102.87,101.86, 101.3, 100.04, 101.08, 98.58, 98.42, 99, 98.94, 99.21,99.29, 100.2, 100.41, 100.26, 101.88, 103.26, 105.1, 109.39,108.48, 108.71, 108.18, 109.15, 109.6, 106.76, 107.35, 106.77,105.99, 105.48, 104.52, 104.25, 104.94, 103.35, 103.55,];const xData = Array.from({ length: chartData.length },(_, index) => index);let options = {tooltip: {trigger: 'axis',axisPointer: {type: 'cross',},},grid: {top: 10,left: 10,bottom: 10,right: 10,containLabel: true,},xAxis: {type: 'category',data: xData,},yAxis: {scale: true,},series: [{symbolSize: 10,data: xData.map((x, i) => [x, chartData[i]]),type: 'scatter',},],};// 渲染 echartspieCharts.setOption(options, true);pieCharts.resize();},},
};
</script>
<style lang="" scoped></style>
dataHandle.js-数据处理方法
export const handleSlpmle = (data) => {// console.log(data);return data;
};
echartsGet.vue-模板调用,图形模板根据配置文件调用
<template><div><!-- 如果echartsJsonSet useFlag等于true的话那就是省份的特殊样式--><divv-if="echartsJsonSet"style="position: relative":style="{height: echartsJsonSet.height,width: echartsJsonSet.width,}"id="combatTable":class="echartsJsonSet.useFlag? `${echartsJsonSet.tempId} ${echartsJsonSet.tempId}_${echartsJsonSet.value}`: `${echartsJsonSet.tempId}`"><!-- 使用 component 标签配合 is 属性 --><div v-if="echartsJsonSet"><componentv-for="(item, index) in echartsJsonSet.echartsList":key="index":is="item.type":echartsId="item.tempName":echartsJsonData="item":style="{width: item.width,height: item.height,}":class="`${item.tempName} echartsList`"></component></div></div></div>
</template>
<script>
import pie from './echartsTemplate/pie.vue';
import areaEcharts from './echartsTemplate/areaEcharts.vue';
import bar from './echartsTemplate/bar.vue';
import lineBar from './echartsTemplate/lineBar.vue';
import lineEcharts from './echartsTemplate/lineEcharts.vue';
import mapEcharts from './echartsTemplate/mapEcharts.vue';
import radar from './echartsTemplate/radar.vue';
import stacked from './echartsTemplate/stacked.vue';
import trabecula from './echartsTemplate/trabecula.vue';
export default {name: '',components: {pie,areaEcharts,bar,lineBar,lineEcharts,mapEcharts,radar,stacked,trabecula,},mixins: [],// 'echartsJson'标准模板,默认值 'areaEchartsJson'地区模板,如果某个地区的某个图需要特殊方式显示props: ['echartsJson'],data() {return { echartsJsonSet: null };},computed: {},watch: {echartsJson: {handler(to) {if (to) {console.log(to, 'ttotooto');this.echartsJsonSet = to;}},immediate: true,},},mounted() {},methods: {},
};
</script>
<style lang="" scoped></style>
echartsTempCss.less模板css,根据规则生成的class名
.G000 {background: rgba(175, 199, 223);.echartsList {position: absolute;}.G00001 {top: 10px;left: 10px;}.G00002 {top:201px;left: 10px;}.G00003 {top: 10px;left: 267.5px;}.G00004 {top: 392px;left: 10px;border: 1px solid rgb(245, 246, 247);}.G00005 {top: 392px;left: 267.5px;border: 1px solid rgb(245, 246, 247);}.G00006 {top: 392px;left: 525px;border: 1px solid rgb(245, 246, 247);}.G00007 {top: 10px;left: 782.5px;border: 1px solid rgb(245, 246, 247);}.G00008 {top:201px;left: 782.5px;border: 1px solid rgb(245, 246, 247);}.G00009 {top: 392px;left: 782.5px;border: 1px solid rgb(245, 246, 247);}
}
functionEcharts.vue-操作按钮
<template><div><div class="block"><span class="demonstration">月</span><el-date-pickerv-model="timeValue"type="month"placeholder="选择月"></el-date-picker></div><el-select v-model="selectValue" placeholder="请选择"><el-optionv-for="item in option":key="item.value":label="item.label":value="item.value"></el-option></el-select><el-button @click="query">查询</el-button><!-- <div @click="generateAndDownloadReport">下载</div> --></div>
</template>
<script>
import html2canvas from 'html2canvas';
import provinceSetting from './provinceSetting.json';
export default {name: '',components: {},mixins: [],props: {},data() {return {selectValue: '100000',timeValue: '2024-06',option: provinceSetting,};},computed: {},watch: {},mounted() {},methods: {query() {this.$eventBus.$emit('realDatas', {time: this.formatDate(this.timeValue),province: this.selectValue,});},formatDate(dateString) {try {const date = new Date(dateString);return [date.getFullYear(),(date.getMonth() + 1).toString().padStart(2, '0'),].join('');} catch (e) {return '格式错误';}},generateAndDownloadReport() {try {const targetElement = document.getElementById('combatContent');html2canvas(targetElement, {scale: 1, // 提高分辨率backgroundColor: '#ffffff', // 背景色(可自定义)useCORS: true, // 如果有加载图片或图标}).then((canvas) => {// 生成图片链接const link = document.createElement('a');link.download = 'combat-report.png';link.href = canvas.toDataURL('image/png', 0.0);// 下载图片document.body.appendChild(link);link.click();document.body.removeChild(link);});} catch (error) {console.error('生成报告失败:', error);alert('下载失败:' + error.message);}},},
};
</script>
<style lang="" scoped></style>
index.vue-入口页面
<template><div style="padding: 10px"><paramEcharts v-if="functionFlag"></paramEcharts><echartsGet id="combatContent" :echartsJson="echartsJson"></echartsGet></div>
</template>
<script>
import echartsTempJson from './temp.json';
import provinceSetting from './provinceSetting.json';
import paramEcharts from './functionEcharts.vue';
import echartsGet from './echartsGet.vue';
import { handleSlpmle } from './dataHandle.js';export default {name: '',components: { echartsGet, paramEcharts },mixins: [],props: {},data() {return {functionFlag: true,echartsJson: null,// echartsTempJson: null,time: '202406',province: '100000',echartsListData: {},};},computed: {},watch: {},mounted() {if (this.$route.query.province) {//根据省份信息去查provinceSetting配置信息,然后根据里面的模板id去查temp公共模板配置this.functionFlag = false;//如果传了模板id就不显示参数按钮//在后台调用echarts模板时 需要时间,省份之类的参数,前端参数按钮也需要//应该从省份区模板才对// this.echartsTempJson = echartsTempJson[graphId];this.getEchartsData('202406', this.$route.query.province);} else {this.functionFlag = true;// this.time = '2024';// this.province = '100000';this.getEchartsData('202406', '100000'); //默认}let _this = this;this.$eventBus.$on('realDatas', function (res) {// console.log(res);// _this.areaEchartsJson = res.alldata;_this.getEchartsData(res.time, res.province);});},methods: {//根据传来的tiem和province去查询接口getEchartsData(time, province) {let tempC = {};// 查找对应的省份模板配置for (const elementProvince of provinceSetting) {if (province !== elementProvince.value) continue;// 遍历模板配置(公共模板)for (const key in echartsTempJson) {if (elementProvince.tempId !== key) continue;tempC = { ...echartsTempJson[key] }; // 深拷贝公共模板tempC.value = elementProvince.value;tempC.useFlag = !!elementProvince.useFlag; // 是否使用地区特殊样式// 遍历地区模板中的 echartsList 并覆盖公共模板对应项for (const elementEchartsList of elementProvince.echartsList) {for (let j = 0; j < tempC.echartsList.length; j++) {if (elementEchartsList.tempName ===tempC.echartsList[j].tempName) {if (elementEchartsList.useFlag) {tempC.echartsList[j] = {...elementEchartsList,};}if (elementEchartsList.useFunction) {tempC.echartsList[j].useFunction =elementEchartsList.useFunction;}}}}}}// 构造接口参数let params = {dateStr: time,regionCode: province,topicId: tempC.tempId,};//调用接口传数据let echartsListData = {G0001_G000001: [{ name: 1111, value: 2222 },{ name: 1111, value: 2222 },{ name: 1111, value: 2222 },{ name: 2222, value: 2222 },{ name: 2222, value: 2222 },],G0001_G000002: [{ name: 4444, value: 3333 },{ name: 4444, value: 3333 },{ name: 4444, value: 3333 },{ name: 3333, value: 3333 },{ name: 3333, value: 3333 },{ name: 3333, value: 3333 },],};for (const key in echartsListData) {for (let index = 0; index < tempC.echartsList.length; index++) {const elements = tempC.echartsList[index];// 通过模板名匹配数据键名(去掉前缀)if (elements.tempName === key.split('_')[1]) {let funcName = elements.useFunction;console.log(funcName);// 动态调用指定的数据处理函数let thisData = funcName? handleFns[funcName](echartsListData[key]): handleFns.handleSlpmle(echartsListData[key]);// 设置处理后的数据tempC.echartsList[index].optionData = thisData;}}}this.echartsJson = tempC;},},
};
</script>
<style lang="less">
@import './echartsTempCss.less';
</style>
provinceSetting.json-根据省份分别显示模板(强化公共模板)
[{"value": "100000","label": "全国","realValue": ["100000"],"tempId": "G000","useFlag": true,"echartsList": [{"useFlag": false,"tempName": "G00001","type": "pie","width": "300px","height": "400px"},{ "tempName": "G00002", "type": "pie" },{ "tempName": "G00003", "type": "pie" },{ "tempName": "G00004", "type": "pie" },{ "tempName": "G00005", "type": "pie" },{ "tempName": "G00006", "type": "pie" },{ "tempName": "G00007", "type": "pie" },{ "tempName": "G00008", "type": "pie" },{ "tempName": "G00009", "type": "pie" }]},{"value": "100001","label": "中部地区","tempId": "G0003","realValue": ["140000","340000","360000","410000","420000","430000"],"echartsList": [{"useFlag": false,"tempName": "G000301"}]}
]
temp.json-公共模板
{"G000": {"name": "全国指标速览","show": true,"tempId": "G000","width": "1030px","height": "575px","echartsList": [{"tempName": "G00001","type": "pie","width": "237.5px","height": "171px","useFunction": "handleSlpmle"},{"tempName": "G00002","type": "radar","width": "237.5px","height": "171px"},{"tempName": "G00003","type": "map","width": "515px","height": "382px"},{"tempName": "G00004","type": "area","width": "237.5px","height": "171px"},{"tempName": "G00005","type": "lineEcharts","width": "237.5px","height": "171px"},{"tempName": "G00006","type": "bar","width": "237.5px","height": "171px"},{"tempName": "G00007","type": "bar","width": "237.5px","height": "171px"},{"tempName": "G00008","type": "trabecula","width": "237.5px","height": "171px"},{"tempName": "G00009","type": "lineEcharts","width": "237.5px","height": "171px"}]},"G0003": {"name": "省份","show": true,"tempId": "G0003","width": "1030px","height": "575px","echartsList": [{"tempName": "G000301","type": "map","width": "237.5px","height": "171px"}]}
}
项目中用到的ecentbus–https://blog.csdn.net/Shi_haoliu/article/details/146340424?spm=1001.2014.3001.5501
相关文章:
echarts模板化开发,简易版配置大屏组件-根据配置文件输出图形和模板(vue2+echarts5.0)
实现结果 项目结构 根据我的目录和代码 复制到项目中 echartsTemplate-echarts图形 pie实例 <template><div :id"echartsId"></div> </template> <script> export default {name: ,components: {},mixins: [],props: [echartsId,…...
从人工到智能:外呼系统如何重构企业效率新生态
在数字化转型的浪潮中,智能外呼系统正从边缘辅助工具演变为企业效率革命的核心引擎。根据Gartner最新调研数据,部署AI外呼系统的企业客服效率平均提升68%,销售线索转化率增长42%。但在这场技术驱动的变革中,真正决定成败的往往不是…...
HTTP 2.0 和 3.0 的区别
HTTP 2.0 和 3.0 的核心区别体现在底层协议设计、性能优化和网络适应性上,以下是具体对比: 一、核心区别对比 特性HTTP 2.0HTTP 3.0(HTTP/3)底层传输协议TCPUDP(基于 QUIC 协议)队头阻塞(TCP …...
Qt项目——Tcp网络调试助手服务端与客户端
目录 前言结果预览工程文件源代码一、开发流程二、Tcp协议三、Socket四、Tcp服务器的关键流程五、Tcp客户端的关键流程六、Tcp服务端核心代码七、客户端核心代码总结 前言 这期要运用到计算机网络的知识,要搞清楚Tcp协议,学习QTcpServer ,学…...
4.21 从0开始配置spark-local模式
首先准备好安装包 然后使用命令解压 使用source /etc/profile命令让环境变量生效 输入命令 spark-submit --class org.apache.spark.examples.SparkPi --master local[2] /opt/module/spark-local/examples/jars/spark-examples_2.12-3.1.1.jar 10 即在spark运行了第一个程序…...
chili3d调试笔记3 加入c++ 大模型对话方法 cmakelists精读
加入 #include <emscripten/bind.h> #include <emscripten/val.h> #include <nlohmann/json.hpp> 怎么加包 函数直接用emscripten::function,如: emscripten::function("send_to_llm", &send_to_llm); set (CMAKE_C…...
go语言八股文
1.go语言的接口是怎么实现 接口(interface)是一种类型,它定义了一组方法的集合。任何类型只要实现了接口中定义的所有方法,就被认为实现了该接口。 代码的实现 package mainimport "fmt"// 定义接口 type Shape inte…...
C++——多态、抽象类和接口
目录 多态的基本概念 如何实现多态 在C中,派生类对象可以被当作基类对象使用 编程示例 关键概念总结 抽象类 一、抽象类的定义 基本语法 二、抽象类的核心特性 1. 不能直接实例化 2. 派生类必须实现所有纯虚函数才能成为具体类 3. 可以包含普通成员函数和…...
【Java面试笔记:基础】3.谈谈final、finally、 finalize有什么不同?
1. final、finally、finalize 的区别 final: 用途:用于修饰类、方法和变量。 修饰类:表示该类不能被继承。 final class ImmutableClass { // 此类无法被其他类继承 }修饰方法:表示该方法不能被子类重写。 class Parent {fin…...
基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐,涵盖基础理论、模型架构、实战技巧及对比分析,并附表格总结
以下是基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐,涵盖基础理论、模型架构、实战技巧及对比分析,并附表格总结: 1. 推荐书籍及内容说明 (1) 《深度学习》(Deep Learning) 作者:Ian Goodfellow…...
从数字化到智能化,百度 SRE 数智免疫系统的演进和实践
1. 为什么 SRE 需要数智免疫系统? 2022 年 10 月,在 Gartner 公布的 2023 年十大战略技术趋势中提到了「数字免疫系统」的概念,旨在通过结合数据驱动的一系列手段来提高系统的弹性和稳定性。 在过去 2 年的时间里,百度基于该…...
[Git] Git Stash 命令详解
1. Git Stash 的基本概念 Git Stash 是一个用于暂存当前工作目录中更改的命令。当你正在处理一个功能分支,但突然需要切换到另一个分支进行紧急修复或查看其他工作时,Git Stash 就显得非常有用。它允许你将当前工作目录中的更改保存起来,以便…...
ArcGIS及其组件抛出 -- “Sorry, this application cannot run under a Virtual Machine.“
产生背景: 使用的是“破解版本”或“被套壳过”的非官方 ArcGIS 版本 破解版本作者为了防止: 被研究破解方式 被自动化抓包/提权/逆向 被企业环境中部署多机使用 通常会加入**“虚拟化环境检测阻断运行”机制** 原因解释: 说明你当前运…...
Python项目调用Java数据接口实现CRUD操作
Django Python项目调用Java数据接口实现CRUD操作:接口设计与实现指南 引言 在现代软件架构中,系统间的数据交互变得越来越重要。Python和Java作为两种流行的编程语言,在企业级应用中常常需要实现跨语言的数据交互。本报告将详细介绍如何在D…...
进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程
进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程 (图片来源: ThisIsEngineering RAEng on Pexels) 在前几篇中,我们深入研究了经典的时间序列统计模型,如 ETS 和强大的 SARIMA 家族。它们在理论上成熟且应用广泛,但有…...
ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库
1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1.1. 安装依赖1.2. 安装 osxcross 及 macOS SDK 1.2.1. 可能错误 1.3. 编译 cmake 类工程1.4. 编译 configure 类工程1.5. 单文件…...
JavaScript 中的单例模式
单例模式在 JavaScript 中是一种确保类只有一个实例,并提供全局访问点的方式。由于 JavaScript 的语言特性(如对象字面量、模块系统等),实现单例有多种方式。 常见实现方式 1. 对象字面量(最简单的单例) …...
深度学习基石:神经网络核心知识全解析(一)
神经网络核心知识全解析 一、神经网络概述 神经网络作为机器学习领域的关键算法,在现代生活中发挥着重要作用,广泛应用于图像识别、语音处理、智能推荐等诸多领域,深刻影响着人们的日常生活。它通过模拟人类大脑神经系统的结构和功能&#…...
java的反编译命令
1. javap -c: 显示方法中的字节码 2. javap -p: 显示所有访问级别,包括private 3. Javap -v: verbose模式,全信息,输出的内容包括: 类的访问标志(access_flags) 类名、父类、接口 …...
影刀填写输入框(web) 时出错: Can not convert Array to String
环境: 影刀5.26.24 Win10专业版 问题描述: [错误来源]行12: 填写输入框(web) 执行 填写输入框(web) 时出错: Can not convert Array to String. 解决方案: 1. 检查变量内容 在填写输入框之前,打印BT和NR变量的值ÿ…...
词语关系图谱模型
参数配置说明 sentences, # 分词后的语料(列表嵌套列表) vector_size100, # 每个词的向量维度 window5, # 词与上下文之间的最大距离(滑动窗口大小) min_count5, # 忽略出现次数小于5的…...
《C++ 模板:泛型编程的核心》
C模板详解 模板是C中实现泛型编程的重要特性,它允许你编写与数据类型无关的代码。模板可以分为函数模板和类模板两种。 1. 函数模板 函数模板允许你定义一个可以处理多种数据类型的函数。 基本语法 template <typename T> T functionName(T parameter1, T…...
HTTP的请求消息Request和响应消息Response
一:介绍 (1)定义 service方法里的两个参数 (2)过程 Request:获取请求数据 浏览器发送http请求数据(字符串),字符串被tomcat解析,解析后tomcat会将请求数据放入request对象 Response:…...
解决Python与Java交互乱码问题:从编码角度优化数据流
在现代软件开发中,跨语言系统的集成已经成为日常工作的一部分。特别是当Python和Java之间进行交互时,编码问题往往会成为导致数据传输错误、乱码以及难以调试的主要原因之一。 你是否曾遇到过这种情境:Python脚本通过标准输出返回了正确的数…...
DES、3DES、SM4 加密算法简介
1. DES(Data Encryption Standard) 设计时间:1975 年(IBM 开发,1977 年被 NIST 采纳为美国联邦标准)。 密钥长度:64 位(实际有效 56 位 8 位校验)。 分组长度…...
C++异步操作 - future async package_task promise
异步 异步编程是一种程序设计范式,允许任务在等待耗时操作(如I/O、网络请求)时暂停执行,转而处理其他任务,待操作完成后自动恢复。其核心目标是避免阻塞主线程,提升程序的并发性和响应速度…...
Feign 深度解析:Java 声明式 HTTP 客户端的终极指南
Feign 深度解析:Java 声明式 HTTP 客户端的终极指南 Feign 是由 Netflix 开源的 声明式 HTTP 客户端,后成为 Spring Cloud 生态的核心组件(现由 OpenFeign 维护)。它通过注解和接口定义简化了服务间 RESTful 通信,并…...
08前端项目----升序/降序
升序/降序 vue实现升序/降序服务器处理 vue实现升序/降序 用vue实现升序/降序,以及css绘制三角形 <div class"sui-navbar"><div class"navbar-inner filter"><ul class"sui-nav"><li class"active"&g…...
用Java实现简易区块链:从零开始的探索
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 区块链技术作为近年来的热门话题&am…...
JavaScript 渲染内容爬取实践:Puppeteer 进阶技巧
进一步探讨如何使用 Puppeteer 进行动态网页爬取,特别是如何等待页面元素加载完成、处理无限滚动加载、单页应用的路由变化以及监听接口等常见场景。 一、等待页面元素加载完成 在爬取动态网页时,确保页面元素完全加载是获取完整数据的关键。Puppeteer…...
