当前位置:   article > 正文

数据库 | 基于opengauss的医院患者预约简易系统_医生预约名额需要加到数据库里面吗

医生预约名额需要加到数据库里面吗

一、概述

        代码使用 python 进行开发,使用 pycharm 作为开发工具,连接到 openGauss 数据库。使用psycopg2库进行数据库的连接,在此基础上进行数据库的一系列操作。

        该系统实现医院预约的简易操作,创建医生、患者、科系、预约、预约备份、一般管理员账号密码信息 共6张表,共有4种登录类型:患者、医生、一般管理员、超级管理员。同时还创建了3个数据库存储过程函数,分别对应增删改3个触发器。通过触发器,系统自动完成对患者操作信息的记录。        

        (1)Data Studio上展示的ER图:

b075ab82eace4b78a2fa2bb6df92ad46.png

         (2)模式结构

9f062d2dfe674425b8aade30cb6d3ec9.png

二、实现功能

        系统可以实现的功能如下:

        (1)患者:进行预约、取消预约、修改预约、查询预约。

        (2)一般管理员:查询医院科室表、查询医生信息表、查询患者预约备份表、添加医院科室表、添加医 生信息表、清除所有预约信息。

        (3)超级管理员:查询一般管理员信息表、添加一般管理员、删除一般管理员、修改一般管理员、清空 患者预约备份表。

        (4)系统使用三个触发器,对患者进行预约,取消预约,修改预约的操作进行记录,把预约的相关信息 以及操作时间记录在预约备份表中。

三、连接数据库

        1.使用 Python 连接数据库

  1. # -*- coding: utf-8 -*-
  2. from multiprocessing import connection
  3. from psycopg2 import connect, OperationalError
  4. import os
  5. def CreateConnect():
  6. try:
  7. env = os.environ
  8. params = {
  9. 'database': env.get('OG_DATABASE', 'postgres'), # 数据库名称
  10. 'user': env.get('OG_USER', 'tom'), # 用户姓名
  11. 'password': env.get('OG_PASSWORD', '12345'), # 用户密码
  12. 'host': env.get('OG_HOST', '192.000.00.000'), # 主机IP
  13. 'port': env.get('OG_PORT', 26000) # 端口号
  14. }
  15. conn: connection = connect(**params)
  16. print('数据库连接成功!')
  17. return conn
  18. except OperationalError:
  19. print('数据库连接失败!')
  20. if __name__ == '__main__':
  21. CreateConnect()

        2.使用 Java 连接数据库

  1. import java.sql.*; 
  2. public class GaussDBJDBC {
  3. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  4. //配置信息
  5. //useUnicode=true&characterEncoding=utf-8 解决中文乱码
  6. String url = "jdbc:postgresql://数据库ip地址:26000/school?useUnicode=true&characterEncoding=utf-8";
  7. String username = "数据库用户名";
  8. String password = "数据库密码";
  9. //1.加载驱动
  10. Class.forName("com.mysql.cj.jdbc.Driver");
  11. //2.连接数据库,代表数据库
  12. Connection connection = DriverManager.getConnection(url, username, password);
  13. //3.向数据库发送SQL的对象Statement,PreparedStatement : CRUD
  14. Statement statement = connection.createStatement();
  15. //4.编写SQL
  16. String sql = "select * from student";
  17. //5.执行查询SQL,返回一个 ResultSet : 结果集
  18. ResultSet rs = statement.executeQuery(sql);
  19. while (rs.next()) {
  20. //student表
  21. System.out.print("id:" + rs.getObject("std_id"));
  22. System.out.print(" name:" + rs.getObject("std_name"));
  23. System.out.print(" sex:" + rs.getObject("std_sex"));
  24. System.out.print(" birth:" + rs.getObject("std_birth"));
  25. System.out.print(" in:" + rs.getObject("std_in"));
  26. System.out.println(" address:" + rs.getObject("std_address"));
  27. }
  28. //6.关闭连接,释放资源(一定要做) 先开后关
  29. rs.close();
  30. statement.close();
  31. connection.close();
  32. }
  33. }

 三、源代码

        1、代码总览 

5eab877ecf774205900ac3d8fa3eccae.png

        2.初始化数据(InitializationCode)

        仅运行一次,创建表以及导入一些初始案例数数据,如医院科室信息、医生信息等。

        (1)Initialize_CreateTable.py

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from multiprocessing import connection
  4. from psycopg2 import connect
  5. '''连接数据库'''
  6. def CreateConnect():
  7. try:
  8. env = os.environ
  9. params = {
  10. 'database': env.get('OG_DATABASE', 'postgres'),
  11. 'user': env.get('OG_USER', 'tom'),
  12. 'password': env.get('OG_PASSWORD', 'Huawei_123'),
  13. 'host': env.get('OG_HOST', '192.168.56.130'),
  14. 'port': env.get('OG_PORT', 26000)
  15. }
  16. conn: connection = connect(**params)
  17. return conn
  18. except:
  19. print('数据库连接失败!')
  20. '''创建表'''
  21. # 科系表
  22. def CreateTable_Court(conn):
  23. cursor = conn.cursor()
  24. cursor.execute('''create table if not exists Court(
  25. c_id int not null primary key,
  26. c_name varchar(500)
  27. )''')
  28. conn.commit()
  29. conn.close()
  30. # 医生表
  31. def CreateTable_Doctor(conn):
  32. cursor = conn.cursor()
  33. cursor.execute('''create table if not exists Doctor(
  34. d_id int primary key,
  35. d_name varchar(32) not null,
  36. dp_courtID int,
  37. d_workWeekData varchar(500),
  38. d_workStartTime varchar(500),
  39. d_workEndTime varchar(500),
  40. foreign key(dp_courtID) references Court(c_id) on delete cascade
  41. )''')
  42. conn.commit()
  43. conn.close()
  44. # 患者表
  45. def CreateTable_Patient(conn):
  46. cursor = conn.cursor()
  47. cursor.execute('''create table if not exists Patient(
  48. p_id varchar(32) primary key,
  49. p_name varchar(32) not null
  50. )''')
  51. conn.commit()
  52. conn.close()
  53. # 预约表
  54. def CreateTable_Appointment(conn):
  55. cursor = conn.cursor()
  56. cursor.execute('''create table if not exists Appointment(
  57. p_id varchar(32),
  58. p_name varchar(500),
  59. d_id varchar(32)
  60. )''')
  61. conn.commit()
  62. conn.close()
  63. # 管理员账号密码表
  64. def CreateTable_Administrator(conn):
  65. cursor = conn.cursor()
  66. cursor.execute('''create table if not exists Administrator(
  67. a_id varchar(32),
  68. a_name varchar(500) primary key
  69. )''')
  70. conn.commit()
  71. conn.close()
  72. # 预约表副本
  73. def CreateTable_AppointmentRecord(conn):
  74. cursor = conn.cursor()
  75. cursor.execute('''create table if not exists AppointmentRecord(
  76. p_id varchar(32),
  77. p_name varchar(32),
  78. d_id varchar(32),
  79. date_time date primary key,
  80. type varchar(32)
  81. )''')
  82. conn.commit()
  83. conn.close()
  84. '''创建触发器函数'''
  85. # 创建INSERT触发器函数
  86. def CreateFunction_insertOnAppointmentRecord(conn):
  87. cursor = conn.cursor()
  88. cursor.execute('''CREATE OR REPLACE FUNCTION Record_insert_func ( ) RETURNS TRIGGER AS
  89. $$
  90. DECLARE
  91. BEGIN
  92. INSERT INTO AppointmentRecord(p_id,p_name,d_id,date_time,type)
  93. VALUES (NEW.p_id,NEW.p_name,NEW.d_id,now(),'预约医生');
  94. RETURN NEW;
  95. END
  96. $$
  97. LANGUAGE PLPGSQL''')
  98. conn.commit()
  99. conn.close()
  100. # 创建UPDATE触发器函数
  101. def CreateFunction_updateOnAppointmentRecord(conn):
  102. cursor = conn.cursor()
  103. cursor.execute('''CREATE OR REPLACE FUNCTION Record_update_func ( ) RETURNS TRIGGER AS
  104. $$
  105. DECLARE
  106. BEGIN
  107. INSERT INTO AppointmentRecord(p_id,p_name,d_id,date_time,type)
  108. VALUES (NEW.p_id,NEW.p_name,NEW.d_id,now(),'修改预约');
  109. RETURN NEW;
  110. END
  111. $$
  112. LANGUAGE PLPGSQL''')
  113. conn.commit()
  114. conn.close()
  115. # 创建DELETE触发器函数
  116. def CreateFunction_deleteOnAppointmentRecord(conn):
  117. cursor = conn.cursor()
  118. cursor.execute('''CREATE OR REPLACE FUNCTION Record_delete_func ( ) RETURNS TRIGGER AS
  119. $$
  120. DECLARE
  121. BEGIN
  122. INSERT INTO AppointmentRecord(p_id,p_name,d_id,date_time,type)
  123. VALUES (OLD.p_id,OLD.p_name,OLD.d_id,now(),'取消预约');
  124. RETURN NEW;
  125. END
  126. $$
  127. LANGUAGE PLPGSQL''')
  128. conn.commit()
  129. conn.close()
  130. '''创建触发器'''
  131. # 创建INSERT触发器
  132. def CreateTrigger_insertOnAppointment(conn):
  133. cursor = conn.cursor()
  134. cursor.execute('''DROP TRIGGER IF EXISTS insert_trigger ON Appointment;
  135. CREATE TRIGGER insert_trigger
  136. BEFORE INSERT ON Appointment
  137. FOR EACH ROW
  138. EXECUTE PROCEDURE Record_insert_func()''')
  139. conn.commit()
  140. conn.close()
  141. # 创建UPDATE触发器
  142. def CreateTrigger_updateOnAppointment(conn):
  143. cursor = conn.cursor()
  144. cursor.execute('''DROP TRIGGER IF EXISTS update_trigger ON Appointment;
  145. CREATE TRIGGER update_trigger
  146. AFTER UPDATE ON Appointment
  147. FOR EACH ROW
  148. EXECUTE PROCEDURE Record_update_func()''')
  149. conn.commit()
  150. conn.close()
  151. # 创建DELETE触发器
  152. def CreateTrigger_deleteOnAppointment(conn):
  153. cursor = conn.cursor()
  154. cursor.execute('''DROP TRIGGER IF EXISTS delete_trigger ON Appointment;
  155. CREATE TRIGGER delete_trigger
  156. BEFORE DELETE ON Appointment
  157. FOR EACH ROW
  158. EXECUTE PROCEDURE Record_delete_func()''')
  159. conn.commit()
  160. conn.close()
  161. # 初始化函数
  162. if __name__ == '__main__':
  163. # 创建表
  164. CreateTable_Court(CreateConnect())
  165. CreateTable_Doctor(CreateConnect())
  166. CreateTable_Patient(CreateConnect())
  167. CreateTable_Appointment(CreateConnect())
  168. CreateTable_Administrator(CreateConnect())
  169. CreateTable_AppointmentRecord(CreateConnect())
  170. # 创建触发器函数
  171. CreateFunction_insertOnAppointmentRecord(CreateConnect())
  172. CreateFunction_updateOnAppointmentRecord(CreateConnect())
  173. CreateFunction_deleteOnAppointmentRecord(CreateConnect())
  174. print('[提示] 表以及触发器创建成功!')

        (2)Initialize_InsertData.py

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from multiprocessing import connection
  4. from psycopg2 import connect
  5. '''连接数据库'''
  6. def CreateConnect():
  7. try:
  8. env = os.environ
  9. params = {
  10. 'database': env.get('OG_DATABASE', 'postgres'),
  11. 'user': env.get('OG_USER', 'tom'),
  12. 'password': env.get('OG_PASSWORD', 'Huawei_123'),
  13. 'host': env.get('OG_HOST', '192.168.56.130'),
  14. 'port': env.get('OG_PORT', 26000)
  15. }
  16. conn: connection = connect(**params)
  17. return conn
  18. except:
  19. print('数据库连接失败!')
  20. '''插入数据'''
  21. # 插入管理员信息
  22. def InsertData_Administrator(conn):
  23. cursor = conn.cursor()
  24. cursor.execute('''insert into Administrator(a_id, a_name) values('adm1@1234567', 'adm1')''')
  25. cursor.execute('''insert into Administrator(a_id, a_name) values('adm2@1234567', 'adm2')''')
  26. cursor.execute('''insert into Administrator(a_id, a_name) values('adm3@1234567', 'adm3')''')
  27. cursor.execute('''insert into Administrator(a_id, a_name) values('adm4@1234567', 'adm4')''')
  28. cursor.execute('''insert into Administrator(a_id, a_name) values('adm5@1234567', 'adm5')''')
  29. cursor.execute('''insert into Administrator(a_id, a_name) values('adm6@1234567', 'adm6')''')
  30. conn.commit()
  31. conn.close()
  32. # 插入科室信息
  33. def InsertData_Court(conn):
  34. cursor = conn.cursor()
  35. cursor.execute('''insert into Court(c_id, c_name) values(1, '急诊科')''')
  36. cursor.execute('''insert into Court(c_id, c_name) values(2, '临床专科科')''')
  37. cursor.execute('''insert into Court(c_id, c_name) values(3, '眼科')''')
  38. cursor.execute('''insert into Court(c_id, c_name) values(4, '耳鼻喉科')''')
  39. cursor.execute('''insert into Court(c_id, c_name) values(5, '皮肤科')''')
  40. cursor.execute('''insert into Court(c_id, c_name) values(6, '口腔科')''')
  41. cursor.execute('''insert into Court(c_id, c_name) values(7, '男科')''')
  42. cursor.execute('''insert into Court(c_id, c_name) values(8, '内科')''')
  43. cursor.execute('''insert into Court(c_id, c_name) values(9, '外科')''')
  44. cursor.execute('''insert into Court(c_id, c_name) values(10, '妇产科')''')
  45. cursor.execute('''insert into Court(c_id, c_name) values(11, '儿科')''')
  46. cursor.execute('''insert into Court(c_id, c_name) values(12, '放射科')''')
  47. cursor.execute('''insert into Court(c_id, c_name) values(13, '骨科')''')
  48. conn.commit()
  49. conn.close()
  50. # 插入医生信息
  51. def InsertData_Doctor(conn):
  52. cursor = conn.cursor()
  53. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 1,'张三',1,'星期五','7:30','12:30')''')
  54. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 2,'李四',2,'星期三','8:30','12:30')''')
  55. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 3,'王五',3,'星期四','11:00','19:30')''')
  56. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 4,'孙六',4,'星期五','7:30','11:00')''')
  57. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 5,'单七',5,'星期日','8:00','14:30')''')
  58. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 6,'王平',6,'星期一','7:30','12:20')''')
  59. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 7,'李胜',7,'星期二','9:00','12:00')''')
  60. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 8,'宋江',3,'星期五','11:20','14:15')''')
  61. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 9,'李逵',9,'星期三','3:30','10:30')''')
  62. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 10,'李贵',10,'星期三','7:30','15:30')''')
  63. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 11,'李鬼',11,'星期五','14:30','22:30')''')
  64. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 12,'白璇',1,'星期六','7:30','11:30')''')
  65. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 13,'李白',8,'星期日','5:30','12:30')''')
  66. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 14,'杜甫',4,'星期二','13:30','22:30')''')
  67. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 15,'杨笑',1,'星期四','13:00','20:30')''')
  68. cursor.execute('''insert into Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime) values( 16,'卢浩',1,'星期三','14:30','23:30')''')
  69. conn.commit()
  70. conn.close()
  71. if __name__ == '__main__':
  72. InsertData_Administrator(CreateConnect())
  73. InsertData_Court(CreateConnect())
  74. InsertData_Doctor(CreateConnect())
  75. print('[提示] 案例数据导入成功!')

 

        3.主要代码(FunctionCode)

        程序主要代码,通过表的增删改查等操作,实现医院预约。

        (1) Connector.py

  1. # -*- coding: utf-8 -*-
  2. import os
  3. from multiprocessing import connection
  4. from psycopg2 import connect,OperationalError
  5. '''连接数据库'''
  6. def CreateConnect():
  7. try:
  8. env = os.environ
  9. params = {
  10. 'database': env.get('OG_DATABASE', 'postgres'),
  11. 'user': env.get('OG_USER', 'tom'),
  12. 'password': env.get('OG_PASSWORD', 'Huawei_123'),
  13. 'host': env.get('OG_HOST', '192.168.56.130'),
  14. 'port': env.get('OG_PORT', 26000)
  15. }
  16. conn: connection = connect(**params)
  17. return conn
  18. except OperationalError:
  19. print('数据库连接失败!')

        (2) MainFunc.py

  1. # -*- coding: utf-8 -*-
  2. # 患者操作
  3. import Patient_InsertAppointment
  4. import Patient_CancelAppointment
  5. import Patient_AlterAppointment
  6. import Patient_QueryAppointment
  7. # 一般管理员操作
  8. import GeneralAdministrator_Login
  9. import GeneralAdministrator_InsertTable
  10. import GeneralAdministrator_ClearTable
  11. import GeneralAdministrator_QueryTable
  12. # 超级管理员操作
  13. import SuperAdministrator_Login
  14. import SuperAdministrator_OperateOnTable
  15. # 主菜单
  16. def ChooseOperatorMenu():
  17. while True:
  18. print('\n\n======== 操作菜单 ========')
  19. print('\t\t1 --- 患者')
  20. print('\t\t2 --- 管理员')
  21. print('\t\t3 --- 结束')
  22. print('========================')
  23. flag = int(input('请输入菜单序号:'))
  24. if flag == 1:
  25. Patient_OperateMenu()
  26. break
  27. elif flag == 2:
  28. Administrator_ChooseMenu()
  29. break
  30. elif flag == 3:
  31. break
  32. # 管理员菜单
  33. def Administrator_ChooseMenu():
  34. while True:
  35. print('\n\n======== 操作菜单 ========')
  36. print('\t\t1 --- 一般管理员')
  37. print('\t\t2 --- 超级管理员')
  38. print('\t\t3 --- 结束')
  39. print('========================')
  40. flag = int(input('请输入身份序号:'))
  41. if flag == 1:
  42. GeneralAdministrator_OperateMenu()
  43. break
  44. elif flag == 2:
  45. SuperAdministrator_OperateMenu()
  46. break
  47. elif flag == 3:
  48. break
  49. # 超级管理员菜单
  50. def SuperAdministrator_OperateMenu():
  51. # [唯一账号] SuperAdministrator
  52. # [唯一密码] SuperAdm_123
  53. flag = True
  54. while True:
  55. a = SuperAdministrator_Login.Login()
  56. if a == 'again':
  57. continue
  58. if a == 'allow':
  59. print('[提示]登录成功!')
  60. break
  61. if a == 'over':
  62. flag = False
  63. break
  64. while flag:
  65. print('\n\n========= 操作菜单 =========')
  66. print('\t1 --- 查询 一般管理员信息表')
  67. print('\t2 --- 添加 一般管理员')
  68. print('\t3 --- 删除 一般管理员')
  69. print('\t4 --- 修改 一般管理员')
  70. print('\t5 --- 清空 患者预约备份表')
  71. print('\t6 --- 结束')
  72. print('==========================')
  73. flag = int(input('请输入操作序号:'))
  74. if flag == 1:
  75. SuperAdministrator_OperateOnTable.selectDate_GeneralAdministrator()
  76. elif flag == 2:
  77. SuperAdministrator_OperateOnTable.InsertData_GeneralAdministrator()
  78. elif flag == 3:
  79. SuperAdministrator_OperateOnTable.DeleteData_GeneralAdministrator()
  80. elif flag == 4:
  81. SuperAdministrator_OperateOnTable.UpdateData_GeneralAdministrator()
  82. elif flag == 5:
  83. SuperAdministrator_OperateOnTable.ClearData_AppointmentRecord()
  84. elif flag == 6:
  85. break
  86. # 一般管理员菜单
  87. def GeneralAdministrator_OperateMenu():
  88. # [账号1] adm1
  89. # [密码1] adm1@1234567
  90. flag = True
  91. while True:
  92. a = GeneralAdministrator_Login.Login()
  93. if a == 'again':
  94. continue
  95. if a == 'allow':
  96. print('[提示]登录成功!')
  97. break
  98. if a == 'over':
  99. flag = False
  100. break
  101. while flag:
  102. print('\n\n========= 操作菜单 =========')
  103. print('\t1 --- 查询 医院科室表')
  104. print('\t2 --- 查询 医生信息表')
  105. print('\t3 --- 查询 患者预约备份表')
  106. print('\t4 --- 添加 医院科室表')
  107. print('\t5 --- 添加 医生信息表')
  108. print('\t6 --- 清除 所有预约信息')
  109. print('\t7 --- 结束')
  110. print('==========================')
  111. flag = int(input('请输入操作序号:'))
  112. if flag == 1:
  113. GeneralAdministrator_QueryTable.ShowCourtMenu()
  114. elif flag == 2:
  115. GeneralAdministrator_QueryTable.ShowDoctorMenu()
  116. elif flag == 3:
  117. GeneralAdministrator_QueryTable.ShowAppointmentMenu()
  118. elif flag == 4:
  119. GeneralAdministrator_InsertTable.InsertCourt()
  120. elif flag == 5:
  121. GeneralAdministrator_InsertTable.InsertDoctor()
  122. elif flag == 6:
  123. GeneralAdministrator_ClearTable.ClearData()
  124. elif flag == 7:
  125. break
  126. # 患者菜单
  127. def Patient_OperateMenu():
  128. while True:
  129. print('\n\n========= 操作菜单 =========')
  130. print('\t\t1 --- 开始预约')
  131. print('\t\t2 --- 取消预约')
  132. print('\t\t3 --- 修改预约')
  133. print('\t\t4 --- 查询预约')
  134. print('\t\t5 --- 结束预约')
  135. print('==========================')
  136. flag = int(input('请输入操作序号:'))
  137. if flag == 1:
  138. Patient_InsertAppointment.MainFunc()
  139. elif flag == 2:
  140. Patient_CancelAppointment.MainFunc()
  141. elif flag == 3:
  142. Patient_AlterAppointment.MainFunc()
  143. elif flag == 4:
  144. Patient_QueryAppointment.MainFunc()
  145. elif flag == 5:
  146. break
  147. if __name__ == '__main__':
  148. ChooseOperatorMenu()

        (3) Patient_InsertAppointment.py

  1. # -*- coding: utf-8 -*-
  2. import GeneralAdministrator_QueryTable
  3. import Connector
  4. def MainFunc():
  5. """
  6. 开始预约
  7. :return: 预约患者的预约编号
  8. """
  9. while True:
  10. # 展示科系表
  11. GeneralAdministrator_QueryTable.ShowCourtMenu()
  12. # 输入患者信息
  13. p_name = input('请输入您的姓名:')
  14. p_courtID = int(input('请输入您选择的科室序号:'))
  15. while p_courtID > 11 or p_courtID < 0:
  16. p_courtID = int(input('[提示]输入错误!请重新输入科室序号:'))
  17. # 导入患者信息
  18. p_id = InsertData_Patient(p_name)
  19. # 展示医生信息
  20. DoctorList = Show_AlternativeDoctor(p_courtID)
  21. # 选择医生
  22. d_id = int(input('请输入您选择的医生的序号:'))
  23. while d_id not in DoctorList:
  24. d_id = int(input('[提示]输入错误!请重新输入您选择的医生的序号:'))
  25. # 导入预约表
  26. InsertData_Appointment(p_name, d_id, p_id)
  27. print('[提示]预约成功,您的预约单号为: ' + str(p_id))
  28. p_id += 1
  29. # 判断
  30. if int(input('继续请输入1,退出请输入0:')) == 0:
  31. break
  32. def Show_AlternativeDoctor(p_courtID):
  33. """
  34. 展示可供预约的医生以及上班时间
  35. :param p_courtID: 患者预约的科室号
  36. :return: 展示可供预约医生的列表
  37. """
  38. # 数据库查询
  39. conn = Connector.CreateConnect()
  40. cursor = conn.cursor()
  41. cursor.execute('''select d_id,c_name,d_name, d_workWeekData,d_workStartTime,d_workEndTime
  42. from Doctor,Court
  43. where Court.c_id = Doctor.dp_courtID
  44. and Doctor.dp_courtID = %s'''
  45. % (str(p_courtID)))
  46. Doctor_rows = cursor.fetchall()
  47. conn.commit()
  48. conn.close()
  49. # 展示可供选择的医生以及上班时间
  50. DoctorList = []
  51. print("[提示]您可选择的医生及上班时间如下:")
  52. print('\t\t------- 医生表 -------')
  53. for row in Doctor_rows:
  54. print(row[0], ' 科室:', row[1], ' 姓名:', row[2], ' 时间:', row[3], row[4], '到', row[5])
  55. DoctorList.append(row[0])
  56. print('\t\t----------------------')
  57. return DoctorList
  58. def InsertData_Patient(p_name):
  59. """
  60. 导入患者信息
  61. :param p_name: 患者姓名
  62. :return:
  63. """
  64. sql = '''select MAX(p_id) from Patient'''
  65. conn = Connector.CreateConnect()
  66. cursor = conn.cursor()
  67. cursor.execute(sql)
  68. ID = cursor.fetchone()
  69. if ID == (None,):
  70. p_id = 0
  71. else:
  72. p_id = int(''.join(ID)) + 1
  73. sql = "insert into Patient(p_id,p_name) values(%s,%s)"
  74. cursor.execute(sql, (str(p_id), str(p_name)))
  75. conn.commit()
  76. conn.close()
  77. return p_id
  78. def InsertData_Appointment(p_name, d_id, p_id):
  79. """
  80. 导入患者预约信息
  81. :param p_name: 患者姓名
  82. :param p_id: 患者ID
  83. :param d_id: 医生ID
  84. :return:
  85. """
  86. sql = "insert into Appointment(p_id,p_name,d_id) values(%s,%s,%s)"
  87. conn = Connector.CreateConnect()
  88. cursor = conn.cursor()
  89. cursor.execute(sql, (p_id, str(p_name), str(d_id)))
  90. conn.commit()
  91. conn.close()

        (4) Patient_AlterAppointment.py

  1. # -*- coding: utf-8 -*-
  2. import Connector
  3. import Patient_InsertAppointment
  4. def MainFunc():
  5. """
  6. 修改预约信息
  7. :return:
  8. """
  9. while True:
  10. p_id = str(input('请输入您的预约单号:'))
  11. # 查询患者预约的医生
  12. Judge = Show_ReservedDoctor(p_id)
  13. # 替换医生
  14. if Judge:
  15. d_id = int(input('请选择你希望替换的医生的序号:'))
  16. UpdateData_Appointment(d_id, p_id)
  17. # 操作备份
  18. pass
  19. if int(input('继续请输入1,退出请输入0:')) == 0:
  20. break
  21. def Show_ReservedDoctor(p_id):
  22. """
  23. 展示已经预约的医生
  24. :param p_id:
  25. :return: 布尔型
  26. """
  27. sql = '''select Doctor.d_name
  28. from Doctor,Appointment
  29. where Appointment.d_id = Doctor.d_id
  30. and Appointment.p_id = %s''' % p_id
  31. conn = Connector.CreateConnect()
  32. cursor = conn.cursor()
  33. cursor.execute(sql)
  34. ExistingDoctor_rows = cursor.fetchall()
  35. if not ExistingDoctor_rows:
  36. print('[提示]您不在预约表中!')
  37. conn.commit()
  38. conn.close()
  39. return False
  40. else:
  41. print('[查询结果]您已预约的医生:', ''.join(ExistingDoctor_rows[0]))
  42. sql = '''select Doctor.dp_courtID
  43. from Doctor,Appointment
  44. where Appointment.d_id = Doctor.d_id
  45. and Appointment.p_id = %s''' % p_id
  46. cursor.execute(sql)
  47. DoctorCourtID_rows = cursor.fetchall()
  48. Patient_InsertAppointment.Show_AlternativeDoctor(DoctorCourtID_rows[0][0])
  49. conn.commit()
  50. conn.close()
  51. return True
  52. def UpdateData_Appointment(d_id, p_id):
  53. """
  54. 数据库中修改信息
  55. :param d_id: 医生ID
  56. :param p_id: 患者ID
  57. :return:
  58. """
  59. sql = '''update Appointment
  60. set d_id = %s
  61. where p_id = %s'''
  62. conn = Connector.CreateConnect()
  63. cursor = conn.cursor()
  64. cursor.execute(sql, (str(d_id), str(p_id)))
  65. print("[提示]修改成功!")
  66. conn.commit()
  67. conn.close()

        (5) Patient_CancelAppointment.py

  1. # -*- coding: utf-8 -*-
  2. import Connector
  3. def MainFunc():
  4. while True:
  5. p_id = str(input('请输入您的预约单号:'))
  6. DeleteData_Appointment(p_id)
  7. if int(input('继续请输入1,退出请输入0:')) == 0:
  8. break
  9. def DeleteData_Appointment(p_id):
  10. """
  11. 数据库中取消预约
  12. :param p_id: 患者ID
  13. :return:
  14. """
  15. conn = Connector.CreateConnect()
  16. cursor = conn.cursor()
  17. cursor.execute("select * from Appointment where p_id = '%s'" % p_id)
  18. if not cursor.fetchall():
  19. print('[提示]您不在预约表中!')
  20. else:
  21. cursor.execute("delete from Appointment where p_id = '%s'" % p_id)
  22. cursor.execute("delete from Patient where p_id = '%s' " % p_id)
  23. print('[提示]预约取消成功!')
  24. conn.commit()
  25. conn.close()

        (6) Patient_QueryAppointment.py

  1. # -*- coding: utf-8 -*-
  2. import Connector
  3. def MainFunc():
  4. while True:
  5. p_id = str(input('请输入您的预约单号:'))
  6. sql = '''select Doctor.d_name
  7. from Doctor,Appointment,Patient
  8. where Appointment.d_id = Doctor.d_id
  9. and Patient.p_id = Appointment.p_id
  10. and Patient.p_id = %s''' % p_id
  11. conn = Connector.CreateConnect()
  12. cursor = conn.cursor()
  13. cursor.execute(sql)
  14. ExistingDoctor_rows = cursor.fetchall()
  15. conn.commit()
  16. conn.close()
  17. if not ExistingDoctor_rows:
  18. print('[提示]您不在预约表中!')
  19. return False
  20. else:
  21. print('[查询结果]您已预约的医生: ', ''.join(ExistingDoctor_rows[0]))
  22. if int(input('继续请输入1,退出请输入0:')) == 0:
  23. break

        (7) GeneralAdministrator_Login.py

  1. # -*- coding: utf-8 -*-
  2. import time
  3. import Connector
  4. def Login():
  5. Login_Account = str(input('\t[账号] '))
  6. Login_ID = str(input('\t[密码] '))
  7. Login_Num = int(3)
  8. Login_flag = FindLoginMessage(Login_ID, Login_Account)
  9. while Login_flag is False and Login_Num > 0:
  10. flag = int(input('[提示]输入错误\n[提示]是否继续? 继续请输入1,否则输入0: '))
  11. if flag == 0:
  12. return 'over'
  13. Login_Account = str(input('\t[账号] '))
  14. Login_ID = str(input('\t[密码] '))
  15. Login_flag = FindLoginMessage(Login_ID, Login_Account)
  16. Login_Num = Login_Num - 1
  17. if Login_flag is True:
  18. return 'allow'
  19. if Login_Num == 0:
  20. flag = int(input('[提示]是否继续?继续请输入1,否则输入0:'))
  21. if flag == 0:
  22. return 'over'
  23. else:
  24. Login_Account = str(input('\t[账号] '))
  25. Login_ID = str(input('\t[密码] '))
  26. if FindLoginMessage(Login_ID, Login_Account) is False:
  27. print('[提示]输入错误次数过多,请5分钟后再尝试:')
  28. time.sleep(30)
  29. return 'again'
  30. else:
  31. return 'allow'
  32. def FindLoginMessage(Login_ID, Login_Account):
  33. conn = Connector.CreateConnect()
  34. cursor = conn.cursor()
  35. cursor.execute("select * from Administrator where a_id = %s and a_name = %s", (Login_ID, Login_Account,))
  36. if not cursor.fetchall():
  37. flag = False
  38. else:
  39. flag = True
  40. conn.commit()
  41. conn.close()
  42. return flag

        (8) GeneralAdministrator_InsertTable.py

  1. # -*- coding: utf-8 -*-
  2. import Connector
  3. # 添加 医院科室表
  4. def InsertCourt():
  5. while True:
  6. c_name = str(input('请输入新的科室名称:'))
  7. c_id = getCourtNum()
  8. InsertData_Court(c_id, c_name)
  9. if int(input('继续请输入1,退出请输入0:')) == 0:
  10. break
  11. def getCourtNum():
  12. sql = '''select MAX(c_id) from Court'''
  13. conn = Connector.CreateConnect()
  14. cursor = conn.cursor()
  15. cursor.execute(sql)
  16. ID = cursor.fetchone()
  17. if ID == (None,):
  18. c_id = 0
  19. else:
  20. c_id = ID[0] + 1
  21. conn.commit()
  22. conn.close()
  23. return c_id
  24. def InsertData_Court(c_id, c_name):
  25. sql = '''insert into Court(c_id,c_name) values(%s,%s)'''
  26. conn = Connector.CreateConnect()
  27. cursor = conn.cursor()
  28. cursor.execute(sql, (str(c_id), str(c_name)))
  29. print("\n[提示]修改成功!")
  30. conn.commit()
  31. conn.close()
  32. # 添加 医生信息表
  33. def InsertDoctor():
  34. while True:
  35. d_name = int(input('请输入新的医生姓名:'))
  36. d_id = getDoctorNum()
  37. court_list = getCourtNum()
  38. dp_courtID = int(input('请输入新的医生的科室号:'))
  39. while dp_courtID not in court_list:
  40. dp_courtID = int(input('\n[提示]输入科室号错误,重新输入!'))
  41. d_workWeekData = str(input('请输入新的医生的上班日期:'))
  42. d_workStartTime = str(input('请输入新的医生的开始上班时间:'))
  43. d_workEndTime = str(input('请输入新的医生的结束上班时间:'))
  44. InsertData_Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime)
  45. if int(input('继续请输入1,退出请输入0:')) == 0:
  46. break
  47. def getCourtID():
  48. court_list = []
  49. sql = '''select c_id from Court'''
  50. conn = Connector.CreateConnect()
  51. cursor = conn.cursor()
  52. cursor.execute(sql)
  53. ID = cursor.fetchall()
  54. for row in ID:
  55. court_list.append(row[0])
  56. conn.commit()
  57. conn.close()
  58. return court_list
  59. def getDoctorNum():
  60. sql = '''select MAX(d_id) from Doctor'''
  61. conn = Connector.CreateConnect()
  62. cursor = conn.cursor()
  63. cursor.execute(sql)
  64. ID = cursor.fetchone()
  65. if ID == (None,):
  66. d_id = 0
  67. else:
  68. d_id = int(''.join(ID)) + 1
  69. conn.commit()
  70. conn.close()
  71. return d_id
  72. def InsertData_Doctor(d_id, d_name, dp_courtID, d_workWeekData, d_workStartTime, d_workEndTime):
  73. sql = '''insert into Doctor(d_id,d_name,dp_courtID,d_workWeekData,d_workStartTime,d_workEndTime) values(%s,%s,%s,%s,%s,%s)'''
  74. conn = Connector.CreateConnect()
  75. cursor = conn.cursor()
  76. cursor.execute(sql, (
  77. str(d_id), str(d_name), str(dp_courtID), str(d_workWeekData), str(d_workStartTime), str(d_workEndTime)))
  78. print("[提示]修改成功!")
  79. conn.commit()
  80. conn.close()

        (9) GeneralAdministrator_QueryTable.py

  1. # -*- coding: utf-8 -*-
  2. import Connector
  3. def ShowCourtMenu():
  4. sql = '''select c_name from Court order by c_id asc'''
  5. conn = Connector.CreateConnect()
  6. cursor = conn.cursor()
  7. cursor.execute(sql)
  8. Court_rows = cursor.fetchall()
  9. conn.commit()
  10. conn.close()
  11. print('\t\t------- 科系表 -------')
  12. i = 1
  13. for row in Court_rows:
  14. print('\t\t\t' + str(i) + ' --- ' + ''.join(row))
  15. i += 1
  16. print('\t\t---------------------')
  17. def ShowDoctorMenu():
  18. sql = '''select d_id,c_name,d_name, d_workWeekData,d_workStartTime,d_workEndTime
  19. from Doctor,Court
  20. where Court.c_id = Doctor.dp_courtID
  21. order by d_id asc'''
  22. conn = Connector.CreateConnect()
  23. cursor = conn.cursor()
  24. cursor.execute(sql)
  25. Doctor_rows = cursor.fetchall()
  26. conn.commit()
  27. conn.close()
  28. print('\t\t------- 医生信息表 -------')
  29. for row in Doctor_rows:
  30. print(row[0], ' 科室:', row[1], ' \t姓名:', row[2], '\t时间:', row[3], row[4], '到', row[5])
  31. print('\t\t--------------------------')
  32. def ShowAppointmentMenu():
  33. sql = '''select p_id,p_name,d_id, date_time,type
  34. from AppointmentRecord
  35. order by date_time asc'''
  36. conn = Connector.CreateConnect()
  37. cursor = conn.cursor()
  38. cursor.execute(sql)
  39. Doctor_rows = cursor.fetchall()
  40. conn.commit()
  41. conn.close()
  42. print('\t\t------- 预约记录表 -------')
  43. for row in Doctor_rows:
  44. print('操作类型:', row[4], ' 操作时间:', row[3], ' 患者预约号:', row[0], ' 患者姓名:', row[1], '\t医生编号:', row[2])
  45. print('\t\t--------------------------')

        (10) GeneralAdministrator_ClearTable.py

  1. # -*- coding: utf-8 -*-
  2. import Connector
  3. def ClearData():
  4. """
  5. 清除预约表和患者信息表
  6. :return: 空
  7. """
  8. ClearData_Appointment()
  9. ClearData_Patient()
  10. print('[提示]清除成功!')
  11. def ClearData_Appointment():
  12. """
  13. 清除预约表
  14. :return: 空
  15. """
  16. sql = '''truncate table Appointment'''
  17. conn = Connector.CreateConnect()
  18. cursor = conn.cursor()
  19. cursor.execute(sql)
  20. conn.commit()
  21. conn.close()
  22. def ClearData_Patient():
  23. """
  24. 清除患者信息表
  25. :return: 空
  26. """
  27. sql = '''truncate table Patient'''
  28. conn = Connector.CreateConnect()
  29. cursor = conn.cursor()
  30. cursor.execute(sql)
  31. conn.commit()
  32. conn.close()

        (11) SuperAdministrator_Login.py

  1. # -*- coding: utf-8 -*-
  2. import time
  3. def Login():
  4. Login_Account = str(input('\t[账号] '))
  5. Login_ID = str(input('\t[密码] '))
  6. Login_Num = int(3)
  7. Login_flag = FindLoginMessage(Login_ID, Login_Account)
  8. while Login_flag == False and Login_Num > 0:
  9. flag = int(input('[提示]输入错误\n[提示]是否继续? 继续请输入1,否则输入0: '))
  10. if flag == 0:
  11. return 'over'
  12. Login_Account = str(input('\t[账号] '))
  13. Login_ID = str(input('\t[密码] '))
  14. Login_flag = FindLoginMessage(Login_ID, Login_Account)
  15. Login_Num = Login_Num - 1
  16. if Login_flag:
  17. return 'allow'
  18. if Login_Num == 0:
  19. flag = int(input('[提示]是否继续?继续请输入1,否则输入0:'))
  20. if flag == 0:
  21. return 'over'
  22. else:
  23. Login_Account = str(input('\t[账号] '))
  24. Login_ID = str(input('\t[密码] '))
  25. if not FindLoginMessage(Login_ID, Login_Account):
  26. print('[提示]输入错误次数过多,请5分钟后再尝试:')
  27. time.sleep(30)
  28. return 'again'
  29. else:
  30. return 'allow'
  31. def FindLoginMessage(Login_ID, Login_Account):
  32. if Login_Account != 'SuperAdministrator' and Login_ID != 'SuperAdm_123':
  33. flag = False
  34. else:
  35. flag = True
  36. return flag

        (12) SuperAdministrator_OperateOnTable.py

  1. # -*- coding: utf-8 -*-
  2. import Connector
  3. def selectDate_GeneralAdministrator():
  4. sql = '''select a_id,a_name from Administrator'''
  5. conn = Connector.CreateConnect()
  6. cursor = conn.cursor()
  7. cursor.execute(sql)
  8. Administrator_rows = cursor.fetchall()
  9. conn.commit()
  10. conn.close()
  11. print('\t------- 管理员信息表 -------')
  12. for row in Administrator_rows:
  13. print('账号:', row[1], ' 密码:', row[0])
  14. print('\t--------------------------')
  15. def InsertData_GeneralAdministrator():
  16. Adm_Account = str(input('\t待添加的账号:'))
  17. Adm_ID = str(input('\t待添加的密码:'))
  18. conn = Connector.CreateConnect()
  19. cursor = conn.cursor()
  20. while True:
  21. cursor.execute("select * from Administrator where a_name = '%s' " % Adm_Account)
  22. if not cursor.fetchall():
  23. break
  24. else:
  25. Adm_Account = str(input('[提示]已经存在该账户,请重新输入:'))
  26. sql = '''insert into Administrator(a_id,a_name) values(%s,%s)'''
  27. cursor.execute(sql, (str(Adm_ID), str(Adm_Account)))
  28. print("[提示]添加成功!")
  29. conn.commit()
  30. conn.close()
  31. def UpdateData_GeneralAdministrator():
  32. conn = Connector.CreateConnect()
  33. cursor = conn.cursor()
  34. flag = int(input('修改账户请输入1,修改密码请输入2,否则按任意键退出:'))
  35. if flag == 1:
  36. Adm_OldAccount = str(input('\t旧账号:'))
  37. Adm_NewAccount = str(input('\t新账号:'))
  38. while True:
  39. cursor.execute("select * from Administrator where a_name = '%s' " % Adm_OldAccount)
  40. if not cursor.fetchall():
  41. str(input('[提示]该账户不存在,请重新输入账号:'))
  42. else:
  43. break
  44. sql = '''update Appointment set a_name = %s where a_name = %s'''
  45. cursor.execute(sql, (str(Adm_NewAccount), str(Adm_OldAccount)))
  46. print("[提示]修改成功!")
  47. conn.commit()
  48. conn.close()
  49. elif flag == 2:
  50. Adm_Account = str(input('\t账号:'))
  51. Adm_NewID = str(input('\t新密码:'))
  52. while True:
  53. cursor.execute("select * from Administrator where a_name = '%s' " % Adm_Account)
  54. if not cursor.fetchall():
  55. Adm_Account = str(input('[提示]该账户不存在,请重新输入账号:'))
  56. else:
  57. break
  58. sql = '''update Appointment set a_id = %s where a_name = %s'''
  59. cursor.execute(sql, (str(Adm_NewID), str(Adm_Account)))
  60. print("[提示]修改成功!")
  61. conn.commit()
  62. conn.close()
  63. else:
  64. return False
  65. def DeleteData_GeneralAdministrator():
  66. Adm_Account = str(input('\t待删除的账号:'))
  67. str(input('\t待删除的密码:'))
  68. conn = Connector.CreateConnect()
  69. cursor = conn.cursor()
  70. while True:
  71. cursor.execute("select * from Administrator where a_name = '%s' " % Adm_Account)
  72. if not cursor.fetchall():
  73. Adm_Account = str(input('[提示]该账户不存在,请重新输入账号:'))
  74. else:
  75. break
  76. cursor.execute("delete from Administrator where a_name = '%s'" % Adm_Account)
  77. print('[提示]删除成功!')
  78. conn.commit()
  79. conn.close()
  80. def ClearData_AppointmentRecord():
  81. sql = '''truncate table appointmentrecord'''
  82. conn = Connector.CreateConnect()
  83. cursor = conn.cursor()
  84. cursor.execute(sql)
  85. print('[提示]清理成功!')
  86. conn.commit()
  87. conn.close()

 

四、结果展示

        1、患者预约界面

        预约以及查询

ca4f2def71464265b0845a90ba71b693.png

b9b91f5ac6f1432783e4259b76df52ec.png

       修改

f89f197d7f7d44f1bdf003d29160f0ab.png

34a854cd9d444caf9c299acb9811e45d.png

         取消

16d163ce01cf4e7eb0ea96a4f4ceed5a.png

        2、一般管理员控制界面

 

        登录一般管理员:

6535536f4e1b42278f45a5344813854f.png

02801beed4f640b395ab95cb872cb2e4.png

        查询医院科系:

451cc04eaebf49bdbfd0d9171f3c8359.png

         查询医生信息:

 

 

 

b5bb324ef0a54822a033c951e9de84ca.png

         查询患者预约操作记录表:

f0de93d4fd174bd4914711ed691611ca.png

         添加医院科系:

 

 

 

0f2dc4bc15404339a19d7ec4eb58a865.png

5bf9d941fa964257a2ad55783cda1987.png

        清理所有预约信息(包括预约表以及患者信息表):

 

33bdaac04a5d44df9e60cb7f630d3078.png

 

        3、超级管理员控制界面

                登录超级管理员:

7e803830e09642fe90d7a773e8043923.png

9c195ff547df43fca66f29a2a80a2eb3.png

                  查询 一般管理员信息表:

0bbc6760e237434e8812344dd632f0b6.png

                 添加 一般管理员:

f53b83448fae4f61a5a11a0a468fbfd2.png

7264ad65448246c8a48c575764d20c79.png

                删除 一般管理员: 

752e0d95028a4f28bf4bc95848380ca1.png

0f17de04e86a42218dd8cb35d56e271c.png

                 清空 患者预约备份表:

bb5fc19b4ea94b12bd4a29f26e75218d.png

                结束: 

9a9408445d0f47fb866f5dcd8d4e261f.png

 

五、总结反思

        这次作业通过 python 实现了医院预约的基本操作,但是还存在相当多不合理的地方,比如

        医生上班时间预约的人数没有设置上限;

        医院预约的患者没有设置会诊的时间,导致会诊时间混乱;

        患者、一般管理员、超级管理员的登录应当设置不同的数据库角色,通过 sql 语言实现超级管理员为一般管理员和患者的授权,而不是通过 python 语言实现;

        该作业全部为后端编写,通过控制台实现,没有GUI图形化界面或者HTML网页;

        等。

        因为时间仓促,加上一系列的考试,这次作业实现的并不理想。等到以后学习了前端开发,时间允许,我会再改进作业,以达到更好的效果。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/675958
推荐阅读
相关标签
  

闽ICP备14008679号