QT实现简单的医院管理系统
? ? 現(xiàn)代化的醫(yī)院也應(yīng)該有現(xiàn)代化的管理系統(tǒng)。在科技日益發(fā)達(dá)的今天,人們的身體健康也在不斷受到重視。因此,醫(yī)院進(jìn)行現(xiàn)代化管理就變得尤為重要。
一、系統(tǒng)需求分析
???通過一個醫(yī)院管理系統(tǒng),使醫(yī)院的管理工作系統(tǒng)化、規(guī)范化、自動化,從而達(dá)到提高醫(yī)院管理效率的目的。
1.1 系統(tǒng)功能分析
????醫(yī)院管理系統(tǒng)需要完成功能主要有:
(1)各類信息的輸入。
????(2)員工各種信息的輸入,包括員工基本信息、職稱、崗位等。
????(3)員工各種信息的查詢、修改,包括員工基本信息、職稱、崗位、工資等。
????(4)員工的人事調(diào)動管理。
????(5)病人信息的管理。
????(6)醫(yī)院病床的管理。
????(7)藥劑資源管理。
????(8)儀器資源管理。
????(9)系統(tǒng)用戶管理、權(quán)限管理。
1.2 系統(tǒng)功能模塊設(shè)計(劃分)
????根據(jù)系統(tǒng)功能要求,可以將系統(tǒng)分解成幾個模塊來分別設(shè)計應(yīng)用程序界面,如圖 1 所示。
1.3 系統(tǒng)的關(guān)系
????醫(yī)院管理系統(tǒng)是對醫(yī)院內(nèi)各種信息資源的管理。在本系統(tǒng)中,員工管理、病床管理、病人管理、儀器管理、藥劑管理、部門管理和崗位管理是本系統(tǒng)的集合。各個管理又為系統(tǒng)的小模塊,各個小模塊之前又有著緊密的聯(lián)系,比如員工與部門崗位的聯(lián)系、病人與病床的聯(lián)系、員工與病人的聯(lián)系等等。
二、數(shù)據(jù)庫設(shè)計
2.1 數(shù)據(jù)庫需求分析
????通過對醫(yī)院管理的內(nèi)容和數(shù)據(jù)關(guān)系分析,我們設(shè)計的數(shù)據(jù)項和數(shù)據(jù)結(jié)構(gòu)如下:
????(1)員工基本狀況包括的數(shù)據(jù)項有員工號、員工姓名、性別、所在部門、身 ??份證號、生日、籍貫、國籍、民族、婚姻狀況、健康狀況、參加工作時間、員工 ??狀態(tài)、家庭住址、聯(lián)系電話等。
????(2)員工工資狀況包括的數(shù)據(jù)項有員工號、工資項別、工資金額等。
????(3)?醫(yī)院工作崗位信息包括的數(shù)據(jù)庫項有工作崗位代號、工作崗位名稱等。
????(4)醫(yī)院部門信息包括的數(shù)據(jù)項有部門代號、部門名稱、部門負(fù)責(zé)人等。
????(5)病人信息包括的數(shù)據(jù)項有病人姓名、病人性別、入院時間、病人所屬科室、病人狀況、病人主治醫(yī)生、房問號、病床號等。
????(6)藥劑資源管理信息包括的數(shù)據(jù)項有藥劑代號、藥劑名稱、藥劑價格、藥劑庫存數(shù)量、備注等。
????(7)醫(yī)療儀器管理包括的數(shù)據(jù)項有儀器代號、儀器名稱、儀器價格、儀器數(shù)量、備注等。
????有了上面的數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)項和數(shù)據(jù)關(guān)系,我們就能進(jìn)行下面的數(shù)據(jù)庫設(shè)計。
2.2 數(shù)據(jù)庫概念結(jié)構(gòu)設(shè)計
????本系統(tǒng)根據(jù)上面的設(shè)計規(guī)劃出的實(shí)體有員工實(shí)體、部門實(shí)體、崗位實(shí)體、病人實(shí)體、藥劑實(shí)體、儀器實(shí)體。實(shí)體和實(shí)體之間的關(guān)系 E-R 圖模型如圖 2?所示。
需要注意的是,關(guān)系需要設(shè)置好‘INSERT 和 UPDATE 規(guī)范’。既然提到這,那我們先了解下‘INSERT 和 UPDATE 規(guī)范’的類別:
(1)無操作:?顯示一條錯誤信息,告知用戶不允許執(zhí)行該刪除(更新)操作,DELETE 將被回滾。
(2)級聯(lián)(層疊)?:刪除(更新)包含外鍵關(guān)系中所涉及的數(shù)據(jù)的所有行。
(3)設(shè)置空:如果表的所有外鍵列都可接受空值,則將該值設(shè)置為空。僅適用于 SQL Server 2005。
(4)設(shè)置默認(rèn)值:?如果表的所有外鍵列均已定義默認(rèn)值,則將該值設(shè)置為列定義的默認(rèn)值。僅適用于 SQL Server 2005。
在本關(guān)系圖中,personnel__emp_no和salary__EMP_NO的更新操作和刪除操作都是層疊,因為員工信息的更新和刪除與員工工資的信息密切相關(guān)。而其他的關(guān)系的更新設(shè)置為層疊,刪除設(shè)置為空,例如:一個員工被開除了,那么病人的主治醫(yī)師將設(shè)置為空,如果更新,那么主治醫(yī)生的信息也將更新。
2.3 數(shù)據(jù)庫邏輯結(jié)構(gòu)設(shè)計
????在上面的實(shí)體以及實(shí)體之間關(guān)系的基礎(chǔ)上,我們就可以形成數(shù)據(jù)庫中的表格以及各個表格之間的關(guān)系。醫(yī)院管理系統(tǒng)數(shù)據(jù)庫中各個表格的設(shè)計結(jié)果如下表所示。
說明:
emp_no————員工號(主鍵)
Emp_name———— 員工姓名
emp_dept_id ————所在的部門號
emp_duty ————職務(wù)
emp_xl ————學(xué)歷
emp_gender ————性別
emp_birthday ————生日
emp_hometown ————籍貫
emp_couniry ————國籍
emp_nation ————民族
emp_id ————身份證號
emp_marriage ————婚姻狀況
emp_health ————健康狀況
emp_startwork ————參加工作時間
emp_state ————員工狀態(tài)
emp_homeaddress ————家庭住址
emp_teleno ————聯(lián)系電話
emp_email ————聯(lián)系Email地址
emp_job_id ————工作崗位代號(外鍵)
說明:
Job_id ————工作崗位代號(主鍵)
Job_name ————工作崗位名稱
dept_id ———— 部門代號(外鍵)
說明:
dept_id ————部門代號(主鍵)
dept_name———— 部門名稱
dept_manager————部門主任代號
dept_vicemanager ————部門副主任代號
說明:
patient_name ————病人姓名(主鍵)
patient_gender ————病人性別
patient_date_start ————入院時間
patient_dept ————病人所屬科室
patient_state ————病人狀況
patient_doc ————病人主治醫(yī)生(外鍵)
patient_room———— 病人房間號
patient_bed ————病人病床號(外鍵)
說明:
TMS_USER————用戶名(主鍵)
TMS_PSWD————密碼
TMS_GG————判斷管理員權(quán)限(約束:GG(普通)/HH(高級))
說明:
EMP_NO————員工號(主鍵/外鍵)
SALARY————工資(默認(rèn)值:5000)
說明:
BED ————病床號(主鍵)
STATE ————病床狀態(tài)(約束:free/employ)
需要注意的是,關(guān)系型數(shù)據(jù)庫提供了三類完整性規(guī)則,實(shí)體完整性規(guī)則,參照完整性規(guī)則,用戶自定義完成性規(guī)則:
(1)實(shí)體完整性規(guī)則:實(shí)體完整性規(guī)則是指關(guān)系的主屬性(就是俗稱主鍵的一些字段,主鍵的組成部分)不能為空值。
(2)參照完整性規(guī)則:指如果關(guān)系的外鍵R1和關(guān)系R2的主鍵相符,那么外鍵的每個值必須在關(guān)系R2中主鍵的值中可以找到或者是空值。
(3)用戶自定義的完整性規(guī)則:是指某一具體的實(shí)際數(shù)據(jù)庫的約束條件,由應(yīng)用環(huán)境所決定,反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的要求(比如說一個人的年齡必須要大于零),根據(jù)現(xiàn)實(shí)生活中的一個實(shí)際情況用戶定義的一個用戶自定義完整性。
例如上表中,床位狀態(tài)約束、email地址等等。
2.4 數(shù)據(jù)庫的建立
2.4.1 數(shù)據(jù)庫的建立(表的創(chuàng)建與約束)
2.4.2 初始數(shù)據(jù)的輸入
數(shù)據(jù)庫初始數(shù)據(jù)輸入可以用SQL語句插入也可以直接在可視化表內(nèi)輸入。
添加數(shù)據(jù)到tms表中:
INSERT INTO tms VALUES(‘admin’,’admin’,’GG’)
INSERT INTO tms VALUES(‘S66’,’S66’,’HH’)
添加數(shù)據(jù)到chuang表中:
添加數(shù)據(jù)到job表中:
數(shù)據(jù)添加到dept表中:
其他數(shù)據(jù)可以不初始化,而在軟件直接輸入保存在數(shù)據(jù)庫。
三、各功能模塊的設(shè)計與實(shí)現(xiàn)
3.1 功能說明
(1)各類信息的錄入。
? ? 此功能設(shè)計在菜單欄上,分別有員工信息錄入、病人信息錄入、病床信息錄入、儀器信息錄入、藥劑信息錄入、崗位信息錄入、部門信息錄入。點(diǎn)擊相應(yīng)按鈕進(jìn)入相應(yīng)的信息錄入界面。需要注意的是,一、因為各類數(shù)據(jù)有著密切聯(lián)系的原因,錄入界面的輸入框和選擇框需要進(jìn)行數(shù)據(jù)輸入約束,比如:在錄入病人信息的時候,病床號的信息必須是已經(jīng)存在并且為空閑狀態(tài)的病床。二、在進(jìn)行對數(shù)據(jù)庫的操作的時候,往往需要創(chuàng)建一個事務(wù),比如:錄入員工信息的同時,員工工資的錄入。
(2)員工信息的管理。
? ? 員工信息的錄入已經(jīng)在錄入模塊,那么員工信息的管理界面中,有一個表格視圖用于數(shù)據(jù)顯示,另外有六個按鈕,分別為員工一覽按鈕、條件查詢員工信息按鈕、刪除信息按鈕、員工信息修改按鈕、工資報表按鈕和人事調(diào)動按鈕。
? ? 其中員工一覽按鈕將員工信息顯示在本界面中的表格視圖,而其他的按鈕,點(diǎn)擊之后分別進(jìn)入相應(yīng)的信息管理界面,值得一提的是,工資報表按鈕和人事調(diào)動按鈕點(diǎn)擊之后不能立即進(jìn)入管理界面,需要進(jìn)行權(quán)限認(rèn)證,輸入的管理員帳號和密碼與tms表中的超級管理員數(shù)據(jù)相對應(yīng)才能進(jìn)入管理界面。
? ? 條件查詢員工信息界面,可根據(jù)各字段對應(yīng)的信息進(jìn)行查詢,將查詢結(jié)果顯示于本界面中的表格視圖。
? ? 刪除信息界面,分為鼠標(biāo)單擊單行進(jìn)行刪除和根據(jù)字段信息進(jìn)行批量刪除。
? ? 員工信息修改界面,除了需要權(quán)限才可以訪問的信息之外,其他信息可以在此頁面更改,修改方式是根據(jù)輸入需要修改的記錄與相應(yīng)的字段信息。
? ? ?工資報表界面是需要權(quán)限才能進(jìn)入的,一個表格視圖顯示數(shù)據(jù),兩個按鈕分別是查看報表和打印報表。另外在菜單欄還有一個工資信息修改按鈕,進(jìn)入工資信息修改界面。
? ? 人事調(diào)動界面也是需要權(quán)限才能進(jìn)入的,界面內(nèi)可以對員工的所屬部門、所在崗位、職務(wù)等等信息的修改。
(3)病人信息的管理。
? ? 病人信息管理界面實(shí)現(xiàn)了數(shù)據(jù)的顯示,以及數(shù)據(jù)的刪查改操作。查詢操作分所有病人查詢和條件查詢。修改操作是根據(jù)輸入需要修改的記錄與相應(yīng)的字段信息。刪除操作分為鼠標(biāo)單擊單行進(jìn)行刪除和根據(jù)字段信息進(jìn)行批量刪除。(需要注意的是:刪除操作會影響病床的狀態(tài),變?yōu)閒ree)每次執(zhí)行操作后都會將操作后的信息顯示在表格視圖。
(4)醫(yī)院病床的管理。
病床管理界面實(shí)現(xiàn)了查詢操作,分所有病人查詢和條件查詢。床位信息錄入在菜單欄處。需要注意的是:病床信息錄入的時候,狀態(tài)默認(rèn)值為free狀態(tài),而病人信息錄入的時候,所選的病床號將變?yōu)?/span>?employ狀態(tài),病人信息刪除操作會由?employ狀態(tài)變?yōu)?/span>free狀態(tài)。
(5)儀器資源的管理。
? ? 儀器資源管理界面實(shí)現(xiàn)了數(shù)據(jù)的顯示,以及數(shù)據(jù)的刪查改操作。查詢操作分所有病人查詢和條件查詢。修改操作是根據(jù)輸入需要修改的記錄與相應(yīng)的字段信息。刪除操作分為鼠標(biāo)單擊單行進(jìn)行刪除和根據(jù)字段信息進(jìn)行批量刪除。每次執(zhí)行操作后都會將操作后的信息顯示在表格視圖。
(6)藥劑資源的管理。
? ? 藥劑資源管理界面實(shí)現(xiàn)了數(shù)據(jù)的顯示,以及數(shù)據(jù)的刪查改操作。查詢操作分所有病人查詢和條件查詢。修改操作是根據(jù)輸入需要修改的記錄與相應(yīng)的字段信息。刪除操作分為鼠標(biāo)單擊單行進(jìn)行刪除和根據(jù)字段信息進(jìn)行批量刪除。每次執(zhí)行操作后都會將操作后的信息顯示在表格視圖。
(7)部門崗位信息的查詢。
? ? 部門崗位信息查詢界面只實(shí)現(xiàn)了所有部門信息和所有崗位信息的查詢。
(8)系統(tǒng)用戶管理、權(quán)限管理。
? ? 本系統(tǒng)有兩個管理員,一個是普通管理員,另一個是超級管理員。兩個管理員都可以登錄本系統(tǒng),而且歡迎界面會不同。另外只有超級管理員才有權(quán)限進(jìn)入工資報表界面和人事調(diào)動界面。
3.2 用戶界面設(shè)計(部分)
完成數(shù)據(jù)庫創(chuàng)建和功能說明以后,我們可以進(jìn)行下一步工作, 即設(shè)計用戶界面。本系統(tǒng)的前端制作用的是QT Creator(C++),我們設(shè)計好醫(yī)院管理系統(tǒng)的窗體,如下圖所示。
(1)系統(tǒng)登錄歡迎界面及主界面設(shè)計
(2)員工管理模塊主界面及子頁面
(3)菜單欄模塊及子頁面
3.3 各功能模塊的實(shí)現(xiàn)(部分)
????下面是部分功能的核心代碼,雖說部分,但是對數(shù)據(jù)庫數(shù)據(jù)的增刪查改都已經(jīng)實(shí)現(xiàn)了,而且不同數(shù)據(jù)的很多相同操作都有異曲同工之妙的。遺憾的是還沒學(xué)會使用事務(wù)處理數(shù)據(jù),只能按先后順序操作。
(1)數(shù)據(jù)庫的連接
本系統(tǒng)前端和后端數(shù)據(jù)庫的連接使用的是ODBC數(shù)據(jù)源方式,實(shí)現(xiàn)的代碼如下:
void OpenDatabase() {QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");db.setDatabaseName(QString("DRIVER={SQL SERVER};""SERVER=%1;" //服務(wù)器名稱"DATABASE=%2;"//數(shù)據(jù)庫名).arg("HASEE-PC\\SQLEXPRESS").arg("hospital"));if (!db.open()){QMessageBox::critical(0, qApp->tr("Cannot open database"),db.lastError().databaseText(), QMessageBox::Cancel);} }(2)員工管理模塊設(shè)計
員工一覽:
void MainWindow::on_pushButton_5_clicked() {QSqlQueryModel *model = new QSqlQueryModel;model->setQuery("select * from personnel");//這里直接設(shè)置SQL語句,忽略最后一個參數(shù)ui->tableView_2->setModel(model);//以下是視覺方面的效果,不加也沒影響//隔行變色ui->tableView_2->setAlternatingRowColors(true);//設(shè)置行高int row_count = model->rowCount();for(int i =0; i < row_count; i++){ui->tableView_2->setRowHeight(i, 20);} }工資報表:
void Salary::on_pushButton_clicked() {QSqlQueryModel *model = new QSqlQueryModel;model->setQuery("select * from salary");//這里直接設(shè)置SQL語句,忽略最后一個參數(shù)ui->tableView->setModel(model);//以下是視覺方面的效果,不加也沒影響//隔行變色ui->tableView->setAlternatingRowColors(true);//設(shè)置行高int row_count = model->rowCount();for(int i =0; i < row_count; i++){ui->tableView->setRowHeight(i, 20);} }人事調(diào)動:
void Change::on_pushButton_clicked() {QMessageBox::StandardButton button;button = QMessageBox::question(this, tr("確認(rèn)"),QString(tr("是否修改此信息?")),QMessageBox::Yes | QMessageBox::No);if (button == QMessageBox::No) {this->close(); //忽略退出信號,程序繼續(xù)運(yùn)行}else if (button == QMessageBox::Yes) {QSqlQueryModel *model = new QSqlQueryModel;QString temStr,strSQL="update personnel set ";temStr="emp_dept_id=";strSQL+=temStr;strSQL+=""+this->ui->comboBox_2->currentText()+",";strSQL+="emp_duty=";strSQL+="'"+this->ui->a->text().trimmed()+"',";strSQL+="emp_job_id=";strSQL+=""+this->ui->comboBox_3->currentText()+"";strSQL+=" where emp_no=";strSQL+=""+this->ui->comboBox->currentText()+"";// query.exec(QObject::tr("update potion set id=333 where id=5"));// qDebug()<<strSQL;model->setQuery(strSQL);QMessageBox msgBox;msgBox.setText("修改成功");msgBox.exec();this->close();} }條件查詢員工信息:
void PersonnelCha::on_pushButton_clicked() {QSqlQueryModel *model = new QSqlQueryModel;QString temStr,strSQL="SELECT * FROM personnel where ";temStr=this->ui->comboBox->currentText();strSQL+=temStr+"=";strSQL+="'"+this->ui->a->text()+"'";model->setQuery(strSQL);//這里直接設(shè)置SQL語句,忽略最后一個參數(shù)ui->tableView->setModel(model);//以下是視覺方面的效果,不加也沒影響//隔行變色ui->tableView->setAlternatingRowColors(true);//設(shè)置行高int row_count = model->rowCount();for(int i =0; i < row_count; i++){ui->tableView->setRowHeight(i, 20);} }(3)病人管理模塊設(shè)計
病人信息修改:
void MainWindow::on_pushButton_22_clicked() {// QSqlQuery query;QSqlQueryModel *model = new QSqlQueryModel;QString temStr,strSQL="update patient set ";temStr=this->ui->comboBox_10->currentText();strSQL+=temStr+"=";strSQL+="'"+this->ui->patient_updata->text().trimmed()+"'";strSQL+=" where patient_name=";strSQL+="'"+this->ui->patient_id->text().trimmed()+"'";// query.exec(QObject::tr("update potion set id=333 where id=5"));model->setQuery(strSQL);//這里直接設(shè)置SQL語句,忽略最后一個參數(shù)model->setQuery("select * from patient");//這里直接設(shè)置SQL語句,忽略最后一個參數(shù)ui->tableView->setModel(model);//以下是視覺方面的效果,不加也沒影響//隔行變色ui->tableView->setAlternatingRowColors(true);//設(shè)置行高int row_count = model->rowCount();for(int i =0; i < row_count; i++){ui->tableView->setRowHeight(i, 20);} }(4)病床管理模塊設(shè)計
病床查詢:
void MainWindow::on_pushButton_13_clicked() {QSqlQueryModel *model = new QSqlQueryModel;QString temStr,strSQL="SELECT * FROM chuang where ";temStr=this->ui->comboBox_3->currentText();strSQL+=temStr+"=";strSQL+="'"+this->ui->chuang_cha->text()+"'";model->setQuery(strSQL);//這里直接設(shè)置SQL語句,忽略最后一個參數(shù)ui->tableView_3->setModel(model);//以下是視覺方面的效果,不加也沒影響//隔行變色ui->tableView_3->setAlternatingRowColors(true);//設(shè)置行高int row_count = model->rowCount();for(int i =0; i < row_count; i++){ui->tableView_3->setRowHeight(i, 20);} }項目代碼:GitHub - Killzone-CN/Hospital: 這是一個使用QT編寫的醫(yī)院管理系統(tǒng)。。。。。。。
總結(jié)
以上是生活随笔為你收集整理的QT实现简单的医院管理系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GD32低功耗:深度睡眠唤醒系统时钟变慢
- 下一篇: markdown 希腊字母