1. 项目概述
这个基于Spring Boot和Django的疫情监控系统,是我去年指导的一个大数据专业毕业设计项目。系统整合了前后端技术栈,实现了疫情数据的实时采集、存储、分析和可视化展示。作为一名有10年全栈开发经验的工程师,我想分享一下这个项目的技术实现细节和开发经验,希望能给正在做类似毕设的同学一些参考。
疫情数据监控系统本质上是一个典型的数据密集型应用,需要处理高并发的实时数据流,同时提供直观的数据可视化界面。我们采用微服务架构,前端使用Vue.js实现响应式交互,后端基于Spring Boot构建RESTful API,数据层采用MySQL和Redis混合存储,通过Python爬虫实时抓取公开疫情数据源。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体架构方案
系统采用前后端分离的B/S架构,整体分为四个主要层次:
- 数据采集层:Python爬虫集群,定时抓取各地卫健委公布的疫情数据
- 数据处理层:Spring Boot微服务,负责数据清洗、聚合和存储
- 数据存储层:MySQL关系型数据库 + Redis缓存
- 数据展示层:Vue.js前端 + ECharts可视化组件
这种分层架构的优势在于:
- 各层职责明确,便于团队协作开发
- 可以独立扩展各层资源(如单独增加爬虫节点)
- 前后端分离便于多终端适配
2.2 关键技术选型
后端技术栈
- Spring Boot 2.7:简化配置,快速构建微服务
- MyBatis-Plus 3.5:增强的ORM框架,减少样板代码
- Redis 6.2:缓存热点数据,减轻数据库压力
- Quartz 2.3:定时任务调度框架
- Shiro 1.8:认证和授权管理
前端技术栈
- Vue 3:响应式前端框架
- Element Plus:UI组件库
- ECharts 5:数据可视化库
- Axios:HTTP请求库
数据采集技术
- Scrapy:Python爬虫框架
- BeautifulSoup:HTML解析库
- Pandas:数据清洗和处理
技术选型心得:对于学生毕设项目,建议选择文档丰富、社区活跃的技术栈。Spring Boot和Vue都有完善的中文文档和大量教程,遇到问题容易找到解决方案。
3. 核心功能实现
3.1 数据采集模块
疫情数据采集是整个系统的基础,我们设计了多源数据采集方案:
python复制class CovidDataSpider(scrapy.Spider):
name = 'covid_spider'
def start_requests(self):
urls = [
'http://wsjkw.sh.gov.cn/',
'http://wjw.beijing.gov.cn/',
# 其他数据源URL
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 提取疫情数据
data = {
'region': self.extract_region(soup),
'new_cases': self.extract_new_cases(soup),
'total_cases': self.extract_total_cases(soup),
'update_time': datetime.now()
}
# 数据清洗
cleaned_data = self.clean_data(data)
# 存储到临时JSON文件
self.save_to_file(cleaned_data)
实现要点:
- 使用Scrapy的分布式爬虫架构,支持并发抓取多个数据源
- 每个数据源编写特定的解析规则
- 数据清洗环节处理异常值和格式转换
- 添加请求头模拟浏览器访问,避免被封禁
3.2 数据存储设计
数据库采用MySQL 8.0,主要表结构设计如下:
疫情数据表(covid_data)
sql复制CREATE TABLE `covid_data` (
`id` bigint NOT NULL AUTO_INCREMENT,
`region_code` varchar(10) NOT NULL COMMENT '行政区划代码',
`region_name` varchar(50) NOT NULL COMMENT '地区名称',
`new_cases` int DEFAULT '0' COMMENT '新增确诊',
`total_cases` int DEFAULT '0' COMMENT '累计确诊',
`new_asymptomatic` int DEFAULT '0' COMMENT '新增无症状',
`total_asymptomatic` int DEFAULT '0' COMMENT '累计无症状',
`update_time` datetime NOT NULL COMMENT '更新时间',
`data_source` varchar(255) DEFAULT NULL COMMENT '数据来源',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_region_time` (`region_code`,`update_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
用户表(sys_user)
sql复制CREATE TABLE `sys_user` (
`user_id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`salt` varchar(20) DEFAULT NULL COMMENT '加密盐值',
`email` varchar(100) DEFAULT NULL,
`mobile` varchar(20) DEFAULT NULL,
`status` tinyint DEFAULT '1' COMMENT '状态 0:禁用 1:正常',
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
数据库优化措施:
- 为高频查询字段添加索引
- 使用分区表按日期存储历史数据
- 建立物化视图预计算统计数据
- 配置主从复制提高读取性能
3.3 数据可视化实现
前端使用ECharts实现多种可视化图表:
javascript复制// 疫情地图实现
function initMapChart() {
const chart = echarts.init(document.getElementById('map-container'));
const option = {
tooltip: {
trigger: 'item',
formatter: params => {
return `${params.name}<br/>
新增确诊: ${params.data.value[0]}<br/>
累计确诊: ${params.data.value[1]}`
}
},
visualMap: {
min: 0,
max: 100,
text: ['高', '低'],
inRange: {
color: ['#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695']
}
},
series: [{
name: '疫情数据',
type: 'map',
map: 'china',
roam: true,
emphasis: {
label: {
show: true
}
},
data: this.mapData
}]
};
chart.setOption(option);
window.addEventListener('resize', chart.resize);
}
可视化功能亮点:
- 中国地图分级着色展示疫情严重程度
- 时间轴动画展示疫情发展趋势
- 多图表联动交互
- 响应式设计适配不同屏幕尺寸
4. 关键技术实现细节
4.1 实时数据更新机制
系统采用混合更新策略:
- 定时拉取:Quartz定时任务每小时执行数据同步
- 事件驱动:Redis Pub/Sub通知数据变更
- 长轮询:前端定期检查数据更新
Spring Boot定时任务配置示例:
java复制@Configuration
public class QuartzConfig {
@Bean
public JobDetail dataSyncJobDetail() {
return JobBuilder.newJob(DataSyncJob.class)
.withIdentity("dataSyncJob")
.storeDurably()
.build();
}
@Bean
public Trigger dataSyncTrigger() {
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule("0 0 0/1 * * ?");
return TriggerBuilder.newTrigger()
.forJob(dataSyncJobDetail())
.withIdentity("dataSyncTrigger")
.withSchedule(scheduleBuilder)
.build();
}
}
4.2 高性能数据查询优化
对于疫情数据这类读多写少的场景,我们采用以下优化方案:
-
多级缓存策略:
- 使用Redis缓存热点数据
- 本地Caffeine缓存减少Redis访问
- 数据库查询结果缓存
-
SQL优化示例:
java复制@Repository
public interface CovidDataRepository extends BaseMapper<CovidData> {
@Select("SELECT region_name, SUM(new_cases) as cases FROM covid_data " +
"WHERE update_time >= #{start} AND update_time < #{end} " +
"GROUP BY region_name ORDER BY cases DESC LIMIT 10")
List<Map<String, Object>> findTopRegions(@Param("start") Date start,
@Param("end") Date end);
@Cacheable(value = "dailyStats", key = "#date.format('yyyyMMdd')")
public DailyStats getDailyStats(LocalDate date) {
// 复杂统计查询
}
}
- 前端数据分页与懒加载:
- 表格数据分页查询
- 地图区域按需加载
- 图表数据采样降精度
5. 开发经验与避坑指南
5.1 常见问题解决方案
问题1:数据不一致性
- 现象:不同数据源统计口径不一致
- 解决方案:建立数据标准化规则,开发数据清洗模块
问题2:爬虫被封禁
- 现象:IP被目标网站封禁
- 解决方案:
- 使用代理IP池
- 设置合理的爬取间隔
- 模拟浏览器User-Agent
问题3:图表性能问题
- 现象:大数据量下地图渲染卡顿
- 解决方案:
- 数据采样降维
- WebWorker异步渲染
- 使用Canvas替代SVG
5.2 项目开发建议
- 版本控制:使用Git进行代码管理,合理规划分支策略
- API文档:使用Swagger自动生成接口文档
- 单元测试:保证核心业务逻辑的测试覆盖率
- 持续集成:配置自动化构建和部署流程
- 性能监控:添加应用性能指标收集
5.3 毕设答辩技巧
- 技术亮点提炼:准备3-5个技术难点及解决方案
- 演示准备:录制备用视频,防止现场网络问题
- 问题预测:提前准备常见问题的回答
- 数据对比:展示优化前后的性能指标对比
- 项目展望:合理规划未来改进方向
6. 系统部署方案
6.1 生产环境部署
推荐使用Docker容器化部署,docker-compose.yml示例:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: covid
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:6.2
ports:
- "6379:6379"
volumes:
- redis_data:/data
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/covid
SPRING_REDIS_HOST: redis
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
volumes:
mysql_data:
redis_data:
6.2 监控与运维
- 应用监控:Prometheus + Grafana
- 日志收集:ELK Stack
- 报警机制:配置异常指标报警规则
- 备份策略:数据库定期全量备份+binlog增量备份
7. 项目扩展方向
对于想进一步扩展项目的同学,可以考虑以下方向:
- 移动端适配:开发微信小程序或React Native应用
- 预测模型:集成机器学习疫情预测算法
- 国际数据:增加全球疫情数据支持
- 舆情分析:结合社交媒体舆情数据
- 智能预警:建立自动化预警机制
这个疫情监控系统涵盖了大数据处理的完整流程,从数据采集、存储、处理到可视化展示。在开发过程中,我们遇到了各种技术挑战,也积累了不少实战经验。希望这个分享能给正在做毕设的同学一些启发和帮助。
