71-Python+MySQL 医院挂号问诊管理系统-1
·
1.系统介绍
项目概述
本系统是一个命令行版医院挂号问诊管理系统,主要面向医院管理员或挂号员,
用于管理患者挂号、医生排班、就诊记录等核心业务。
核心功能模块
1.患者管理 (Patients)
添加新患者
查看所有患者
查找患者(按姓名或ID)
2.医生管理 (Doctors)
添加医生
查看所有医生
查找医生
3.科室管理 (Departments)
查看所有科室
4.挂号管理 (Registrations)
为患者挂号(选择科室、医生)
查看所有待就诊挂号
处理挂号(标记为已就诊)
查看历史就诊记录
5.退出系统
系统使用 pymysql 连接数据库,pandas 导出数据,
通过菜单驱动提供交互式操作。
系统特点
结构化设计:清晰的模块划分(患者、医生、挂号、记录)。
数据关联:使用外键确保数据完整性。
事务安全:在“处理就诊”等关键操作中使用事务,确保挂号状态和病历同步更新。
用户友好:菜单清晰,输入有验证,输出格式化。
实用功能:包含挂号、就诊、病历、导出等完整流程。
可扩展性:易于添加新功能,如预约、缴费、药品管理等。
2. 数据库准备
-- 创建数据库
CREATE DATABASE IF NOT EXISTS hospital_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE hospital_db;
-- 科室表
CREATE TABLE departments (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE,
description TEXT
);
-- 医生表
CREATE TABLE doctors (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
department_id INT NOT NULL,
title VARCHAR(50), -- 职称:主任医师、副主任医师等
FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE CASCADE
);
-- 患者表
CREATE TABLE patients (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
gender ENUM('男', '女') NOT NULL,
age INT NOT NULL,
phone VARCHAR(15),
address TEXT
);
-- 挂号表(核心)
CREATE TABLE registrations (
id INT AUTO_INCREMENT PRIMARY KEY,
patient_id INT NOT NULL,
doctor_id INT NOT NULL,
registration_date DATETIME DEFAULT CURRENT_TIMESTAMP,
status ENUM('待就诊', '已就诊', '已取消') DEFAULT '待就诊',
FOREIGN KEY (patient_id) REFERENCES patients(id) ON DELETE CASCADE,
FOREIGN KEY (doctor_id) REFERENCES doctors(id) ON DELETE CASCADE
);
-- 就诊记录表
CREATE TABLE medical_records (
id INT AUTO_INCREMENT PRIMARY KEY,
registration_id INT NOT NULL,
diagnosis TEXT, -- 诊断结果
prescription TEXT, -- 处方
visit_date DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (registration_id) REFERENCES registrations(id) ON DELETE CASCADE
);
-- 插入测试数据
INSERT INTO departments (name, description) VALUES
('内科', '负责内科疾病诊疗'),
('外科', '负责外科手术及创伤处理'),
('儿科', '儿童疾病诊疗'),
('妇科', '女性健康与疾病诊疗');
INSERT INTO doctors (name, department_id, title) VALUES
('张医生', 1, '主任医师'),
('李医生', 2, '副主任医师'),
('王医生', 3, '主治医师'),
('赵医生', 4, '主治医师');
INSERT INTO patients (name, gender, age, phone, address) VALUES
('小明', '男', 8, '13812345678', '北京市朝阳区'),
('小红', '女', 25, '13987654321', '北京市海淀区');
-- 初始挂号
INSERT INTO registrations (patient_id, doctor_id, status) VALUES
(1, 3, '待就诊'), -- 小明挂儿科王医生
(2, 4, '待就诊'); -- 小红挂妇科赵医生
3. 开发患者管理模块
# -*- coding: utf-8 -*-
"""
@Project : 01-python-learn
@File : 12_医院管理系统.py
@IDE : PyCharm
@Author : 刘庆东
@Date : 2025/9/16 14:15
"""
# 1.导入模块
import pymysql
import pandas as pd
from datetime import datetime
from numpy.f2py.crackfortran import charselector
class HospitalManagementSystem:
def __init__(self):#定义构造方法
self.connection=self.connect_db()
#做为数据库连接的方法
"""
pymysql.cursors.DictCursor
因为默认返回的是元组类型
通过设置 cursorclass 使返回类型变为字典类型
处理大量数据的时候更加的方便
"""
def connect_db(self):
try:
conn=pymysql.connect(
host="192.168.88.151",
user="root",
password="hadoop",
database="hospital_db",
charset="utf8",
cursorclass=pymysql.cursors.DictCursor)
print("✅ 数据库连接成功了")
return conn
except Exception as e:
print(f"❌数据库连接失败:{e}")
return None
# 定义关闭资源的方法
def close_connection(self):
if self.connection:
self.connection.close()#当connection不是空的时候调用方法进行数据库的关闭
print("🔌数据库连接已经断开!")
def add_patients(self):
print("添加患者")
name=input("姓名:").strip()
if not name:
print("❌姓名不能为空!")
return
gender=input("性别 (男/女):").strip()
if gender not in ['男','女']:
print("❌性别只能是男女")
return
try:
age=int(input("年龄:"))
if age<0 or age>150:
print("❌年龄不合法!")
except ValueError:
print("年龄必须是数字")
return
phone=input("电话 (可选):").strip()
address=input("地址 (可选):").strip()
#将上面的信息添加到数据库中
try:
with self.connection.cursor() as cursor:
sql="INSERT INTO patients(NAME,gender,age,phone,address) VALUES (%s,%s,%s,%s,%s)"
cursor.execute(sql,(name,gender,age,phone,address))
#提交事务
self.connection.commit()
print(f"✅患者 {name} ,添加成功了!")
except Exception as e:
#回滚 撤销刚才的所有的操作
self.connection.rollback()
print(f"❌添加失败:{e}")
#查询所有的患者
def view_all_patients(self):
try:
with self.connection.cursor() as cursor:
cursor.execute("SELECT * FROM patients ORDER BY id ")
patients = cursor.fetchall()#提取全部的数据
if not patients:
print("暂时没有患者")
return
print("患者列表如下:")
print("_"*36)
for p in patients:
print(p)
print("_" * 36)
except Exception as e:
print(f"查询失败了:{e}")
# 医生
# 科室
# 问诊
#菜单
def show_menu(self):
print("="*36)
print(" 🏥 医院挂号问诊管理系统")
print("=" * 36)
print("""
1. 添加患者
2. 查看所有患者
3. 查找患者
4. 查看所有医生
5. 添加医生
6. 查看所有科室
7. 患者挂号
8. 查看待就诊挂号
9. 处理就诊
10. 查看历史就诊记录
11. 导出数据到Excel
12. 退出
""")
print("-"*36)
def run(self):
if not self.connection:
print("❌系统启动失败,数据库连接异常!")
return
#没有问题
while True:
self.show_menu()#调用显示菜单的方法
choice=input("请选择 (1-12):").strip()
actions={
'1':self.add_patients,
'2':self.view_all_patients,
'12':lambda :print("系统退出") or exit()
# 你们写 3 4 5 6 7 8 。。
}
action=actions.get(choice)#根据你的选择进行获取功能
if action:
action()
else:
print("无效的选择,请重新输入!")
#创建对象 跑程序
if __name__ == '__main__':
sytemss=HospitalManagementSystem()
try:
sytemss.run()
except Exception as e:
print(f"出问题了:{e}")
finally:
sytemss.close_connection()
更多推荐
所有评论(0)