前言

疫情期间的Demo,面向零基础,从代码编写到项目部署,在此记录一下学习过程,巩固一下知识。

使用到的工具如下

  • IDEA
  • 阿里云服务器

代码编写

java代码编写,疫情期间网上公布着世界的人数感染情况,这些数据是从何而来?网易、丁香园这些数据并不是他们自己做出来的,而是通过实时收集数据,每个省上报的人数进行统计、汇总并进行公布。这时就有了固定的数据接口供大家使用,这种API接口挺多的。

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
package com.jh2ng.demo2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class Demo1 {
public static void main(String[] args) throws IOException {
//创建URL对象
URL u1 = new URL("https://zaixianke.com/yq/all"); //调API
//建立连接
URLConnection con = u1.openConnection();
//获取数据流
InputStream is = con.getInputStream();
//读取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
//输出
String text = br.readLine();
System.out.println(text);

//关闭流
br.close();

}
}

输出实例(部分)

image.png

数据既然拿到了,就需要在页面上展示我们所获取到的数据,也就是一个疫情地图,页面可以自行优化。

css样式代码如下:

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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
var myChart = echarts.init(document.getElementById('main'));
function updateMap(num){
$(".control").show();
$(".control:eq("+num+")").hide();
myChart.clear();
var opt = null;
switch(num){
case 0:{
opt = {
// 设置标题和副标题及副标题跳转链接
title: {
text: '新冠疫情-国内累计数据',
subtext: '数据来源--jh2ng',
sublink: 'https://www.jh2ing.com'
},
// 数据提示框
tooltip: {
trigger: 'item', // item放到数据区域触发
formatter: function (params, ticket, callback) {
if(params.data)
return params.name+'<br/>'+params.data.value+' (人)';
else
return params.name+'<br/>无疫情信息';
}
},
// 视觉映射方案:
// visualMap默认是连续映射,我们也可以设置为分段型,对于分布范围广的数据
// 使用透明度来区分疫情严重情况
visualMap: {
type: 'piecewise',
pieces: [
{gt: 2000, color: 'darkred'}, // (1500, Infinity]
{gt: 1300, lte: 2000, color: 'red', colorAlpha: 1}, // (1000, 1500]
{gt: 800, lte: 1300, color: 'red', colorAlpha: 0.8},
{gt: 500, lte: 800, color: 'red', colorAlpha: 0.6},
{gt: 200, lte: 500, color: 'red', colorAlpha: 0.4},
{gt: 50, lte: 200, color: 'red', colorAlpha: 0.3},
{lt: 50, color: 'red', colorAlpha: 0.2} // (-Infinity, 100)
],
},

// 具体数据
series: [
{
name: '国内各省确诊病例', // 系列名称
zoom:1.2,//地图大小
type: 'map', // 系列类型,地图
map: 'china', // 要使用的地图,即上面注册的地图名称
roam: true, // 开启鼠标缩放和平移漫游
label: { // 图形上的文本标签,地图默认显示数据名
show: true,
formatter: '{b}', // b是数据名,c是数据值
fontSize: 8
},
data: data.data,
}
]
};

}
break;
case 1:{
opt = {
// 设置标题和副标题及副标题跳转链接
title: {
text: '新冠疫情-国内新增数据',
subtext: '数据来源--jh2ng',
sublink: 'https://www.jh2ing.com'
},
// 数据提示框
tooltip: {
trigger: 'item', // item放到数据区域触发
formatter: function (params, ticket, callback) {
if(params.data)
return params.name+'<br/>'+params.data.value+' (人)';
else
return params.name+'<br/>无疫情信息';
}
},

// 视觉映射方案:
// visualMap默认是连续映射,我们也可以设置为分段型,对于分布范围广的数据
// 使用透明度来区分疫情严重情况
visualMap: {
type: 'piecewise',
pieces: [
{gt: 50, color: 'darkred'}, // (1500, Infinity]
{gt: 30, lte: 50, color: 'red', colorAlpha: 1}, // (1000, 1500]
{gt: 20, lte: 30, color: 'red', colorAlpha: 0.8},
{gt: 10, lte: 20, color: 'red', colorAlpha: 0.6},
{gt: 5, lte: 10, color: 'red', colorAlpha: 0.4},
{gt: 1, lte: 5, color: 'red', colorAlpha: 0.3},
{lt: 1, color: 'red', colorAlpha: 0.0} // (-Infinity, 100)
],
},

// 具体数据
series: [
{
name: '国内各省确诊病例', // 系列名称
zoom:1.2,//地图大小
type: 'map', // 系列类型,地图
map: 'china', // 要使用的地图,即上面注册的地图名称
roam: true, // 开启鼠标缩放和平移漫游
label: { // 图形上的文本标签,地图默认显示数据名
show: true,
formatter: '{b}', // b是数据名,c是数据值
fontSize: 8
},
data: data.today,
}
]
};
}
break;
case 2:{
opt = {
// 设置标题和副标题及副标题跳转链接
title: {
text: '新冠疫情-全球累计数据',
subtext: '数据来源--jh2ng',
sublink: 'https://www.jh2ing.com'
},
// 数据提示框
tooltip: {
trigger: 'item', // item放到数据区域触发
//formatter: '{b}<br/>{c} (人)' // 提示数据格式br表示换行,地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无)
formatter:function (params, ticket, callback) {
if(params.data)
return params.name+'<br/>'+params.data.value+' (人)';
else
return params.name+'<br/> 未公布感染人数';
}
},
// 视觉映射方案1:,疫情颜色根据传染病疫情等级分类为5个级别:黄色-橙色-深橙色-红色-深红色
// 为了是视觉分布更好,可以添加更多的颜色范围,然后适当调小max的值,因为美国和其它国家相差太大
/**/
visualMap: {
min: 1, // 颜色映射对应的最小值,即对应下面的lightskyblue
max: 500000, // 颜色映射对应的最大值,即对应下面的orangered
text: ['严重', '轻微'], // 映射图上下标记文本
realtime: true, // 是否显示拖拽手柄,映射条可以拖拽调整要映射的范围
calculable: true, // 拖拽时,是否实时更新地图
inRange: {
color: ['rgba(222,0,0,0.2)','rgba(160,0,0,1)'] // 颜色映射范围,最小值,过渡值,最大值
}
},

// 具体数据
series: [
{
name: '全球各国确诊病例', // 系列名称
zoom:1.2,//地图大小
type: 'map', // 系列类型,地图
map: 'world', // 要使用的地图,即上面注册的地图名称
roam: true, // 开启鼠标缩放和平移漫游
label: { // 图形上的文本标签,地图默认显示数据名
show: true,
fontSize:8,
//formatter: '{b}', // b是数据名,c是数据值
formatter:function (params, ticket, callback) {
//公布了数据 且 数据累计数据大于5万的显示国家名称
if(params.data && params.data.value>50000) {
return params.name;
}else{
return '';
}
}
},
data: data.g_data,
}
]
};
}
break;
case 3:{
opt = {
// 设置标题和副标题及副标题跳转链接
title: {
text: '新冠疫情-全球新增数据',
subtext: '数据来源--jh2ng',
sublink: 'https://www.jh2ing.com'
},
// 数据提示框
tooltip: {
trigger: 'item', // item放到数据区域触发
formatter:function (params, ticket, callback) {
if(params.data)
return params.name+'<br/>'+params.data.value+' (人)';
else
return params.name+'<br/> 未公布感染人数';
}
},
// 视觉映射方案1:,疫情颜色根据传染病疫情等级分类为5个级别:黄色-橙色-深橙色-红色-深红色
// 为了是视觉分布更好,可以添加更多的颜色范围,然后适当调小max的值,因为美国和其它国家相差太大
/**/
visualMap: {
min: 0, // 颜色映射对应的最小值,
max: 20000, // 颜色映射对应的最大值
text: ['严重', '轻微'], // 映射图上下标记文本
realtime: true, // 是否显示拖拽手柄,映射条可以拖拽调整要映射的范围
calculable: true, // 拖拽时,是否实时更新地图
inRange: {
color: ['rgba(160,0,0,0)','rgba(160,0,0,1)'] // 颜色映射范围,最小值,过渡值,最大值
}
},
// 具体数据
series: [
{
name: '全球各国新增病例', // 系列名称
zoom:1.2,//地图大小
type: 'map', // 系列类型,地图
map: 'world', // 要使用的地图,即上面注册的地图名称
roam: true, // 开启鼠标缩放和平移漫游
label: { // 图形上的文本标签,地图默认显示数据名
show: true,
fontSize:8,
//formatter: '{b}', // b是数据名,c是数据值
formatter:function (params, ticket, callback) {
//公布了数据 且 数据累计数据大于5万的显示国家名称
if(params.data && params.data.value>1000 || params.name == '中国') {
return params.name;
}else{
return '';
}
}
},
data: data.g_today,
}
]
};
}
break;
}
myChart.setOption(opt);
}
updateMap(0);

网页怎么进行数据展示?需要在一个网页里实时获取数据,html是静态的,写完之后页面固定。所以这里使用了能嵌套java代码的jsp来做这个,使用了echarts来做地图可视化,直接引入echarts.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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<%@ page import="java.net.URL" %>
<%@ page import="java.net.URLConnection" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.BufferedReader" %>
<%@ page import="java.io.InputStreamReader" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<title>疫情地图</title>
<script type="text/javascript">
<%
//创建URL对象
URL u1 = new URL("https://zaixianke.com/yq/all");
//建立连接
URLConnection con = u1.openConnection();
//获取数据流
InputStream is = con.getInputStream();
//读取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
//输出
String text = br.readLine();
//System.out.println(text);

//关闭流
br.close();

%>
var data = <%= text %>
</script>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/echarts/4.7.0/echarts.min.js"></script>
<script src="http://cdn.zaixianke.com/china.js"></script>
<script src="http://cdn.zaixianke.com/world.js"></script>
</head>
<body>
<div id="main" style="width: 100%;height:600px;"></div> <br>
<div style="text-align:center">
<a style="color:#333" class="control" align="center" href="javascript:updateMap(0)">国内累计</a>
<a style="color:#333" class="control" align="center" href="javascript:updateMap(1)">国内新增</a>
<a style="color:#333" class="control" align="center" href="javascript:updateMap(2)">全球累计</a>
<a style="color:#333" class="control" align="center" href="javascript:updateMap(3)">全球新增</a>
</div>
<script src="control.js"></script>
</body>
</html>

此Demo的代码就编写完了。通过java的URL工具类访问API,然后使用IO流读取数据再存入String类型的text,再通过JSP在web页面加载数据,最后通过echarts可视化输出疫情数据分布图。

项目部署

事出突然,心血来潮,手里没测试的服务器,本来想通过本地搭建的我想了一想还是算了,就选了阿里按时计费的来进行测试,来记录从购买到项目搭建的全过程吧。

  1. 购买阿里云服务器,进入选择产品,云服务器 ECS,选择按量付费,配置自己选择即可,测试照着便宜的买就行了

image.png

  1. 选择宝塔镜像,快速搭建,避免新手敲Linux命令。

image.png

  1. 带宽拉满(自己选择),把80端口勾上,反正后面也要放行80端口,这里勾上简单、方便、节约时间。

image.png

  1. 设置密码,注意密码规则

image.png

  1. 设置资源释放时间,服务器按小时计费,会一直扣钱。购买成功之后转到控制台

image.png

  1. 在实例中,操作栏点击配置规则,配置服务器的安全规则,宝塔默认端口为8888

image.png

  1. 登陆服务器,输入bt default,显示宝塔连接地址及一些信息,复制密码,因为第一次初始化要改密码。自己可以改用户名

image.png

  1. 登陆之后去软件商店搜索tomcat并安装进行端口配置,然后进行保存,然后重启tomcat

image.png

访问看看是否配置成功

image.png

  1. 上传自己的项目文件(css文件和jsp文件)

image.png

最终效果图

image.png