dev-QQq
方佳 博 2 years ago
parent 960d759241
commit fe28a8d23d

@ -256,3 +256,23 @@ span{
padding: 38px 20px 0;
}
}
.main-but {
margin: 0px 20px 0;
display: flex;
.el-button:nth-child(1) {
width: 150px;
height: 50px;
background: url("@/assets/images/011.png");
color: #ffffff;
border-color: #ffffff00;
background-size: 100% 100%;
}
.el-button:nth-child(2) {
width: 150px;
height: 50px;
background: url("@/assets/images/022.png");
color: #ffffff;
border-color: #ffffff00;
background-size: 100% 100%;
}
}

@ -17,7 +17,7 @@ const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分
// baseURL: import.meta.env.VITE_APP_BASE_API,
// baseURL:'http://118.31.7.2:9868/',
baseURL:'http://192.168.2.28:9868/',
baseURL:'http://192.168.2.4:9868/',
// 超时
timeout: 100000
})

@ -0,0 +1,420 @@
<template>
<div class="app-container">
<div class="frame">
<div class="left">
<el-scrollbar height="650px" style="height:96%">
<div style="width: calc(100% - 216px);">
<p class="test">大数据之所以称为大数据因其和小数据比较起来有显著的特征:</p>
<div class="topic" v-for="(item, index) in data" :key="item">
<div class="setp">
<div class="setp-item">{{ index + 1 }}</div>
<span>{{ item.topicName }}</span>
</div>
<div class="content">
<p v-for="(item1,index1) in item.topicOption" :key="index1" style="position: relative;">
<el-radio-group v-model="item1.radio" class="ml-4" text-color="#ffffff00">
<el-radio @click.prevent="clickRadio(index,index1)" :label="item1.checked" size="large">{{ item1.name }}</el-radio>
</el-radio-group>
<span class="tsRight" v-if="elRadioIndex(index,index1)&&isShow"></span>
</p>
</div>
</div>
</div>
</el-scrollbar>
<div class="dialog-footer">
<el-button @click="sendTitle()" class="tj">提交任务</el-button>
<el-button type="primary" @click="startOver" class="cxks">
重新开始
</el-button>
</div>
</div>
<div class="right">
<span @click="frameDialogVisible=true"></span>
</div>
<el-dialog
custom-class="gdialog"
v-model="frameDialogVisible"
title="大数据技术框架"
width="70%">
<el-scrollbar height="660px">
<p>在2003年Google创造了两个突破使得大数据成为可能一个是Hadoop它由两个关键服务组成<br/>
· 使用Hadoop分布式文件系统(HDFS)可靠的数据存储<br/>
· 使用称为MapReduce的技术进行高性能并行数据处理
</p>
<p style="font-weight:600;">大数据平台通用架构</p>
<p>大数据技术的体系庞大且复杂基础的技术包含数据的采集数据预处理分布式存储NoSQL数据库数据仓库机器学习并行计算可视化等各种技术范畴<br/>和不同的技术层面<br/>
首先科学的给出一个通用化的大数据处理技术框架主要分为下面几个方面数据采集与预处理数据存储数据清洗数据查询分析和数据可视化
</p>
<p><img src="@/assets/images/szjj/u1706.png" alt=""></p>
<p style="font-weight:600;">数据采集与预处理</p>
<p> 对于各种来源的数据包括移动互联网数据社交网络的数据等这些结构化和非结构化的海量数据是零散的也就是所谓的数据孤岛此时的这些数据并没有什么意义数据采集就是将这些数据写入数据仓库中把零散的数据整合在一起对这些数据综合起来进行分析数据采集包括文件日志的采集数据库日志的采集关系型数据库的接入和应用程序的接入等在数据量比较小的时候可以写个定时的脚本将日志写入存储系统但随着数据量的增长这些方法无法提供数据安全保障并且运维困难需要更强壮的解决方案<br/>
Flume NG作为实时日志收集系统支持在日志系统中定制各类数据发送方用于收集数据同时对数据进行简单处理并写到各种数据接收方(比如文本HDFSHbase等)Flume NG采用的是三层架构Agent层Collector层和Store层每一层均可水平拓展其中Agent包含SourceChannel和 Sinksource用来消费收集数据源到channel组件中channel作为中间临时存储保存所有source的组件信息sink从channel中读取数据读取成功之后会删除channel中的信息<br/>
NDCNetease Data Canal直译为网易数据运河系统是网易针对结构化数据库的数据实时迁移同步和订阅的平台化解决方案它整合了网易过去在数据传输领域的各种工具和经验将单机数据库分布式数据库OLAP系统以及下游应用通过数据链路串在一起除了保障高效的数据传输外NDC的设计遵循了单元化和平台化的设计哲学<br/>
Logstash是开源的服务器端数据处理管道能够同时从多个来源采集数据转换数据然后将数据发送到您最喜欢的 存储库 一般常用的存储库是ElasticsearchLogstash 支持各种输入选择可以在同一时间从众多常用的数据来源捕捉事件能够以连续的流式传输方式轻松地从您的日志指标Web 应用数据存储以及各种 AWS 服务采集数据<br/>
Sqoop用来将关系型数据库和Hadoop中的数据进行相互转移的工具可以将一个关系型数据库(例如MysqlOracle)中的数据导入到Hadoop(例如HDFSHiveHbase)也可以将Hadoop(例如HDFSHiveHbase)中的数据导入到关系型数据库(例如MysqlOracle)Sqoop 启用了一个 MapReduce 作业极其容错的分布式并行计算来执行任务Sqoop 的另一大优势是其传输大量结构化或半结构化数据的过程是完全自动化的<br/>
流式计算是行业研究的一个热点流式计算对多个高吞吐量的数据源进行实时的清洗聚合和分析可以对存在于社交网站新闻等的数据信息流进行快速的处理并反馈目前大数据流分析工具有很多比如开源的stromspark streaming等<br/>
Strom集群结构是有一个主节点nimbus和多个工作节点supervisor组成的主从结构主节点通过配置静态指定或者在运行时动态选举nimbus与supervisor都是Storm提供的后台守护进程之间的通信是结合Zookeeper的状态变更通知和监控通知来处理nimbus进程的主要职责是管理协调和监控集群上运行的topology包括topology的发布任务指派事件处理时重新指派任务等supervisor进程等待nimbus分配任务后生成并监控workerjvm进程执行任务supervisor与worker运行在不同的jvm上如果由supervisor启动的某个worker因为错误异常退出或被kill掉supervisor会尝试重新生成新的worker进程<br/>
当使用上游模块的数据进行计算统计分析时就可以使用消息系统尤其是分布式消息系统Kafka使用Scala进行编写是一种分布式的基于发布/订阅的消息系统Kafka的设计理念之一就是同时提供离线处理和实时处理,以及将数据实时备份到另一个数据中心Kafka可以有许多的生产者和消费者分享多个主题将消息以topic为单位进行归纳Kafka发布消息的程序称为producer也叫生产者预订topics并消费消息的程序称为consumer也叫消费者当Kafka以集群的方式运行时可以由一个服务或者多个服务组成每个服务叫做一个broker运行过程中producer通过网络将消息发送到Kafka集群集群向消费者提供消息Kafka通过Zookeeper管理集群配置选举leader以及在Consumer Group发生变化时进行rebalanceProducer使用push模式将消息发布到brokerConsumer使用pull模式从broker订阅并消费消息Kafka可以和Flume一起工作如果需要将流式数据从Kafka转移到hadoop可以使用Flume代理agent将Kafka当做一个来源source这样可以从Kafka读取数据到Hadoop<br/>
Zookeeper是一个分布式的开放源码的分布式应用程序协调服务提供数据同步服务它的作用主要有配置管理名字服务分布式锁和集群管理配置管理指的是在一个地方修改了配置那么对这个地方的配置感兴趣的所有的都可以获得变更省去了手动拷贝配置的繁琐还很好的保证了数据的可靠和一致性同时它可以通过名字来获取资源或者服务的地址等信息可以监控集群中机器的变化实现了类似于心跳机制的功能</p>
<p style="font-weight:600;">数据存储</p>
<p>
Hadoop作为一个开源的框架专为离线和大规模数据分析而设计HDFS作为其核心的存储引擎已被广泛用于数据存储<br/>
HBase是一个分布式的面向列的开源数据库可以认为是hdfs的封装本质是数据存储NoSQL数据库HBase是一种Key/Value系统部署在hdfs上克服了hdfs在随<br/>机读写这个方面的缺点与hadoop一样Hbase目标主要依靠横向扩展通过不断增加廉价的商用服务器来增加计算和存储能力<br/>
Phoenix相当于一个Java中间件帮助开发工程师能够像使用JDBC访问关系型数据库一样访问NoSQL数据库HBase<br/>
Yarn是一种Hadoop资源管理器可为上层应用提供统一的资源管理和调度它的引入为集群在利用率资源统一管理和数据共享等方面带来了巨大好处Yarn由下面的几大组件构成一个全局的资源管理器ResourceManagerResourceManager的每个节点代理NodeManager表示每个应用的Application以及每一个ApplicationMaster拥有多个Container在NodeManager上运行<br/>
Mesos是一款开源的集群管理软件支持HadoopElasticSearchSparkStorm 和Kafka等应用架构<br/>
Redis是一种速度非常快的非关系数据库可以存储键与5种不同类型的值之间的映射可以将存储在内存的键值对数据持久化到硬盘中使用复制特性来扩展性能还可以使用客户端分片来扩展写性能<br/>
Atlas是一个位于应用程序与MySQL之间的中间件在后端DB看来Atlas相当于连接它的客户端在前端应用看来Atlas相当于一个DBAtlas作为服务端与应用程序通讯它实现了MySQL的客户端和服务端协议同时作为客户端与MySQL通讯它对应用程序屏蔽了DB的细节同时为了降低MySQL负担它还维护了连接池Atlas启动后会创建多个线程其中一个为主线程其余为工作线程主线程负责监听所有的客户端连接请求工作线程只监听主线程的命令请求<br/>
Kudu是围绕Hadoop生态圈建立的存储引擎Kudu拥有和Hadoop生态圈共同的设计理念它运行在普通的服务器上可分布式规模化部署并且满足工业界的高可用要求其设计理念为fast analytics on fast data作为一个开源的存储引擎可以同时提供低延迟的随机读写和高效的数据分析能力Kudu不但提供了行级的插入更新删除API同时也提供了接近Parquet性能的批量扫描操作使用同一份存储既可以进行随机读写也可以满足数据分析的要求Kudu的应用场景很广泛比如可以进行实时的数据分析用于数据可能会存在变化的时序数据应用等<br/>
在数据存储过程中涉及到的数据表都是成千上百列包含各种复杂的Query推荐使用列式存储方法比如parquent,ORC等对数据进行压缩Parquet 可以支持灵活的压缩选项显著减少磁盘上的存储
</p>
<p style="font-weight:600;">数据清洗</p>
<p>
MapReduce作为Hadoop的查询引擎用于大规模数据集的并行计算Map映射Reduce归约是它的主要思想它极大的方便了编程人员在不会分布式并行编程的<br/>情况下将自己的程序运行在分布式系统中<br/>
随着业务数据量的增多需要进行训练和清洗的数据会变得越来越复杂这个时候就需要任务调度系统比如oozie或者azkaban对关键任务进行调度和监控<br/>
Oozie是用于Hadoop平台的一种工作流调度引擎提供了RESTful API接口来接受用户的提交请求(提交工作流作业)当提交了workflow后由工作流引擎负责workflow的执行以>及状态的转换用户在HDFS上部署好作业(MR作业)然后向Oozie提交WorkflowOozie以异步方式将作业(MR作业)提交给Hadoop这也是为什么当调用Oozie 的RESTful接口提交作业之后能立即返回一个JobId的原因用户程序不必等待作业执行完成因为有些大作业可能会执行很久(几个小时甚至几天)Oozie在后台以异步方式再将workflow对应的Action提交给hadoop执行<br/>
Azkaban也是一种工作流的控制引擎可以用来解决有多个hadoop或者spark等离线计算任务之间的依赖关系问题azkaban主要是由三部分构成Relational DatabaseAzkaban Web Server和Azkaban Executor Serverazkaban将大多数的状态信息都保存在MySQL中Azkaban Web Server提供了Web UI是azkaban主要的管理者包括project的管理认证调度以及对工作流执行过程中的监控等Azkaban Executor Server用来调度工作流和任务记录工作流或者任务的日志 <br/>
</p>
<p style="font-weight:600;">数据查询分析</p>
<p> Hive的核心工作就是把SQL语句翻译成MR程序可以将结构化的数据映射为一张数据库表并提供 HQL(Hive SQL)查询功能Hive本身不存储和计算数据它完全依赖于HDFS和MapReduce可以将Hive理解为一个客户端工具将SQL操作转换为相应的MapReduce jobs然后在hadoop上面运行Hive支持标准的SQL语法免去了用户编写MapReduce程序的过程它的出现可以让那些精通SQL技能但是不熟悉MapReduce 编程能力较弱与不擅长Java语言的用户能够在HDFS大规模数据集上很方便地利用SQL 语言查询汇总分析数据<br/>
Hive是为大数据批量处理而生的Hive的出现解决了传统的关系型数据库(MySqlOracle)在大数据处理上的瓶颈 Hive 将执行计划分成map->shuffle->reduce->map->shuffle->reduce的模型如果一个Query会被编译成多轮MapReduce则会有更多的写中间结果由于MapReduce执行框架本身的特点过多的中间过程会增加整个Query的执行时间在Hive的运行过程中用户只需要创建表导入数据编写SQL分析语句即可剩下的过程由Hive框架自动的完成<br/>
Impala是对Hive的一个补充可以实现高效的SQL查询使用Impala来实现SQL on Hadoop用来进行大数据实时查询分析通过熟悉的传统关系型数据库的SQL风格来操作大数据同时数据也是可以存储到HDFS和HBase中的Impala没有再使用缓慢的Hive+MapReduce批处理而是通过使用与商用并行关系数据库中类似的分布式查询引擎由Query PlannerQuery Coordinator和Query Exec Engine三部分组成可以直接从HDFS或HBase中用SELECTJOIN和统计函数查询数据从而大大降低了延迟<br/>
Impala将整个查询分成一执行计划树而不是一连串的MapReduce任务相比Hive没了MapReduce启动时间Hive 适合于长时间的批处理查询分析而Impala适合于实时交互式SQL查询Impala给数据人员提供了快速实验验证想法的大数据分析工具可以先使用Hive进行数据转换处理之后使用Impala在Hive处理好后的数据集上进行快速的数据分析总的来说Impala把执行计划表现为一棵完整的执行计划树可以更自然地分发执行计划到各个Impalad执行查询而不用像Hive那样把它组合成管道型的map->reduce模式以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle但是Impala不支持UDF能处理的问题有一定的限制<br/>
Spark拥有Hadoop MapReduce所具有的特点它将Job中间输出结果保存在内存中从而不需要读取HDFSSpark 启用了内存分布数据集除了能够提供交互式查询外它还可以优化迭代工作负载Spark 是在 Scala 语言中实现的它将 Scala 用作其应用程序框架 Hadoop 不同Spark Scala 能够紧密集成其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集<br/>
Nutch 是一个开源Java 实现的搜索引擎它提供了我们运行自己的搜索引擎所需的全部工具包括全文搜索和Web爬虫Solr用Java编写运行在Servlet容器如Apache Tomcat或Jetty的一个独立的企业级搜索应用的全文搜索服务器它对外提供类似于Web-service的API接口用户可以通过http请求向搜索引擎服务器提交一定格式的XML文件生成索引也可以通过Http Get操作提出查找请求并得到XML格式的返回结果<br/>
Elasticsearch是一个开源的全文搜索引擎基于Lucene的搜索服务器可以快速的储存搜索和分析海量的数据设计用于云计算中能够达到实时搜索稳定可靠快速安装使用方便<br/>
还涉及到一些机器学习语言比如Mahout主要目标是创建一些可伸缩的机器学习算法供开发人员在Apache的许可下免费使用深度学习框架Caffe以及使用数据流图进行数值计算的开源软件库TensorFlow等常用的机器学习算法比如贝叶斯逻辑回归决策树神经网络协同过滤等<br/>
</p>
<p style="font-weight:600;"> 数据可视化</p>
<p>
对接一些BI平台将分析得到的数据进行可视化用于指导决策服务主流的BI平台比如FineBI国外的敏捷BI TableauQlikviewPowrerBI等国内的SmallBI和新兴的有数BI等<br/>
在上面的每一个阶段保障数据的安全是不可忽视的问题<br/>
基于网络身份认证的协议Kerberos用来在非安全网络中对个人通信以安全的手段进行身份认证它允许某实体在非安全网络环境下通信向另一个实体以一种安全的方式证明自己的身份<br/>
控制权限的ranger是一个Hadoop集群权限框架提供操作监控管理复杂的数据权限它提供一个集中的管理机制管理基于yarn的Hadoop生态圈的所有数据权限可以对Hadoop生态的组件如HiveHbase进行细粒度的数据访问控制通过操作Ranger控制台管理员可以轻松的通过配置策略来控制用户访问HDFS文件夹HDFS文件数据库字段权限这些策略可以为不同的用户和组来设置同时权限可与hadoop无缝对接
</p>
<p style="font-weight:600;">大数据通用处理流程</p>
<p><img src="@/assets/images/szjj/u1685.png" alt=""></p>
</el-scrollbar>
</el-dialog>
</div>
</div>
</template>
<script setup>
// import {getUserId} from '@/utils/auth.js'
import {topicPresentation,topicSelection,submitTrainingTask} from '@/api/hash/digitalEconomy.js'
const { proxy } = getCurrentInstance();
const frameDialogVisible = ref(false);
const radio1 = ref(-1)
const data = ref([
{
topicId: "1b2eccf76e0e4080a99c19358dfcd7b7",
topicName: "区块链中常用的哈希算法是( ",
topicType: "单选题",
topicDifficultyLevel: null,
topicScore: 10,
topicNumber: null,
topicOption:{
A: "SHA-256",
B: "SHA-512",
C: "MD5",
D: "SHA-1",
E: "SHA-256",
F: "SHA-512",
G: "MD5",
K: "SHA-1",
A: "SHA-256",
B: "SHA-512",
C: "MD5",
D: "SHA-1",
A: "SHA-256",
B: "SHA-512",
C: "MD5",
D: "SHA-1",
A: "SHA-256",
B: "SHA-512",
C: "MD5",
D: "SHA-1",
},
optionE: null,
optionF: null,
answer: "B",
studentAnswer: "A",
questionAnswer: null,
module: "哈希函数",
logic: 1,
state: null,
reason: null,
optionImg: null,
rightOrWrong: "错误",
},
{
topicId: "1cc64b24a2f2493b89741f1464dfb626",
topicName: "关于哈希函数,下列说法错误的是( ",
topicType: "单选题",
topicDifficultyLevel: null,
topicScore: 10,
topicNumber: null,
option:{
A: "哈希函数是一种单向函数",
B: "哈希函数是一种不可逆函数",
C: "哈希函数是一种可逆函数",
D: "哈希函数是一种压缩函数",
},
optionE: null,
optionF: null,
answer: "C",
studentAnswer: "A",
questionAnswer: null,
module: "哈希函数",
logic: 1,
state: null,
reason: null,
optionImg: null,
rightOrWrong: "错误",
},
]);
const isShow=ref(false)
const getList=async()=>{
try{
const sendData={
module:'大数据技术框架',
userId:'487'
}
const res=await topicPresentation(sendData)
data.value=res.data
let ra=0
data.value.forEach((item,index)=>{
const topicArray = item.topicOption.split(',');
// topicArray.pop();
item.topicOption=topicArray.map(name => ({ name: name.trim(), checked: false ,radio:isFT(item.stuAnswer,name) }));
})
// console.log(data.value);
}catch(e){
console.log(e);
}
}
let errorNumber=0
const isFT=(stuAnswer,item)=>{
if(stuAnswer===null){
return true
}
isShow.value=true
for (let index = 0; index < stuAnswer.length; index++) {
if(stuAnswer[index]===item)
return false
}
return true
}
getList()
const clickRadio=(index,index1)=>{
if(data.value[index].topicOption[index1].radio){
data.value[index].topicOption[index1].radio=false
}else{
data.value[index].topicOption[index1].radio=true
}
}
//
const sendTitle=async()=>{
try{
const nowStuSelectDTOList = data.value.map((question, index) => {
const selectedItems = question.topicOption.filter(item => !item.radio).map(item => item.name);
return {
id: question.id,
select: selectedItems
};
});
const sendData={
"StuSelectDetailsDTO":{
"userId":'487',
"module":"大数据技术框架",
"stuSelectDTOList":nowStuSelectDTOList
}
}
const res=await topicSelection(sendData)
errorNumber=res.data
setTimeout(() => {
sendTask()
}, 200);
frameDialogVisible.value=false
}catch(e){
console.log(e);
}
}
const startOver=()=>{
// getList()
data.value.forEach((item,index)=>{
item.topicOption.forEach((item)=>{
item.radio=true
})
})
// frameDialogVisible.value=false
}
const elRadioIndex=(index,cIndex)=>{
if(index===0){
if(cIndex===0||cIndex===1||cIndex===2){
return true
}
}
if(index===1){
if(cIndex===3||cIndex===4||cIndex===5||cIndex===6){
return true
}
}
if(index===2){
if(cIndex===7||cIndex===8){
return true
}
}
if(index===3){
if(cIndex===9||cIndex===10||cIndex===11||cIndex===12||cIndex===13){
return true
}
}
if(index===4){
if(cIndex===14||cIndex===15||cIndex===16||cIndex===17){
return true
}
}
return false
}
const sendTask=async()=>{
try{
const sendData={
module:'大数据',
numberOfErrors:errorNumber > 10 ? 10 :errorNumber ,
taskName:'大数据技术框架',
userId:getUserId()
}
const res=await submitTrainingTask(sendData)
proxy.$modal.msgSuccess("提交成功")
}catch{}
}
</script>
<style lang='scss' scoped>
.frame {
display: flex;
.left{
position: relative;
width:100%;
}
.right{
position: absolute;
top: 150px;
right: 20px;
width: 216px;
padding-left: 60px;
span {
display: inline-block;
width: 110px;
height: 143px;
background: url("@/assets/images/szjj/案例任务.png") no-repeat;
background-size: 100% 100%;
}
}
p{
// font-size: 1px;
font-family: Source Han Sans CN;
// font-weight:600;
color: #FFFFFF;
}
.topic {
.setp {
display: flex;
align-items: center;
.setp-item {
width: 25px;
height: 25px;
background: #5621f8;
border-radius: 50%;
font-size: 12px;
text-align: center;
line-height: 25px;
color: #ffffff;
}
span {
margin-left: 8px;
font-size: 12px;
font-family: Source Han Sans CN;
font-weight: 600;
color: #FFFFFF;
}
}
.content{
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px 20px;
margin: 26px 0px;
}
p {
height: 36px;
background: #e9ebfc;
border-radius: 4px;
padding: 0px 20px;
margin: 0px;
}
}
}
.dialog-footer{
.el-button{
background: url('@/assets/images/szjj/提交任务.png') no-repeat;
background-size: 100% 100%;
width: 136px;
height: 40px;
border:none;
border-color:none;
}
.tj{
color: #FFFFFF;
}
.cxks{
background: url('@/assets/images/szjj/重新开始.png') no-repeat;
}
}
.tsRight{
color: green;
position: absolute;
right: 12px;
top: 9px;
}
:deep(.el-radio__inner){
border-radius: 0 !important;
}
</style>

@ -16,7 +16,7 @@
</div>
<div class="app-main">
<div class="main-left">
<el-scrollbar height="550px" style="padding: 0 10px" min-size="5">
<el-scrollbar height="560px" style="padding: 0 10px" min-size="5">
<div>
<div class="left-top">
<span>选择指标</span>
@ -626,28 +626,10 @@ const startOver = () => {
border: 1px solid #0452c6;
padding: 5px 20px;
}
.main-but {
margin: 5px 20px 0;
display: flex;
.el-button:nth-child(1) {
width: 180px;
height: 56px;
background: url("../../../assets/images/011.png");
color: #ffffff;
border-color: #ffffff00;
}
.el-button:nth-child(2) {
width: 180px;
height: 56px;
background: url("../../../assets/images/022.png");
color: #ffffff;
border-color: #ffffff00;
}
}
.app-main {
// background-color: #f5f5f5;
// min-height: 965px;
margin: 5px 20px 0;
margin: 0px 20px 0;
height: 100%;
display: flex;
// overflow: auto;

@ -17,7 +17,7 @@
<div class="app-main">
<div class="main-left">
<el-scrollbar height="550px" style="padding: 0 10px" min-size="5">
<el-scrollbar height="560px" style="padding: 0 10px" min-size="5">
<div>
<div class="left-top">
<span>选择指标</span>
@ -670,28 +670,10 @@ const handleExport = async (name) => {
border: 1px solid #0452c6;
padding: 5px 20px;
}
.main-but {
margin: 5px 20px 0;
display: flex;
.el-button:nth-child(1) {
width: 180px;
height: 56px;
background: url("../../../assets/images/011.png");
color: #ffffff;
border-color: #ffffff00;
}
.el-button:nth-child(2) {
width: 180px;
height: 56px;
background: url("../../../assets/images/022.png");
color: #ffffff;
border-color: #ffffff00;
}
}
.app-main {
// background-color: #f5f5f5;
// min-height: 965px;
margin: 5px 20px 0;
margin: 0px 20px 0;
height: 100%;
display: flex;
// overflow: auto;

@ -534,28 +534,10 @@ const download = () => {
border: 1px solid #0452c6;
padding: 5px 20px;
}
.main-but {
margin: 5px 20px 0;
display: flex;
.el-button:nth-child(1) {
width: 180px;
height: 56px;
background: url("../../../assets/images/011.png");
color: #ffffff;
border-color: #ffffff00;
}
.el-button:nth-child(2) {
width: 180px;
height: 56px;
background: url("../../../assets/images/022.png");
color: #ffffff;
border-color: #ffffff00;
}
}
.app-main {
// background-color: #f5f5f5;
// min-height: 965px;
margin: 5px 20px 0;
margin: 0px 20px 0;
height: 100%;
display: flex;
// overflow: auto;

@ -642,26 +642,8 @@ const switchingModels = () => {
border: 1px solid #0452c6;
padding: 5px 20px;
}
.main-but {
margin: 5px 20px 0;
display: flex;
.el-button:nth-child(1) {
width: 180px;
height: 56px;
background: url("../../../assets/images/011.png");
color: #ffffff;
border-color: #ffffff00;
}
.el-button:nth-child(2) {
width: 180px;
height: 56px;
background: url("../../../assets/images/022.png");
color: #ffffff;
border-color: #ffffff00;
}
}
.app-main {
margin: 5px 20px 0;
margin: 0px 20px 0;
height: 100%;
display: flex;
overflow: auto;

@ -16,7 +16,7 @@
</div>
<div class="app-main">
<div class="main-left">
<el-scrollbar height="550px" style="padding: 0 10px" min-size="5">
<el-scrollbar height="560px" style="padding: 0 10px" min-size="5">
<div>
<div class="left-top">
<span>选择指标</span>
@ -644,28 +644,10 @@ const startOver = () => {
border: 1px solid #0452c6;
padding: 5px 20px;
}
.main-but {
margin: 5px 20px 0;
display: flex;
.el-button:nth-child(1) {
width: 180px;
height: 56px;
background: url("../../../assets/images/011.png");
color: #ffffff;
border-color: #ffffff00;
}
.el-button:nth-child(2) {
width: 180px;
height: 56px;
background: url("../../../assets/images/022.png");
color: #ffffff;
border-color: #ffffff00;
}
}
.app-main {
// background-color: #f5f5f5;
// min-height: 965px;
margin: 5px 20px 0;
margin: 0px 20px 0;
// height: 100%;
display: flex;
overflow: auto;

Loading…
Cancel
Save