【vue】简易封装echarts

news2025/2/5 3:46:45

将echarts封装成组件,达到只要调用方法,传入数据和相应的参数就能生成图表的效果,避免在项目中编写大量重复和累赘的echarts的配置代码,实现的思路如下:

  1. 接口返回的一般是json数据,所以首先要将json数据进行处理,处理成echarts需要的数据形式
  2. 将echarts的配置代码封装在一个方法里,通过自定义的配置名进行调用

下面对我自己封装的组件 EchartsGenerate 逐步解释
首先看template

<template>
  <div>
    <slot></slot>
  </div>
</template>

这里使用插槽slot是因为,有时候图表的样式要根据页面进行调整,所以用插槽好方便自定义样式,就比如下面的代码:

<echarts-generate ref="echarts" name-data-key="title" value-data-key="score">
      <!-- 中间的元素设置id -->
      <div class="chart-container" id="chart-sample"></div>
</echarts-generate>
<style>
	.chart-container {
	  position: relative;
	  height: 50vh;
	  overflow: hidden;
	}
</style>

通过class来设置图表的样式

再看props

props: {
    // 坐标对应的 传入数据指定的键值
    nameDataKey: {
      type: String,
      default: "name",
    },
    // 数据对应的 传入数据指定的键值
    valueDataKey: {
      type: String,
      default: "value",
    },
    // 图表标题
    chartTitle: {
      type: String,
    },
  },

nameDataKey和valueDataKey分别对应传入数据的键的名字和值和名字,比如,假如数据是这样

[
   	{
       id: "physical1",
         // label
         title: "physical1",
         // 排序
         sort: 0,
         // 分数
         score: 11,
         desc: "户外活动1",
         // 分数
         point: 25,
       },
       {
         id: "taste1",
         title: "taste1",
         sort: 1,
         score: 25,
         desc: "味道1",
         // 分数
         point: 35,
       },
       {
         id: "acceptance1",
         title: "acceptance1",
         sort: 2,
         score: 55,
         desc: "接受度1",
         // 分数
         point: 45,
       },
     ];

那么在组件上设置 name-data-key="title" value-data-key="score" 那图表的横坐标是title对应的值,竖坐标是score对应的值,这个在后面会详细说。

最后在看主要的方法
首先看处理json数据的方法

generateChartInData(list) {
      let chartInData = {};

      // 保证list中的每个对象的属性名是相同的,也就是说一一对应
      for (let attr1 in list[0]) {
        // 以每个属性名为名字构建数组
        chartInData[attr1] = [];
      }
      list.forEach(function (item, index) {
        for (let attr2 in item) {
          // chartInData[attr2] 为underfined时 初始化为空数组
          if (!chartInData[attr2]) {
            chartInData[attr2] = [];
          }
          chartInData[attr2].push(item[attr2]);
        }
      });
      chartInData["length"] = list.length;
      return chartInData;
    },

上面方法实现的效果是将json数组转换为一个包含以属性名命名数组的对象,例如传入的数据是这个格式

[
   	{
       id: "physical1",
         // label
         title: "physical1",
         // 排序
         sort: 0,
         // 分数
         score: 11,
         desc: "户外活动1",
         // 分数
         point: 25,
       },
       {
         id: "taste1",
         title: "taste1",
         sort: 1,
         score: 25,
         desc: "味道1",
         // 分数
         point: 35,
       },
       {
         id: "acceptance1",
         title: "acceptance1",
         sort: 2,
         score: 55,
         desc: "接受度1",
         // 分数
         point: 45,
       },
     ];

通过generateChartInData方法生成的数据如下:

{
    id: ["physical1", "taste1","acceptance1"],
    title: ["physical1", "taste1", "acceptance1"],
    sort: [ 0,1,2],
    score: [11,25, 55],
    desc: ["户外活动1","味道1","接受度1"],
    point: [25,35,45],
    length: 3
}

将通过generateChartInData生成的数据,传入下面的方法中

	// 生成图表数据
    chartDataFactory(dataType, chartInData) {
      let chartOutData = {};
      switch (dataType) {
        // 根据需求配置数据
        case "listData":
          // 生成数组数据
          // 单个数据格式为 [1,2,3]
          // 多个数据格式为 [[1,2,3],[1,2,4],[3,4,5]]
          if (Array.isArray(chartInData) && chartInData.length > 0) {
            let seriesList = [];
            chartInData.forEach((item) => {
              seriesList = [...seriesList, item[this.valueDataKey]];
            });
            chartOutData = {
              xAxisData: chartInData[0][this.nameDataKey],
              seriesData: seriesList,
            };
          } else {
            chartOutData = {
              xAxisData: chartInData[this.nameDataKey],
              seriesData: chartInData[this.valueDataKey],
            };
          }

          break;
        case "objectData":
          // 生成对象数据
          // 数据格式为
          // {name:"", value:""}
          chartOutData = {
            seriesData: this.generateObjectData(
              chartInData,
              this.nameDataKey,
              this.valueDataKey
            ),
          };
          break;
      }

      return chartOutData;
    },

    // 生成对象数据源
    // 属性为 name和value
    // chartInData  生成的图表数据
    // nameKey name对应的键
    // valueKey value对应的键
    generateObjectData(chartInData, nameKey, valueKey) {
      let objectList = [];
      for (var i = 0; i < chartInData["length"]; i++) {
        let objectItem = {
          name: "",
          value: "",
        };
        objectItem.name = chartInData[nameKey][i];
        objectItem.value = chartInData[valueKey][i];
        objectList = [...objectList, objectItem];
      }
      return objectList;
    },

在chartDataFactory这个方法里面就用到了前面提到的nameDataKey和valueDataKey。然后这个方法处理了多条数据的,可以参考下

下面是将echarts图表的配置都封装在getOption这个方法里面,同时把chartDataFactory生成的数据传入这个方法

	// 配置option
    getOption(optionType, chartOutData) {
      let option = {};
      let seriesList = [];
      // 如果seriesData有数据,且seriesData的第一个元素是数组,说明传入的数据是多对象数组
      // 否则说明传入的是单个对象
      if (
        chartOutData.seriesData.length > 0 &&
        Array.isArray(chartOutData.seriesData[0])
      ) {
        seriesList = chartOutData.seriesData.map((item) => {
          return (item = {
            data: item,
          });
        });
      } else {
        seriesList = [
          {
            data: chartOutData.seriesData,
          },
        ];
      }

      switch (optionType) {
      	// 基础折线图
        case "lineOption":
          // 遍历后添加其他属性
          seriesList = seriesList.map((item) => {
            return (item = {
              data: item.data,
              type: "line",
            });
          });
          option = {
            title: {
              text: this.chartTitle,
            },
            xAxis: {
              type: "category",
              data: chartOutData.xAxisData,
            },
            yAxis: {
              type: "value",
            },
            series: seriesList,
          };
          break;
        // 基础柱状图 
        case "barOption":
          seriesList = seriesList.map((item) => {
            return (item = {
              data: item.data,
              type: "bar",
            });
          });
          option = {
            xAxis: {
              type: "category",
              data: chartOutData.xAxisData,
            },
            yAxis: {
              type: "value",
            },
            series: seriesList,
          };
          break;
         // 基础饼图
        case "pieOption":
          option = {
            title: {
              text: this.chartTitle,
              left: "center",
            },
            tooltip: {
              trigger: "item",
            },
            legend: {
              orient: "vertical",
              left: "left",
            },
            series: [
              {
                name: "Access From",
                type: "pie",
                radius: "50%",
                data: chartOutData.seriesData,
                emphasis: {
                  itemStyle: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: "rgba(0, 0, 0, 0.5)",
                  },
                },
              },
            ],
          };
          break;
      }

      return option;
    },

后续开发在getOption这个方法里添加配置

最后是生成图表的方法

	// 生成图表
    // domRef 图表标识 id
    // dataType 图表数据类型
    // optionType option类型
    // list 要生成图表的数据列表
    generateChart(domRef, dataType, optionType, list) {
      let chartInData = null;
      if (document.getElementById(domRef) || this.$refs[domRef]) {
        let chartDom = this.initChartDom(domRef);
        // 存在表格的话先进行销毁
        if (chartDom) {
          let chart = this.getChart(domRef);
          // 存在表格的话先进行销毁
          if (chart) {
            chart.dispose();
          }
          // 如果传入数据为空,则返回
          if(list.length<=0){
            return
          }
          // 如果list的子元素是数组
          if ( Array.isArray(list[0])) {
            // list是包含多条数据的数组
            chartInData = list.map((item) => {
              // item 是数据列表
              return this.generateChartInData(item);
            });
          }
          // 如果list的子元素不是数组时对象
          if (!Array.isArray(list[0])) {
            chartInData = this.generateChartInData(list);
          }

          let data = this.chartDataFactory(dataType, chartInData);
          let option = this.getOption(optionType, data);
          if (option && typeof option === "object") {
            chartDom.setOption(option);
          }
        }
      }
    },

其中图表标识最好是通过id,使用ref会没效果

完整代码如下

<template>
  <div>
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: "EchartsGenerate",
  data() {
    return {
      instances: {},
      chartDom: null,
    };
  },
  props: {
    // 坐标对应的 传入数据指定的键值
    nameDataKey: {
      type: String,
      default: "name",
    },
    // 数据对应的 传入数据指定的键值
    valueDataKey: {
      type: String,
      default: "value",
    },
    // 图表标题
    chartTitle: {
      type: String,
    },
  },
  created() {},
  mounted() {},
  components: {},
  methods: {
    // 用于用户数据不需要处理
    // 直接传入数据源生成图表
    generateChartWithData(domRef, optionType, data) {
      if (document.getElementById(domRef) || this.$refs[domRef]) {
        let chartDom = this.initChartDom(domRef);
        // 存在表格的话先进行销毁
        if (chartDom) {
          let chart = this.getChart(domRef);
          // 存在表格的话先进行销毁
          if (chart) {
            chart.dispose();
          }
          let option = this.getOption(optionType, data);
          if (option && typeof option === "object") {
            chartDom.setOption(option);
          }
        }
      }
    },
    // 生成图表
    // domRef 图表标识 id
    // dataType 图表数据类型
    // optionType option类型
    // list 要生成图表的数据列表
    generateChart(domRef, dataType, optionType, list) {
      let chartInData = null;
      if (document.getElementById(domRef) || this.$refs[domRef]) {
        let chartDom = this.initChartDom(domRef);
        // 存在表格的话先进行销毁
        if (chartDom) {
          let chart = this.getChart(domRef);
          // 存在表格的话先进行销毁
          if (chart) {
            chart.dispose();
          }
          // 如果传入数据为空,则返回
          if(list.length<=0){
            return
          }
          // 如果list的子元素是数组
          if ( Array.isArray(list[0])) {
            // list是包含多条数据的数组
            chartInData = list.map((item) => {
              // item 是数据列表
              return this.generateChartInData(item);
            });
          }
          // 如果list的子元素不是数组时对象
          if (!Array.isArray(list[0])) {
            chartInData = this.generateChartInData(list);
          }

          let data = this.chartDataFactory(dataType, chartInData);
          let option = this.getOption(optionType, data);
          if (option && typeof option === "object") {
            chartDom.setOption(option);
          }
        }
      }
    },

    getCanvas(item) {
      if (this.isDomSupported() && typeof item === "string") {
        item = document.getElementById(item) || this.$refs[item];
      } else if (item && item.length) {
        item = item[0];
      }
      if (item && item.canvas) {
        item = item.canvas;
      }
      return item;
    },

    // 获取图表
    getChart(key) {
      const canvas = this.getCanvas(key);
      return Object.values(this.instances)
        .filter((c) => c.canvas === canvas)
        .pop();
    },

    isDomSupported() {
      return typeof window !== "undefined" && typeof document !== "undefined";
    },

    // 初始化图表dom
    // 可以通过id和ref两种属性进行初始化
    initChartDom(domRef) {
      let chartDom = null;
      let initDom = document.getElementById(domRef) || this.$refs[domRef];

      chartDom = this.$echarts.init(initDom, null, {
        renderer: "canvas",
        useDirtyRect: false,
      });
      return chartDom;
    },

    // 生成图表数据
    chartDataFactory(dataType, chartInData) {
      let chartOutData = {};
      switch (dataType) {
        // 根据需求配置数据
        case "listData":
          // 生成数组数据
          // 单个数据格式为 [1,2,3]
          // 多个数据格式为 [[1,2,3],[1,2,4],[3,4,5]]
          if (Array.isArray(chartInData) && chartInData.length > 0) {
            let seriesList = [];
            chartInData.forEach((item) => {
              seriesList = [...seriesList, item[this.valueDataKey]];
            });
            chartOutData = {
              xAxisData: chartInData[0][this.nameDataKey],
              seriesData: seriesList,
            };
          } else {
            chartOutData = {
              xAxisData: chartInData[this.nameDataKey],
              seriesData: chartInData[this.valueDataKey],
            };
          }

          break;
        case "objectData":
          // 生成对象数据
          // 数据格式为
          // {name:"", value:""}
          chartOutData = {
            seriesData: this.generateObjectData(
              chartInData,
              this.nameDataKey,
              this.valueDataKey
            ),
          };
          break;
      }

      return chartOutData;
    },

    // 生成对象数据源
    // 属性为 name和value
    // chartInData  生成的图表数据
    // nameKey name对应的键
    // valueKey value对应的键
    generateObjectData(chartInData, nameKey, valueKey) {
      let objectList = [];
      for (var i = 0; i < chartInData["length"]; i++) {
        let objectItem = {
          name: "",
          value: "",
        };
        objectItem.name = chartInData[nameKey][i];
        objectItem.value = chartInData[valueKey][i];
        objectList = [...objectList, objectItem];
      }
      return objectList;
    },

    // 生成图表需要的数据
    // list - 对象数组
    generateChartInData(list) {
      let chartInData = {};

      // 保证list中的每个对象的属性名是相同的,也就是说一一对应
      for (let attr1 in list[0]) {
        // 以每个属性名为名字构建数组
        chartInData[attr1] = [];
      }
      list.forEach(function (item, index) {
        for (let attr2 in item) {
          // chartInData[attr2] 为underfined时 初始化为空数组
          if (!chartInData[attr2]) {
            chartInData[attr2] = [];
          }
          chartInData[attr2].push(item[attr2]);
        }
      });
      chartInData["length"] = list.length;
      return chartInData;
    },

    // 配置option
    getOption(optionType, chartOutData) {
      let option = {};
      let seriesList = [];
      // 如果seriesData有数据,且seriesData的第一个元素是数组,说明传入的数据是多对象数组
      // 否则说明传入的是单个对象
      if (
        chartOutData.seriesData.length > 0 &&
        Array.isArray(chartOutData.seriesData[0])
      ) {
        seriesList = chartOutData.seriesData.map((item) => {
          return (item = {
            data: item,
          });
        });
      } else {
        seriesList = [
          {
            data: chartOutData.seriesData,
          },
        ];
      }

      switch (optionType) {
        case "lineOption":
          // 遍历后添加其他属性
          seriesList = seriesList.map((item) => {
            return (item = {
              data: item.data,
              type: "line",
            });
          });
          option = {
            title: {
              text: this.chartTitle,
            },
            xAxis: {
              type: "category",
              data: chartOutData.xAxisData,
            },
            yAxis: {
              type: "value",
            },
            series: seriesList,
          };
          break;
        case "barOption":
          seriesList = seriesList.map((item) => {
            return (item = {
              data: item.data,
              type: "bar",
            });
          });
          option = {
            xAxis: {
              type: "category",
              data: chartOutData.xAxisData,
            },
            yAxis: {
              type: "value",
            },
            series: seriesList,
          };
          break;
        case "pieOption":
          option = {
            title: {
              text: this.chartTitle,
              left: "center",
            },
            tooltip: {
              trigger: "item",
            },
            legend: {
              orient: "vertical",
              left: "left",
            },
            series: [
              {
                name: "Access From",
                type: "pie",
                radius: "50%",
                data: chartOutData.seriesData,
                emphasis: {
                  itemStyle: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: "rgba(0, 0, 0, 0.5)",
                  },
                },
              },
            ],
          };
          break;
      }

      return option;
    },
  },
};
</script>

<style>
</style>

使用的示例代码如下:

<template>
  <div>
    <!-- 子组件设置ref -->
    <echarts-generate ref="echarts" name-data-key="title" value-data-key="score">
      <!-- 中间的元素设置id -->
      <div class="chart-container" id="chart-sample"></div>
    </echarts-generate>
  </div>
</template>

<script>
import EchartsGenerate from "@/components/charts/EchartsGenerate";
export default {
  name: "EchartsSample",
  data() {
    return {
      //传入的json数据
      chartData: [],
    };
  },
  created() {},
  async mounted() {
    await this.getData();
    // 通过调用子组件的方法生成图表,设置id获取元素
    // 无法通过ref获取
    this.$refs.echarts.generateChart(
      "chart-sample",
      "listData",
      "barOption",
      this.chartData
    );
  },
  components: {
    "echarts-generate": EchartsGenerate,
  },
  methods: {
    async getData() {
      // 多个数据
      // this.chartData = [
      //   [
      //   {
      //     id: "physical-activity",
      //     // label
      //     title: "physical activity",
      //     // 排序
      //     sort: 0,
      //     // 分数
      //     score: 13,
      //     desc: "户外活动",
      //     // 分数
      //     point: 20,
      //   },
      //   {
      //     id: "taste",
      //     title: "taste",
      //     sort: 1,
      //     score: 20,
      //     desc: "味道",
      //     // 分数
      //     point: 30,
      //   },
      //   {
      //     id: "acceptance",
      //     title: "acceptance",
      //     sort: 2,
      //     score: 50,
      //     desc: "接受度",
      //     // 分数
      //     point: 40,
      //   },
      // ],
      // [
      //   {
      //     id: "physical1",
      //     // label
      //     title: "physical1",
      //     // 排序
      //     sort: 0,
      //     // 分数
      //     score: 11,
      //     desc: "户外活动1",
      //     // 分数
      //     point: 25,
      //   },
      //   {
      //     id: "taste1",
      //     title: "taste1",
      //     sort: 1,
      //     score: 25,
      //     desc: "味道1",
      //     // 分数
      //     point: 35,
      //   },
      //   {
      //     id: "acceptance1",
      //     title: "acceptance1",
      //     sort: 2,
      //     score: 55,
      //     desc: "接受度1",
      //     // 分数
      //     point: 45,
      //   },
      // ]
      // ];
      
      // 单个数据
      this.chartData = 
      [
        {
          id: "physical1",
          // label
          title: "physical1",
          // 排序
          sort: 0,
          // 分数
          score: 11,
          desc: "户外活动1",
          // 分数
          point: 25,
        },
        {
          id: "taste1",
          title: "taste1",
          sort: 1,
          score: 25,
          desc: "味道1",
          // 分数
          point: 35,
        },
        {
          id: "acceptance1",
          title: "acceptance1",
          sort: 2,
          score: 55,
          desc: "接受度1",
          // 分数
          point: 45,
        },
      ];
    },
  },
};
</script>

<style>
.chart-container {
  position: relative;
  height: 50vh;
  overflow: hidden;
}
</style>

代码在下面
项目地址 https://gitee.com/joeyan3/joe-vue-demo-project
在这里插入图片描述

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

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

相关文章

【LVGL学习笔记】(四)PlatformIO + LVGL8.3配置

LVGL全程LittleVGL&#xff0c;是一个轻量化的&#xff0c;开源的&#xff0c;用于嵌入式GUI设计的图形库。并且配合LVGL模拟器&#xff0c;可以在电脑对界面进行编辑显示&#xff0c;测试通过后再移植进嵌入式设备中&#xff0c;实现高效的项目开发。 LVGL中文教程手册&#…

PicGo+GitHub搭建个人图床用于Markdown、HTML等图片引用

方便程度&#xff1a;★★★★☆ 配置难度&#xff1a;★★☆☆☆ 稳定性&#xff1a;★★★★★ 适用环境&#xff1a;Windows、Mac、Linux 需要工具&#xff1a;GitHub 账号、PicGo 客户端 隐私性&#xff1a;别人可以访问你的图片仓库 GitHub仓库设置 流程&#xff1…

vue后台系统管理项目-商城轮播图管理功能

商城轮播图管理功能 功能介绍&#xff1a; 1.轮播图列表分页功能&#xff1b; 2.轮播图添加功能&#xff1b; 3.轮播图编辑功能&#xff1b; 4.轮播图删除功能&#xff1b; 5.轮播图启用禁用功能&#xff1b; 6.轮播图获取排序号功能&#xff1b; 7.轮播图查看详情功能&#xf…

2.创建自己的Cesiunm地球隐藏控件

目录​​​​​​​ 一、创建地球 引入Cesium.JS和初始页面 修改初始页面 将项目通过tomcat发布 二、去除不需要的控件 一、创建地球 引入Cesium.JS和初始页面 创建一个名为my-cesium的文件夹&#xff0c;将下载好的Cesium中的Build文件夹和Apps中的HelloWorld.html复制到…

基于Android的地铁查询系统app-计算机毕业设计

项目介绍 本软件研究了一个Android平台的地铁查询软件实现方案,从数据库数据保存到地铁数据的提取&#xff0c;再到界面的友好展示,最后到一个成型软件的生成这样一个过程,研究了SQLite数据库在Android平台的应用以及在手机平台的展示等等。 系统提供了地铁线路、站点和换乘的…

3.Entity和CZML添加图形

目录 Entity创建盒子 创建view容器 配置Entity ​编辑CZML数据添加图形 CZML是什么 怎么加载CZML Entity创建盒子 创建view容器 <!DOCTYPE html> <html lang"en"><head><!-- Use correct character set. --><meta charset"ut…

精华推荐 |【深入浅出Sentinel原理及实战】「原理探索专题」完整剖析Alibaba微服务架构体系之轻量级高可用流量控制组件Sentinel(1)

Sentinel是什么&#xff1f;不要概念混淆啊&#xff01; 注意&#xff1a;本Sentinel与Redis服务Sentinel是两回事&#xff0c;压根不是一个概念&#xff0c;请大家不要混肴。 Alibaba的Sentinel Sentinel是由阿里巴巴中间件团队开发的开源项目&#xff0c;是一种面向分布式微…

Vuex的相关知识

「Vuex的相关知识」 ​ vuex是一种对vue 应用中多个组件的共享状态进行集中式的管理(读/写)&#xff1b; vuex的工作原理&#xff1a; https://segmentfault.com/a/1190000021717329 ​ vuex 核心概念和API&#xff1a;state、mutations、actions、getters、modules、向外暴…

green power 设备入网过程

目录 Green Power设备入网流程 单项green power commissioning过程 抓包实例 1. SINK发送Green Power:GP Proxy Commissioning Mode命令​编辑​编辑 2. GPD发送入网命令 3. Proxy和Sink发送Green Power:GP Commissioning Notification 4. …

通过 Request 请求获取真实 IP 地址以及对应省份城市

title: 通过 Request 请求获取真实 IP 地址以及对应省份城市和系统浏览器信息 date: 2022-12-16 16:20:26 tags: GeoIP2UserAgentUtils categories:开发技术及框架 cover: https://cover.png feature: false 1. 获取真实 IP 地址 1.1 代码 代码如下&#xff0c;这里的 Commo…

set、map使用及其细节

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、两个概念①关联式容器与序列式容器②键值对二、set、map①setset的两种遍历方式set的升降序排序set的eraseset的count②mapSGI-STL中键值…

ISCSLP论文介绍|利用BERT提高语种识别性能

本文介绍清华大学语音与音频技术实验室&#xff08;SATLab&#xff09;ISCSLP 2022录用论文。BERT-LID: Leveraging BERT to Improve Spoken Language Identification。这篇文章将BERT模型引入到语种识别领域。利用BERT模型的优越性&#xff0c;再结合下游不同的神经网络模型&a…

OFDM系统中基于dmrs导频的时间跟踪、频率跟踪算法

目录发射端模型假设接收端模型假设时延估计&#xff08;时间跟踪&#xff09;频偏估计&#xff08;频率跟踪&#xff09;在OFDM系统中&#xff0c;为了估计出信号传输遇到的时间偏移和频率偏移&#xff0c;可以采用导频进行估计。 发射端模型假设 我们假设如下模型&#xff1…

如何熟练掌握运用Delft3D建模、水动力模拟方法及在地表水环境影响评价中的实践技术

Delft3D是由荷兰Delft大学WL Delft Hydraulics开发的一套功能强大的软件包&#xff0c;主要应用于自由地表水环境。该软件具有灵活的框架&#xff0c;能够模拟二维和三维的水流、波浪、水质、生态、泥沙输移及床底地貌&#xff0c;以及各个过程之间的相互作用。它是国际上最为先…

使用 C# Graphics 绘图来绘制一个足球

背景 2022卡塔尔世界杯是足球爱好者的狂欢&#xff0c;这与我毫无关系&#xff0c;作为一个缺乏运动的人&#xff0c;还是不要去看人家玩命的运动了。虽然不看球&#xff0c;不过这波热度的持续冲击&#xff0c;还是让我在朋友圈刷到了结局 ———— 球王梅西如愿以偿捧得金杯…

Bootstrap5 下拉菜单

下拉菜单可以是单选下拉菜单&#xff0c;也可以是多选的下拉菜单。 单选下拉菜单&#xff1a; 多选下拉菜单&#xff1a; 在 Bootstrap5 中下拉菜单 <select> 元素可以使用 .form-select 类来渲染 : 实例 <select class"form-select"> <option>…

内核启动过程分析

目录 一、内核源码获取查看 1.1、Source Insight使用 二、查看链接脚本 三、分析head.S 3.1、到入口前代码 3.2、内核启动的汇编阶段 四、main.c内核启动的c语言阶段 4.1、内核打印函数printk 4.2、启动信息 五、rest_init函数 5.1、进程0、进程1、进程2​编辑 5.2、…

详细复习云开发~小程序【搜索功能、登陆注册功能、点赞收藏评论功能、评论功能、CMS网页版管理后台】

文章目录一&#xff0c;搜索功能1-1&#xff0c;需求1-2&#xff0c;实现原理1-3&#xff0c;模糊搜索的代码实现1-3-1&#xff0c;模糊搜索单个字段1-3-2&#xff0c;模糊搜索多个字段&#xff08;满足一个即可&#xff09;1-3-3&#xff0c;模糊搜索多个字段&#xff08;要同…

python获取redis memory使用情况

项目研发过程中&#xff0c;用到Python操作Redis场景&#xff0c;记录学习过程中的心得体会。 一、环境搭建 Windows Anaconda3安装redis第3方包&#xff0c;pip install -u redis pip install -u # 升级安装 linux下查看redis配置信息bind 127.0.0.1 # 表示只允许本地访问,…

AssetBundle依赖打包有哪些注意点

1&#xff09;AssetBundle依赖打包有哪些注意点 ​2&#xff09;子程序集如何引用Assembly-CSharp.dll 3&#xff09;Unity的线性空间下自定义贴图在PS中修改问题 4&#xff09;如何关闭视锥体剔除 这是第318篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化…