一、系统架构设计:Django与Vue的协同优势
在线疫苗预约系统需兼顾高并发处理与用户体验,采用Django(后端)+Vue(前端)的分离架构是理想选择。Django作为Python生态的成熟框架,提供ORM、Admin后台、安全认证等开箱即用功能,可快速构建RESTful API;Vue则以响应式数据绑定和组件化开发著称,能高效实现动态界面。两者通过Axios进行异步通信,形成“后端服务+前端渲染”的轻量级协作模式。
技术选型依据:
- 开发效率:Django的MTV模式(Model-Template-View)与Vue的单文件组件(.vue)结构,可并行开发前后端,缩短项目周期。
- 扩展性:Django的中间件机制支持添加权限控制、日志记录等横切关注点;Vue的插件系统(如Vuex状态管理)便于功能扩展。
- 安全性:Django内置CSRF防护、SQL注入拦截,Vue通过v-model双向绑定减少DOM操作漏洞,双重保障数据安全。
二、核心功能模块实现
1. 用户管理模块
- 功能设计:支持普通用户(预约疫苗)、医疗机构(管理库存)、管理员(审核机构)三类角色。
- Django实现:
# models.pyfrom django.contrib.auth.models import AbstractUserclass User(AbstractUser):USER_TYPE_CHOICES = (('user', '普通用户'),('hospital', '医疗机构'),('admin', '管理员'))user_type = models.CharField(max_length=10, choices=USER_TYPE_CHOICES)phone = models.CharField(max_length=11, unique=True) # 疫苗预约需实名手机号
- Vue交互:通过
v-if动态渲染不同角色的导航菜单,例如医疗机构用户可见“库存管理”入口。
2. 疫苗预约流程
- 流程设计:选择疫苗类型→查看可预约时段→填写接种人信息→支付定金(可选)→生成预约码。
- 关键技术点:
- 时段冲突检测:后端通过
F()表达式查询数据库,避免同一时段重复预约:# views.pyfrom django.db.models import Fdef check_slot(request, hospital_id, slot_time):reserved = Reservation.objects.filter(hospital_id=hospital_id,slot_time=slot_time,status__in=['reserved', 'paid']).count()return JsonResponse({'available': reserved == 0})
- 预约码生成:使用Python的
uuid模块生成唯一码,存储为加密字符串:import uuidreservation.code = uuid.uuid4().hex[:8].upper() # 取前8位大写
- 时段冲突检测:后端通过
3. 医疗机构管理后台
- 功能实现:
- 疫苗库存管理:通过Django Admin自定义表单,限制库存数量为正整数:
# admin.pyclass VaccineAdmin(admin.ModelAdmin):list_display = ('name', 'type', 'stock')def get_form(self, request, obj=None, **kwargs):form = super().get_form(request, obj, **kwargs)form.base_fields['stock'].widget.attrs['min'] = 0 # HTML5原生验证return form
- 预约记录导出:集成
tablib库生成Excel报表,供医疗机构统计使用。
- 疫苗库存管理:通过Django Admin自定义表单,限制库存数量为正整数:
三、数据库设计与优化
1. 核心表结构
- 疫苗表(Vaccine):字段包括名称、类型(如灭活疫苗、mRNA疫苗)、适用年龄、禁忌症等。
- 预约记录表(Reservation):关联用户、医疗机构、疫苗、预约时段、状态(待支付/已取消/已完成)。
- 医疗机构表(Hospital):存储机构名称、地址、联系方式、服务时间。
2. 性能优化策略
- 索引优化:为高频查询字段(如
user_id、hospital_id、slot_time)添加索引:# models.pyclass Reservation(models.Model):user = models.ForeignKey(User, on_delete=models.CASCADE)hospital = models.ForeignKey(Hospital, on_delete=models.CASCADE)slot_time = models.DateTimeField()# 添加复合索引class Meta:indexes = [models.Index(fields=['hospital', 'slot_time']),]
- 缓存机制:使用Django的
cache_page装饰器缓存静态页面(如疫苗列表页),减少数据库查询。
四、前后端交互与安全实践
1. API设计规范
- RESTful接口:
GET /api/vaccines/:获取疫苗列表POST /api/reservations/:提交预约请求PUT /api/reservations/<id>/:修改预约状态
- 请求验证:通过Django REST Framework的
Serializer校验数据,例如确保手机号格式正确:# serializers.pyfrom rest_framework import serializersclass ReservationSerializer(serializers.ModelSerializer):phone = serializers.RegexField(regex=r'^1[3-9]\d{9}$', required=True)class Meta:model = Reservationfields = '__all__'
2. 安全防护措施
- JWT认证:使用
djangorestframework-simplejwt实现无状态认证,避免Session存储风险。 - 敏感数据脱敏:前端展示手机号时隐藏中间4位,后端通过
__contains查询替代完整匹配:// Vue中格式化手机号methods: {maskPhone(phone) {return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');}}
五、部署与运维建议
- 容器化部署:使用Docker Compose编排Django(Gunicorn+Nginx)和Vue(Nginx静态文件)服务,简化环境配置。
- 日志监控:通过Django的
logging模块记录预约异常,结合ELK(Elasticsearch+Logstash+Kibana)实现可视化分析。 - 压力测试:使用Locust模拟1000并发用户,验证系统在高负载下的响应时间(目标<2s)。
六、毕业设计亮点提炼
- 技术深度:展示对Django中间件、Vue生命周期钩子的理解,例如在
created阶段加载用户预约历史。 - 业务价值:强调系统对公共卫生管理的提升,如减少现场排队、精准统计接种率。
- 创新点:可加入AI推荐模块,根据用户年龄、病史推荐适合的疫苗类型。
通过以上设计,该系统不仅能满足毕业设计的技术要求,更具备实际落地价值。开发者可基于此框架进一步扩展功能,如添加短信通知、二维码核验等,打造更完善的医疗服务平台。