静态地图布局设计

这一节的教程是基于b站pink老师的教程进行记录的,感兴趣的可以点过去学习一波

案例——ECharts

前期准备工作,搭建项目文件夹存储对应文件

所需技术

  1. css布局

  2. flex布局

  3. 原生js+JQuery

  4. rem适配(px转rem)

    • sublime安装插件,下载地址https://gitee.com/selience/Sublime-cssrem-plugin.git

    • 打开sublime插件目录

    • 将下载的插件包复制进该文件夹

    • 打开sublime,首选项→package Settions→cssrem→设置,本来打算在这两个文件设置相应配置,但失败了(懒得研究)

      image-20200616210129279

    • 在插件文件夹打开Sublime-cssrem-plugin,路径→Sublime Text 3\Packages\Sublime-cssrem-plugin,修改设置

      image-20200616205943772

      1
      2
      3
      4
      5
      {
      "px_to_rem": 80, //设置80px转1rem
      "max_rem_fraction_length": 6,
      "available_file_types": [".css", ".less", ".sass"]
      }

页面布局

页面HTML文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>中国疫情地图</title>
<!-- <link rel="stylesheet" href="Bootstrap/css/bootstrap.min.css"> -->
<!-- <script src="Bootstrap/js/bootstrap.min.js"></script> -->
<script src="js/echarts.min.js"></script>
<!-- arcgis模块 -->
<link rel="stylesheet" href="https://js.arcgis.com/4.15/esri/themes/light/main.css">
<script src="https://js.arcgis.com/4.15/"></script>
<script src="js/jquery.js"></script>
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<header>
<h1> 中国疫情地图 </h1>
<div class="showTime"></div>
<!-- 这里是时间函数,下面有 -->
</header>
<section class="mainbox">
<!-- 左 -->
<div class="column">
<div class="panel bar">
<h2>各省疫情状况</h2>
<div class="chart"></div>
<div class="panelFooter"></div>
</div>
<div class="panel">
<h2>各省疫情状况</h2>
<div class="chart"></div>
<div class="panelFooter"></div>
</div>
<div class="panel">
<h2>各省疫情状况</h2>
<div class="chart"></div>
<div class="panelFooter"></div>
</div>
</div>
<!-- 中 -->
<div class="column">
<!-- 上模块 -->
<div class="no">
<div class="no-hd">
<ul>
<li>12566</li>
<li>10000</li>
</ul>
</div>
<div class="no-bd">
<ul>
<li>当前确诊人数</li>
<li>累计确诊人数</li>
</ul>
</div>
</div>
<!-- 地图模块 -->
<div class="map">
<div class="map1"></div>
<div class="map2"></div>
<div class="map3"></div>
<div class="chart" id="viewDiv"></div>
</div>
</div>
<!-- 右 -->
<div class="column">
<div class="panel">
<h2>各省疫情状况</h2>
<div class="chart"></div>
<div class="panelFooter"></div>
</div>
<div class="panel">
<h2>各省疫情状况</h2>
<div class="chart"></div>
<div class="panelFooter"></div>
</div>
<div class="panel">
<h2>各省疫情状况</h2>
<div class="chart"></div>
<div class="panelFooter"></div>
</div>
</div>
</section>
<script src="js/flexible.js"></script>
<!-- <script src="js/echarts.min.js"></script> -->
<script src="js/index.js"></script>
</body>
</html>

页面初始化

1
2
3
4
5
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}

页面底部以及背景图设置

  • 引入背景图(覆盖整个页面)
1
2
3
4
5
6
7
body {
background: url('../images/bg.jpg') no-repeat top center;
/* 覆盖整个页面 */
background-size: cover;
margin: 0;
padding: 0;
}

页面顶部导航条设置

  1. 高度为100px
  2. 背景图,在容器内显示
  3. 缩放比例为 100%
  4. h1 标题部分 白色 38像素 居中显示 行高为 80像素
  5. 时间模块 showTime 定位右侧 right 为 30px 行高为 75px 文字颜色为:rgba(255, 255, 255, 0.7) 而文字大小为 20像素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
header {
position: relative;
background: url('../images/head_bg.png') no-repeat top center;
height: 1.25rem;
/* 🔺缩放比例 100% */
background-size: 100% 100%;
}

header h1 {
color: white;
font-size: 0.475rem;
/* 文字居中 */
text-align: center;
line-height: 1.0rem;
}

.showTime {
position: absolute;
top: 0;
right: 0.375rem;
text-align: center;
line-height: 0.9375rem;
color: rgba(255, 255, 255, 0.7);
  • 这里的时间实时更新函数引用之前的js案例并相应修改,同时添加定时器(setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式)用来每隔指定时间调用该函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var formaDate = function() {
var d = new Date()
var year = d.getFullYear(), //多变量赋值
month = d.getMonth() + 1, //month:从0开始
date = d.getDate(),
hour = d.getHours(),
minute = d.getMinutes(),
second = d.getSeconds();

year = year < 10 ? '0' + year : year; //三元操作符
month = month < 10 ? '0' + month : month;
date = date < 10 ? '0' + date : date;
hour = hour < 10 ? '0' + hour : hour;
minute = minute < 10 ? '0' + minute : minute;
second = second < 10 ? '0' + second : second;
var a = year + '-' + month + '-' + date + ' ' + hour + ':' + minute + ':' + second
$('.showTime').html(a);
}
setInterval(formaDate, 1000) //设定定时器,循环运行;

mainbox主体模块

  1. 需要一个上左右的10px 的内边距
  2. column 列容器,分三列,占比 3:5:3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.mainbox {
padding: 0.125rem 0.125rem 0;
display: flex;
min-width: 1024px;
max-width: 1920px;
/* background-color: lightpink; */
}

.column {
flex: 3;
}

.column:nth-child(2) {
flex: 5;
margin: 0 0.125rem 0.1875rem;
}

公共面板模块 panel

设置放置图表的容器公共样式

  • 高度为 310px
    • 1像素的 1px solid rgba(25, 186, 139, 0.17) 边框
    • 有line.jpg 背景图片
    • padding为 上为 0 左右 15px 下为 40px
    • 下外边距是 15px
    • 利用panel 盒子 before 和after 制作上面两个角 大小为 10px 线条为 2px solid #02a6b5
    • 新加一个盒子before 和after 制作下侧两个角 宽度高度为 10px
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
.panel {
position: relative;
height: 3.875rem;
/* width: 100%; */
border: 1px solid rgba(25, 186, 139, 0.17);
background: rgba(255, 255, 255, 0.04) url('../images/line(1).png');
padding: 0 0.1875rem 0.5rem;
margin-bottom: 0.1875rem;
}

.panel::before {
position: absolute;
top: 0;
/* 要给内容 */
content: "";
left: 0;
height: 10px;
width: 10px;
border-top: 2px solid #02a6b5;
border-left: 2px solid #02a6b5;
}

.panel::after {
position: absolute;
top: 0;
/* 要给内容 */
content: "";
right: 0;
height: 10px;
width: 10px;
border-top: 2px solid #02a6b5;
border-right: 2px solid #02a6b5;
}
.panelFooter {
position: absolute;
bottom: 0;
left: 0;
/* background-color: pink; */
height: 10px;
width: 100%;
}

.panelFooter::before {
position: absolute;
top: 0;
/* 要给内容 */
content: "";
left: 0;
height: 10px;
width: 10px;
border-bottom: 2px solid #02a6b5;
border-left: 2px solid #02a6b5;
}

.panelFooter::after {
position: absolute;
top: 0;
/* 要给内容 */
content: "";
right: 0;
height: 10px;
width: 10px;
border-bottom: 2px solid #02a6b5;
border-right: 2px solid #02a6b5;
}

图表标题及图表布局

  • 标题模块 h2 高度为 48px 文字颜色为白色 文字大小为 20px
  • 图标内容模块 chart 高度 240px
  • 以上可以作为panel公共样式部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.panel h2 {
height: 0.6rem;
line-height: 0.6rem;
margin: 0;
color: white;
font-size: 0.25rem;
text-align: center;
font-weight: 400;
}

.panel .chart {
height: 3.0rem;
/* margin: 0 0.1875rem; */
background-color: pink;
}

中间布局

  • 上面是no 数字模块

  • 下面是map 地图模块

  • 字体声明

    1
    2
    3
    4
    5
    /* 声明字体*/
    @font-face {
    font-family: electronicFont;
    src: url(../font/DS-DIGIT.TTF);
    }
  1. 数字模块 no 有个背景颜色 rgba(101, 132, 226, 0.1); 有个15像素的内边距
  2. 注意中间列 column 有个 左右 10px 下 15px 的外边距
  3. no 模块里面上下划分 上面是数字(no-hd) 下面 是 相关文字说明(no-bd)
  4. no-hd 数字模块 有一个边框 1px solid rgba(25, 186, 139, 0.17)
  5. no-hd 数字模块 里面分为两个小li 每个小li高度为 80px 文字大小为 70px 颜色为 #ffeb7b 字体是图标字体 electronicFont
  6. no-hd 利用 after 和 before制作2个小角, 边框 2px solid #02a6b5 宽度为 30px 高度为 10px
  7. 小竖线 给 第一个小li after 就可以 1px宽 背景颜色为 rgba(255, 255, 255, 0.2); 高度 50% top 25% 即可
  8. no-bd 里面也有两个小li 高度为 40px 文字颜色为 rgba(255, 255, 255, 0.7) 文字大小为 18px 上内边距为 10px
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
.no {
background-color: rgba(101, 132, 226, 0.1);
padding: 0.1875rem;
}

.no-hd {
position: relative;
border: 1px solid rgba(25, 186, 139, 0.17);
}

.no-hd::before{
position: absolute;
top: 0;
left: 0;
content: " ";
border-top: 2px solid #02a6b5;
border-left: 2px solid #02a6b5;
width: 0.375rem;
height: 0.125rem;
}
.no-hd::after{
position: absolute;
bottom: 0;
right: 0;
content: " ";
border-bottom: 2px solid #02a6b5;
border-right: 2px solid #02a6b5;
width: 0.375rem;
height: 0.125rem;
}

.no-hd ul {
display: flex;
}
.no-hd ul li {
position: relative;
flex: 1;
font-size: 0.875rem;
height: 1.0rem;
text-align: center;
color: #ffeb7b;
font-family: electronicFont;
}

.no-hd ul li:nth-child(1)::after {
content: "";
position: absolute;
top: 25%;
right: 0;
background-color: rgba(255, 255, 255, 0.2);
width: 1px;
height: 50%;
}

.no-bd ul {
display: flex;
}

.no-bd ul li {
flex: 1;
height: 0.5rem;
color: rgba(255, 255, 255, 0.7);
font-size: 0.225rem;
padding-top: 0.125rem;
text-align: center;
}

地图模块(css动画)

  1. 地图模块高度为 810px 里面包含4个盒子 chart、 放图表模块、球体盒子、旋转1、旋转2
  2. 球体图片模块 map1 大小为 518px 要加背景图片 因为要缩放100% 定位到最中央 透明度 .3
  3. 旋转1 map 2 大小为 643px 要加背景图片 因为要缩放100% 定位到中央 透明度 .6 做旋转动画
  4. 旋转2 map3 大小为 566px 要加背景图片 因为要缩放100% 定位到中央 旋转动画 注意是逆时针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
.map {
height: 10.125rem;
position: relative;
}

.map .map1 {
position: absolute;
height: 6.475rem;
width: 6.475rem;
opacity: 0.3;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: url('../images/map.png') no-repeat;
background-size: 100% 100%;
}

.map .map2 {
position: absolute;
height: 6.475rem;
width: 6.475rem;
/* opacity: 0.3; */
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: url('../images/lbx.png') no-repeat;
background-size: 100% 100%;
animation: rotate 15s linear infinite;
}
.map .map3 {
position: absolute;
height: 6.475rem;
width: 6.475rem;
/* opacity: 0.3; */
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: url('../images/jt.png') no-repeat;
background-size: 100% 100%;
animation: rotate1 10s linear infinite;
}

.map .chart {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 10.125rem;
}

@keyframes rotate{
from {
transform: translate(-50%,-50%) rotate(0deg);
}
to {
transform: translate(-50%,-50%) rotate(360deg);
}
}
@keyframes rotate1{
from {
transform: translate(-50%, -50%) rotate(0deg)
}
to {
transform: translate(-50%, -50%) rotate(-360deg)
}
}

ECharts

这一节的教程也是基于b站pink老师的教程进行记录的,感兴趣的可以点过去学习一波

常见的数据可视化库:

  • D3.js 目前 Web 端评价最高的 Javascript 可视化工具库(入手难)
  • ECharts.js 百度出品的一个开源 Javascript 数据可视化库
  • Highcharts.js 国外的前端数据可视化库,非商用免费,被许多国外大公司所使用
  • AntV 蚂蚁金服全新一代数据可视化解决方案 等等
  • Highcharts 和 Echarts 就像是 Office 和 WPS 的关系

ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。

简单理解

使用步骤

下载地址:https://www.echartsjs.com/zh/index.html

  1. 引入echarts 插件文件到html页面中(🔺注意:引入的Echarts的js文件必须在arcgis前面)
1
<script src="js/echarts.min.js"> </script>
  1. 准备一个具备宽度和高度的DOM容器
1
<div id="main" style="width: 600px;height:400px;"></div>
  1. 初始化echarts实例对象
1
var myChart = echarts.init(document.getElementById('main'));
  1. 指定配置项和数据(option)
1
2
3
4
5
6
7
8
9
10
11
12
13
var option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'line'
}]
};
  1. 将配置项设置给echarts实例对象
1
myChart.setOption(option);

常用对象

series xAxis yAxis grid tooltip title legend color

  • series

    • 系列列表。每个系列通过 type 决定自己的图表类型
    • 图标数据,指定什么类型的图表,可以多个图表重叠。
  • xAxis:直角坐标系 grid 中的 x 轴

    • boundaryGap: 坐标轴两边留白策略 true,这时候刻度只是作为分隔线,标签和数据点都会在两个刻度之间的带(band)中间。
  • yAxis:直角坐标系 grid 中的 y 轴

  • grid:直角坐标系内绘图网格。

  • title:标题组件

  • tooltip:提示框组件

  • legend:图例组件

  • color:调色盘颜色列表

    数据堆叠,同个类目轴上系列配置相同的stack值后 后一个系列的值会在前一个系列的值上相加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
option = {
// color设置我们线条的颜色 注意后面是个数组
color: ['pink', 'red', 'green', 'skyblue'],
// 设置图表的标题
title: {
text: '折线图堆叠123'
},
// 图表的提示框组件
tooltip: {
// 触发方式
trigger: 'axis'
},
// 图例组件
legend: {
// series里面有了 name值则 legend里面的data可以删掉
},
// 网格配置 grid可以控制线形图 柱状图 图表大小
grid: {
left: '3%',
right: '4%',
bottom: '3%',
// 是否显示刻度标签 如果是true 就显示 否则反之
containLabel: true
},
// 工具箱组件 可以另存为图片等功能
toolbox: {
feature: {
saveAsImage: {}
}
},
// 设置x轴的相关配置
xAxis: {
type: 'category',
// 是否让我们的线条和坐标轴有缝隙
boundaryGap: false,
data: ['星期一', '周二', '周三', '周四', '周五', '周六', '周日']
},
// 设置y轴的相关配置
yAxis: {
type: 'value'
},
// 系列图表配置 它决定着显示那种类型的图表
series: [
{
name: '邮件营销',
type: 'line',

data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: '联盟广告',
type: 'line',

data: [220, 182, 191, 234, 290, 330, 310]
},
{
name: '视频广告',
type: 'line',

data: [150, 232, 201, 154, 190, 330, 410]
},
{
name: '直接访问',
type: 'line',

data: [320, 332, 301, 334, 390, 330, 320]
}
]
};

项目正式使用

  1. 使用立即执行函数制作各个表格模块

    立即执行函数优点:

    • 不必为函数命名,避免了污染全局变量
    • 立即执行函数内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量
    • 封装变量
  2. 每个要制作图表的dom容器必须指定长宽

左上柱状图

  • 官网找到类似实例, 适当分析,并且引入到HTML页面中

  • 根据需求定制图表

    1. 修改图表柱形颜色

    2. 修改图表大小 top 为 10px bottom 为 4% grid决定我们的柱状图的大小

      1
      2
      3
      4
      5
      6
      7
      8
      color: ["#2f89cf"],
      grid: {
      left: "0%",
      top: "10px",
      right: "0%",
      bottom: "4%",
      containLabel: true //是否将文字标注也算进去
      },
    3. X轴相关设置 xAxis

      • 文本颜色设置为 rgba(255,255,255,.6) 字体大小为 12px
      • X轴线的样式 不显示
      • 修改data为自己的数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // X轴
    xAxis: [{
    type: "category", //X轴类型
    data: [
    "湖北",
    "广东",
    "江西",
    "北京",
    "上海",
    "河北",
    "浙江"
    ],
    //刻度
    axisTick: {
    alignWithLabel: true
    },
    //刻度标签
    axisLabel: {
    textStyle: {
    color: "rgba(255,255,255,.6)",
    fontSize: '12'
    }
    },
    //刻度线
    axisLine: {
    show: false
    }
    }],
    1. Y 轴相关定制

      • 文本颜色设置为 rgba(255,255,255,.6) 字体大小为 12px
      • Y 轴线条样式 更改为 1像素的 rgba(255,255,255,.1) 边框
      • 分隔线的颜色修饰为 1像素的 rgba(255,255,255,.1)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    yAxis: [{
    type: "value",
    axisLabel: {
    textStyle: {
    color: "rgba(255,255,255,.6)",
    fontSize: '12'
    }
    },
    axisLine: {
    lineStyle: {
    color: "rgba(255,255,255,.1)"
    // width: 1,
    // type: "solid"
    }
    },
    splitLine: {
    lineStyle: {
    color: "rgba(255,255,255,.1)"
    }
    }
    }],
    1. 修改柱形为圆角以及柱子宽度 series 里面设置 添加数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //图表中心内容
    series: [{
    name: "直接访问",
    type: "bar",
    barWidth: "35%",
    // fontSize: '8',
    data: [200, 300, 300, 900, 1500, 1200, 600],
    itemStyle: {
    barBorderRadius: 5
    }
    }]
    1. 让图表跟随屏幕自适应
    1
    2
    3
    4
    5
        //图表跟随屏幕自适应
    window.addEventListener('resize', function() {
    myChart.resize();
    })
    })();
    1. 完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//左上模块
(function() {
//初识化ECharts
var myChart = echarts.init(document.querySelector(".bar .chart"));
//指定配置项和数据
var option = {
color: ["#2f89cf"],
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow" // 默认为直线,可选为:'line' | 'shadow'
}
},
grid: {
left: "0%",
top: "10px",
right: "0%",
bottom: "4%",
containLabel: true //是否将文字标注也算进去
},
// X轴
xAxis: [{
type: "category", //X轴类型
data: [
"湖北",
"广东",
"江西",
"北京",
"上海",
"河北",
"浙江"
],
//刻度
axisTick: {
alignWithLabel: true
},
//刻度标签
axisLabel: {
textStyle: {
color: "rgba(255,255,255,.6)",
fontSize: '12'
}
},
//刻度线
axisLine: {
show: false
}
}],
// y轴
yAxis: [{
type: "value",
axisLabel: {
textStyle: {
color: "rgba(255,255,255,.6)",
fontSize: '12'
}
},
axisLine: {
lineStyle: {
color: "rgba(255,255,255,.1)"
// width: 1,
// type: "solid"
}
},
splitLine: {
lineStyle: {
color: "rgba(255,255,255,.1)"
}
}
}],
//图表中心内容
series: [{
name: "直接访问",
type: "bar",
barWidth: "35%",
// fontSize: '8',
data: [200, 300, 300, 900, 1500, 1200, 600],
itemStyle: {
barBorderRadius: 5
}
}]
};
//配置项设置给ECarts实例对象
myChart.setOption(option);
//图表跟随屏幕自适应
window.addEventListener('resize', function() {
myChart.resize();
})
})();

柱状图2定制

  • 官网找到类似实例, 适当分析,并且引入到HTML页面中
  • 根据需求定制图表

需求1: 修改图形大小 grid

1
2
3
4
5
6
// 图标位置
grid: {
top: "10%",
left: "22%",
bottom: "10%"
},

需求2: 不显示x轴

1
2
3
xAxis: {
show: false //取消显示x轴(包括竖线)
},

需求3: y轴相关定制

  • 不显示y轴轴线和相关刻度

  • y轴文字的颜色设置为白色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//y轴
yAxis: [{
show: true, //显示y轴
data: titlename, //类目数据
inverse: true, //反向坐标轴
axisLine: { //坐标轴线
show: false
},
splitLine: { //分割线
show: false
},
axisTick: { //坐标轴刻度
show: false
},
axisLabel: {
color: "#fff", //标注字体颜色
rich: { //富文本样式
lg: {
backgroundColor: "#391",
color: "#fff",
borderRadius: 15,
// padding: 5,
align: "center",
width: 15,
height: 15
}
}
}
},
],

需求4:

  • 修改第一组柱子相关样式(条状)

  • 设置第一组柱子内百分比显示数据

  • 设置第一组柱子不同颜色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
name: "条",
type: "bar", //类型
yAxisIndex: 0, //使用的 y 轴的 index,bar的基部位置
data: data,
barCategoryGap: 50,
barWidth: 10, //bar宽度
itemStyle: { //图形样式
normal: {
barBorderRadius: 20, //数据条圆角
//定义函数分配每个数据值的颜色,不知道%num啥意思
color: function(params) {
// var num = myColor.length;
// console.log(params);
// return myColor[params.dataIndex % num]
return myColor[params.dataIndex]
}
}
},
label: { //标签
normal: {
show: true,
position: "inside", //标签位置
formatter: "{c}%" //数值
}
}
},

需求5: 修改第二组柱子的相关配置(框状)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
name: "框",
type: "bar",
yAxisIndex: 1,
barCategoryGap: 50,
data: [100, 100, 100, 100, 100],
barWidth: 15,
itemStyle: {
normal: {
color: "none", //去掉填充颜色
borderColor: "#00c1de",
borderWidth: 3, //边框宽度
barBorderRadius: 15
}
}
}

需求6: 给y轴添加第二组数据

1
2
3
4
5
6
7
8
9
10
11
12
//定义右侧y坐标轴
{
show: true,
inverse: true,
data: valdata,
axisLabel: {
textStyle: {
fontSize: 12,
color: "#fff"
}
}
}

需求7: 设置两组柱子层叠以及更换数据

1
2
3
4
5
6
7
8
9
10
11
12
// 给series  第一个对象里面的 添加 
yAxisIndex: 0,
// 给series 第二个对象里面的 添加
yAxisIndex: 1,
// series 第一个对象里面的data
data: [70, 34, 60, 78, 69],
// series 第二个对象里面的data
data: [100, 100, 100, 100, 100],
// y轴更换第一个对象更换data数据
data: ["中国", "美国", "日本", "伊朗", "意大利"],
// y轴更换第二个对象更换data数据
data:[702, 350, 610, 793, 664],

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// 学习进度柱状图模块
(function() {
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.querySelector(".bar1 .chart"));

var data = [70, 34, 60, 78, 69];
var titlename = ["中国", "美国", "日本", "伊朗", "意大利"];
var valdata = [702, 350, 610, 793, 664];
var myColor = ["#1089E7", "#F57474", "#56D0E3", "#F8B448", "#8B78F6"];
option = {
//图表位置(网格)
grid: {
top: "10%",
left: "22%",
bottom: "10%"
},
//X轴
xAxis: {
show: false //取消显示x轴(包括竖线)
},
//y轴
yAxis: [{
show: true, //显示y轴
data: titlename, //类目数据
inverse: true, //反向坐标轴
axisLine: { //坐标轴线
show: false
},
splitLine: { //分割线
show: false
},
axisTick: { //坐标轴刻度
show: false
},
axisLabel: {
color: "#fff", //标注字体颜色
rich: { //富文本样式
lg: {
backgroundColor: "#391",
color: "#fff",
borderRadius: 15,
// padding: 5,
align: "center",
width: 15,
height: 15
}
}
}
},
//定义右侧y坐标轴
{
show: true,
inverse: true,
data: valdata,
axisLabel: {
textStyle: {
fontSize: 12,
color: "#fff"
}
}
}
],
series: [{
name: "条",
type: "bar", //类型
yAxisIndex: 0, //使用的 y 轴的 index,bar的基部位置
data: data,
barCategoryGap: 50,
barWidth: 10, //bar宽度
itemStyle: { //图形样式
normal: {
barBorderRadius: 20, //数据条圆角
//定义函数分配每个数据值的颜色,不知道%num啥意思
color: function(params) {
// var num = myColor.length;
// console.log(params);
// return myColor[params.dataIndex % num]
return myColor[params.dataIndex]
}
}
},
label: { //标签
normal: {
show: true,
position: "inside", //标签位置
formatter: "{c}%" //数值
}
}
},
//第二个图形
{
name: "框",
type: "bar",
yAxisIndex: 1,
barCategoryGap: 50,
data: [100, 100, 100, 100, 100],
barWidth: 15,
itemStyle: {
normal: {
color: "none", //去掉填充颜色
borderColor: "#00c1de",
borderWidth: 3, //边框宽度
barBorderRadius: 15
}
}
}
]
};

// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
window.addEventListener("resize", function() {
myChart.resize();
});
})();

折线图1 模块

  • 官网找到类似实例, 适当分析,并且引入到HTML页面中
  • 根据需求定制图表

需求1: 修改折线图大小,显示边框设置颜色:#012f4a,并且显示刻度标签。

1
2
3
4
5
6
7
8
9
grid: {
top: "20%",
left: "3%",
right: "4%",
bottom: "3%",
show: true,
borderColor: "#012f4a",
containLabel: true //包含刻度
},

需求2: 修改图例组件中的文字颜色 #4c9bfd, 距离右侧 right 为 10%

1
2
3
4
5
6
7
8
9
10
//图例模块
legend: {
// 距离容器10%
right: "10%",
// 修饰图例文字的颜色
textStyle: {
color: "#4c9bfd"
}
// 如果series 里面设置了name,此时图例组件的data可以省略
// data: ["邮件营销", "联盟广告"]

需求3: x轴相关配置

  • 刻度去除
  • x轴刻度标签字体颜色:#4c9bfd
  • 剔除x坐标轴线颜色(将来使用Y轴分割线)
  • 轴两端是不需要内间距 boundaryGap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
xAxis: {
type: 'category',
boundaryGap: false,
data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
//去除刻度
axisTick: {
show: false
},
//修改刻度标签颜色
axisLabel: {
color: "white"
},
//去除x坐标轴
axisLine: {
show: false
},
boundaryGap: false // 去除轴内间距

},

需求4: y轴的定制

  • 刻度去除
  • 字体颜色:#4c9bfd
  • 分割线颜色:#012f4a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
yAxis: {
type: 'value',
//去除y轴刻度
axisTick: {
show: false
},
//修改刻度标签颜色
axisLabel: {
color: "white"
},
//修改y轴分割线颜色
splitLine: {
lineStyle: {
color: "#012f4a"
}
}
},

需求5: 两条线形图定制

  • 颜色分别:#00f2f1 #ed3f35
  • 把折线修饰为圆滑 series 数据中添加 smooth 为 true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
series: [{
name: '现存确诊',
type: 'line',
stack: '总量',
data: [24, 40, 101, 134, 90, 230, 210, 230, 120, 230, 210, 120],
smooth: true

},
{
name: '累计确诊',
type: 'line',
stack: '总量',
data: [40, 64, 191, 324, 290, 330, 310, 213, 180, 200, 180, 79],
smooth: true

}
]

需求6: 配置数据

1
2
3
4
// x轴的文字
xAxis: {
type: 'category',
data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 图表数据
series: [{
name: '现存确诊',
type: 'line',
stack: '总量',
data: [24, 40, 101, 134, 90, 230, 210, 230, 120, 230, 210, 120]
},
{
name: '累计确诊',
type: 'line',
stack: '总量',
data: [40, 64, 191, 324, 290, 330, 310, 213, 180, 200, 180, 79]
}
]

需求7: 新增需求 点击 2020年 2021年 数据发生变化

以下是后台送过来数据(ajax请求过来的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var yearData = [
{
year: '2020', // 年份
data: [ // 两个数组是因为有两条线
[24, 40, 101, 134, 90, 230, 210, 230, 120, 230, 210, 120],
[40, 64, 191, 324, 290, 330, 310, 213, 180, 200, 180, 79]
]
},
{
year: '2021', // 年份
data: [ // 两个数组是因为有两条线
[123, 175, 112, 197, 121, 67, 98, 21, 43, 64, 76, 38],
[143, 131, 165, 123, 178, 21, 82, 64, 43, 60, 19, 34]
]
}
];
  • tab栏切换事件
  • 点击2020按钮 需要把 series 第一个对象里面的data 换成 2020年对象里面data[0]
  • 点击2020按钮 需要把 series 第二个对象里面的data 换成 2020年对象里面data[1]
  • 2021 按钮同样道理
1
2
3
4
5
6
7
8
9
10
11
// 5.点击切换效果
$(".line h2").on("click", "a", function() {
// alert(1);
// console.log($(this).index());
// 点击 a 之后 根据当前a的索引号 找到对应的 yearData的相关对象
// console.log(yearData[$(this).index()]);
var obj = yearData[$(this).index()];
option.series[0].data = obj.data[0];
option.series[1].data = obj.data[1];
// 需要重新渲染
myChart.setOption(option);

完整代码(这里去掉年份需求):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//折线图模块
(function() {
var myChart = echarts.init(document.querySelector('.line .chart'))
var option = {
color: ["#00f2f1", "#ed3f35"],
tooltip: {
trigger: 'axis'
},
//图例模块
legend: {
// 距离容器10%
right: "10%",
// 修饰图例文字的颜色
textStyle: {
color: "#4c9bfd"
}
// 如果series 里面设置了name,此时图例组件的data可以省略
// data: ["邮件营销", "联盟广告"]
},
grid: {
top: "20%",
left: "3%",
right: "4%",
bottom: "3%",
show: true,
borderColor: "#012f4a",
containLabel: true
},
xAxis: {
type: 'category',
boundaryGap: false,
data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
//去除刻度
axisTick: {
show: false
},
//修改刻度标签颜色
axisLabel: {
color: "white"
},
//去除x坐标轴
axisLine: {
show: false
}
},
yAxis: {
type: 'value',
//去除y轴刻度
axisTick: {
show: false
},
//修改刻度标签颜色
axisLabel: {
color: "white"
},
//修改y轴分割线颜色
splitLine: {
lineStyle:{
color: "#012f4a"
}
}
},
series: [{
name: '现存确诊',
type: 'line',
stack: '总量',
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: '累计确诊',
type: 'line',
stack: '总量',
data: [220, 182, 191, 234, 290, 330, 310]
},
]
};
// 把配置和数据给实例对象
myChart.setOption(option);

window.addEventListener('resize', function() {
myChart.resize()
})
})()

折线图2模块

  1. 引入类似的官方示例
  2. 进行样式定制

更换图例组件文字颜色 rgba(255,255,255,.5) 文字大小为12

1
2
3
4
5
6
7
8
legend: {
top: "0%",
//图例字体样式
textStyle: {
color: "rgba(255,255,255,.5)",
fontSize: "12"
}
},

修改图表大小

1
2
3
4
5
6
7
grid: {
left: "10",
top: "30",
right: "10",
bottom: "10",
containLabel: true
},

修改x轴相关配置

  • 修改文本颜色为rgba(255,255,255,.6) 文字大小为 12
  • x轴线的颜色为 rgba(255,255,255,.2)
1
2
3
4
5
6
7
8
9
10
11
12
13
// 文本颜色为rgba(255,255,255,.6)  文字大小为 12
axisLabel: {
textStyle: {
color: "rgba(255,255,255,.6)",
fontSize: 12
}
},
// x轴线的颜色为 rgba(255,255,255,.2)
axisLine: {
lineStyle: {
color: "rgba(255,255,255,.2)"
}
},

修改y轴的相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
yAxis: [{
type: 'value',
//隐藏坐标轴刻度
axisTick: { show: false },
//标注y轴线样式
axisLine: {
lineStyle: {
color: "rgba(255,255,255,.1)"
}
},
//标注文本
axisLabel: {
textStyle: {
color: "rgba(255,255,255,.6)",
fontSize: 12
}
},
// 修改分割线的颜色
splitLine: {
lineStyle: {
color: "rgba(255,255,255,.1)"
}
}
}],

修改两个线模块配置(注意在series 里面定制)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
series: [{
name: '新增确诊',
type: 'line',
// stack: '总量', //数据堆叠
data: [220, 182, 191, 234, 290, 330, 310],
//线圆滑
smooth: true,
// 单独修改线的样式
lineStyle: {
color: "#0184d5",
width: 2
},
// 填充区域
areaStyle: {
// 渐变色
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[{
offset: 0,
color: "rgba(1, 132, 213, 0.4)" // 渐变色的起始颜色
},
{
offset: 0.8,
color: "rgba(1, 132, 213, 0.1)" // 渐变线的结束颜色
}
],
false
),
shadowColor: "rgba(0, 0, 0, 0.1)" //阴影颜色
},
// 设置拐点 小圆点
symbol: "circle",
// 拐点大小
symbolSize: 8,
// 设置拐点颜色以及边框
itemStyle: {
color: "#0184d5",
borderColor: "rgba(221, 220, 107, .1)",
borderWidth: 12
},
//开始不显示坐标圆点
showSymbol: false,
},
{
// 开始不显示拐点, 鼠标经过显示
showSymbol: false,
name: "新增死亡",
type: "line",
smooth: true,
lineStyle: {
normal: {
color: "#00d887",
width: 2
}
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[{
offset: 0,
color: "rgba(0, 216, 135, 0.4)"
},
{
offset: 0.8,
color: "rgba(0, 216, 135, 0.1)"
}
],
false
),
shadowColor: "rgba(0, 0, 0, 0.1)"
}
},
// 设置拐点 小圆点
symbol: "circle",
// 拐点大小
symbolSize: 5,
// 设置拐点颜色以及边框
itemStyle: {
color: "#00d887",
borderColor: "rgba(221, 220, 107, .1)",
borderWidth: 12
},
// 开始不显示拐点, 鼠标经过显示
showSymbol: false,
data: [120, 132, 101, 134, 90, 230, 210],
// stack: '总量',
}
]
}

更换数据

1
没有

饼形图1模块

  • 官网找到类似实例, 适当分析,并且引入到HTML页面中
  • 根据需求定制图表

定制图表需求1:

  • 修改图例组件在底部并且居中显示。
  • 每个小图标的宽度和高度修改为 10px
  • 文字大小为12 颜色 rgba(255,255,255,.5)
1
2
3
4
5
6
7
8
9
10
11
12
legend: {
// 距离底部为0%
bottom: "0%",
// 小图标的宽度和高度
itemWidth: 10,
itemHeight: 10,
// 修改图例组件的文字为 12px
textStyle: {
color: "rgba(255,255,255,.5)",
fontSize: "12"
}
},

定制需求2:

  • 修改水平居中 垂直居中
  • 修改内圆半径和外圆半径为 [“40%”, “60%”] pink老师友情提示,带有直角坐标系的比如折线图柱状图是 grid修改图形大小,而我们饼形图是通过 radius 修改大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
series: [{
name: '确诊病例',
type: 'pie',
//设置饼状图在容器中的位置,这里和带有坐标系的图不一样
center: ["50%", "50%"],
// 修改内圆半径和外圆半径为 百分比是相对于容器宽度来说的
radius: ["40%", "60%"],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
// show: true,
fontSize: '30',
fontWeight: 'bold'
}
},
//不显示连接线
labelLine: {
show: false
},
data: [
{ value: 335, name: '广东' },
{ value: 310, name: '武汉' },
{ value: 234, name: '北京' },
{ value: 135, name: '浙江' },
{ value: 1548, name: '江苏' }
]
}]

更换颜色

1
2
3
4
5
6
7
color: [
"#065aab",
"#066eab",
"#0682ab",
"#0696ab",
"#06a0ab",
],

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
(function() {
var myChart = echarts.init(document.querySelector(".pie .chart"));
var option = {
color: [
"#065aab",
"#066eab",
"#0682ab",
"#0696ab",
"#06a0ab",
],
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b}: {c} ({d}%)'
},
legend: {
// 距离底部为0%
bottom: "0%",
// 小图标的宽度和高度
itemWidth: 10,
itemHeight: 10,
// 修改图例组件的文字为 12px
textStyle: {
color: "rgba(255,255,255,.5)",
fontSize: "12"
}
},
series: [{
name: '确诊病例',
type: 'pie',
//设置饼状图在容器中的位置,这里和带有坐标系的图不一样
center: ["50%", "50%"],
// 修改内圆半径和外圆半径为 百分比是相对于容器宽度来说的
radius: ["40%", "60%"],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
// show: true,
fontSize: '30',
fontWeight: 'bold'
}
},
//不显示连接线
labelLine: {
show: false
},
data: [
{ value: 335, name: '广东' },
{ value: 310, name: '武汉' },
{ value: 234, name: '北京' },
{ value: 135, name: '浙江' },
{ value: 1548, name: '江苏' }
]
}]
};
myChart.setOption(option);
window.addEventListener('resize', function() {
myChart.resize();
})
})();

饼形图(南丁格尔玫瑰图)

  • 官网找到类似实例, 适当分析,并且引入到HTML页面中
  • 根据需求定制图表

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(function() {
var myChart = echarts.init(document.querySelector(".pie1 .chart"))
var option = {
color: ['#006cff', '#60cda0', '#ed8884', '#ff9f7f', '#0096ff', '#9fe6b8', '#32c5e9', '#1d9dff'],
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)'
},
legend: {
left: 'center',
top: 'bottom',
data: ['rose1', 'rose2', 'rose3', 'rose4', 'rose5', 'rose6', 'rose7', 'rose8']
},
series: [{
name: '面积模式',
type: 'pie',
//饼图大小
radius: ['10%', '70%'],
center: ['50%', '50%'],
//饼图显示模式area面积模式radius半径模式
roseType: 'radius',
// 文本标签控制饼形图文字的相关样式
label: {
fontSize: 10
},
// 引导线调整
labelLine: {
// 连接扇形图线长
length: 6,
// 连接文字线长
length2: 8
},
data: [
{ value: 10, name: '广东' },
{ value: 5, name: '北京' },
{ value: 15, name: '武汉' },
{ value: 25, name: '浙江' },
{ value: 20, name: '上海' },
{ value: 35, name: '江苏' },
{ value: 30, name: '云南' },
{ value: 40, name: '河北' }
]
}]
};

myChart.setOption(option)
window.addEventListener('resize', function() {
myChart.resize()
})
})();

载入arcgis server 的地图服务

详细的教程可去官网: ArcGIS API for JavaScript

  1. require请求将所需模块加载进去,这里因为想调用arcgis online 中的某个地图,经查阅资料得出,通过调用该id号获取其底图(在调用arcgis online的底图时需要登录才能查看该id,详情可以看该教程),所以需要用到WebMap模块。require以及底图加载代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    require([
    //require写什么,后面参数必须按require的顺序写
    "esri/WebMap",
    "esri/views/MapView", //地图查看器模块
    "esri/layers/FeatureLayer", //要素图层
    "esri/layers/TileLayer"
    ], function(WebMap, MapView, FeatureLayer, TileLayer) {

    //基础底图
    // var map = new Map({
    // basemap: "streets-night-vector" //底图样式
    // });

    //id号获取底图
    var map = new WebMap({
    portalItem: {
    id: "bf024b8d0b4b48f5a486070214e87c5f" //ArcGIS Online
    }
    });
    var view = new MapView({
    container: "viewDiv",
    map: map,
    center: [116.26, 24.2], // longitude, latitude 地理坐标
    zoom: 3 //缩放程度s
    });

    })
  2. 通过调用在arcgis server发布的地图服务url,将要显示的要素图层加载进去,然后在本地就可以浏览echarts和arcgis server结合的简单案例啦,调用url代码在回调函数中,如下所示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //添加Traiheads要素图层
    var china = new FeatureLayer({
    url: "http://localhost:6080/arcgis/rest/services/Text/text/MapServer", //url:....../1:行政区图层索引号
    //数组存放标题和内容
    outFields: ["Name", "性别比"],

    //显示路径名称和弹出窗口的字段
    popupTemplate: { // 启动弹出模板
    "title": "{Name}", // 标题名
    "content": "<p>该省性别比为</p> <p>{性别比}。</p>" // 弹出框文本内容
    },
    opacity: .4 //透明程度
    });
    map.add(china);
  3. 成果

    image-20200719215053753

后台搭建服务器

  1. 整理好相关文件

  2. 创建整理文件夹

    • public(存放js、css、图片文件)
    • views(存放html页面)
  3. 下载所需基础模块(下载模块前记得初始化package文件)

    • jQuery
    • Bootstrap(可能用不到)
    • body-parser(最后发现用不到)
    • express
    • mongoose(本来打算连接芒果数据库的数据,最后发现本地有一个json格式的疫情数据,就用不上这个模块了)
    • art-template(模板引擎)
  4. 设计路由,因为这里简单只需用到渲染页面以及返回数据的路由,所以偷个懒

  5. 初始化app.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    var express = require('express')
    var app = express()

    //引入fs模块,用来读取疫情数据
    var fs = require('fs')

    //body-parse中间件配置
    // parse application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: false }))
    // parse application/json
    app.use(bodyParser.json())

    //模板引擎 engine后面没有r谢谢
    app.engine('html', require('express-art-template'))

    //开放静态资源
    app.use('/public', express.static('./public/'))
    app.use('/node_modules', express.static("./node_modules/"))

    //首页渲染
    app.get('/', (req, res) => {

    })

    //post请求返回疫情数据
    app.post('/', (req, res) => {

    })

    //开放端口
    app.listen(3000, () => {
    console.log("server is running...")
    })
  6. 渲染页面(get路由)

    1
    2
    3
    app.get('/', (req, res) => {
    res.render('index.html')
    })
  7. 分析json文件

    这里因为只需要中国地区城市的疫情数据,所以需要进行筛选

    image-20200716100603807

    image-20200716100627300

    从数据可以看出,数组内第一个对象即为中国的疫情状况,所以这里直接读取第一个对象即可,用fs模块读取整个json文件,因为读取后的数据是json格式,使用json.parse将其转化为对象格式,再从里面的cities获取中国城市的疫情数据,记得读取文件时加上utf8参数,否则会出现乱码,下面放出代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    app.post('/', (req, res) => {
    fs.readFile('./public/DXYArea.json', 'utf8', (err, data) => {
    if (err) {
    console.log('error')
    }
    // console.log(data)
    var virus = JSON.parse(data).results
    console.log(virus)
    var cn = virus[0].cities
    res.send(cn)
    })

    })
  8. 到这里,后台搭建就准完毕,可以浏览器访问localhost:3000查看基础页面

ajax配合echarts使用

这里,其实思考过几种方法,一种是通过后台获取数据然后利用模板引擎将数据转到前端隐藏控件中去读取然后进行数据渲染,详情可参考这篇文章https://blog.csdn.net/tksnail/article/details/88096072,但是里面的数据较为简单,而这边是一整个对象数组,转到前端去就全部变成字符串类型,除非先在后台对数据进行处理,转成一个一个数组后传递到前端,但我想尝试在前端的Ajax中处理。所以自己摸索研究了一下

  1. 在放有echarts的js文件中,在想要引用数据的图表中,建立Ajax,代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    $.ajax({
    url: '/',
    type: 'post',
    data: {},
    dataType: 'json',
    success: function(data) {
    console.log(data)
    })
  2. 分析数据,依旧是对象格式,这很棒,然后就想着怎么拿里面数据,这里要拿到城市名和疫情状况,字段名分别是cityNameconfirmedCount,这里在ajax外定义两个数组用来存放数据,,接着在通过for循环将数据存入数组

    1
    2
    3
    4
    for (var i = 0; i < data.length; i++) {
    city.push(data[i].cityName)
    num.push(data[i].confirmedCount)
    }
  3. 最后需要重新配置图表用以更新数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //必须在这里在设置一遍,这里涉及到的问题不太懂,只知道如不再设置,而在ajax外赋值是没有作用的
    myChart.setOption({ //加载数据图表
    xAxis: {
    data: city
    },
    series: [{
    // 根据名字对应到相应的系列
    data: num
    }]
    })
  4. 完整代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    var city = []
    var num = []
    $.ajax({
    url: '/',
    type: 'post',
    data: {},
    dataType: 'json',
    success: function(data) {
    console.log(data)
    for (var i = 0; i < data.length; i++) {
    city.push(data[i].cityName)
    num.push(data[i].confirmedCount)
    }
    // myChart.hideLoading()
    //必须在这里在设置一遍,这里涉及到的问题不太懂(可能是同步异步的问题,后面再去补齐这一部分理论),只知道如不再设置,而在ajax外赋值是没有作用的
    myChart.setOption({ //加载数据图表
    xAxis: {
    data: city
    },
    series: [{
    // 根据名字对应到相应的系列
    data: num
    }]
    })
    }
    })
  5. 这里,echarts搭配node以及ajax的学习过程就完成啦,后面会将整个疫情地图的小项目完成放在自己的博客上。