阶段三:项目开发---民航功能模块实现:任务18:指挥航空公司架次与延误率占比

任务描述

内 容:在前面的“使用Spark清洗统计业务数据并保存到数据库”任务中,已经通过Spark Streaming 清洗程序,将Kafka中Topic为“task_Aftn”的报文数据,经过数据清洗后,保存到了MySQL数据库中;本节任务内容,通过统计查询,计算总架次数和延误架次数的一个比例,即指挥航空公司架次与延误率占比。

学  时:6学时

知识点:Vue和iView熟悉,内部推送和邮件推送处理

重点: 熟悉ECharts双Y轴展示,赋值

任务指导

通过统计查询,计算总架次数和延误架次数的一个比例,即指挥航空公司架次与延误率占比。使用ECharts展示柱状图、设置双Y轴,并绑定数据,展示即可:

1、打开前端kongguan_web项目,继续编写前端代码

  • 柱状图与折线图叠加,设置双Y轴

2、打开后端BigData-KongGuan项目,继续编写后端代码

3、前后端整合

  • 从后台请求数据,赋值展示

展示效果如下:

任务实现

1、打开前端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

  • 页面展示效果:

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

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

相关文章

LLM 入门与实践(四) Yi 部署与分析

本文截取自20万字的《PyTorch实用教程》&#xff08;第二版&#xff09;&#xff0c;敬请关注&#xff1a;《Pytorch实用教程》&#xff08;第二版&#xff09;无论是零基础入门&#xff0c;还是CV、NLP、LLM项目应用&#xff0c;或是进阶工程化部署落地&#xff0c;在这里都有…

【C++】stack和queue的模拟实现 双端队列deque的介绍

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 &#x1f308;前言&#x1f525;stack的模拟实现&#x1f525;queue的模拟实现&#x1f525;deque&#xff08;双端队列&#xff09;deque的缺陷 &#x1f308;为什么选择…

免费分享:1981-2016全球粮食产量数据集(附下载方法)

了解主要作物的历史产量模式&#xff0c;包括趋势和年际变化&#xff0c;对于了解在粮食需求和气候变化日益增长的情况下粮食生产的现状、潜力和风险至关重要。 数据简介 1981-2016全球粮食产量数据集是农业普查统计&#xff08;粮农组织报告的国家产量统计数据&#xff09;和…

Python3极简教程(一小时学完)中

异常 在这个实验我们学习 Python 的异常以及如何在你的代码中处理它们。 知识点 NameErrorTypeError异常处理&#xff08;try..except&#xff09;异常抛出&#xff08;raise&#xff09;finally 子句 异常 在程序执行过程中发生的任何错误都是异常。每个异常显示一些相关…

多国广播无线电台RadioMaximus Pro 2.33.00

RadioMaximus Pro是一款适用于Windows的程序,可让您收听和录制互联网上数以千计的广播电台。使用RadioMaximus Pro,您可以享受来自世界各地的最多样化的收音机。 RadioMaximus Pro是一款具有录音功能的全功能收音机播放器,您可以同时收听和录制多个电台,创建自动录音时间表…

搞不清啊?伦敦金与上海金区别是?

进入黄金市场的朋友&#xff0c;有可能会被各式各样的黄金交易品种带得眼花缭乱&#xff0c;其实各品种虽然都以黄金作为投资标的物&#xff0c;但是也是各有不同的&#xff0c;下面我们就来比较一下相似的投资品种——伦敦金和上海金。 首先在比较之前&#xff0c;我们要搞清楚…

js逆向研究【响应结果解密思路与案例实战】

什么是响应结果加密 我们在爬虫过程中&#xff0c;抓包之后&#xff0c;针对内容关键词搜索无法定位到数据接口&#xff0c;并在响应的接口内发现有编码/不可读的长字符串等&#xff0c;我们可以判定其为响应结果加密。 如何针对将响应结果还原为可读的数据 如果响应结果有特…

Android平台实现RTSP拉流转发至轻量级RTSP服务

技术背景 我们在做Android平台RTSP转发模块的时候&#xff0c;有公司提出来这样的技术需求&#xff0c;他们希望拉取外部RTSP摄像头的流&#xff0c;然后提供个轻量级RTSP服务&#xff0c;让内网其他终端过来拉流。实际上&#xff0c;这块&#xff0c;大牛直播SDK前几年就已经…

python网络编程-TCP/IP

链路层 帧组成&#xff08;按顺序&#xff09;&#xff1a; 目标MAC&#xff1a;6B 源MAC&#xff1a;6B 类型&#xff1a;2B 数据&#xff1a;46B-1500B CRC&#xff1a;4B 其中&#xff0c;源MAC为主机网卡地址&#xff0c;类型为来源网络层的数据类型&#xff0c;ipv…

基于Java+SpringMvc+Vue技术智慧校园系统设计与实现--60页及以上论文参考

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

Python 爬虫 tiktok API接口获取tiktok用户关注列表

此接口可获取tiktok用户关注列表。若有需要&#xff0c;请点击文末链接联系我们。 详细采集页面如下https://www.tiktok.com/quanap_official 请求API http://api.xxxx.com/tt/user/following?user_id7252644648840381445&count10&offset0&tokentest 请求参数 返…

雅虎财经世媒讯全球软文发稿对于企业宣发的意义

在当今信息爆炸的时代&#xff0c;企业宣传和品牌推广的方式变得多种多样&#xff0c;其中软文发稿成为了一种颇受欢迎的宣传手段。雅虎作为全球知名的门户网站之一&#xff0c;拥有广泛的用户基础和强大的影响力&#xff0c;通过雅虎进行软文发稿&#xff0c;不仅可以有效提升…

移远BC28_opencpu方案_开发环境搭建

OPEN CPU 代码采用的是 Python 脚本写的 scons 自动化构建工具。从构建这个角度说&#xff0c;它与 GNU make 是同一类的工具。它是一种改进&#xff0c;并跨平台的 gnu make 替代工具&#xff0c;其集成功能类似于 autoconf/automake。 这里给出简单安装方式

WAIC | 2024年世界人工智能大会“数学与人工智能”学术会议成功举办!

由斯梅尔数学与计算研究院&#xff08;Smale Institue of Mathematics & Computation&#xff09;主办的2024年世界人工智能大会(WAIC)“数学与人工智能”学术会议7月4日在上海世博中心圆满落幕&#xff01;作为全球性高级别学术研讨会&#xff0c;此次会议由华院计算技术&…

如何通过ip地址判断网络类别

在计算机网络中&#xff0c;IP地址不仅是设备在网络中的唯一标识&#xff0c;同时也隐含了网络类别的信息。了解如何根据IP地址判断网络类别&#xff0c;对于网络管理员、系统工程师以及网络爱好者来说都是一项基本技能。本文将详细介绍如何通过IP地址判断网络类别。 一、IP地址…

伦敦银交易平台价格的突破成不成功?这点很重要!

在伦敦银交易中&#xff0c;当银价出现突破的时候&#xff0c;也正是引起很多投资者关注的时候。一旦银价出现突破&#xff0c;很可能是新行情的开端。但是做过突破交易&#xff0c;有相关经验的朋友会发现&#xff0c;自己在伦敦银交易平台做突破的时候&#xff0c;也并不是每…

等保2.0中,云计算平台如何做到数据的分类和加密?

在信息化浪潮的激荡中&#xff0c;云计算平台已然成为企业智慧运作的心脏&#xff0c;承载着海量的数据资产。随着中国国家网络安全等级保护制度迈入2.0时代&#xff0c;对云计算平台的数据安全提出了更为严苛的要求。在这一背景下&#xff0c;如何巧妙地编织数据的分类之网&am…

MySQL的慢sql

什么是慢sql 每执行一次sql&#xff0c;数据库除了会返回执行结果以外&#xff0c;还会返回sql执行耗时&#xff0c;以mysql数据库为例&#xff0c;当我们开启了慢sql监控开关后&#xff0c;默认配置下&#xff0c;当sql的执行时间大于10s&#xff0c;会被记录到慢sql的日志文件…

【AI资讯】可以媲美GPT-SoVITS的低显存开源文本转语音模型Fish Speech

Fish Speech是一款由fishaudio开发的全新文本转语音工具&#xff0c;支持中英日三种语言&#xff0c;语音处理接近人类水平&#xff0c;使用Flash-Attn算法处理大规模数据&#xff0c;提供高效、准确、稳定的TTS体验。 Fish Audio

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f60…