1. 项目概述
作为一名在高校信息化建设领域深耕多年的开发者,我最近完成了一个基于Python+Django的高校传染病疫情防控信息管理系统。这个系统源于疫情期间高校管理的实际需求,旨在解决传统手工登记方式效率低下、数据孤岛、响应迟缓等问题。
系统采用B/S架构,前端使用Vue.js+ElementUI构建响应式界面,后端基于Django REST framework实现API服务,数据库选用MySQL 8.0。系统实现了从疫情监测、信息上报、数据分析到应急处理的完整闭环管理,目前已在3所高校试点运行,日均处理健康打卡数据超过2万条。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选型
后端技术栈:
- Django 4.1 + Django REST framework:提供稳健的MVC架构和RESTful API支持
- Django Channels:实现WebSocket协议,用于实时疫情预警
- Celery + Redis:异步任务队列处理大数据分析
- PyMySQL:MySQL数据库驱动
- Pandas + NumPy:疫情数据分析
前端技术栈:
- Vue 3.2 + Vuex + Vue Router
- Element Plus UI组件库
- ECharts 5.3 数据可视化
- Axios HTTP客户端
数据库:
- MySQL 8.0(主从复制架构)
- Redis 6.2(缓存和消息队列)
2.2 系统架构图
系统采用典型的三层架构:
code复制表示层(Vue) ↔ 业务逻辑层(Django) ↔ 数据访问层(MySQL)
关键设计考量:
- 前后端完全分离,通过JWT进行认证
- 采用微服务思想,将核心功能模块化
- 引入消息队列解耦耗时操作
- 多级缓存提升系统响应速度
3. 核心功能实现
3.1 疫情数据采集模块
python复制# models.py
class HealthReport(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
temperature = models.DecimalField(max_digits=3, decimal_places=1)
symptoms = models.JSONField() # 存储症状JSON数据
location = models.PointField() # 地理坐标
report_time = models.DateTimeField(auto_now_add=True)
is_abnormal = models.BooleanField(default=False)
class Meta:
indexes = [
models.Index(fields=['report_time']),
models.Index(fields=['is_abnormal']),
]
关键实现细节:
- 使用Django的GeoDjango扩展处理地理位置数据
- JSONField存储动态症状信息
- 复合索引优化查询性能
- 信号机制自动检测异常体温(>37.3℃)
3.2 实时预警系统
python复制# consumers.py
class AlertConsumer(AsyncWebsocketConsumer):
async def connect(self):
await self.channel_layer.group_add(
"alerts",
self.channel_name
)
await self.accept()
async def send_alert(self, event):
await self.send(text_data=json.dumps(event["message"]))
技术要点:
- 基于WebSocket实现服务端推送
- 使用Django Channels处理实时通信
- 结合Celery定时任务扫描异常数据
- 前端采用指数退避算法实现断线重连
4. 关键问题解决方案
4.1 高并发健康打卡
问题:每天8:00-9:00出现打卡高峰,QPS超过500
解决方案:
- 引入Redis缓存热门数据
- 使用bulk_create批量插入
- 数据库读写分离
- 前端实现请求队列和重试机制
python复制# utils.py
def batch_create_reports(data):
with transaction.atomic():
objs = [HealthReport(**item) for item in data]
HealthReport.objects.bulk_create(objs, batch_size=1000)
4.2 疫情热力图渲染
优化前:全表扫描导致响应时间>5s
优化方案:
- 使用MySQL空间索引
- 预聚合网格数据
- 前端分级渲染
sql复制-- 创建空间索引
CREATE SPATIAL INDEX location_index ON app_healthreport(location);
-- 网格聚合查询
SELECT
ST_AsText(ST_Centroid(grid)) as grid_center,
COUNT(*) as count
FROM
(SELECT ST_SRID(location, 4326) as geom FROM app_healthreport) as points,
(SELECT ST_CreateFishnet(10, 10, 0.1, 0.1, 116.0, 39.0) as grid) as grids
WHERE
ST_Contains(grid, points.geom)
GROUP BY
grid;
5. 系统安全设计
5.1 数据安全策略
- 传输层:全站HTTPS + HSTS
- 存储加密:
- 敏感字段AES-256加密
- 数据库透明加密(TDE)
- 访问控制:
- RBAC权限模型
- 基于JWT的细粒度授权
- 审计日志:
- 记录所有数据变更
- 使用Django Auditlog
5.2 防攻击措施
- 常见Web攻击防护:
- CSRF Token
- XSS过滤
- SQL注入防护
- 速率限制:
python复制# settings.py REST_FRAMEWORK = { 'DEFAULT_THROTTLE_RATES': { 'anon': '100/hour', 'user': '1000/hour' } } - 敏感操作二次认证
6. 部署方案
6.1 服务器配置
生产环境:
- 阿里云ECS(4核8G)×3
- 应用服务器 ×2(负载均衡)
- 数据库服务器 ×1
- 对象存储OSS:存储报表等静态资源
- SLB:流量分发和SSL卸载
6.2 Docker部署示例
dockerfile复制# Django容器
FROM python:3.9
RUN pip install gunicorn
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app
WORKDIR /app
CMD ["gunicorn", "config.wsgi", "-b", "0.0.0.0:8000"]
编排文件:
yaml复制version: '3'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- redis
- db
redis:
image: redis:6
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
7. 项目扩展方向
- 大数据分析:集成Spark进行疫情传播预测
- 移动端适配:开发微信小程序版本
- 物联网集成:对接智能测温设备
- 区块链应用:疫情数据存证
我在实际部署中发现,系统性能瓶颈主要出现在数据库IO上。通过以下优化获得了显著提升:
- 查询优化:Explain分析慢查询,添加缺失索引
- 缓存策略:热点数据Redis缓存,TTL动态调整
- 连接池:使用django-db-geventpool
一个特别实用的调试技巧:在Django的settings.py中配置:
python复制LOGGING = {
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
'handlers': ['console'],
}
}
}
这样可以打印所有SQL查询,方便优化。
