echarts 基础入门

前言:本文档主要讲解 echarts 在 vue3 中的用法,及其 echarts 的一些配置参数含义及用法。示例参考 echarts 示例

一:快速开始

1. 安装 echarts

npm install echarts
# or
pnpm add echarts
# or
yarn add echarts

2. 使用 echarts

<script setup lang="ts">
import { onMounted } from "vue";
import * as echarts from "echarts";

const initEchart = () => {
  // 基于准备好的dom,初始化echarts实例
  const myChart = echarts.init(document.getElementById("demo"));
  // 绘制图表
  myChart.setOption({
    title: {
      text: "ECharts 入门示例",
    },
    tooltip: {},
    xAxis: {
      data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
    },
    yAxis: {},
    series: [
      {
        name: "销量",
        type: "bar",
        data: [5, 20, 36, 10, 10, 20],
      },
    ],
  });
};
onMounted(() => {
  initEchart();
});
</script>

<template>
  <div id="demo" style="width: 600px; height: 400px">demoEchats</div>
</template>

二:基础概念

1. 图表容器及大小

1.1 设置 dom 节点宽高

推荐通过 css 设置该节点的宽高,该节点的大小默认就是图表的大小,调用 echarts.init 时必须保证容器已经有宽高了。

<div id="demo" style="width: 600px; height: 400px"></div>

1.2 指定图表大小

如果容器未设置宽高,或你希望图表大小不等于容器大小,可以在初始化图表时设置大小。

// 基于准备好的dom,初始化echarts实例
const myChart = echarts.init(document.getElementById("demo"), null, {
  width: 600,
  height: 400,
});

1.3 响应容器大小

有时候我们希望图表可以随容器大小的变化而变化,可以通过监听页面的 resize 事件获取浏览器大小改变的事件,然后调用 echartsInstance.resize 改变图表的大小。

<script setup lang="ts">
import { onMounted, ref } from "vue";
import * as echarts from "echarts";

let myChart = null;
const initEchart = () => {
  // 绘制图表
  myChart.setOption({
    title: {
      text: "ECharts 入门示例",
    },
    tooltip: {},
    xAxis: {
      data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
    },
    yAxis: {},
    series: [
      {
        name: "销量",
        type: "bar",
        data: [5, 20, 36, 10, 10, 20],
      },
    ],
  });
};
onMounted(() => {
  // 基于准备好的dom,初始化echarts实例
  myChart = echarts.init(document.getElementById("demo"));
  window.addEventListener("resize", function () {
    myChart.resize();
  });
  initEchart();
});
</script>

<template>
  <div id="demo" style="width: 100%; height: 400px">demoEchats</div>
</template>

1.4 重置图表大小

通过给 resize 传入参数,重置图表大小。

myChart.resize({
  width: 800,
  height: 400,
});

1.5 容器节点的销毁和重建

假设页面有多个标签页,每个标签页都有图表,当切换标签页时,当前标签页的 DOM 节点被移除,再切回来时,就会发现图表"不见了"。这是因为图表的容器节点被移除导致,就算之后节点重新添加,图表所在节点也不存在了,处理方法是,在容器节点被销毁之后,调用 echartsInstance.dispose 销毁实例,在容器节点被重新添加后再次调用 echarts.init 初始化。

tips:在容器节点被销毁时,总是应调用 echartsInstance.dispose 以销毁实例释放资源,避免内存泄漏。

<script setup lang="ts">
import { onMounted, ref, onUnmounted } from "vue";
import * as echarts from "echarts";

let myChart = null;
const initEchart = () => {
  // 绘制图表
  myChart.setOption({
    title: {
      text: "ECharts 入门示例",
    },
    tooltip: {},
    xAxis: {
      data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
    },
    yAxis: {},
    series: [
      {
        name: "销量",
        type: "bar",
        data: [5, 20, 36, 10, 10, 20],
      },
    ],
  });
};
const resize = () => {
  myChart.resize();
};
onMounted(() => {
  myChart = echarts.init(document.getElementById("demo"));
  initEchart();
  window.addEventListener("resize", resize);
});
onUnmounted(() => {
  myChart.setOption({
    echartsInstance: {
      dispose: false,
    },
  });
  window.removeEventListener("resize", resize);
});
</script>

<template>
  <div id="demo" style="width: 100%; height: 400px">demoEchats</div>
</template>

2. 样式

可以通过颜色主题、调色盘、直接样式设置、视觉映射改变图形元素或文字的颜色、明暗、大小等。

2.1 颜色主题

echarts 内置了 'dark' 主题,其他主题需自己下载。

var chart = echarts.init(dom, "dark");

2.2 调色盘

调色盘,可以在 option 中设置。它给定了一组颜色,图形、系列会自动依次从其中选择颜色。可以设置全局的调色盘,也可以设置系列自己专属的调色盘。

var option = {
  // 全局调色盘。
  color: [
    "#c23531",
    "#2f4554",
    "#61a0a8",
    "#d48265",
    "#91c7ae",
    "#749f83",
    "#ca8622",
    "#bda29a",
    "#6e7074",
    "#546570",
    "#c4ccd3",
  ],

  series: [
    {
      type: "bar",
      // 此系列自己的调色盘。
      color: [
        "#dd6b66",
        "#759aa0",
        "#e69d87",
        "#8dc1a9",
        "#ea7e53",
        "#eedd78",
        "#73a373",
        "#73b9bc",
        "#7289ab",
        "#91ca8c",
        "#f49f42",
      ],
      // ...
    },
    {
      type: "pie",
      // 此系列自己的调色盘。
      color: [
        "#37A2DA",
        "#32C5E9",
        "#67E0E3",
        "#9FE6B8",
        "#FFDB5C",
        "#ff9f7f",
        "#fb7293",
        "#E062AE",
        "#E690D1",
        "#e7bcf3",
        "#9d96f5",
        "#8378EA",
        "#96BFFF",
      ],
      // ...
    },
  ],
};

2.3 直接样式设置

这是比较常见的设置方式,在 option 中的很多地方可以设置 itemStylelineStyleareaStylelabel 等等。这些的地方可以直接设置图形元素的颜色、线宽、点的大小、标签的文字、标签的样式等等。后续配置项有详解,在这就不多叙述了。

2.4 高亮样式 emphasis

鼠标悬浮图形元素一般会出现高亮的样式,默认情况下,高亮样式是根据普通样式自动生成的,也可以通过 emphasis 自定义高亮。

myChart.setOption({
  title: {
    text: "ECharts 入门示例",
  },
  tooltip: {},
  xAxis: {
    data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
  },
  yAxis: {},
  series: [
    {
      name: "销量",
      type: "bar",
      data: [5, 20, 36, 10, 10, 20],
      emphasis: {
        itemStyle: {
          // 高亮时点的颜色。
          color: "blue",
        },
        label: {
          show: true,
          // 高亮时标签的文字。
          formatter: "This is a emphasis label.",
        },
      },
    },
  ],
});

3. 数据集

常用 series.data 设置系列所需展示数据,但官网推荐使用数据集(dataset)来专门管理数据,因为这样数据可以被多个组件复用。

3.1 在系列中设置数据

var option = {
  xAxis: {
    type: "category",
    data: ["Matcha Latte", "Milk Tea", "Cheese Cocoa", "Walnut Brownie"],
  },
  yAxis: {},
  series: [
    {
      type: "bar",
      name: "2015",
      data: [89.3, 92.1, 94.4, 85.4],
    },
    {
      type: "bar",
      name: "2016",
      data: [95.8, 89.4, 91.2, 76.9],
    },
    {
      type: "bar",
      name: "2017",
      data: [97.7, 83.1, 92.5, 78.1],
    },
  ],
};

3.2 在数据集中设置数据

var option = {
  legend: {},
  tooltip: {},
  dataset: {
    // 提供一份数据。
    source: [
      ["product", "2015", "2016", "2017"],
      ["Matcha Latte", 43.3, 85.8, 93.7],
      ["Milk Tea", 83.1, 73.4, 55.1],
      ["Cheese Cocoa", 86.4, 65.2, 82.5],
      ["Walnut Brownie", 72.4, 53.9, 39.1],
    ],
  },
  // 声明一个 X 轴,类目轴(category)。默认情况下,类目轴对应到 dataset 第一列。
  xAxis: { type: "category" },
  // 声明一个 Y 轴,数值轴。
  yAxis: {},
  // 声明多个 bar 系列,默认情况下,每个系列会自动对应到 dataset 的每一列。
  series: [{ type: "bar" }, { type: "bar" }, { type: "bar" }],
};

或者也可以使用常见的"对象数组"的格式

var option = {
  legend: {},
  tooltip: {},
  dataset: {
    // 用 dimensions 指定了维度的顺序。直角坐标系中,如果 X 轴 type 为 category,
    // 默认把第一个维度映射到 X 轴上,后面维度映射到 Y 轴上。
    // 如果不指定 dimensions,也可以通过指定 series.encode
    // 完成映射,参见后文。
    dimensions: ["product", "2015", "2016", "2017"],
    source: [
      { product: "Matcha Latte", 2015: 43.3, 2016: 85.8, 2017: 93.7 },
      { product: "Milk Tea", 2015: 83.1, 2016: 73.4, 2017: 55.1 },
      { product: "Cheese Cocoa", 2015: 86.4, 2016: 65.2, 2017: 82.5 },
      { product: "Walnut Brownie", 2015: 72.4, 2016: 53.9, 2017: 39.1 },
    ],
  },
  xAxis: { type: "category" },
  yAxis: {},
  series: [{ type: "bar" }, { type: "bar" }, { type: "bar" }],
};

3.3 数据集(dataset)到图形 (series) 的映射

指定数据集的列(column)或行(row)映射为系列(series)。通过 series.seriesLayoutBy 属性来配置。默认是按照列(column)来映射。

指定维度映射的规则:通过 series.encode 属性,以及 visualMap 组件来配置。默认情况下维度会自动对应到 dataset.source 中的第一列,之后三个柱图系列的数据一一对应到 dataset.source 中后面每一列。

3.4 数据集(dataset)的行列映射为系列(series)

有了数据表后,用户可以通过 series.seriesLayoutBy 配置项,改变图表对于行列的理解。series.seriesLayoutBy 可取值:

'column': 默认值。系列被安放到 dataset 的列上面。

'row': 系列被安放到 dataset 的行上面。

var option = {
  legend: {},
  tooltip: {},
  dataset: {
    source: [
      ["product", "2012", "2013", "2014", "2015"],
      ["Matcha Latte", 41.1, 30.4, 65.1, 53.3],
      ["Milk Tea", 86.5, 92.1, 85.7, 83.1],
      ["Cheese Cocoa", 24.1, 67.2, 79.5, 86.4],
    ],
  },
  xAxis: [
    { type: "category", gridIndex: 0 },
    { type: "category", gridIndex: 1 },
  ],
  yAxis: [{ gridIndex: 0 }, { gridIndex: 1 }],
  grid: [{ bottom: "55%" }, { top: "55%" }],
  series: [
    // 这几个系列会出现在第一个直角坐标系中,每个系列对应到 dataset 的每一行。
    { type: "bar", seriesLayoutBy: "row" },
    { type: "bar", seriesLayoutBy: "row" },
    { type: "bar", seriesLayoutBy: "row" },
    // 这几个系列会出现在第二个直角坐标系中,每个系列对应到 dataset 的每一列。
    { type: "bar", xAxisIndex: 1, yAxisIndex: 1 },
    { type: "bar", xAxisIndex: 1, yAxisIndex: 1 },
    { type: "bar", xAxisIndex: 1, yAxisIndex: 1 },
    { type: "bar", xAxisIndex: 1, yAxisIndex: 1 },
  ],
};

3.5 维度(dimension)

当把系列(series)对应到 “列” 时,列就称为“维度(dimension)”,行称为数据项(item)。当把系列(series)对应到 “行” 时,行就是“维度(dimension)”,列就是数据项(item)。

维度名(dimension name)可以在定义在 dataset 的第一行(列)。从第二行(列)开始,才是正式的数据。dataset.source 中第一行(列)到底包含不包含维度名,ECharts 默认会自动探测。也可以通过 dataset.sourceHeader 设置,为 true 显示声明第一行(列)就是维度,为 false 表明第一行(列)开始就直接是数据。

3.6 数据到图形的映射(series.encode)

可以使用 series.encode 来做映射。

var option = {
  dataset: {
    source: [
      ["score", "amount", "product"],
      [89.3, 58212, "Matcha Latte"],
      [57.1, 78254, "Milk Tea"],
      [74.4, 41032, "Cheese Cocoa"],
      [50.1, 12755, "Cheese Brownie"],
      [89.7, 20145, "Matcha Cocoa"],
      [68.1, 79146, "Tea"],
      [19.6, 91852, "Orange Juice"],
      [10.6, 101852, "Lemon Juice"],
      [32.7, 20112, "Walnut Brownie"],
    ],
  },
  xAxis: {},
  yAxis: { type: "category" },
  series: [
    {
      type: "bar",
      encode: {
        // 将 "amount" 列映射到 X 轴。
        x: "amount",
        // 将 "product" 列映射到 Y 轴。
        y: "product",
      },
    },
  ],
};

series.encode 声明结构如下。冒号左边可以是坐标系、标签等特定名称,如 'x', 'y', 'tooltip' 等,冒号右边是数据中的维度名(string 格式)或者维度的序号(number 格式,从 0 开始计数),可以指定一个或多个维度(使用数组)。

// 在任何坐标系和系列中,都支持:
encode: {
  // 使用 “名为 product 的维度” 和 “名为 score 的维度” 的值在 tooltip 中显示
  tooltip: ['product', 'score']
  // 使用 “维度 1” 和 “维度 3” 的维度名连起来作为系列名。(有时候名字比较长,这可以避免在 series.name 重复输入这些名字)
  seriesName: [1, 3],
  // 表示使用 “维度2” 中的值作为 id。这在使用 setOption 动态更新数据时有用处,可以使新老数据用 id 对应起来,从而能够产生合适的数据更新动画。
  itemId: 2,
  // 指定数据项的名称使用 “维度3” 在饼图等图表中有用,可以使这个名字显示在图例(legend)中。
  itemName: 3
}

// 直角坐标系(grid/cartesian)特有的属性:
encode: {
  // 把 “维度1”、“维度5”、“名为 score 的维度” 映射到 X 轴:
  x: [1, 5, 'score'],
  // 把“维度0”映射到 Y 轴。
  y: 0
}

// 单轴(singleAxis)特有的属性:
encode: {
  single: 3
}

// 极坐标系(polar)特有的属性:
encode: {
  radius: 3,
  angle: 2
}

// 地理坐标系(geo)特有的属性:
encode: {
  lng: 3,
  lat: 2
}

// 对于一些没有坐标系的图表,例如饼图、漏斗图等,可以是:
encode: {
  value: 3
}
3.6.1 默认的 series.encode

在坐标系中(如直角坐标系、极坐标系等):

| 有类目轴(axis.type 为 'category'),则将第一列(行)映射到这个轴上,后续每一列(行)对应一个系列。

| 如果没有类目轴,假如坐标系有两个轴(例如直角坐标系的 X Y 轴),则每两列对应一个系列,这两列分别映射到这两个轴上。

如果没有坐标系(如饼图):

| 取第一列(行)为名字,第二列(行)为数值(如果只有一列,则取第一列为数值)。

3.6.2 常见的 series.encode 设置方式
// 把第三列设置为 X 轴,第五列设置为 Y 轴
var option = {
  series: {
    // 注意维度序号(dimensionIndex)从 0 开始计数,第三列是 dimensions[2]。
    encode: { x: 2, y: 4 },
    // ...
  },
};

// 第三行设置为 X 轴,第五行设置为 Y 轴
var option = {
  series: {
    encode: { x: 2, y: 4 },
    seriesLayoutBy: 'row'
    // ...
  }
};

// 把第二列设置为标签
var option = {
  series: {
    label: {
      // `'{@score}'` 表示 “名为 score” 的维度里的值。
      // `'{@[4]}'` 表示引用序号为 4 的维度里的值。
      formatter: 'aaa{@product}bbb{@score}ccc{@[4]}ddd';
    }
  }
};

// 让第 2 列和第 3 列显示在提示框(tooltip)
var option = {
  series: {
    encode: {
      tooltip: [1, 2]
      // ...
    }
    // ...
  }
};

// 给维度取名
var option = {
  dataset: {
    dimensions: ['score', 'amount'],
    source: [
      [89.3, 3371],
      [92.1, 8123],
      [94.4, 1954],
      [85.4, 829]
    ]
  }
};

// 把第三列映射为气泡图的点的大小
var option = {
  dataset: {
    source: [
      [12, 323, 11.2],
      [23, 167, 8.3],
      [81, 284, 12],
      [91, 413, 4.1],
      [13, 287, 13.5]
    ]
  },
  visualMap: {
    show: false,
    dimension: 2, // 指向第三列(列序号从 0 开始记,所以设置为 2)。
    min: 2, // 需要给出数值范围,最小数值。
    max: 15, // 需要给出数值范围,最大数值。
    inRange: {
      // 气泡尺寸:5 像素到 60 像素。
      symbolSize: [5, 60]
    }
  },
  xAxis: {},
  yAxis: {},
  series: {
    type: 'scatter'
  }
};

3.7 数据的各种格式

除了二维数组还可以是 key-value 格式

dataset: [
  {
    // 按行的 key-value 形式(对象数组),这是个比较常见的格式。
    source: [
      { product: "Matcha Latte", count: 823, score: 95.8 },
      { product: "Milk Tea", count: 235, score: 81.4 },
      { product: "Cheese Cocoa", count: 1042, score: 91.2 },
      { product: "Walnut Brownie", count: 988, score: 76.9 },
    ],
  },
  {
    // 按列的 key-value 形式。
    source: {
      product: ["Matcha Latte", "Milk Tea", "Cheese Cocoa", "Walnut Brownie"],
      count: [823, 235, 1042, 988],
      score: [95.8, 81.4, 91.2, 76.9],
    },
  },
];

3.8 多个 dataset 以及如何引用他们

可以同时定义多个 dataset。系列可以通过 series.datasetIndex 来指定引用哪个 dataset。

var option = {
  dataset: [
    {
      // 序号为 0 的 dataset。
      source: [],
    },
    {
      // 序号为 1 的 dataset。
      source: [],
    },
    {
      // 序号为 2 的 dataset。
      source: [],
    },
  ],
  series: [
    {
      // 使用序号为 2 的 dataset。
      datasetIndex: 2,
    },
    {
      // 使用序号为 1 的 dataset。
      datasetIndex: 1,
    },
  ],
};

4. 数据转换

“数据转换” 指给定一个“数据集”(dataset)和一个“转换方法”(transform),echarts 生成一个新的“数据集”,然后使用这个新的“数据集”绘制图表。

4.1 数据转换基础使用

例子:三个饼图分别显示了 2011、2012、2013 年的数据。

var option = {
  dataset: [
    {
      // 这个 dataset 的 index 是 `0`。
      source: [
        ["Product", "Sales", "Price", "Year"],
        ["Cake", 123, 32, 2011],
        ["Cereal", 231, 14, 2011],
        ["Tofu", 235, 5, 2011],
        ["Dumpling", 341, 25, 2011],
        ["Biscuit", 122, 29, 2011],
        ["Cake", 143, 30, 2012],
        ["Cereal", 201, 19, 2012],
        ["Tofu", 255, 7, 2012],
        ["Dumpling", 241, 27, 2012],
        ["Biscuit", 102, 34, 2012],
        ["Cake", 153, 28, 2013],
        ["Cereal", 181, 21, 2013],
        ["Tofu", 395, 4, 2013],
        ["Dumpling", 281, 31, 2013],
        ["Biscuit", 92, 39, 2013],
        ["Cake", 223, 29, 2014],
        ["Cereal", 211, 17, 2014],
        ["Tofu", 345, 3, 2014],
        ["Dumpling", 211, 35, 2014],
        ["Biscuit", 72, 24, 2014],
      ],
      // id: 'a'
    },
    {
      // 这个 dataset 的 index 是 `1`。
      // 这个 `transform` 配置,表示,此 dataset 的数据,来自于此 transform 的结果。
      transform: {
        type: "filter",
        config: { dimension: "Year", value: 2011 },
      },
      // 我们还可以设置这些可选的属性: `fromDatasetIndex` 或 `fromDatasetId`。
      // 这些属性,指定了,transform 的输入,来自于哪个 dataset。例如,
      // `fromDatasetIndex: 0` 表示输入来自于 index 为 `0` 的 dataset 。又例如,
      // `fromDatasetId: 'a'` 表示输入来自于 `id: 'a'` 的 dataset。
      // 当这些属性都不指定时,默认认为,输入来自于 index 为 `0` 的 dataset 。
    },
    {
      // 这个 dataset 的 index 是 `2`。
      // 同样,这里因为 `fromDatasetIndex` 和 `fromDatasetId` 都没有被指定,
      // 那么输入默认来自于 index 为 `0` 的 dataset 。
      transform: {
        // 这个类型为 "filter" 的 transform 能够遍历并筛选出满足条件的数据项。
        type: "filter",
        // 每个 transform 如果需要有配置参数的话,都须配置在 `config` 里。
        // 在这个 "filter" transform 中,`config` 用于指定筛选条件。
        // 下面这个筛选条件是:选出维度( dimension )'Year' 中值为 2012 的所有
        // 数据项。
        config: { dimension: "Year", value: 2012 },
      },
    },
    {
      // 这个 dataset 的 index 是 `3`。
      transform: {
        type: "filter",
        config: { dimension: "Year", value: 2013 },
      },
    },
  ],
  series: [
    {
      type: "pie",
      radius: 50,
      center: ["25%", "50%"],
      // 这个饼图系列,引用了 index 为 `1` 的 dataset 。也就是,引用了上述
      // 2011 年那个 "filter" transform 的结果。
      datasetIndex: 1,
    },
    {
      type: "pie",
      radius: 50,
      center: ["50%", "50%"],
      datasetIndex: 2,
    },
    {
      type: "pie",
      radius: 50,
      center: ["75%", "50%"],
      datasetIndex: 3,
    },
  ],
};

4.2 数据转换的进阶使用

transform 可以被链式声明,这是一个语法糖。

var option = {
  dataset: [
    {
      source: [
        // 原始数据
      ],
    },
    {
      // 几个 transform 被声明成 array ,他们构成了一个链,
      // 前一个 transform 的输出是后一个 transform 的输入。
      transform: [
        {
          type: "filter",
          config: { dimension: "Product", value: "Tofu" },
        },
        {
          type: "sort",
          config: { dimension: "Year", order: "desc" },
        },
      ],
    },
  ],
  series: {
    type: "pie",
    // 这个系列引用上述 transform 的结果。
    datasetIndex: 1,
  },
};

使用 transform 时,可以通过 transform.print: true 打印结果,方便 debug 。这个配置项只在开发环境中生效。

var option = {
  dataset: [
    {
      source: [],
    },
    {
      transform: {
        type: "filter",
        config: {},
        // 配置为 `true` 后, transform 的结果
        // 会被 console.log 打印出来。
        print: true,
      },
    },
  ],
  // ...
};

4.3 数据转换器 "filter"

config.dimension 指定了维度:可以指定维度名或维度 index。

关系操作符:>(gt)、>=(gte)、<(lt)、<=(lte)、=(eq)、!=(ne、<>)、reg。

var option = {
  dataset: [
    {
      source: [
        ["Product", "Sales", "Price", "Year"],
        ["Cake", 123, 32, 2011],
        ["Latte", 231, 14, 2011],
        ["Tofu", 235, 5, 2011],
        ["Milk Tee", 341, 25, 2011],
        ["Porridge", 122, 29, 2011],
        ["Cake", 143, 30, 2012],
        ["Latte", 201, 19, 2012],
        ["Tofu", 255, 7, 2012],
        ["Milk Tee", 241, 27, 2012],
        ["Porridge", 102, 34, 2012],
        ["Cake", 153, 28, 2013],
        ["Latte", 181, 21, 2013],
        ["Tofu", 395, 4, 2013],
        ["Milk Tee", 281, 31, 2013],
        ["Porridge", 92, 39, 2013],
        ["Cake", 223, 29, 2014],
        ["Latte", 211, 17, 2014],
        ["Tofu", 345, 3, 2014],
        ["Milk Tee", 211, 35, 2014],
        ["Porridge", 72, 24, 2014],
      ],
    },
    {
      transform: {
        type: "filter",
        config: { dimension: "Year", "=": 2011 },
        // 这个筛选条件表示,遍历数据,筛选出维度( dimension )
        // 'Year' 上值为 2011 的所有数据项。
      },
    },
  ],
  series: {
    type: "pie",
    datasetIndex: 1,
  },
};

也支持逻辑比较操作符,与或非( and | or | not ):

var option = {
  dataset: [
    {
      source: [
        // ...
      ],
    },
    {
      transform: {
        type: "filter",
        config: {
          // 使用 and 操作符。
          // 类似地,同样的位置也可以使用 “or” 或 “not”。
          // 但是注意 “not” 后应该跟一个 {...} 而非 [...] 。
          and: [
            { dimension: "Year", "=": 2011 },
            { dimension: "Price", ">=": 20, "<": 30 },
          ],
        },
        // 这个表达的是,选出 2011 年价格大于等于 20 但小于 30 的数据项。
      },
    },
  ],
  series: {
    type: "pie",
    datasetIndex: 1,
  },
};

and/or/not 自然可以被嵌套,例如:

transform: {
  type: 'filter',
  config: {
    or: [{
      and: [{
        dimension: 'Price', '>=': 10, '<': 20
      }, {
        dimension: 'Sales', '<': 100
      }, {
        not: { dimension: 'Product', '=': 'Tofu' }
      }]
    }, {
      and: [{
        dimension: 'Price', '>=': 10, '<': 20
      }, {
        dimension: 'Sales', '<': 100
      }, {
        not: { dimension: 'Product', '=': 'Cake' }
      }]
    }]
  }
}

4.4 数据转换器 "sort"

"sort" 是另一个内置的数据转换器,用于排序数据。目前主要能用于在类目轴( axis.type: 'category' )中显示排过序的数据。例如:

var option = {
  dataset: [
    {
      dimensions: ["name", "age", "profession", "score", "date"],
      source: [
        [" Hannah Krause ", 41, "Engineer", 314, "2011-02-12"],
        ["Zhao Qian ", 20, "Teacher", 351, "2011-03-01"],
        [" Jasmin Krause ", 52, "Musician", 287, "2011-02-14"],
        ["Li Lei", 37, "Teacher", 219, "2011-02-18"],
        [" Karle Neumann ", 25, "Engineer", 253, "2011-04-02"],
        [" Adrian Groß", 19, "Teacher", null, "2011-01-16"],
        ["Mia Neumann", 71, "Engineer", 165, "2011-03-19"],
        [" Böhm Fuchs", 36, "Musician", 318, "2011-02-24"],
        ["Han Meimei ", 67, "Engineer", 366, "2011-03-12"],
      ],
    },
    {
      transform: {
        type: "sort",
        // 按分数排序
        config: { dimension: "score", order: "asc" },
        print: true,
      },
    },
  ],
  xAxis: { type: "category" },
  yAxis: {},
  series: [
    {
      type: "bar",
      datasetIndex: 1,
      encode: {
        x: "name",
        y: "score",
      },
    },
  ],
  // ...
};

5. 坐标轴

5.1 x 轴、y 轴

x 轴y 轴都由轴线、刻度、刻度标签、轴标题四个部分组成。

普通的二维数据坐标系都有 x 轴和 y 轴,通常情况下,x 轴显示在图表的底部,y 轴显示在左侧,一般配置如下:

var option = {
  xAxis: {
    // ...
  },
  yAxis: {
    // ...
  },
};

当 x 轴(水平坐标轴)跨度很大,可以使用 dataZoom 区域缩放的方式,灵活显示数据内容。

var option = {
  xAxis: {
    type: "time",
    name: "销售时间",
    // ...
  },
  yAxis: {
    type: "value",
    name: "销售数量",
    // ...
  },
  dataZoom: [
    // ...
  ],
  // ...
};

在二维数据中,轴可以有多个。ECharts 中一般情况下单个 grid 组件最多只能放两个 x/y 轴,多于两个 x/y 轴需通过配置 offset 属性防止同个位置多个轴的重叠。两个 x 轴显示在上下,两个 y 轴显示在左右两侧。

var option = {
  xAxis: {
    type: "time",
    name: "销售时间",
    // ...
  },
  yAxis: [
    {
      type: "value",
      name: "销售数量",
      // ...
    },
    {
      type: "value",
      name: "销售金额",
      // ...
    },
  ],
  // ...
};

5.2 轴线

使用 axisLine 修改相关的配置,例如轴线两端的箭头,轴线的样式等。

var option = {
  xAxis: {
    axisLine: {
      symbol: "arrow",
      lineStyle: {
        type: "dashed",
        // ...
      },
    },
    // ...
  },
  yAxis: {
    axisLine: {
      symbol: "arrow",
      lineStyle: {
        type: "dashed",
        // ...
      },
    },
  },
  // ...
};

5.3 刻度

使用 axisTick 修改相关的配置,例如刻度线的长度,样式等。

var option = {
  xAxis: {
    axisTick: {
      length: 6,
      lineStyle: {
        type: "dashed",
        // ...
      },
    },
    // ...
  },
  yAxis: {
    axisTick: {
      length: 6,
      lineStyle: {
        type: "dashed",
        // ...
      },
    },
  },
  // ...
};

5.4 刻度标签

使用 axisLabel 修改相关的配置,例如文字对齐方式,自定义刻度标签内容等。

var option = {
  xAxis: {
    axisLabel: {
      formatter: "{value} kg",
      align: "center",
      // ...
    },
    // ...
  },
  yAxis: {
    axisLabel: {
      formatter: "{value} 元",
      align: "center",
      // ...
    },
  },
  // ...
};

5.5 示例

左侧的 y 轴代表月平均气温,右侧的 y 轴表示降水量,x 轴表示时间。两组 y 轴在一起,反映了平均气温和降水量间的趋势关系。

var option = {
  tooltip: {
    trigger: "axis",
    axisPointer: { type: "cross" },
  },
  legend: {},
  xAxis: [
    {
      type: "category",
      axisTick: {
        alignWithLabel: true,
      },
      data: [
        "1月",
        "2月",
        "3月",
        "4月",
        "5月",
        "6月",
        "7月",
        "8月",
        "9月",
        "10月",
        "11月",
        "12月",
      ],
    },
  ],
  yAxis: [
    {
      type: "value",
      name: "降水量",
      min: 0,
      max: 250,
      position: "right",
      axisLabel: {
        formatter: "{value} ml",
      },
    },
    {
      type: "value",
      name: "温度",
      min: 0,
      max: 25,
      position: "left",
      axisLabel: {
        formatter: "{value} °C",
      },
    },
  ],
  series: [
    {
      name: "降水量",
      type: "bar",
      yAxisIndex: 0,
      data: [6, 32, 70, 86, 68.7, 100.7, 125.6, 112.2, 78.7, 48.8, 36.0, 19.3],
    },
    {
      name: "温度",
      type: "line",
      smooth: true,
      yAxisIndex: 1,
      data: [
        6.0, 10.2, 10.3, 11.5, 10.3, 13.2, 14.3, 16.4, 18.0, 16.5, 12.0, 5.2,
      ],
    },
  ],
};

6. 图例

通过 legend 设置图例,点击图例可以显示或隐藏该图例对应数据列。

6.1 布局

通过 orienttoprgihtleftbottom 设置图例位置。

var option = {
  legend: {
    // Try 'horizontal'
    orient: "vertical",
    right: 10,
    top: "center",
  },
  dataset: {
    source: [
      ["product", "2015", "2016", "2017"],
      ["Matcha Latte", 43.3, 85.8, 93.7],
      ["Milk Tea", 83.1, 73.4, 55.1],
      ["Cheese Cocoa", 86.4, 65.2, 82.5],
      ["Walnut Brownie", 72.4, 53.9, 39.1],
    ],
  },
  xAxis: { type: "category" },
  yAxis: {},
  series: [{ type: "bar" }, { type: "bar" }, { type: "bar" }],
};

当图例较多时,设置 legend.type: 'scroll' 使用可滚动翻页的图例

var option = {
  legend: {
    type: "scroll",
    orient: "vertical",
    right: 10,
    top: 20,
    bottom: 20,
    data: ["图例一", "图例二", "图例三" /* ... */, , "图例n"],
    // ...
  },
  // ...
};

6.2 样式

var option = {
  legend: {
    data: ["图例一", "图例二", "图例三"],
    backgroundColor: "#ccc",
    textStyle: {
      color: "#ccc",
      // ...
    },
    // ...
  },
  // ...
};

6.3 交互

根据场景需要,图例可支持交互操作,点击控制显示或隐藏对应的数据列;

var option = {
  legend: {
    data: ["图例一", "图例二", "图例三"],
    selected: {
      图例一: true,
      图例二: true,
      图例三: false,
    },
    // ...
  },
  // ...
};

7. 事件与行为

ECharts 中的事件名称对应 DOM 事件名称,均为小写的字符串,如下是一个绑定点击操作的示例。

myChart.on("click", function (params) {
  // 控制台打印数据的名称
  console.log(params.name);
});

7.1 鼠标事件的处理

ECharts 支持常规的鼠标事件类型,包括 'click'、 'dblclick'、 'mousedown'、 'mousemove'、 'mouseup'、 'mouseover'、 'mouseout'、 'globalout'、 'contextmenu' 事件。例子:点击柱状图后打开相应的百度搜索页面的示例。

// 基于准备好的dom,初始化ECharts实例
// var myChart = echarts.init(document.getElementById('main'));

// 指定图表的配置项和数据
var option = {
  xAxis: {
    data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
  },
  yAxis: {},
  series: [
    {
      name: "销量",
      type: "bar",
      data: [5, 20, 36, 10, 10, 20],
    },
  ],
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
// 处理点击事件并且跳转到相应的百度搜索页面
myChart.on("click", function (params) {
  window.open("https://www.baidu.com/s?wd=" + encodeURIComponent(params.name));
});

如何区分鼠标点击到了哪里:

myChart.on("click", function (params) {
  if (params.componentType === "markPoint") {
    // 点击到了 markPoint 上
    if (params.seriesIndex === 5) {
      // 点击到了 index 为 5 的 series 的 markPoint 上。
    }
  } else if (params.componentType === "series") {
    if (params.seriesType === "graph") {
      if (params.dataType === "edge") {
        // 点击到了 graph 的 edge(边)上。
      } else {
        // 点击到了 graph 的 node(节点)上。
      }
    }
  }
});

7.2 组件交互的行为事件

监听图例开关的示例:

// 图例开关的行为只会触发 legendselectchanged 事件
myChart.on("legendselectchanged", function (params) {
  // 获取点击图例的选中状态
  var isSelected = params.selected[params.name];
  // 在控制台中打印
  console.log((isSelected ? "选中了" : "取消选中了") + "图例" + params.name);
  // 打印所有图例的状态
  console.log(params.selected);
});

通过 dispatchAction 去轮流高亮饼图的每个扇形。

var option = {
  title: {
    text: "饼图程序调用高亮示例",
    left: "center",
  },
  tooltip: {
    trigger: "item",
    formatter: "{a} <br/>{b} : {c} ({d}%)",
  },
  legend: {
    orient: "vertical",
    left: "left",
    data: ["直接访问", "邮件营销", "联盟广告", "视频广告", "搜索引擎"],
  },
  series: [
    {
      name: "访问来源",
      type: "pie",
      radius: "55%",
      center: ["50%", "60%"],
      data: [
        { value: 335, name: "直接访问" },
        { value: 310, name: "邮件营销" },
        { value: 234, name: "联盟广告" },
        { value: 135, name: "视频广告" },
        { value: 1548, name: "搜索引擎" },
      ],
      emphasis: {
        itemStyle: {
          shadowBlur: 10,
          shadowOffsetX: 0,
          shadowColor: "rgba(0, 0, 0, 0.5)",
        },
      },
    },
  ],
};

let currentIndex = -1;

setInterval(function () {
  var dataLen = option.series[0].data.length;
  // 取消之前高亮的图形
  myChart.dispatchAction({
    type: "downplay",
    seriesIndex: 0,
    dataIndex: currentIndex,
  });
  currentIndex = (currentIndex + 1) % dataLen;
  // 高亮当前图形
  myChart.dispatchAction({
    type: "highlight",
    seriesIndex: 0,
    dataIndex: currentIndex,
  });
  // 显示 tooltip
  myChart.dispatchAction({
    type: "showTip",
    seriesIndex: 0,
    dataIndex: currentIndex,
  });
}, 1000);

7.3 监听 “空白处” 的事件

zrender 事件:当鼠标在任何地方都会被触发

echarts 事件:当鼠标在图形元素上时才能被触发。

myChart.getZr().on("click", function (event) {
  // 该监听器正在监听一个`zrender 事件`。
});
myChart.on("click", function (event) {
  // 该监听器正在监听一个`echarts 事件`。
});

有了 zrender 事件,我们就可以实现监听空白处的事件,如下:

myChart.getZr().on("click", function (event) {
  // 没有 target 意味着鼠标/指针不在任何一个图形元素上,它是从“空白处”触发的。
  if (!event.target) {
    // 点击在了空白处,做些什么。
  }
});

三:基础配置项

大部分 echarts 样式,布局都可以通过配置项解决,可以自行参考详细的配置项,echarts 配置项,本文档只作常用配置介绍。

1. xAxis x 轴 | yAxis y 轴

直角坐标系中的 x 轴,y 轴,两个选项的配置一模一样。

var option = {
  xAxis: {
    type: "category", // 轴类型:'value' 数值轴,适用于连续数据 | 'category' 类目轴,适用于离散的类目数据 | 'time' 时间轴,适用于连续的时序数据 | 'log' 对数轴。适用于对数数据。
    data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], // 类目数据,在类目轴(type: 'category')中有效。
    show: true, // 是否显示:默认 true
    position: "bottom", // x 轴的位置:'top' | 'bottom'
    name: "x 轴的名字", // 轴名称
    nameLocation: "center", // 轴名称显示位置 'start' | 'middle' 或者 'center' | 'end'
    nameGap: 15, // 轴名称与轴线之间的距离
    nameRotate: 30, // 轴名字旋转,角度值
    axisLine: {
      // 轴线配置
      show: true,
      lineStyle: {}, // 轴线样式设置
    },
    axisTick: {
      // 轴刻度配置
      show: true,
      alignWithLabel: false, // 刻度线和标签是否对齐
      inside: true, // 轴刻度是否朝内
      length: 5, // 轴刻度长度
      lineStyle: {}, // 轴刻度样式设置
    },
    axisLabel: {
      // 刻度标签
      show: true,
      interval: "auto", // 刻度标签间隔显示:0 强制全显示 | 1 间隔一个刻度标签显示 | 2 间隔两个刻度标签显示
      inside: false, // 刻度标签是否朝内
      rotate: 30, // 刻度标签旋转的角度
    },
    splitLine: {
      // 区域中的分隔线
      show: true,
    },
  },
  yAxis: {},
  series: [
    {
      name: "销量",
      type: "bar",
      data: [5, 20, 36, 10, 10, 20],
    },
  ],
};

2. series 系列列表

每个系列通过 type 决定自己的图表类型。

var option = {
  series: [
    {
      type: "line", // 折线/面积图
    },
    {
      type: "bar", // 柱状图
    },
    {
      type: "pie", // 饼图
    },
    {
      type: "scatter", // 散点(气泡)图
    },
    {
      type: "effectScatter", // 带有涟漪特效动画的散点(气泡)图
    },
    {
      type: "radar", // 雷达图
    },
    {
      type: "tree", // 树图
    },
    {
      type: "sunburst", // 旭日图
    },
    {
      type: "candlestick", // K线图
    },
    {
      type: "heatmap", // 热力图
    },
    {
      type: "map", // 地图
    },
    {
      type: "parallel", // 平行坐标系
    },
    {
      type: "lines", // 路径图
    },
    {
      type: "graph", // 关系图
    },
    {
      type: "sankey", // 桑基图
    },
    {
      type: "funnel", // 漏斗图
    },
    {
      type: "gauge", // 仪表盘
    },
    {
      type: "pictorialBar", // 象形柱图
    },
    {
      type: "themeRiver", // 主题河流
    },
    {
      type: "custom", // 自定义系列
    },
  ],
};

3. title 标题组件

包含主标题和副标题

var option = {
  xAxis: {
    data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
  },
  yAxis: {},
  series: [
    {
      name: "销量",
      type: "bar",
      data: [5, 20, 36, 10, 10, 20],
    },
  ],
  title: {
    // 主标题和副标题
    show: true, // 是否显示
    text: "主标题", // 主标题文本,支持使用 \n 换行
    link: "http://www.baidu.com", // 主标题文本超链接
    target: "blank", // 打开主标题超链接。方式:'self' 当前窗口打开 | 'blank' 新窗口打开
    subtext: "副标题", // 副标题文本,支持使用 \n 换行
    sublink: "http://wwww.4399.com", // 副标题文本超链接
    subtarget: "blank", // 打开副标题超链接 'self' 当前窗口打开 | 'blank' 新窗口打开
  },
};

4. legend 图例组件

展示不同系列的图例,系列必须设置有 name 属性,可以通过点击控制系列的显示和隐藏。

var option = {
  xAxis: {
    data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
  },
  yAxis: {},
  series: [
    {
      name: "销量",
      type: "bar",
      data: [5, 20, 36, 10, 10, 20],
    },
  ],
  legend: {
    type: "plain", // 图例的类型:'plain' 普通图例 | 'scroll' 可滚动图例
    left: "auto", // 图例距离容器左侧距离
    top: "auto", // 图例距离容器左侧距离
    right: "auto", // 图例距离容器左侧距离
    bottom: "auto", // 图例距离容器左侧距离
    itemGap: 10, // 图例间距
    formatter: function (name) {
      // 格式化图例文本
      return "Legend" + name;
    },
    selectedMode: true, // 图例选择模式:true | false | 'single' | 'multiple'
    icon: "circle", // 图例项 icon:'circle' | 'rect' | 'roundRect' | 'triangle' | 'diamond' | 'pin' | 'arrow' | 'none'
  },
};

5. tooltip 提示框

提示框可以在很多地方设置,可以设置全局的 tooltip、坐标系中 grid.tooltip、系列中 series.tooltip、系列每个数据项中 series.data.tooltip

字符串模板变量有 {a},{b},{c},{d},{e} 分别表示系列名、数据名、数据值等。当有多系列时可以通过{a0}, {a1}, {a2}等。

不同图表类型下的 {a},{b},{c},{d} 含义不一样。 其中变量{a}, {b}, {c}, {d}在不同图表类型下代表数据含义为:

折线(区域)图、柱状(条形)图、K 线图 : {a}(系列名称),{b}(类目值),{c}(数值), {d}(无)

散点图(气泡)图 : {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无)

地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无)

饼图、仪表盘、漏斗图: {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比)

var option = {
  xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] },
  yAxis: {},
  series: [
    {
      name: "销量",
      type: "bar",
      data: [5, 20, 36, 10, 10, 20],
    },
  ],
  tooltip: {
    position: [10, 10], // 提示框位置:相对于容器左侧 10px, 上侧 10 px
    formatter: "{a0}<br />{b0}: {c0}", // 提示框浮层内容格式器,支持字符串模板和回调函数
  },
};

6. grid 绘图网格

直角坐标系内绘图网格,可以通过该配置设置网格的位置和大小

var option = {
  xAxis: {
    data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
  },
  yAxis: {},
  series: [
    {
      name: "销量",
      type: "bar",
      data: [5, 20, 36, 10, 10, 20],
    },
  ],
  grid: {
    top: "10%", // grid 组件离容器上侧的距离
    left: "20%", // grid 组件离容器左侧的距离
    width: "400px", // grid 组件的宽度,默认自适应
  },
};

7. toolbox 工具栏

内置有导出图片,数据视图,动态类型切换,数据区域缩放,重置五个工具。

var option = {
  xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] },
  yAxis: {},
  series: [
    {
      name: "销量",
      type: "bar",
      data: [5, 20, 36, 10, 10, 20],
    },
  ],
  toolbox: {
    show: true,
    feature: {
      // 各工具配置项。除了各个内置的工具按钮外,还可以自定义工具按钮。
      dataZoom: {
        // 数据区域缩放。目前只支持直角坐标系的缩放。
        yAxisIndex: "none",
      },
      dataView: { readOnly: false }, // 数据视图工具,可以展现当前图表所用的数据,编辑后可以动态更新。
      magicType: { type: ["line", "bar"] }, // 动态类型切换
      restore: {}, // 配置项还原
      saveAsImage: {}, // 保存为图片
    },
  },
};

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

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

相关文章

通过商品id采集京东商品详情数据(含价格、优惠券、详情、主图等字段)

item_get_app-获得JD商品详情原数据 公共参数 名称类型必须描述keyString是调用key&#xff08;注册账号获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cach…

【八股】Spring篇

why Spring? 1.使用它的IOC功能&#xff0c;在解耦上达到了配置级别。 2.使用它对数据库访问事务相关的封装。 3.各种其他组件与Spring的融合&#xff0c;在Spring中更加方便快捷的继承其他一些组件。 IoC和DI &#x1f449;IOC是Inversion of Control的缩写&#xff0c;“…

Day4 商品管理

Day4 商品管理 这里会总结构建项目过程中遇到的问题&#xff0c;以及一些个人思考&#xff01;&#xff01; 学习方法&#xff1a; 1 github源码 文档 官网 2 内容复现 &#xff0c;实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 编写品牌服务 …

【C++】string类的增删改查模拟实现(图例超详细解析!!!)

目录 一、前言 二、string类的模拟实现 ✨前情提要 ✨Member functions —— 成员函数 ⚡构造函数 ⚡拷贝构造函数 ⚡赋值运算符重载 ⚡析构函数 ✨Element access —— 元素访问 ⚡operator[ ] ⚡Iterator —— 迭代器 ✨Capacity —— 容量 ⚡size ⚡capacity ⚡clea…

2024年 Java 面试八股文(20w字)

目录 第一章-Java基础篇 1、你是怎样理解OOP面向对象 难度系数&#xff1a;⭐ 2、重载与重写区别 难度系数&#xff1a;⭐ 3、接口与抽象类的区别 难度系数&#xff1a;⭐ 4、深拷贝与浅拷贝的理解 难度系数&#xff1a;⭐ 5、sleep和wait区别 难度系数&a…

VSCode配置Eclipse快捷键

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载扩展二、使用扩展总结 前言 有时候我们可能会同时使用很多种IDE&#xff0c;每种IDE又有不同的Keymap&#xff0c;快捷键用起来很头疼。比如我&#x…

免费语音转文字:自建Whisper,贝锐花生壳3步远程访问

Whisper是OpenAI开发的自动语音识别系统&#xff08;语音转文字&#xff09;。 OpenAI称其英文语音辨识能力已达到人类水准&#xff0c;且支持其它98中语言的自动语音辨识&#xff0c;Whisper神经网络模型被训练来运行语音辨识与翻译任务。 此外&#xff0c;与其他需要联网运行…

Ubuntu 20.04.6下载、安装

一、下载 下载地址&#xff1a;https://cn.ubuntu.com/download 下载版本&#xff1a;ubuntu-20.04.6-desktop-amd64.iso 二、安装 参考博客&#xff1a; https://blog.csdn.net/lhl_blog/article/details/123406322 https://www.cnblogs.com/fieldtianye/p/17879840.html…

如何使用docker部署前端项目

账号:root 密码:*** 主机:ip地址 登录后: 初级名词: sudo 是Linux和类Unix操作系统中的一个命令,全称为“super user do”,用于允许普通用户以超级用户(root)的身份执行某些或全部命令 需要下载的软件: sudo yum install 软件名 sudo yum install lrzsz 上传软件 s…

婴儿专用洗衣机有必要吗?四大宝藏婴儿洗衣机测评对比

对于有了宝宝的家庭来说&#xff0c;洗衣成为了一项重要的家务事。大家都知道&#xff0c;宝宝的皮肤比较娇嫩&#xff0c;容易受到各种细菌、病毒的侵扰。所以&#xff0c;宝宝的衣物应该与大人的分开洗。婴儿洗衣机作为一种专门为婴幼儿家庭设计的洗衣机&#xff0c;其具有除…

Spring5深入浅出篇:Spring对象属性注入详解

Spring5深入浅出篇:Spring对象属性注入详解 很多粉丝私信我这个Spring5的课程在哪看,这边是在B站免费观看欢迎大家投币支持一下. https://www.bilibili.com/video/BV1hK411Y7zf 首先需要了解什么是注入?在创建对象的过程中,不仅仅是创建一个对象还需要为对象的属性赋值.这一系…

Win11和WinRAR取消折叠菜单恢复经典菜单

这里写目录标题 前言1. Win11恢复经典右键菜单1.1 修改前1.2 恢复成经典右键菜单1.3 修改后1.4 想恢复怎么办&#xff1f; 2. WinRAR取消折叠菜单恢复经典菜单2.1 修改前2.2 修改恢复为经典菜单2.3 修改后2.4 想恢复怎么办&#xff1f; 前言 最近换回了Windows电脑&#xff0c…

SpringBoot学习(四)NoSQL、接口文档、远程调用、消息服务、Web安全、可观测性、AOT

文章目录 NoSQLRedis整合场景整合自动配置原理定制化序列化机制redis客户端 接口文档OpenAPI3架构整合使用常用注解Docket配置 远程调用WebClient创建与配置获取响应定义请求体 HTTP interface导入依赖定义接口创建代理&测试 消息服务消息队列-场景异步解耦削峰缓冲 消息队…

学习Docker笔记

在23号刚刚学完新版本的docker还想说回去继续学习老版本的springcloud课程里面的docker 结果一看黑马首页新版本课程出了&#xff0c;绷不住了。以下是我学习新版本docker的笔记&#xff0c;记录了我学习过程遇到的各种bug和解决&#xff0c;也参考了黑马老师的笔记&#xff1a…

统一SQL 支持Oracle decode函数到TDSQL-MySQL的转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;TDSQL-MySQL 操作目标 在Oracle中&#xff0c;decode函数语法如下图&#xff1a;该函数功能是将 expr与每个 search 依次做比较&#x…

告别SQL注入攻击之扰!揭秘强大防护策略,筑牢网站安全防线,畅享无忧体验!

SQL注入攻击是一种极具破坏性的Web漏洞&#xff0c;它利用应用程序对用户输入的处理不当&#xff0c;让恶意用户能够执行非授权的SQL查询&#xff0c;进而对数据库造成巨大损害。这种攻击方式可能导致数据泄露、系统崩溃等严重后果&#xff0c;因此必须引起高度重视。 为了有效…

免费又好用的五款电脑监控软件(先收藏再看)

电脑监控软件可以为企业的管理提供一臂之力&#xff0c;然而市面上的监控软件品牌众多&#xff0c;良莠不齐&#xff0c;导致企业不知道用哪个&#xff0c;今天为大家盘点免费又好用的五款电脑监控软件。 安企神&#xff08;点击试用7天&#xff09; 安企神是一款专业的电脑监…

OpenAIGPT-4.5提前曝光?

OpenAI GPT-4.5的神秘面纱&#xff1a;科技界的震撼新篇章 在人工智能的世界里&#xff0c;每一次技术的飞跃都不仅仅是一次更新&#xff0c;而是对未来无限可能的探索。近日&#xff0c;科技巨头OpenAI似乎再次站在了这场革命的前沿&#xff0c;其潜在的新产品——GPT-4.5 Tur…

电力调度自动化系统,如何减少配电安全隐患?

“双碳”战略目标下&#xff0c;数据中心迎来了更多发展机遇&#xff0c;同时电力调度自动化系统也迎来更多挑战&#xff0c;如何保障持续稳定的电力供应、确保关键负载的可靠运行&#xff0c;并兼顾数字化管理、绿色可持续转型等等议题成为数据中心行业构建未来领导力的重要关…

使用gdb调试遇到No symbol table is loaded. Use the “file“ command.怎么办?

问题排查 出现下面问题&#xff0c;通常是没有处于调式模式环境下&#xff0c;所以我们需要在gcc指令后加 【-g】。 因为&#xff0c;我么的gcc编辑器默认是动态链接&#xff0c;而且是realese发布版本。 想要解决也很简单 主要思路就是在gcc -g。 在makefile文件如下进行修改即…