扇区架次数动态展示

打开前端Vue项目:kongguan_web,完成前端src/components/echart/SectorFlightChart.vue页面设计,使用ECharts插件实现柱状图和饼状图

  • 在src/components目录下创建echart目录,完成src/components/echart/SectorFlightChart.vue 的页面div设计:
<template xmlns:el-col="http://www.w3.org/1999/html">
  <div class="home">
    <div id="barFlightChart" class="chart" />
  </div>
</template>
... 接下文 ...
  • 初始化数据,代码如下:
... 接上文 ...
<script>
  import {findATCTime} from "../../api/chartdata/chartdata";

  export default {
    name: "SectorFlightChart",
    data() {
      return {
        sectorData: [],
        barChartData: [],
        barChartAxis: [],
        sectorCharData: [],
        sectorCharOneData: [],
        sectorChartAxis: ['K', 'S', 'E', 'P', 'G'],

        chartOption: {},
        myChart: {},
      }
    },
     mounted() {
      this.initChart();
      this.loadData();
    },
... 接下文 ...
  • 初始化ECharts,代码如下:
... 接上文 ...
    methods: {
      initChart() {
        this.myChart = this.$echarts.init(document.getElementById("barFlightChart"));
        this.chartOption = {
          baseOption: {
            timeline: {
              axisType: 'category',
              // realtime: false,
              // loop: false,
              autoPlay: true,
              // currentIndex: 2,
              playInterval: 1000,
              // controlStyle: {
              //     position: 'left'
              // },
              lineStyle: {color: "#bcc9d7", width: 1},
              controlStyle: {showPlayBtn: !1, showPrevBtn: !1, showNextBtn: !1},
              checkpointStyle: {color: "#f19326", symbol: "circle", symbolSize: 10, borderWidth: 0},
              itemStyle: {normal: {color: "#419ae7"}},
            },
            title: {
              text: "扇区架次数动态循环展示",
              subtext: "",
              top:18,
              left: 26,
              textStyle: {
                color: "#000000"
              },
            },
            tooltip: {
              trigger: "item",
              padding: 10,
              backgroundColor: "#222",
              borderColor: "#777",
              borderWidth: 1,
            },
            angleAxis: {
              type: "category",
              axisTick: {show: !1},
              axisLine: {show: !0, lineStyle: {color: "#d2dde7"}},
              axisLabel: {color: "#d2dde7"},
              data: ["G区", "K区", "E区", "P区", "S区"],
              z: 10
            },
            radiusAxis: {
              min: 0,
              axisLine: {show: !1, lineStyle: {color: "#000", opacity: .3}},
              axisLabel: {show: !1, color: "#000"},
              axisTick: {show: !1},
              splitLine: {lineStyle: {color: "#d2dde7"}},
              splitArea: {show: !1, areaStyle: {color: "rgb(1, 10, 63)", opacity: .8}}
            },
            grid: {left: "10%", right: "50%", top: "10%", bottom: "9%", containLabel: !1},
            polar: {center: ["75%", "45%"], radius: "50%"},
            xAxis: [{
              type: 'value',
              boundaryGap: [0, 0.01],
              splitLine: {
                show: false
              },
              show: false,
              axisLine: {   //横轴样式
                lineStyle: {},
              },
              position:'top'
            }],
            yAxis: [{
              type: 'category',
              data: this.barChartAxis,
              inverse:true,
              axisLine: {   //纵轴样式
                lineStyle: {
                  color: '#73777d'
                }
              },
              axisLabel: {
                rotate: -45
              }
            }],
            series: [{
              type: "bar",
              coordinateSystem: "polar",
              name: "扇区",
              center: ["75%", "45%"],
              stack: "a",
              itemStyle: {
                normal: {
                  color: function (t) {
                    return ["#51b8f9", "#7d92ff", "#5fccc3", "#f19326", "#f258b6"][t.dataIndex]
                  }, label: {show: !0, position: "top", formatter: "{b}\n{c}"}
                }
              }
            }, {
              name: "本日架次数",
              type: "bar",
              barWidth: 8,
              radius: 90,
              avoidLabelOverlap: !1,
              label: {
                normal: {show: !1, position: "outside", formatter: "{c}"},
                emphasis: {show: !0, textStyle: {fontSize: "12", fontWeight: "normal"}}
              },
              labelLine: {normal: {show: !1}},
              itemStyle: {normal: {color: "#51b8f9"}, emphasis: {color: "#f19326"}}
            }]
          }
        }
        this.myChart.setOption(this.chartOption);
      },
... 接下文 ...
  • 加载整理数据,然后拼装ECharts专用的options对象,代码如下:
  //加载数据
      loadData() {
        findATCTime().then(data => {
          if (data.isSuccess) {
            this.formatData(data.result);
          } else {
            this.$message.error("数据获取失败");
          }
        });
      },
      //整理数据
      formatData(data) {
        let timeLineData = [];
        let barDataArr = [];
        let pieDataArr = [];
        let optionArr = [];
        for (let i = 0; i < data.length; i++) {
          let dayItemData = data[i];
          timeLineData.push(i + 1);
          let dayFlightSum = 0;
          let dayFlightDetail = [];
          for (let j = 0; j < dayItemData.length; j++) {
            dayFlightDetail.push(dayItemData[j][this.sectorChartAxis[j]]);
            dayFlightSum = dayFlightSum + parseInt(dayItemData[j][this.sectorChartAxis[j]]);
          }
          pieDataArr.push(dayFlightDetail);
          barDataArr.push(dayFlightSum);
        }
        //拼装 echart专用的options对象
        for (let i = 0; i < timeLineData.length; i++) {
          optionArr.push({
            series: [{data: pieDataArr[i]}, {data: barDataArr}],
            yAxis: [{data: timeLineData, nameTextStyle: {fontSize: 4, align: "center"},axisLabel:{formatter:'第{value}天'}}]
          })
        }
        this.chartOption.baseOption.timeline.data = timeLineData;
        this.chartOption.options = optionArr;
        this.refreshChart();
      }
      refreshChart() {
        this.myChart.setOption(this.chartOption);
      }
    }
  }
</script>
  • 页面样式,代码如下:
<style scoped>
  .home {
    height: 700px;
    overflow: auto;
    background-color: #ffffff;
    border: 1px solid #ebedf2;
    border-radius: 10px;
    box-shadow: 3px 3px 3px 3px #ebedf2;
  }
  .home::-webkit-scrollbar {
    display: none;
  }
  .chart {
    height: 680px;
  }
</style>
  • 加载数据时,会调用src/api/chartdata/chartdata.js中定义的findATCTime方法,向服务端发送GET请求,获取扇区架次数动态统计,chartdata.js的完整代码如下:
import request from '../../utils/request'
const baseUrl = "/api"
/**
 * 扇区架次数动态统计
 */
export function findATCTime() {
  return request({
    url: baseUrl + "/atc/findATCTime",
    method: "GET"
  })
}
/**
 * 获取各个扇区通话饱和度
 */
export function findCallSaturation() {
  return request({
    url: baseUrl + "/callSaturation/findCallSaturation",
    method: "GET"
  })
}
export function annualWarningStatisticsByCategory() {
  return request({
    url: baseUrl + "/warnFlightHistory/annualWarningStatisticsByCategory",
    method: "GET"
  })
}
export function getAirPortCount() {
  return request({
    url: baseUrl + "/company/getAirPortCount",
    method: "GET"
  })
}
/**
 * 获取从青岛起飞航班数前十的航线
 * @returns {AxiosPromise}
 */
export function findByLimit() {
  return request({
    url: baseUrl + "/airLine/findByLimit",
    method: "GET"
  })
}

2、后端的实现,打开后端项目:BigData-KongGuan

  • 编写实体类com/qrsoft/entity/Atc.java(前面任务时,已经创建过)
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("atc_number")
public class Atc implements Serializable {
	@TableId(value = "id",type = IdType.AUTO)
	private Integer id;

	@TableField(value = "ACID")
	private String acId;

	@TableField(value = "ATC_TIME")
	private String atcTime;

	@TableField(value = "EXECUTE_DATE")
	private String executeDate;

	@TableField(value = "PLAN_SECTOR_NAME")
	private String planSectorName;

	@TableField(exist = false)
	private String count;
}
  • 编写数据访问类com/qrsoft/mapper/AtcMapper.java,添加findATCTime()方法和findATCTime2()方法,AtcMapper类的完整代码如下:
import com.qrsoft.entity.Atc;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface AtcMapper extends BaseMapper<Atc> {
    @Select("select PLAN_SECTOR_NAME,COUNT(*) as count from atc_number GROUP BY PLAN_SECTOR_NAME;")
    List<Atc> findSectorSortie();

    @Select("select EXECUTE_DATE from atc_number group by EXECUTE_DATE order by EXECUTE_DATE desc limit 19;")
    List<String> findATCTime();

    @Select("select PLAN_SECTOR_NAME,count(*) as count from atc_number where EXECUTE_DATE = #{executeTime} and PLAN_SECTOR_NAME = #{sectorName}")
    Atc findATCTime2(String executeTime,String sectorName);
}
  • 编写Service类com/qrsoft/service/AtcService.java,添加findATCTime()方法,AtcService类的完整代码如下:
package com.qrsoft.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qrsoft.common.Result;
import com.qrsoft.common.ResultConstants;
import com.qrsoft.entity.Atc;
import com.qrsoft.entity.MultiRadar;
import com.qrsoft.mapper.AtcMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Service
public class AtcService extends ServiceImpl<AtcMapper, Atc> {
    @Autowired
    private MultiRadarService multiRadarService;

    /**
     * 查询所有扇区航班架次
     */
    public Result findSectorSortie() {
        List<Atc> sectorSortie = baseMapper.findSectorSortie();
        return new Result(ResultConstants.SUCCESS, ResultConstants.C_SUCCESS, sectorSortie);
    }

    /**
     * 根据扇区号查询架次
     * @param planSectorName
     */
    public Result findLocusCount(String planSectorName) {
        QueryWrapper<MultiRadar> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("section",planSectorName);
        int count = multiRadarService.count(queryWrapper);
        return new Result(ResultConstants.SUCCESS, ResultConstants.C_SUCCESS, count);
    }

    /**
     * 扇区架次数动态统计(饼状图)
     */
    public Result findATCTime() {
        List<String> sectorName = new ArrayList<>();
        sectorName.add("K");
        sectorName.add("S");
        sectorName.add("E");
        sectorName.add("P");
        sectorName.add("G");
        List<String> executeTime = baseMapper.findATCTime();

        List list = new ArrayList();
        for (int i = 0; executeTime.size() > i; i++) {
            ArrayList<Object> objects = new ArrayList<>();
            for (int j = 0; sectorName.size() > j; j++) {
                Atc atcTime2 = baseMapper.findATCTime2(executeTime.get(i), sectorName.get(j));
                HashMap<String, Object> map = new HashMap<>();
                if (atcTime2.getPlanSectorName() != null) {
                    map.put(atcTime2.getPlanSectorName(), atcTime2.getCount());
                }else {
                    map.put(sectorName.get(j),0);
                }
                objects.add(map);
            }
            list.add(objects);
        }
        return new Result(ResultConstants.SUCCESS, ResultConstants.C_SUCCESS, list);
    }
}
  • 编写扇区操作的控制器类com/qrsoft/controller/AtcController.java,添加findATCTime()方法,AtcController类的完整代码如下:
package com.qrsoft.controller;

import com.qrsoft.common.Result;
import com.qrsoft.service.AtcService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "扇区操作类")
@RestController
@RequestMapping("/api/atc")
public class AtcController {
    @Autowired
    private AtcService service;
    /**
     * 获取各扇区航班数
     */
    @ApiOperation(value = "获取各扇区航班数")
    @GetMapping("/findSectorSortie")
    public Result findSectorSortie(){
        return service.findSectorSortie();
    }

    /**
     * 根据扇区名称获取该扇区航班数
     * @param planSectorName
     */
    @ApiOperation(value = "根据扇区名称获取该扇区航班数")
    @GetMapping("/findLocusCount")
    public Result findLocusCount(@RequestParam String planSectorName){
        return service.findLocusCount(planSectorName);
    }

    /**
     * 扇区架次数动态统计(饼状图)
     */
    @ApiOperation(value = "扇区架次数动态统计(饼状图)")
    @GetMapping("/findATCTime")
    public Result findATCTime(){
        return service.findATCTime();
    }
}

3、实现前端的报表展示

  • 回顾前面已经完成的src/components/echart/SectorFlightChart.vue页面,在页面中绑定数据的核心代码为:
  //加载数据
      loadData() {
        findATCTime().then(data => {
          if (data.isSuccess) {
            this.formatData(data.result);
          } else {
            this.$message.error("数据获取失败");
          }
        });
      },
      //整理数据
      formatData(data) {
        let timeLineData = [];
        let barDataArr = [];
        let pieDataArr = [];
        let optionArr = [];
        for (let i = 0; i < data.length; i++) {
          let dayItemData = data[i];
          timeLineData.push(i + 1);
          let dayFlightSum = 0;
          let dayFlightDetail = [];
          for (let j = 0; j < dayItemData.length; j++) {
            dayFlightDetail.push(dayItemData[j][this.sectorChartAxis[j]]);
            dayFlightSum = dayFlightSum + parseInt(dayItemData[j][this.sectorChartAxis[j]]);
          }
          pieDataArr.push(dayFlightDetail);
          barDataArr.push(dayFlightSum);
        }

        //拼装 echart专用的options对象
        for (let i = 0; i < timeLineData.length; i++) {
          optionArr.push({
            series: [{data: pieDataArr[i]}, {data: barDataArr}],
            yAxis: [{data: timeLineData, nameTextStyle: {fontSize: 4, align: "center"},axisLabel:{formatter:'第{value}天'}}]
          })
        }

        this.chartOption.baseOption.timeline.data = timeLineData;
        this.chartOption.options = optionArr;
        this.refreshChart();
      }
,
      //重新绑定数据
      refreshChart() {
        this.myChart.setOption(this.chartOption);
      }
  • 在src/views/Home/Index.vue引入SectorFlightChart组件,代码如下:
... 略 ...

  import AirLine from "../../components/AirLine";
  import Section from "../../components/Section";
  import Delay from "../../components/Delay";
  import WarnStatistice from "../../components/WarnStatistice";
  import SectorFlightChart from "../../components/echart/SectorFlightChart";

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

  export default {
    data() {
      return {
      };
    },
    mounted() {
    },
    components: {AirLine,Section,Delay,WarnStatistice,SectorFlightChart},
    methods: {
      isShow(permission){
        return hasPermission(permission);   
      }
    }

... 略 ...
  • 在src/views/Home/Index.vue添加“扇区架次动态展示”组件,代码如下:
<el-row :gutter="30" v-show="isShow('/section/detail')">
    <el-col :span="16" align="center">
      <SectorFlightChart/>
    </el-col>

    // ... 略 ...
</el-row>

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

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

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

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

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

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

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

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

修改sys_auth表,添加一个【/section/detail】权限:

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

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

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

  • src/views/Home/Index.vue的完整代码如下:
<template>
  <div class="index">
   <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/section')">
      <el-col :span="24" align="center">
        <Section/>
      </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>
    <el-row :gutter="30" v-show="isShow('/section/warning')">
      <el-col :span="12" align="center">
        <air-port-count-chart/>
      </el-col>
      <el-col :span="12" align="center">
        <WarnStatistice/>
      </el-col>
    </el-row>
    <el-row :gutter="30" v-show="isShow('/section/detail')">
      <el-col :span="16" align="center">
        <SectorFlightChart/>
      </el-col>
      <el-col :span="8" align="center">
        <sector-call-chart/>
      </el-col>
    </el-row>
  </div>
</template>

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

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

  import SectorFlightChart from "../../components/echart/SectorFlightChart";

  export default {
    data() {
      return {
      };
    },

    mounted() {
    },
    components: {AirLine, Section, WarnStatistice, Delay,SectorFlightChart},
    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

  • 报表的最终展示效果如下图所示:

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

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

相关文章

【SM3哈希算法】算法原理

【SM3哈希算法】算法原理 参考&#xff1a; 文章目录 【SM3哈希算法】算法原理一、算法简介二、基本原理三、具体流程1、填充2、分组3、迭代压缩 C语言实现 一、算法简介 SM3算法是一种密码散列函数标准&#xff0c;由国家密码管理局发布。它的安全性和SHA-256相当&#xff0…

【leetcode热题】 阶乘后的零

给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;0 解释&#xff1a;3! 6 &#xff0c;不含尾随 0示例 2&#xff1a; 输入&#xff1a;n 5 输出&a…

二叉树遍历(牛客网)

描述 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;空格字符代表空树。建立起此二叉树…

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户&#xff1a;登录 个人信息 简历信息 查看招聘信息 企业&#xff1a;登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员&#xff1a;注册 登录 管理员…

const,static深度总结——c++穿透式分析

前言&#xff1b;c类和对象的知识点中除了几种默认函数&#xff0c; 比较重要的还有使用const和static修饰成员相关知识点。const在c中特性很简单。 但是在使用中&#xff0c; 比较容易疏忽大意出现问题。 static特性也很简单&#xff0c; 但是比起const来要直接的多。 在使用中…

2023 re:Invent 使用 PartyRock 和 Amazon Bedrock 安全高效构建 AI 应用程序

前言 “ Your Data , Your AI , Your Future .&#xff08;你的数据&#xff0c;你的 AI &#xff0c;你的未来。&#xff09; 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界…

javaAPI操作Elasticsearch

mapping属性 mapping是对索引库中文档的约束, 常见的mapping属性包括: type: 字段数据类型,常见的简单类型有: 字符串: text(可分词的文本), keyword(精确值, 例如: 品牌,国家)数值: long, integer, short, byte, double, float布尔: boolean日期: date对象: object index: 是否…

LLMs之Grok-1:Grok-1的简介、安装、使用方法之详细攻略

LLMs之Grok-1&#xff1a;Grok-1的简介、安装、使用方法之详细攻略 导读&#xff1a;马斯克旗下的xAI公司宣布开源名为Grok-1的混合专家模型&#xff0c;参数量达3140亿&#xff0c;为目前最大的开源大语言模型。xAI此举或将引领人工智能开源趋势&#xff0c;同时也将对不太Ope…

协议分类笔记

1.3 协议分类 通信的协议还是比较复杂的&#xff0c;java.net 包中包含的类和接口&#xff0c;它们提供低层次的通信细节。我们可以直接使用这些类和接口&#xff0c;来专注于网络程序开发&#xff0c;而不用考虑通信的细节。 java.net 包中提供了两种常见的网络协议的支持&a…

DevExpress WinForms crack,DevExpress WinForms组件套件和库

DevExpress WinForms crack,DevExpress WinForms组件套件和库 Reporting & Analytics - Reports, Pivot Tables, PDF Viewer. The DevExpress WinForms Subscription includes royalty-free user interface components for next-gen decision support systems. Whether you…

Java基础经典10道题

目录 for循环的嵌套 题目一: 求101到200之间的素数的个数,并打印 代码分析: 注意点: 题目二:开发验证码 代码分析: 题目三:数组元素的复制 代码分析: 题目四:评委打分 健壮版代码: 代码分析:看源码 注意点: 题目五:数字加密 优化版代码: 代码分析: 题目六:数字…

MeterSphere和Jmeter使用总结

一、MeterSphere 介绍 MeterSphere 是⼀站式开源持续测试平台&#xff0c;涵盖测试跟踪、接⼝测试、UI 测试和性能测试等&#xff0c;全 ⾯兼容 JMeter、Selenium 等主流开源标准&#xff0c;能够有效助⼒开发和测试团队在线共享协作&#xff0c;实现端到 端的测试管理跟踪…

2、RabbitMQ_安装

RabbitMQ安装文档 RabbitMQ官网下载地址&#xff1a;https://www.rabbitmq.com/download.html 1.安装依赖 在线安装依赖环境&#xff1a; yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc x…

Java语言: 多线程

1. 线程调度 1.1 线程状态 线程是cpu任务调度的最小执行单位&#xff0c;每个线程拥有自己独立的程序计数器、虚拟机栈、本地方法栈。 线程状态&#xff1a;创建、就绪、运行、阻塞、死亡 1.2 线程状态切换 1.3 阻塞唤醒过程 阻塞&#xff1a; 这三个方法的调用都会使当前…

视频私有云,HDMI/AV多硬件设备终端接入,SFU/MCU视频会议交互方案。

在视频业务深入的过程中越来越多的硬件设备接入视频交互的视频会议中远程交互&#xff0c;有的是视频采集&#xff0c;有的是医疗影像等资料&#xff0c;都需要在终端承显&#xff0c;这就需要我们的设备终端能多设备&#xff0c;多协议接入&#xff0c;设备接入如下。 1&#…

2024年敏捷产品负责人CSPO认证培训

课程名称&#xff1a;Scrum Product Owner CSPO产品负责人认证 课程类型&#xff1a;经理级 课程简介&#xff1a; Scrum Product Owner产品负责人在Scrum产品开发当中扮演“舵手”的角色&#xff0c;他决定产品的愿景、路线图以及投资回报&#xff0c;他需要回答为什么做&am…

数据收集与分析

数据收集与分析是任何组织决策过程中的核心环节&#xff0c;特别是在确定关键性能指标&#xff08;KPIs&#xff09;、使用先进的数据分析工具和方法方面。以下是一个概述&#xff0c;旨在解释如何进行数据收集与分析&#xff0c;并确定KPIs。 1. 确定关键性能指标&#xff08…

windows DCMTK编译使用(qt) 医学图像

由于项目需要生成DICOM格式的图片&#xff0c;需要使用到第三方开源库DCMTK&#xff0c;于是研究了一番&#xff0c;该库是C编写的&#xff0c;DICOM主要用于医疗体系中&#xff0c;除了可以保存图片信息外&#xff0c;还可以储存患者信息&#xff0c;病例信息&#xff0c;医疗…

蓝桥杯刷题(十一)

1.卡片 反向思考&#xff0c;看k种卡片可以分给几位同学 代码 n int(input()) k 1 while k*(k1)<2*n:k1 print(k)2.美丽的2 代码 def f(x)->bool:while x:if x%102:return Truex//10return False cnt 0 for i in range(1,2021):if f(i):cnt1 print(cnt)3.单词分析 …

会话绑定实验

准备三台虚拟机 1. 安装epel镜像 2. 安装nginx 3. 配置nginx文件&#xff0c;启动服务 4. 管理剩余两台服务器 同时在剩余两台服务器里操作 5. 操作虚拟机二&#xff08;一&#xff09; 创建data文件夹&#xff0c;解压jdk到user/local下并进入&#xff0c;给jdk做个软链接 6. …