Project01
Project01 copied to clipboard
基于springboot+mybatis+echarts+webmagic 的疫情数据可视化网站
页颿æ

项ç®åå¤
æç¨ææ¯
springboot+mybatis+echarts+webmagic
å®ç°è¿ç¨
ç¨webmagicç¬åè ¾è®¯,ç¾åº¦ç«æ ç½ç«,è·åæ°æ®
å°è¿åçæ°æ®åå¨å¨mysqlä¸
ç¼åä¸å¡,å¨controllerä¸è°ç¨ä¸å¡
ç¨ajaxè·åcontrollerä¼ æ¥çæ°æ®
ç¯å¢å软件
JDK1.8 ,IntelliJ IDEA 2020.1 x64, MySQL 5.5.40,node.js v12.16.2 ,Maven
ä¾èµ
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.9.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>com.huaban</groupId>
<artifactId>jieba-analysis</artifactId>
<version>1.0.2</version>
</dependency>
<!--SpringMVC-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
æ°æ®åºæå»º
#详æ
ä¿¡æ¯
CREATE TABLE `details` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`update_time` varchar(50) DEFAULT NULL COMMENT 'æ°æ®æåæ´æ°æ¶é´',
`province` varchar(50) DEFAULT NULL COMMENT 'ç',
`city` varchar(50) DEFAULT NULL COMMENT 'å¸',
`confirm` int(11) DEFAULT NULL COMMENT '累计确è¯',
`confirm_add` int(11) DEFAULT NULL COMMENT 'æ°å¢ç¡®è¯',
`heal` int(11) DEFAULT NULL COMMENT '累计治æ',
`dead` int(11) DEFAULT NULL COMMENT '累计æ»äº¡',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1826 DEFAULT CHARSET=utf8mb4
#åå²ä¿¡æ¯
CREATE TABLE `history` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ds` varchar(50) NOT NULL COMMENT 'æ¥æ',
`confirm` int(11) DEFAULT NULL COMMENT '累计确è¯',
`confirm_add` int(11) DEFAULT NULL COMMENT '彿¥æ°å¢ç¡®è¯',
`suspect` int(11) DEFAULT NULL COMMENT 'å©ä½çä¼¼',
`suspect_add` int(11) DEFAULT NULL COMMENT '彿¥æ°å¢çä¼¼',
`heal` int(11) DEFAULT NULL COMMENT '累计治æ',
`heal_add` int(11) DEFAULT NULL COMMENT '仿¥æ°å¢æ²»æ',
`dead` int(11) DEFAULT NULL COMMENT '累计æ»äº¡',
`dead_add` int(11) DEFAULT NULL COMMENT '彿¥æ°å¢æ»äº¡',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=108 DEFAULT CHARSET=utf8mb4
#çæ
Create Table
CREATE TABLE `hot` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dt` varchar(50) DEFAULT NULL,
`content` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1085 DEFAULT CHARSET=utf8mb4
ç¬è«æºç½å
å¨é¡¹ç®ä¸
Applicationé 置类
DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/pro?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
mybatis.type-aliases-package=CR553.Pojo
mybatis.mapper-locations=classpath:Mapper/*.xml
server.port=8088
//å
³éç¼å
spring.thymeleaf.cache=false
POJO,Mapper,Service
没å¥ç¹å«ç,åºæ¬çcrud,ç´æ¥ä¸ä»£ç
POJO
@Data//ä¾èµäºlombok
@AllArgsConstructor
@NoArgsConstructor
public class Details {
private Long id;
private String update_time; //æ´æ°æ¶é´
private String province; //ç
private String city; //å¸
private Long confirm; //累计确è¯
private Long confirm_add; //仿¥æ°å¢ç¡®è¯
private Long heal; //æ²»æ
private Long dead; //æ»äº¡
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class History {
private Long id;
private String ds; //æ¥æ
private Long confirm;//累计确è¯
private Long confirm_add;//仿¥ç´¯è®¡ç¡®è¯
private Long suspect;//çä¼¼
private Long suspect_add;//仿¥æ°å¢çä¼¼
private Long heal;//æ²»æ
private Long heal_add;//彿¥æ°å¢æ²»æ
private Long dead;//æ»äº¡
private Long dead_add;//仿¥æ°å¢æ»äº¡
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hot {
private Long id;
private String content;
private String dt;
}
mapper
@Mapper
public interface DetailsMapper {
//åå¨
void saveDetails(Details details);
//æ´æ°
void updateDetails(Details details);
//æ¥æ¾(ç份åå¸åç¸åç)
List<Details> findDetails(Details details);
//æ¥æ¾ç
List<String> findProvince();
//æ¥æ¾æ¯ä¸ªççç¡®è¯äººæ°
List<Integer> findProvinceValue();
//æ¥æ¾åå¸
List<String> findCity();
//æ¥æ¾æ¯ä¸ªåå¸çç¡®è¯äººæ°
List<Long> findCityValue();
}
@Mapper
public interface HistoryMapper {
//ä¿å
void saveHistory(History history);
//æ´æ°
void updateHistory(History history);
//æ¥æ¾ æ¥æç¸åç
List<History> findHistory(History history);
//æ¥æ¾ä»æ¥æ°æ®
History findToday();
//è¿åæ¯å¤©åå²ç´¯è®¡æ°æ®
List<History> findEachDayTotal();
//è¿åæ¯å¤©åå²å¢å æ°æ®
List<History> findEachDayAdd();
}
@Mapper
public interface HotMapper {
//ä¿å
void saveHot(Hot hot);
List<Hot> findTopHot20();
}
serviceImp
@Service
public class DetailsServiceImpl implements DetailsService {
@Autowired
private DetailsMapper detailsMapper;
//æ¥æ¾å¹¶æ´æ°
@Override
public void saveDetails(Details details) {
List<Details> list = this.findDetails(details);
if (list.size() == 0) {
//没æ¥å°,æ°å¢
this.detailsMapper.saveDetails(details);
}else
{
//æ¥å°äº,ä¿®æ¹
this.detailsMapper.updateDetails(details);
}
}
@Override
public void updateDetails(Details details) {
this.updateDetails(details);
}
@Override
public List<Details> findDetails(Details details) {
List<Details> list = this.detailsMapper.findDetails(details);
return list;
}
@Override
public List<String> findProvince() {
List<String> list = this.detailsMapper.findProvince();
return list;
}
@Override
public List<Integer> findProvinceValue() {
List<Integer> list = this.detailsMapper.findProvinceValue();
return list;
}
@Override
public List<String> findCity() {
List<String> city = this.detailsMapper.findCity();
return city;
}
@Override
public List<Long> findCityValue() {
List<Long> cityValue = this.detailsMapper.findCityValue();
return cityValue;
}
}
@Service
public class HistoryServiceImpl implements HistoryService {
@Autowired
private HistoryMapper historyMapper;
@Override
public void saveHistory(History history) {
List<History> list = this.historyMapper.findHistory(history);
if(list.size()==0)
{
this.historyMapper.saveHistory(history);
}else
{
this.historyMapper.updateHistory(history);
}
}
@Override
public void updateHistory(History history) {
this.historyMapper.updateHistory(history);
}
@Override
public List<History> findHistory(History history) {
return this.historyMapper.findHistory(history);
}
@Override
public History findToday() {
return this.historyMapper.findToday();
}
@Override
public List<History> findEachDayTotal() {
return this.historyMapper.findEachDayTotal();
}
@Override
public List<History> findEachDayAdd() {
return this.historyMapper.findEachDayAdd();
}
}
@Service
public class HotServiceImpl implements HotService {
@Autowired
private HotMapper hotMapper;
@Override
public void saveHot(Hot hot) {
this.hotMapper.saveHot(hot);
}
@Override
public List<Hot> findTopHot20() {
return this.hotMapper.findTopHot20();
}
}
Webmagicç¬è«
å¯è½å°±æ¯å¨è§£ææ°æ®çæ¶åè¦è±ä¸ç¹ç¹æ¶é´
è¿éæ¯éè¿æä¸ªæç¹,debugæ ¢æ ¢åæç

å·®ä¸å¤å°±è¿æ ·æµè¯
å çdetailsæ°æ®çè§£æ

æ°æ®å¨è¿ä¸¤ä¸ªä¸è·å
æ¬è´¨ä¸å°±æ¯éåä¸ä¸ªåéfor循ç¯,å¤å±è·åç,å
å±è·åå¸
history 注æç乿¯ä¸¤ä¸ªjsonæ°æ®
è¿éè¦æ³¨æä¸ä¸,chinaDayListä¸çæ¥ææ¯ä»1æ20å·å¼å§ç,èchinaDayAddListä¸çæ¥ææ¯ä»1æ13å·å¼å§ç,è¿æä¸ç¹å°±æ¯é²æ¢æ°ç»è¶ç,è¿ä¸ç¹å¨ä»£ç éé¢ä¼æå°.
ä¸ä¸ªfor循ç¯å°±å¯ä»¥æå®äº.
çæhotè¡¨æ°æ®å¾å°,debugä¸ä¸å¾å®¹æåç°,è¿éä¸å说æ.
æ°æ®çä¿å
以details为ä¾
ææ°æ®å ä¿åå¨ResultItemsä¸,æè¿éç¨äºéæºid,鲿¢keyç¸å
使ç¨pipeline
éåResultItems,è°ç¨detailsServiceæ¹æ³ä¿åæ°æ®å°æ°æ®åº
å¦å¤ä¸¤ä¸ªæä½åºæ¬ç¸å
Controller+SQL+ajax
Controller+SQL+ajax
æ°æ®ä¿åå°æ°æ®åºå,å©ä¸å°±æ¯åéæ°æ®äº
æ´ä¸ªæ°æ®çå±ç¤ºå¤§ä½å为äºå 个é¨å,便¬¡æ¯l1,l2,c1,c2,r1,r2
c1

c2 å°å¾
è¿éç两个sqlå
¶å®æ¯å¯ä»¥æ¾ä¸èµ·,æè¿éå¤èµ°äºä¸æ¥è·¯
l1 æçº¿å¾

l2 æçº¿å¾

r1 æ±å½¢å¾
è¿ä¸¤ä¸ªsqlå
¶å®æ¯å¯ä»¥æ¾å¨ä¸èµ·ç,使¯æçæ¾ä¸èµ·åªæ¥åºäºä¸åæ°æ®,äºæ¯å°±å¤èµ°äºä¸æ¥è·¯
r2 è¯äº
è¿éç¨å°äºjiebaåè¯å¨,å°åè¯åçå ³é®ååæ°å¼è¿åç»å端

å ¶ä»ææ¯
å ³äºecharts,该项ç®ç¨çå¾è¡¨é½æ¯echartsä¸çåºç¡å¾è¡¨,å¨å®ç½é½å¯ä»¥æ¾å°,ä½ ä¹å¯ä»¥ç¨ä½ èªå·±æ¾çå¾è¡¨,æå¼æ¹å¼å¤§åå°å¼,è¿é注æçæ¯ å°å¾åè¯äºéè¦å å¼å ¥ç¸å ³jsæä»¶,ç¸å ³æä»¶é½å¯ä»¥å¨echartså®ç½ä¸è½½ å°å¾åè¯äºéè¦å å¼å ¥ç¸å ³jsæä»¶,ç¸å ³æä»¶é½å¯ä»¥å¨echartså®ç½ä¸è½½
https://echarts.apache.org/zh/download-extension.html
äºåé䏿echarts
https://echarts.apache.org/zh/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20ECharts
ç®åå®ç¨jieba
https://blog.csdn.net/wbcg111/article/details/53191721
seleniumåºæ¬å®ç¨
https://blog.csdn.net/qq_22003641/article/details/79137327
webmagic宿¹ææ¡£ [http://webmagic.io/docs/zh/](
æ»ç»
è¿ä¸ªé¡¹ç®ç®å,åºç¡,éåæ°æ.è¿æ¯æå¦å®springboot ä¹å第ä¸ä¸ªå°é¡¹ç®,åä¹åæè§æ ä»ä¸æ,åå®ååè§å¾æ²¡æä»ä¹,é¡¹ç®æ¯åèbç«ä¸ä¸ä¸ªåºäºpythonå®ç°çè§é¢åç. æ°æ®åºçæå»º,sqlè¯å¥,齿¯æ¨¡ä»¿ç.èªå·±çé¨åä¸»è¦æ¯ç¬è«åä¸å¡çç¼å.å°½ç®¡å¦æ¤,æè¿æ¯è±äºå¥½å 天æ¶é´,ä»ä¸å¼å§çæµé¼å°æ ¢æ ¢æ¨äºè§æ¥,åå®è¿æ¯æä¸ä¸¢ä¸¢çæå°±æç.
è·åèµæºçè·¯æç¹æ²æ,é£ä¸ªè§é¢æ¿èµæè¦å vx,æä¸å ,说è¦å»ä»ä»¬çå¹è®æºæå®ç½æ³¨åè´¦å·,彿¶å«éº»ç¦,没è¦
å¨è§é¢çè¯è®ºåºæäººå ååºæ¥äº,åºæ¬åè§é¢æ²¡å·®,仿龿¥åäºå°äºè¯è®º(äºå®ä¸ä»å¨å¥½å ä¸ªç«æ å¯è§åçè§é¢ä¸é¢é½çäºé¾æ¥,æççæ¯æäº),æé¡ºçç½ç«æ¾å°äºä»çå客,ä¸é¢æäººçè¨è¯´å¯ä¸å¯ä»¥è¦æºç ,ä»è¯´å å vx.æå ´å²å²çå»å äº,使¯åä»è¦çæ¶åä»è¯´**"æå¿!!!" **
æçè§£ä½ä¸è®¤åè¿ç§åæ³,ä¹å¹¸äºä»æç»äºæ,æµçäºææ³å·æçå¿
å¨ç½ä¸ä¹å¾å°æå°åºäºjavaå®ç°çç«æ å¯è§å项ç®(å ¶å®ä¸»è¦æ¯ç¬è«æ°æ®è§£æé¨å䏿æ,大家好åé½å»ç¨pythonäº)
åºäºä»¥ä¸åå ,è¿ææä¸è·¯å¯¹ç½å«è¿æ¥çè§é¢åèµæºæä¾è ææ¿,æå½æ¶å°±å³å®èªå·±æè¿ç§é¡¹ç®ååºæ¥,åå°ç½ä¸,ä¾åæä¸æ ·çèæ°åè,å¦ä¹ .
ç¬¬ä¸æ¬¡å,å¯è½æ´ççä¸å¤ªè¯¦ç»,å ·ä½çå°±åç §æºç å§,. åºæ¬çæ¡æ¶å·®ä¸å¤å°±æ¯è¿æ ·,ç½ç«æä¼æ ¢æ ¢ä¿®æ¹,鿏è±ç¦»ä¹åçå¸å±(u1s1,ççæç¹ä¸),䏿¤åæ¶è¿ä¹æ¯ä¸ä¸ªèååå¦ä¹ ç好éå¾.
弿ºæ¯ä¸ç§ç²¾ç¥
åºç¡,éåæ°æ.è¿æ¯æå¦å®springboot ä¹å第ä¸ä¸ªå°é¡¹ç®,åä¹åæè§æ ä»ä¸æ,åå®ååè§å¾æ²¡æä»ä¹,é¡¹ç®æ¯åèbç«ä¸ä¸ä¸ªåºäºpythonå®ç°çè§é¢åç. æ°æ®åºçæå»º,sqlè¯å¥,齿¯æ¨¡ä»¿ç.èªå·±çé¨åä¸»è¦æ¯ç¬è«åä¸å¡çç¼å.å°½ç®¡å¦æ¤,æè¿æ¯è±äºå¥½å 天æ¶é´,ä»ä¸å¼å§çæµé¼å°æ ¢æ ¢æ¨äºè§æ¥,åå®è¿æ¯æä¸ä¸¢ä¸¢çæå°±æç.
è·åèµæºçè·¯æç¹æ²æ,é£ä¸ªè§é¢æ¿èµæè¦å vx,æä¸å ,说è¦å»ä»ä»¬çå¹è®æºæå®ç½æ³¨åè´¦å·,彿¶å«éº»ç¦,没è¦
å¨è§é¢çè¯è®ºåºæäººå ååºæ¥äº,åºæ¬åè§é¢æ²¡å·®,仿龿¥åäºå°äºè¯è®º(äºå®ä¸ä»å¨å¥½å ä¸ªç«æ å¯è§åçè§é¢ä¸é¢é½çäºé¾æ¥,æççæ¯æäº),æé¡ºçç½ç«æ¾å°äºä»çå客,ä¸é¢æäººçè¨è¯´å¯ä¸å¯ä»¥è¦æºç ,ä»è¯´å å vx.æå ´å²å²çå»å äº,使¯åä»è¦çæ¶åä»è¯´**"æå¿!!!" **
æçè§£ä½ä¸è®¤åè¿ç§åæ³,ä¹å¹¸äºä»æç»äºæ,æµçäºææ³å·æçå¿
å¨ç½ä¸ä¹å¾å°æå°åºäºjavaå®ç°çç«æ å¯è§å项ç®(å ¶å®ä¸»è¦æ¯ç¬è«æ°æ®è§£æé¨å䏿æ,大家好åé½å»ç¨pythonäº)
åºäºä»¥ä¸åå ,è¿ææä¸è·¯å¯¹ç½å«è¿æ¥çè§é¢åèµæºæä¾è ææ¿,æå½æ¶å°±å³å®èªå·±æè¿ç§é¡¹ç®ååºæ¥,åå°ç½ä¸,ä¾åæä¸æ ·çèæ°åè,å¦ä¹ .
ç¬¬ä¸æ¬¡å,å¯è½æ´ççä¸å¤ªè¯¦ç»,å ·ä½çå°±åç §æºç å§,. åºæ¬çæ¡æ¶å·®ä¸å¤å°±æ¯è¿æ ·,ç½ç«æä¼æ ¢æ ¢ä¿®æ¹,鿏è±ç¦»ä¹åçå¸å±(u1s1,ççæç¹ä¸),䏿¤åæ¶è¿ä¹æ¯ä¸ä¸ªèååå¦ä¹ ç好éå¾.
弿ºæ¯ä¸ç§ç²¾ç¥
å ·ä½ä»£ç è§ GitHub:https://github.com/CR553/Project01.git