1. 项目概述
这个基于Django的智能医疗辅助系统是我去年完成的毕业设计项目,经过三个月的开发和优化,最终实现了一套完整的医疗辅助解决方案。系统采用Python+Django作为后端框架,配合MySQL数据库,前端使用Bootstrap+JavaScript构建响应式界面。整个系统包含了患者管理、医生工作站、智能诊断辅助、药品库存管理等核心模块。
提示:这个项目特别适合计算机相关专业的学生作为毕业设计参考,也适合想学习Django全栈开发的初学者。系统代码结构清晰,文档完整,可以直接运行测试。
我在开发过程中特别注重系统的实用性,不仅实现了基础的CRUD功能,还加入了基于规则和简单机器学习的智能诊断建议功能。系统采用模块化设计,各功能组件解耦良好,便于二次开发和功能扩展。
2. 系统架构设计
2.1 技术选型分析
选择Django作为后端框架主要基于以下几个考虑:
- Django自带完善的后台管理系统(Admin),可以快速构建管理界面
- ORM层抽象良好,数据库操作简单高效
- 内置用户认证系统,医疗系统对安全性要求较高
- 丰富的第三方库支持,如Django REST framework可以方便地扩展API
前端选择Bootstrap+jQuery的组合是因为:
- 医疗系统管理员多为非技术人员,需要简洁直观的界面
- Bootstrap的响应式设计适配各种终端设备
- jQuery简化DOM操作,提高开发效率
数据库选用MySQL主要考虑:
- 医疗数据关系复杂,需要强大的关系型数据库支持
- MySQL性能稳定,社区支持完善
- 与Django的ORM配合良好
2.2 系统模块划分
系统主要分为以下几个功能模块:
| 模块名称 | 功能描述 | 技术实现 |
|---|---|---|
| 用户认证 | 用户注册、登录、权限管理 | Django Auth系统 |
| 患者管理 | 患者信息CRUD、病历管理 | Django Model+Form |
| 医生工作站 | 诊断记录、处方管理 | Django Admin定制 |
| 智能诊断 | 症状分析、诊断建议 | 规则引擎+简单ML |
| 药品管理 | 药品库存、采购管理 | Django Model |
| 数据统计 | 就诊数据可视化 | Chart.js集成 |
3. 核心功能实现
3.1 患者管理模块
患者管理是系统的基础模块,我设计了以下数据模型:
class Patient(models.Model): GENDER_CHOICES = [ ('M', 'Male'), ('F', 'Female'), ('O', 'Other') ] name = models.CharField(max_length=100) gender = models.CharField(max_length=1, choices=GENDER_CHOICES) birth_date = models.DateField() phone = models.CharField(max_length=20) address = models.TextField() blood_type = models.CharField(max_length=3) allergies = models.TextField(blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return f"{self.name} ({self.get_gender_display()})"病历管理采用了单独模型,与患者建立一对多关系:
class MedicalRecord(models.Model): patient = models.ForeignKey(Patient, on_delete=models.CASCADE) visit_date = models.DateTimeField() symptoms = models.TextField() diagnosis = models.TextField() treatment = models.TextField() notes = models.TextField(blank=True) prescribed_medicines = models.ManyToManyField('Medicine', through='Prescription') class Meta: ordering = ['-visit_date']注意:医疗数据涉及隐私,在实际部署时必须配置HTTPS,并在Django设置中启用CSRF保护和安全中间件。
3.2 智能诊断辅助功能
智能诊断模块采用了基于规则的专家系统方法,结合简单的机器学习算法。实现步骤如下:
- 构建症状-疾病知识库
class Disease(models.Model): name = models.CharField(max_length=100) description = models.TextField() class Symptom(models.Model): name = models.CharField(max_length=100) description = models.TextField() class DiseaseSymptom(models.Model): disease = models.ForeignKey(Disease, on_delete=models.CASCADE) symptom = models.ForeignKey(Symptom, on_delete=models.CASCADE) weight = models.FloatField() # 症状对疾病诊断的权重- 实现诊断推理引擎
def diagnose(symptoms_list): # 获取所有相关疾病 related_diseases = Disease.objects.filter( diseasesymptom__symptom__in=symptoms_list ).distinct() results = [] for disease in related_diseases: # 计算匹配分数 total_weight = DiseaseSymptom.objects.filter( disease=disease, symptom__in=symptoms_list ).aggregate(Sum('weight'))['weight__sum'] max_possible = DiseaseSymptom.objects.filter( disease=disease ).aggregate(Sum('weight'))['weight__sum'] score = (total_weight / max_possible) * 100 results.append({ 'disease': disease, 'score': round(score, 2) }) # 按分数降序排序 return sorted(results, key=lambda x: x['score'], reverse=True)- 前端交互实现
$('#diagnose-btn').click(function() { let selectedSymptoms = []; $('input[name="symptoms"]:checked').each(function() { selectedSymptoms.push($(this).val()); }); $.ajax({ url: '/api/diagnose/', method: 'POST', data: { symptoms: selectedSymptoms, csrfmiddlewaretoken: $('input[name="csrfmiddlewaretoken"]').val() }, success: function(response) { // 渲染诊断结果 let resultsHtml = ''; response.results.forEach(function(item) { resultsHtml += ` <div class="result-item"> <h5>${item.disease.name} (${item.score}%)</h5> <p>${item.disease.description}</p> </div> `; }); $('#results-container').html(resultsHtml); } }); });4. 系统部署与优化
4.1 本地开发环境搭建
- 创建虚拟环境
python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows- 安装依赖
pip install django mysqlclient pillow pandas scikit-learn- 数据库配置
# settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'medical_system', 'USER': 'root', 'PASSWORD': 'yourpassword', 'HOST': 'localhost', 'PORT': '3306', } }4.2 生产环境部署
对于毕业设计演示,我推荐使用宝塔面板简化部署过程:
- 安装宝塔面板
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh通过宝塔安装Nginx、MySQL、Python项目管理器
配置Django项目:
- 设置Python版本(建议3.8+)
- 安装项目依赖
- 配置静态文件收集
- 设置启动命令(通常为
python manage.py runserver)
配置Nginx反向代理
server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { alias /path/to/your/static/files/; } }4.3 性能优化技巧
- 数据库查询优化
# 不好的写法 - 会产生N+1查询问题 patients = Patient.objects.all() for p in patients: print(p.medicalrecord_set.all()) # 优化写法 - 使用select_related/prefetch_related patients = Patient.objects.prefetch_related('medicalrecord_set').all()- 缓存常用数据
from django.core.cache import cache def get_disease_list(): diseases = cache.get('all_diseases') if not diseases: diseases = list(Disease.objects.all()) cache.set('all_diseases', diseases, 3600) # 缓存1小时 return diseases- 静态文件压缩
python manage.py collectstatic --noinput5. 常见问题与解决方案
5.1 数据库连接问题
问题现象:django.db.utils.OperationalError: (2003, "Can't connect to MySQL server")
解决方案:
- 检查MySQL服务是否运行
- 确认数据库用户权限
- 检查防火墙设置
- 验证settings.py中的数据库配置
5.2 静态文件404错误
问题现象:CSS/JS文件加载失败,返回404
解决方案:
- 确保DEBUG=False时运行了
collectstatic - 检查Nginx/Apache配置中的静态文件路径
- 确认STATIC_ROOT和STATIC_URL设置正确
5.3 跨站请求伪造(CSRF)错误
问题现象:403 Forbidden (CSRF token missing or incorrect)
解决方案:
- 确保表单中包含
{% csrf_token %} - AJAX请求需要添加CSRF token:
// 获取CSRF token function getCookie(name) { let cookieValue = null; if (document.cookie && document.cookie !== '') { const cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } const csrftoken = getCookie('csrftoken'); // 设置AJAX请求头 $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });5.4 时区问题
问题现象:数据库中时间与显示时间不一致
解决方案:
- 在settings.py中正确配置时区:
TIME_ZONE = 'Asia/Shanghai' USE_TZ = True- 模板中显示时间时使用时区转换:
{{ record.visit_date|timezone:"Asia/Shanghai" }}6. 项目扩展方向
这个基础系统还可以进一步扩展以下功能:
微信小程序集成:开发患者端小程序,实现预约挂号、报告查询等功能
- 使用Django REST framework构建API
- 小程序调用后端接口获取数据
机器学习增强:使用更复杂的算法提高诊断准确性
- 收集更多病例数据
- 尝试使用随机森林或神经网络算法
药品交互检查:增加药品相互作用检查功能
- 构建药品知识库
- 在开具处方时自动检查可能的药物相互作用
远程会诊功能:集成视频会诊能力
- 使用WebRTC技术
- 开发预约和通知系统
数据分析和可视化:更丰富的统计报表
- 使用Pandas进行数据分析
- 集成ECharts等可视化库
在开发过程中,我最大的体会是医疗系统的严谨性要求开发者必须考虑各种边界情况和异常处理。比如患者过敏信息的处理、药品库存的并发控制等都需要特别注意。另外,医疗数据的敏感性也要求我们在开发之初就重视数据安全和隐私保护。