指挥航空公司架次与延误率占比

news2025/1/12 7:56:27

打开前端Vue项目kongguan_web,创建前端 src/components/Delay.vue 页面,并添加柱状图与折线图叠加,设置双Y轴。

  • 页面div设计,代码如下:
<template>
  <div>
    <div class="home">
      <div id="map-chart-06"></div>
    </div>
  </div>
</template>
... 接下页 ...
  • 引入 ECharts 插件,代码如下:
... 接上页 ...
<script>
  import echarts from "echarts";
  import {getFindCompanyDelay} from "../api/user/api.js";
... 接下页 ...
  • 初始化ECharts,代码如下:
... 接上页 ...
  export default {
    name: "Home",
    data() {
      return {
        chart: null,
        geoCoordMap: {},
        xData: [],        //x轴数值
        delayData: [],   //延误率
        sortieData: []   //架次

      };
    },
    mounted() {
      this.loadData();
    },
    methods: {
      initChart() {
        const option = {
          title: {
            text: '指挥航空公司架次与延误率占比',
            top: 18,
            left: 26,
          },
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'cross',
              crossStyle: {
                color: '#999'
              }
            }
          },
          grid: {
            left: '3%',
            right: '8%',
            bottom: '3%',
            top: '15%',
            containLabel: true
          },
... 接下页 ...
  • X轴配置,代码如下:
... 接上页 ...
xAxis: [
            {
              type: 'category',
              data: this.xData,
              axisLabel: {
                color: '#bdcad3',
                interval: 0,
                rotate: 40
              },
              axisTick: {
                show: false
              },
              axisLine: {
                lineStyle: {
                  color: '#bdcad3'
                },
                show: false
              },
              axisPointer: {
                type: 'shadow'
              }
            }
          ],
... 接下页 ...
  • 双Y轴配置,代码如下:
... 接上页 ...
yAxis: [
            {
              type: 'value',
              name: '',
              min: 0,
              max: 120,
              interval: 12,
              axisLabel: {
                formatter: '{value}',
                color: '#bdcad3'
              },
              show: true,
              axisTick: {
                show: false
              },
              axisLine: {
                lineStyle: {
                  color: '#bdcad3'
                },
                show: false
              }
            },
            {
              type: 'value',
              name: '',
              min: 0,
              max: 100,
              interval: 10,
              axisLabel: {
                formatter: '{value} %'
              },
              show: true,
              axisTick: {
                show: false
              },
              axisLine: {
                lineStyle: {
                  color: '#bdcad3'
                },
                show: false
              }
            }
          ],
... 接下页 ...
  • 数据配置,代码如下:
... 接上页 ...
series: [
            {
              name: '架次',
              type: 'bar',
              itemStyle: {
                normal: {
                  color: '#5fcec3'
                }
              },
              barWidth: 20,
              data: this.sortieData
            },

            {
              name: '延误率',
              type: 'line',
              itemStyle: {
                normal: {
                  color: '#f88f2f'
                }
              },
              yAxisIndex: 1,
              data: this.delayData
            }
          ]
... 接下页 ...
  • 获取数据,并拼装数据,代码如下:
... 接上页 ...
loadData() {
        getFindCompanyDelay().then(data => {
          if (data.isSuccess) {
            var res = data.result;
            for (var i = 0; i < res.length; i++) {
              this.xData[i] = res[i]['companyName'];
              this.sortieData[i] = res[i]['count'];
              this.delayData[i] = res[i]['delayCount'];
            }
            this.initChart();
          } else {
            this.$message.error("数据获取失败");
          }
        });
      }
... 接下页 ...
  • Delay.vue页面的完整代码如下:
<template>
  <div>
    <div class="home">
      <div id="map-chart-06"></div>
    </div>
  </div>
</template>

<script>
  import echarts from "echarts";
  import {getFindCompanyDelay} from "../api/user/api.js";

  export default {
    name: "Home",
    data() {
      return {
        chart: null,
        geoCoordMap: {},
        xData: [],        //x轴数值
        delayData: [],   //延误率
        sortieData: []   //架次

      };
    },
    mounted() {
      this.loadData();
    },
    methods: {
      initChart() {
        const option = {
          title: {
            text: '指挥航空公司架次与延误率占比',
            top: 18,
            left: 26,
          },
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'cross',
              crossStyle: {
                color: '#999'
              }
            }
          },
          grid: {
            left: '3%',
            right: '8%',
            bottom: '3%',
            top: '15%',
            containLabel: true
          },

          xAxis: [
            {
              type: 'category',
              data: this.xData,
              axisLabel: {
                color: '#bdcad3',
                interval: 0,
                rotate: 40
              },
              axisTick: {
                show: false
              },
              axisLine: {
                lineStyle: {
                  color: '#bdcad3'
                },
                show: false
              },
              axisPointer: {
                type: 'shadow'
              }
            }
          ],
          yAxis: [
            {
              type: 'value',
              name: '',
              min: 0,
              max: 120,
              interval: 12,
              axisLabel: {
                formatter: '{value}',
                color: '#bdcad3'
              },
              show: true,
              axisTick: {
                show: false
              },
              axisLine: {
                lineStyle: {
                  color: '#bdcad3'
                },
                show: false
              }
            },
            {
              type: 'value',
              name: '',
              min: 0,
              max: 100,
              interval: 10,
              axisLabel: {
                formatter: '{value} %'
              },
              show: true,
              axisTick: {
                show: false
              },
              axisLine: {
                lineStyle: {
                  color: '#bdcad3'
                },
                show: false
              }
            }
          ],
          series: [
            {
              name: '架次',
              type: 'bar',
              itemStyle: {
                normal: {
                  color: '#5fcec3'
                }
              },
              barWidth: 20,
              data: this.sortieData
            },

            {
              name: '延误率',
              type: 'line',
              itemStyle: {
                normal: {
                  color: '#f88f2f'
                }
              },
              yAxisIndex: 1,
              data: this.delayData
            }
          ]
        };
        this.chart = echarts.init(document.getElementById("map-chart-06"));
        this.chart.setOption(option);
      },
      loadData() {
        getFindCompanyDelay().then(data => {
          if (data.isSuccess) {
            var res = data.result;
            for (var i = 0; i < res.length; i++) {
              this.xData[i] = res[i]['companyName'];
              this.sortieData[i] = res[i]['count'];
              this.delayData[i] = res[i]['delayCount'];
            }
            this.initChart();
          } else {
            this.$message.error("数据获取失败");
          }
        });
      }
    }
  };
</script>

<style>
  .home {
    height: 490px;
    margin: 0 auto;
    background-color: #ffffff;
    border: 1px solid #ebedf2;
    border-radius: 10px;
    box-shadow: 3px 3px 3px 3px #ebedf2;
  }

  #map-chart-06 {
    height: 490px;
    margin: 0 auto;

  }
</style>
  • 修改src/api/user/api.js,添加getFindCompanyDelay方法,用于访问服务器端获取数据,内容如下:
import request from '../../utils/request'

const baseUrl="/api"

//…
//… 其他 function,略。 …
//…

//获取指挥航空公司架次与延误率占比
export function getFindCompanyDelay(data){
  return request({
    url:baseUrl+"/company/findCompanyDelay",
    method:"get",
    data:data
  })
}

//获取各扇区航班数
export function getSectionVal(data){
  return request({
    url:baseUrl+"/atc/findSectorSortie",
    method:"get",
    data:data
  })
}

2、后端数据获取,打开后端项目BigData-KongGuan

  • 编写关于航空公司的数据操作和存储的实体类com.qrsoft.entity.Commpany,内容如下:
package com.qrsoft.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("company_number")
public class Company implements Serializable {

	@TableId(value = "id",type = IdType.AUTO)
	private Integer id;

	@TableField(value = "acid")
	private String acid;

	@TableField(value = "company_code3")
	private String companyCode3;

	@TableField(value = "company_name")
	private String companyName;

	@TableField(value = "delay_count")
	private String delayCount;

	@TableField(exist = false)
	private String count;

	@TableField(exist = false)
	private Double companyCount;
}
  • 编写数据访问接口BigData-KongGuan/src/main/java/com/qrsoft/mapper/CompanyMapper.java,继承自BaseMapper,内容如下:
package com.qrsoft.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qrsoft.entity.Company;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface CompanyMapper extends BaseMapper<Company> {
    @Select("SELECT company_name,COUNT(*) as count,SUM(delay_count) as delayCount FROM company_number GROUP BY company_name ORDER BY COUNT(*) DESC LIMIT 19;")
    List<Company> findCompanyDelay();
}
  • 编写数据服务接口BigData-KongGuan/src/main/java/com/qrsoft/service/CompanyService.java,使用baseMapper.findCompanyDelay()方法查询指挥航空公司航班数和航班延误数,内容如下:
package com.qrsoft.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qrsoft.common.Result;
import com.qrsoft.common.ResultConstants;
import com.qrsoft.entity.Company;
import com.qrsoft.mapper.CompanyMapper;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CompanyService extends ServiceImpl<CompanyMapper, Company> {
    /**
     * 查询指挥航空公司航班数,和航班延误数
     */
    public Result findCompanyDelay() {
        List<Company> companyDelay = baseMapper.findCompanyDelay();
        for (Company c : companyDelay) {
            double dcount = Double.parseDouble(c.getDelayCount());
            double count = Double.parseDouble(c.getCount());
            Double rest = dcount / count * 100;
            c.setDelayCount(String.format("%.2f", rest));
        }
        return new Result(ResultConstants.SUCCESS, ResultConstants.C_SUCCESS, companyDelay);
    }

    /**
     * 查询指挥航空公司占比
     */
    public Result findCompanyByCompanyAll() {
        List<Company> companyDelay = baseMapper.findCompanyDelay();
        double sum = 0;
        for (Company c : companyDelay) {
            double count = Double.parseDouble(c.getCount());
            sum+=count;
        }
        for (Company c : companyDelay) {
            double count = Double.parseDouble(c.getCount());
            c.setCompanyCount((count!=0)?sum/count:0);
        }
        return new Result(ResultConstants.SUCCESS, ResultConstants.C_SUCCESS, companyDelay);
    }

    /**
     * 机场负荷统计
     */
    public Result findAirportCount(){
        List<Company> companyDelay = baseMapper.findCompanyDelay();
        double sum = 0;
        for (Company c : companyDelay) {
            double count = Double.parseDouble(c.getCount());
            sum+=count;
        }
        for (Company c : companyDelay) {
            double count = Double.parseDouble(c.getCount());
            c.setCompanyCount((count!=0)?sum/count:0);
        }
        return new Result(ResultConstants.SUCCESS, ResultConstants.C_SUCCESS, companyDelay);
    }
}
  • 编写BigData-KongGuan/src/main/java/com/qrsoft/controller/CompanyController.java控制器类,处理前端的请求,请求后台地址:/company/findCompanyDelay,使用get方式,内容如下:
@Api(tags = "航空公司航班数,和航班延误数")
@RestController
@RequestMapping("/api/company")
public class CompanyController {

	@Autowired
	private CompanyService service;
	
	/**
	 * 查询指挥航空公司航班数,和航班延误数
	 */
	@ApiOperation(value = "查询指挥航空公司航班数,和航班延误数")
	@GetMapping("/findCompanyDelay")
	public Result findCompanyDelay(){
		return service.findCompanyDelay();
	}

	@ApiOperation(value = "查询指挥航空公司架次数占比")
	@GetMapping("/findCompanyByCompanyAll")
	public Result findCompanyByCompanyAll(){
		return service.findCompanyByCompanyAll();
	}
}

3、完成前端Index.vue页面,展示“指挥航空公司架次与延误率占比”

  • 在src/views/Home/Index.vue页面引入Delay.vue组件,代码如下:
import Delay from "../../components/Delay";
  • 声明组件,代码如下:
components: {AirLine, Section, Delay},
  • 展示,代码如下:
<el-row :gutter="30" v-show="isShow('/flight/delay')">
      <el-col :span="16" align="center">
        <Delay/>
      </el-col>
      <el-col :span="8" align="center">
        <year-warning-chart/>
      </el-col>
</el-row>

注意:在上面代码中【 v-show="isShow('/flight/delay')" 】属性的作用是判断当前登录的用户是否有权限显示当前内容,如果当前登录的用户没有权限,则不会显示当前内容,新用户的权限需要到MySQL数据库中进行设置。

这里有两种方式,可以显示当前内容:

1)去掉【 v-show="isShow('/flight/delay')" 】属性,即不判断是否有权限显示。

2)需要使用有权限的用户登录才能显示,或到数据库中分配权限。

参照任务“动态航线图”进行设置。

例如我们前面使用的用户admin,该用户没有权限显示,所以使用admin用户登录系统时是不会显示当前内容的,如果要进行权限设置,可以进入MySQL安装节点(node3节点),然后进入数据库,为admin用户授权。

[root@node3 ~]# mysql -uroot -p123456
mysql> use kongguan;

先查看角色表中,“管理员”的ID:

修改sys_auth表,添加一个【/flight/delay】权限:

mysql> insert into sys_auth(auth_name,auth_code,menu_url) values('show delay','/flight/delay','/flight/delay');

修改role_auth表,将权限授权给“管理员”角色:

mysql>insert into role_auth(role_id,auth_id) values(3,196);

  • Index.vue页面的完整代码如下:
<template>
  <div class="index">
    <el-row :gutter="30"  v-show="isShow('/flight/section')">
      <el-col :span="24" align="center">
        <Section/>
      </el-col>
    </el-row>
    <el-row :gutter="30" v-show="isShow('/flight/airline')">
      <el-col :span=24 align="center">
        <AirLine/>
      </el-col>
    </el-row>
    <el-row :gutter="30" v-show="isShow('/flight/delay')">
      <el-col :span="16" align="center">
        <Delay/>
      </el-col>
      <el-col :span="8" align="center">
        <year-warning-chart/>
      </el-col>
    </el-row>

  </div>
</template>

<script>
  import AirLine from "../../components/AirLine";
  import Section from "../../components/Section";
  import Delay from "../../components/Delay";

  import {hasPermission} from "../../utils/permission";

  export default {
    data() {
      return {
      };
    },
    mounted() {
    },
    components: {AirLine, Section, Delay},
    methods: {
      isShow(permission){
        return hasPermission(permission);
      }
    }
  };
</script>

<style scoped>
  .index {
    height: 100%;
    overflow: auto;
    padding-left: 44px;
    padding-right: 44px
  }
  .index::-webkit-scrollbar {
    display: none;
  }

  .caseClass {
    background: url('../../assets/images/index-bg.png') no-repeat;
    background-size: cover;
    margin-top: 20px;
    height: 284px;
  }

  .el-button {
    background: transparent;
  }

</style>
  • 确保Hadoop、Spark、Kafka、Redis、MySQL等服务均已经正常启动,如果没有正常启动,请参照前面的安装部署任务,完成这些服务的启动。

例如:查看MySQL是否正常启动。

  • 启动后端项目 BigData-KongGuan

  • 启动前端项目 kongguan_web

  • 页面展示效果:

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

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

相关文章

短剧小程序软件开发首页接口转发到Selectpage

工具&#xff1a;用的是uniapp开发 技术栈&#xff1a;vue、nide..js、云开发 用时&#xff1a;20工作天 软件&#xff1a;Hb、微信开发者工具 <?php namespace app\api\controller; use app\common\controller\Api; /** * 首页接口 */ class Index extends Api { …

关于PXIE3U18槽背板原理拓扑关系

如今IT行业日新月异&#xff0c;飞速发展&#xff0c;随之带来的是数据吞吐量的急剧升高。大数据&#xff0c;大存储将成为未来数据通信的主流&#xff0c;建立快速、大容量的数据传输通道将成为电子系统的关键。随着集成技术和互连技术的发展&#xff0c;新的串口技术&#xf…

MySQL数据库定时备份

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 文章目录 MySQL 定时备份方式一&#xff1a;简单版方式二&#xff1a;复杂版方式三&#xff1a;doker定时备份&#xff0c;根据备份数量删除方式四&#xff1a;不是 docker 安装备份4、配置定时任务补…

科研绘图二:箱线图(抖动散点)

R语言绘图系列—箱线图抖动散点 &#xff08;二&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;抖动散点&#xff09; 文章目录 R语言绘图系列---箱线图抖动散点&#xff08;二&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;抖动散点&#xff09; 前言一、…

C++学习基础版(一)

目录 一、C入门 1、C和C的区别 2、解读C程序 3、命名空间 4、输入输出 &#xff08;1&#xff09;cout输出流 &#xff08;2&#xff09;endl操纵符 &#xff08;3&#xff09;cin输入流 二、C表达式和控制语句 1、数据机构 特别&#xff1a;布尔类型bool 2、算数运…

java框架 2 springboot 过滤器 拦截器 异常处理 事务管理 AOP

Filter 过滤器 对所有请求都可以过滤。 实现Filter接口&#xff0c;重写几个方法&#xff0c;加上WebFilter注解&#xff0c;表示拦截哪些路由&#xff0c;如上是所有请求都会拦截。 然后还需要在入口处加上SvlterComponentScan注解&#xff0c;因为Filter是javaweb三大组件之…

深度学习pytorch——拼接与拆分(持续更新)

cat拼接 使用条件&#xff1a;合并的dim的size可以不同&#xff0c;但是其它的dim的size必须相同。 语法&#xff1a;cat([tensor1,tensor2],dim n) # 将tensor1和tensor2的第n个维度合并 代码演示&#xff1a; # 拼接与拆分 a torch.rand(4,32,8) b torch.rand(…

AI大浪潮,怎能少了国产HBM内存?

据有关报道显示&#xff0c;武汉新芯半导体制造有限公司&#xff08;XMC&#xff09;正在启动一项专注于开发和生产高带宽内存&#xff08;HBM&#xff09;的项目。 HBM作为一种关键的DRAM类型&#xff0c;对于人工智能&#xff08;AI&#xff09;和高性能计算&#xff08;HPC&…

基于springboot+vue的疗养院管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Google云计算原理与应用(四)

目录 七、海量数据的交互式分析工具Dremel&#xff08;一&#xff09;产生背景&#xff08;二&#xff09;数据模型&#xff08;三&#xff09;嵌套式的列存储&#xff08;四&#xff09;查询语言与执行&#xff08;五&#xff09;性能分析&#xff08;六&#xff09;小结 八、…

USB - USB Gadget on Linux

February, 2012. Embedded Linux Conference 2012. Agenda Introduction to USB USB Gadget API Existing Gadgets Design your own Gadget Demo Conclusio About the Author Software engineer at Adeneo Embedded Linux, Android Main activities: – BSP adaptation – Driv…

Anaconda安装proplot库

看了一下Anaconda中的环境&#xff0c;现在我有4个&#xff0c;其中gee是一个虚拟环境 因此一般在prompt中装库时要先进入其中一个虚拟环境 conda activate geepip install proplot --no-deps下完了之后&#xff0c;发现版本不对应 conda install matplotlib3.4.3

zookeeper快速入门三:zookeeper的基本操作

在zookeeper的bin目录下&#xff0c;输入./zkServer.sh start和./zkCli.sh启动服务端和客户端&#xff0c;然后我们就可以进行zookeeper的基本操作了。如果是windows&#xff0c;请参考前面章节zookeeper快速入门一&#xff1a;zookeeper安装与启动 目录 一、节点的增删改查 …

中间件漏洞(redis)

目录 1.Redis服务器被挖矿案例 2.redis常见用途 3.redis环境配置 4.redis的持久化机制 5.redis动态修改配置 6.webshell提权案例 7.定时任务bash反弹连接提权案例 8.SSH Key提权案例 9.redis安全加固分析 1.Redis服务器被挖矿案例 我没有体验过&#xff0c;那就看看别…

VS code配置免密连接Linux服务器

1. 服务器端 1.1 安装OpensSSH sudo apt install openssh-server 1.2 开启ssh服务 使用下面的命令查看是否开启了ssh&#xff1a; service ssh status 或者 sudo systemctl status ssh 只要看到绿色高亮的active(running)就是开启了ssh 如果没有开启&#xff0c;则使用…

MySQL实战:监控

监控指标 性能类指标 名称说明QPS数据库每秒处理的请求数量TPS数据库每秒处理的事务数量并发数数据库实例当前并行处理的会话数量连接数连接到数据库会话的数量缓存命中率Innodb的缓存命中率 功能类指标 名称说明可用性数据库是否正常对外提供服务阻塞当前是否有阻塞的会话…

30.HarmonyOS App(JAVA)鸿蒙系统app多线程任务分发器

HarmonyOS App(JAVA)多线程任务分发器 打印时间&#xff0c;记录到编辑框textfield信息显示 同步分发&#xff0c;异步分发&#xff0c;异步延迟分发&#xff0c;分组任务分发&#xff0c;屏蔽任务分发&#xff0c;多次任务分发 参考代码注释 场景介绍 如果应用的业务逻辑比…

如何用saga实现分布式事务?

SAGA事务介绍 SAGA事务模式的历史十分悠久&#xff0c;比分布式事务的概念提出还要更早。SAGA的意思是“长篇故事、长篇记叙、一长串事件”&#xff0c;它起源于1987年普林斯顿大学的赫克托 加西亚 莫利纳&#xff08;Hector Garcia Molina&#xff09;和肯尼斯 麦克米伦&a…

python之万花尺

1、使用模块 import sys, random, argparse import numpy as np import math import turtle import random from PIL import Image from datetime import datetime from math import gcd 依次使用pip下载即可 2、代码 import sys, random, argparse import numpy as np imp…

整数和浮点数在内存中存储及题目

一、整数在内存中存储 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码。三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤1表⽰“负”&#xff0c;⽽数值位最⾼位的⼀位是被当做符号位&#xff0c;剩余的都是数值位 正整数…