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. 开发患者管理模块
"""
@Project : 01-python-learn
@File : 12_医院管理系统.py
@IDE : PyCharm
@Author : 刘庆东
@Date : 2025/9/16 14:15
"""
import pymysql
import pandas as pd
from datetime import datetimefrom numpy.f2py.crackfortran import charselectorclass 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 connexcept Exception as e:print(f"❌数据库连接失败:{e}")return Nonedef close_connection(self):if self.connection:self.connection.close()print("🔌数据库连接已经断开!")def add_patients(self):print("添加患者")name=input("姓名:").strip()if not name:print("❌姓名不能为空!")returngender=input("性别 (男/女):").strip()if gender not in ['男','女']:print("❌性别只能是男女")returntry:age=int(input("年龄:"))if age<0 or age>150:print("❌年龄不合法!")except ValueError:print("年龄必须是数字")returnphone=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("暂时没有患者")returnprint("患者列表如下:")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. 导出数据到Excel12. 退出""")print("-"*36)def run(self):if not self.connection:print("❌系统启动失败,数据库连接异常!")returnwhile True:self.show_menu()choice=input("请选择 (1-12):").strip()actions={'1':self.add_patients,'2':self.view_all_patients,'12':lambda :print("系统退出") or exit()}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()