前言
- 如果你僅僅是想弄一份職工管理系統的源代碼,不想知道過程是怎樣實現的,那你可以直接拉到這篇文章的最底部找源代碼,注意:這個實現過程涉及了多個頭文件,cpp文件,具體創建的方法見代碼下面的詳解
- 這個實現過程是用C++的類實現的,而且還涉及到了文件的輸入和輸出。
- 這篇文章首先會講解這個職工管理系統能實現的功能,其次會講解過程是怎樣實現的,然後是源代碼,最後就是源代碼的使用說明。
職工管理系統的功能
上面這個圖片就是這個職工管理系統的功能圖,輸入對應的數字就能實現對應的功能。
這個項目的數據是文件進行保存的。保存在 empfile.txt 文件裏 。
這個項目是文件保存輸入輸出的,一旦運行這個程序,首先就會在堆區開闢一個數組,把文件中的數據讀入到這個數組裏面,接下來不論執行哪個功能,都是直接對數組裏面的數據進行操作,比如執行 4 修改職工信息 這個功能,實際上就是修改數組裏對應的信息,等到修改完成,會把修改後的數組保存至文件中(文件中原本的數據就會被覆蓋掉)。
其他的功能也是類似的,只要記住程序一旦運行,在你選擇對應的功能之前,已經完成了開闢數組,並把文件中的數據保存到了數組中,接下來的操作都是對數組進行操作,操作完成之後就是把修改後數組保存到文件中。
這項目中有三類職工,分別是員工,經理,老闆。每個職工都有自己的職工編號m_Id、職工姓名m_Name和部門編號m_DeptId這些屬性。每個職工都有兩個函數,分別是顯示自己的個人信息showInfo()函數和返回自己的崗位名稱getDeptName函數
員工、經理、老闆,這三種都有對應自己的類。這裏利用多態實現的,寫了父類(Worker)。根據這個父類,利用多態定義出了員工類、經理類和老闆類,具體看代碼詳解。
在這個項目中一共有五個cpp文件,分別是employee、manger、boss、workManger和職工管理系統主程序(main函數在這裏)。其中前三個cpp文件分別是員工類、經理類、老闆類的具體實現,workManger是項目中各個功能類的實現(最重要的一個類)。最後一個就是main函數的入口,在這裏執行程序。
最重要的就是workMangerl類,這個類包含三個屬性,
分別是記錄職工人數的m_EmpNum、判斷文件是否爲空的標誌 m_FileIsEmpty 、職工數組指針m_EmpArray。這個指針是一個二級指針,第一指向的是堆區開闢的數組指針,這個數組指針的每一個指針都指向一個職工,假如我們現在有一個員工、一個經理,一個老闆,這就要在堆區開始三個內存空間來存這三組數據(每個職工都有自己的屬性)。上面的數組指針就是指向這個三個內存空間的數據。然後 職工數組指針m_EmpArray 就是指向這個數組指針。這樣通過一個指針就能來維護所有職工的數據。這大概就是多態的優勢所在吧,不然三個類的成員數據進行保存時,要開闢三個數組,每次維護時還要進行分類討論。數據進行保存時,三個數組還都要都進行保存。
代碼的實現過程
WorkManger的構造函數
這個構造函數的作用就是初始化數據用的。如果文件不存在或者文件爲空,就是職工人數賦值爲0,數組指針指向爲空,如果文件中有數據,首先就利用一個 get_EmpNum()函數 來計算出文件中保存的有多少職工(這個函數是自己寫的)
然後根據這個字數的大小,在堆區開闢對應的指針數組,然後又利用了一個 init_Emp() 函數 ,來初始化數組,init_Emp()的實現過程就是根據文件,讀出對應的數據,每次讀一行(一個職工的數據),然後開闢空間存入。再把上面開闢的數組指針指向這個開闢的空間。根據這個構造函數,就實現了將文件中的數據讀入到了數組中,然後剩下的操作都是對數組進行操作。
0 退出管理程序
利用exit(0)就可以正常的退出程序,具體看代碼
1 增加職工信息
- 這個程序一個可以增加多名職工信息
- 計算新空間的大小,這裏採取的方法是開闢新空間,新空間的大小=原空間大小+新增人數。
- 根據新空間大小,來開闢對應的數組指針
- 把原來數組中的數據存入到新數組裏面。
- 輸入要添加的新職工信息
- 存入職工信息(輸入一個,存入一個)
- 釋放原本空間的內存
- 更改新空間的指向,讓 職工數組指針m_EmpArray 指向這段新空間,更改職工人數,文件是否爲空標誌
- 將新數組的數據存入到文件中。
2 顯示職工信息
- 首先判斷文件是否爲空或者文件中是否有數據,如果符合條件就直接輸入文件爲空或者無數據就行,剩下的程序就不用執行了,這樣比較方便快捷,具體原因可以自己想想
- 如果文件中有數據,直接遍歷一遍數組,把數組的每一個元素調用自身的顯示自己的個人信息showInfo()函數。這裏利用的是多態技術,父類指針指向子類的對象。
3 刪除職工信息
- 首先判斷文件是否爲空或者文件中是否有數據,原因和上面一樣
- 如果文件中有數據,根據職工編號進行刪除職工對應的信息
- 輸入想要刪除的職工編號,這裏有一個 IsExist() 函數 這個函數的作用數傳入一個職工編號,可以返回數組中這個職工編號在數組中存在的下標,如果不存在,會返回-1。利用上面這個函數就能求出來要刪除職工編號對應的下標
- 知道下標後,就可以刪除了,這裏採取的方法是覆蓋的方法,比如刪除的是數組中的某一個元素,那麼把這個元素後面的數據都往前移動一個位置,最後再把記錄職工人數的變量減一即可,再把指針指向的最後一個元素的內存空間釋放掉(代碼中好像沒寫這個釋放空間)。
- 最後把修改後的新數組保存到文件中
4 修改職工信息
- 仍舊是根據文件是否爲空的標誌 m_FileIsEmpty 來進行判斷。
- 輸入想要修改職工的編號,根據這個編號,利用IsExist() 函數 找到在數組中對應的下標
- 首先釋放數組中對應下標指向的內存空間。
- 然後開闢一個新空間,把要修改的職工信息存到新空間裏面,再把指針指向這個新的內存空間
- 最後 仍舊是將修改後的數組保存到文件中
5 查找職工信息
- 仍舊是根據文件是否爲空的標誌 m_FileIsEmpty 來進行判斷。
- 這裏查找職工信息有兩種查找方法,分別是根據職工編號進行查詢、根據職工姓名進行查詢
- 如果是根據職工編號進行查詢的話,直接根據這個職工編號,利用IsExist() 函數 求出下標,然後輸出下標對應的信息就可以
- 如果是根據職工姓名進行查詢,這裏可能會發生重名的現象,所以可以直接遍歷數組,如果有名字相同的,直接輸出對應的信息就可以(可能會出書多個人的信息)
6 按照職工編號進行排序
- 仍舊是根據文件是否爲空的標誌 m_FileIsEmpty 來進行判斷。
- 這裏排序有升序和降序兩種方法,這裏排序的方法選擇的是手寫選擇排序,當然排序方法也可以用其他的方法,比如快排。
- 將排序後的數組保存到文件中
- 這裏還調用了一個 show_Emp()函數 可以輸出排序後的數組信息,當然也可以不調用
7 清空所有文檔
- 這裏清空的方法是採取刪除源文件,重新創建一個新的空文件的方法。
- 因爲程序一運行,就會開闢內存空間來存原文件中的數據,所以這裏需要把開闢的內存空間釋放掉
最後再說一點關於WorkManger的析構函數,在這個函數中,我們要把開闢的各種指針都釋放掉,防止內存泄漏
代碼
worker.h的代碼
#pragma once #include<iostream> using namespace std; #include<string> //職工抽象的類 class Worker { public: //顯示個人信息 virtual void showInfo() = 0; //獲取崗位名稱 virtual string getDeptName() = 0; //職工編號 int m_Id; //職工姓名 string m_Name; //部門編號 int m_DeptId; };
employee.h的代碼
//普通員工文件 #pragma once #include<iostream> using namespace std; #include "worker.h" class Employee :public Worker { public: //構造函數 Employee(int id, string name, int did); //顯示個人信息 virtual void showInfo() ; //獲取個人信息 virtual string getDeptName() ; };
manager.h的代碼
#pragma once #include<iostream> using namespace std; #include "worker.h" //經理類 class Manger : public Worker { public: //構造函數 Manger(int id, string name, int did); //顯示個人信息 virtual void showInfo() ; //獲取崗位名稱 virtual string getDeptName() ; };
boss.h的代碼
#pragma once #include<iostream> using namespace std; #include "worker.h" //經理類 class Boss : public Worker { public: //構造函數 Boss(int id, string name, int did); //顯示個人信息 virtual void showInfo(); //獲取崗位名稱 virtual string getDeptName(); };
workManger.h的代碼
#pragma once #include <iostream> using namespace std; #include "worker.h" #include "employee.h" #include "manager.h" #include "boss.h" #include <fstream> #define FILENAME "empfile.txt" class WorkManger { public: WorkManger(); //展示菜單 void Show_Menu(); //退出系統 void ExitSystem(); //記錄職工的人數有 int m_EmpNum; //職工數組指針 Worker** m_EmpArray; //添加職工 void Add_Emp(); //保存文件 void save(); //判斷文件是否爲空的標誌 bool m_FileIsEmpty; //統計文件中的人數 int get_EmpNum(); //初始化員工 void init_Emp(); //顯示職工 void Show_Emp(); //刪除職工,根據職工的編號進行刪除 void Del_Emp(); //判斷職工是否存在。如果存在,返回職工所在數組中的位置,不存在返回-1 int IsExist(int id); //修改職工 void Mod_Emp(); //查找職工 按照姓名查詢或按照編號查詢 void Find_Emp(); //按照職工的編號進行排序 void Sort_Emp(); //清空文件操作 void Clean_File(); ~WorkManger(); };
employee.cpp的代碼
#include "employee.h" //構造函數 Employee::Employee(int id, string name, int did) { this->m_Id = id; this->m_Name = name; this->m_DeptId = did; } //顯示個人信息 void Employee::showInfo() { cout << "職工編號: " << this->m_Id << "\t職工姓名: " << this->m_Name << "\t崗位: " << this->getDeptName() << "\t崗位職責: 完成經理交給的任務" << endl; } //獲取崗位名稱 string Employee::getDeptName() { return string("員工"); }
manager.cpp的代碼
#include "manager.h" //構造函數 Manger::Manger(int id , string name, int did) { this->m_Id = id; this->m_Name = name; this->m_DeptId = did; } //顯示個人信息 void Manger::showInfo() { cout << "職工編號: " << this->m_Id << "\t職工姓名: " << this->m_Name << "\t崗位: " << this->getDeptName() << "\t崗位職責: 完成老闆交給的任務,並下發任務" << endl; } //獲取崗位名稱 string Manger::getDeptName() { return string("經理"); }
boss.cpp的代碼
#include "boss.h" //構造函數 Boss::Boss(int id, string name, int did) { this->m_Id = id; this->m_Name = name; this->m_DeptId = did; } //顯示個人信息 void Boss::showInfo() { cout << "職工編號: " << this->m_Id << "\t職工姓名: " << this->m_Name << "\t崗位: " << this->getDeptName() << "\t崗位職責: 管理公司所有事務" << endl; } //獲取崗位名稱 string Boss::getDeptName() { return string("老闆"); }
workManger.cpp的代碼
#include "workManger.h" WorkManger::WorkManger() { ifstream ifs; //1、文件不存在 ifs.open(FILENAME, ios::in); //讀文件 if (!ifs.is_open()) { //cout << "文件不存在" << endl; //初始化屬性 //初始化記錄人數 this->m_EmpNum = 0; //初始化數組指針爲空 this->m_EmpArray = NULL; this->m_FileIsEmpty = true; ifs.close(); return; } //2、文件存在,但是數據爲空 char ch; ifs >> ch; if (ifs.eof()) { //文件爲空 //cout << "文件爲空" << endl; //初始化記錄人數 this->m_EmpNum = 0; //初始化數組指針爲空 this->m_EmpArray = NULL; this->m_FileIsEmpty = true; ifs.close(); return; } //3、文件,並且記錄數據 int num = this->get_EmpNum(); //cout << "職工人數爲:" << num << endl; this->m_EmpNum = num; //開闢空間 this->m_EmpArray = new Worker * [this->m_EmpNum]; //將文件中的數據存到數組中 this->init_Emp(); //測試代碼 /*for (int i = 0; i < this->m_EmpNum; i++) { cout << "職工編號: " << this->m_EmpArray[i]->m_Id << "姓名: " << this->m_EmpArray[i]->m_Name << "部門編號: " << this->m_EmpArray[i]->m_DeptId << endl; }*/ } //展示菜單 void WorkManger::Show_Menu() { cout << "************************************" << endl; cout << "****** 歡迎使用職工管理系統! *******" << endl; cout << "********** 0 退出管理程序 **********" << endl; cout << "********** 1 增加職工信息 **********" << endl; cout << "********** 2 顯示職工信息 **********" << endl; cout << "********** 3 刪除離職員工 **********" << endl; cout << "********** 4 修改職工信息 **********" << endl; cout << "********** 5 查找職工信息 **********" << endl; cout << "********** 6 按照編號排序 **********" << endl; cout << "********** 7 清空所有文檔 **********" << endl; cout << "************************************" << endl; cout << endl; } //退出系統 void WorkManger::ExitSystem() { cout << "歡迎下次使用" << endl; system("pause"); exit(0); } //添加職工 void WorkManger::Add_Emp() { cout << "請輸入添加職工的數量: " << endl; int addNum = 0; cin >> addNum; if (addNum > 0) { //添加 //計算添加新空間大小 int newSize = this->m_EmpNum + addNum; //新空間人數=原來人數+新增人數 //開闢新空間 Worker** newSpace = new Worker*[newSize]; //將原來空間下的數據,拷貝到新空間下 if (this->m_EmpArray != NULL) { for (int i = 0; i < this->m_EmpNum; i++) { newSpace[i] = this->m_EmpArray[i]; } } //添加新數據 for (int i = 0; i < addNum; i++) { int id; //職工編號 string name; //職工姓名 int dSelect; //部門選擇 cout << "請輸入第" << i + 1 << "個新職工編號: " << endl; cin >> id; cout << "請輸入第" << i + 1 << "個新職工姓名: " << endl; cin >> name; cout << "請選擇該職工的崗位" << endl; cout << "1、普通職工" << endl; cout << "2、經理" << endl; cout << "3、老闆" << endl; cin >> dSelect; Worker* worker = NULL; switch (dSelect) { case 1: worker = new Employee(id, name, 1); break; case 2: worker = new Manger(id, name, 2); break; case 3: worker = new Boss(id, name, 3); break; default: break; } //將創建的職工職責,保存到數組中 newSpace[this->m_EmpNum + i] = worker; } //釋放原有的空間 delete[] this->m_EmpArray; //更改新空間的指向 this->m_EmpArray = newSpace; //更新新的職工人數 this->m_EmpNum = newSize; //更新職工不爲空標記 this->m_FileIsEmpty = false; //提示添加成功 cout << "成功添加" << addNum <<"名新職工"<< endl; //保存數據到文件中 this->save(); } else { cout << "輸入數據有誤" << endl; } //按任意鍵後 清屏回到上級目錄 system("pause"); system("cls"); } //保存文件 這個保存文件是從文件頭開始保存的, //文件中的數據一開始已經存入到數組中了,這時候文件中的數據 已經沒用了, //保存文件時直接把原來文件中的數據覆蓋了 void WorkManger::save() { ofstream ofs; ofs.open(FILENAME, ios::out); //用輸出的方式打開文件 ----寫文件 //將每個人數據寫入到文件中去 for (int i = 0; i < this->m_EmpNum; i++) { ofs << this->m_EmpArray[i]->m_Id << " " << this->m_EmpArray[i]->m_Name << " " << this->m_EmpArray[i]->m_DeptId << endl; } ofs.close(); } //統計文件中的人數 int WorkManger::get_EmpNum() { ifstream ifs; ifs.open(FILENAME, ios::in); //讀文件 int id; string name; int dId; int num = 0; while (ifs >> id && ifs >> name && ifs >> dId) { //統計人數變量 num++; } return num; } //初始化員工 void WorkManger::init_Emp() { ifstream ifs; ifs.open(FILENAME, ios::in); int id; string name; int dId; int index = 0; while (ifs >> id && ifs >> name && ifs >> dId) { Worker* worker = NULL; if (dId == 1) //普通職工 { worker = new Employee(id, name, dId); } if (dId == 2) //經理 { worker = new Manger(id, name, dId); } if (dId == 3) //老闆 { worker = new Boss(id, name, dId); } this->m_EmpArray[index] = worker; index++; } //關閉文件 ifs.close(); } //顯示職工 void WorkManger::Show_Emp() { //判斷文件是否爲空 if (this->m_FileIsEmpty) { cout << "文件不存在或者記錄爲空!" << endl; } else { for (int i = 0; i < m_EmpNum; i++) { //利用多態調用程序接口 this->m_EmpArray[i]->showInfo(); } } //按任意鍵後清屏 system("pause"); system("cls"); } //刪除職工,根據職工的編號進行刪除 void WorkManger::Del_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或記錄爲空!" << endl; } else { //按照職工編號進行刪除 cout << "請輸入想要刪除職工編號: " << endl; int id = 0; cin >> id; int index = this->IsExist(id); if (index != -1) { for (int i = index; i < this->m_EmpNum-1; i++) //如果是刪除的最後一個元素,就不用移動數據,直接把數組人數-1即可 { //數據前移 this->m_EmpArray[i] = this->m_EmpArray[i + 1]; } this->m_EmpNum--;//更新數組中數組人數的 //數據同步更新到文件中 this->save(); cout << "刪除成功!" << endl; } else { cout << "刪除失敗,未找到該職工!" << endl; } } //按任意鍵後清屏 system("pause"); system("cls"); } //判斷職工是否存在。如果存在,返回職工所在數組中的位置,不存在返回-1 int WorkManger::IsExist(int id) { int index = -1; for (int i = 0; i < this->m_EmpNum; i++) { if (this->m_EmpArray[i]->m_Id == id) { //找到職工 index = i; break; } } return index; } //修改職工 void WorkManger::Mod_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或者記錄爲空!" << endl; } else { cout << "請輸入修改職工的編號" << endl; int id; cin >> id; int ret = this->IsExist(id); if (ret != -1) { //查找到編號的職工 delete this->m_EmpArray[ret]; int newId=0; string newName; int dSelect = 0; cout << "查找: " << id << "號職工,輸入新職工號: " << endl; cin >> newId; cout << "請輸入新姓名: " << endl; cin >> newName; cout << "請輸入崗位: " << endl; cout << "1、普通職工" << endl; cout << "2、經理" << endl; cout << "3、老闆" << endl; cin >> dSelect; Worker * worker = NULL; switch (dSelect) { case 1: worker = new Employee(newId, newName, dSelect); break; case 2: worker = new Manger(newId, newName, dSelect); break; case 3: worker = new Boss(newId, newName, dSelect); break; default : break; } //更新數據到數組中 this->m_EmpArray[ret] = worker; cout << "修改成功!" << endl; //保存到文件中 this->save(); } else { cout << "修改失敗,查無此人!" << endl; } } //按任意鍵清屏 system("pause"); system("cls"); } //查找職工 按照姓名查詢或按照編號查詢 void WorkManger::Find_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或者記錄爲空!" << endl; } else { cout << "請輸入查找的方式: " << endl; cout << "1、按照職工編號查找: " << endl; cout << "2、按照職工姓名查詢: " << endl; int select = 0; cin >> select; if (select == 1) { //按照編號查 int id; cout << "請輸入查找的職工編號: " << endl; cin >> id; int ret = IsExist(id); if (ret != -1) { //找到職工 cout << "查找成功!該職工的信息如下: " << endl; this->m_EmpArray[ret]->showInfo(); } else { cout << "查找失敗!查無此人" << endl; } } else if (select == 2) { //按照姓名查詢 string name; cout << "請輸入查找的姓名: " << endl; cin >> name; //假如一個判斷是否查到的標誌 bool flag = false;//默認未找到職工 for (int i = 0; i < m_EmpNum; i++) { if (this->m_EmpArray[i]->m_Name == name) { cout << "查找成功,職工編號爲: " << this->m_EmpArray[i]->m_Id << "號職工信息如下" << endl; flag = true; //調用顯示信息的接口 this->m_EmpArray[i]->showInfo(); } } if (flag == false) { cout << "查找失敗!查無此人" << endl; } } else { cout << "輸入選項有誤,請重新輸入!" << endl; } } //按任意鍵清屏 system("pause"); system("cls"); } //按照職工的編號進行排序 void WorkManger::Sort_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或記錄爲空!" << endl; //按任意鍵清屏 system("pause"); system("cls"); } else { cout << "請選擇排序的方式: " << endl; cout << "1、按照職工號進行升序" << endl; cout << "2、按照職工號進行降序" << endl; int select = 0; cin >> select; for (int i = 0; i < m_EmpNum; i++) { int minOrmax = i;//聲明最小值 或 最大值的下標 for (int j = i + 1; j < this->m_EmpNum; j++) { if (select == 1)//升序 { if ((this->m_EmpArray[minOrmax]->m_Id) > (this->m_EmpArray[j]->m_Id)) { minOrmax = j; } } else //降序 { if((this->m_EmpArray[minOrmax]->m_Id) < (this->m_EmpArray[j]->m_Id)) { minOrmax = j; } } //判斷一開始認定 最大值或最小值,是不是計算的最大值或最小值,如果不是交換數據 Worker* temp = this->m_EmpArray[i]; this->m_EmpArray[i] = this->m_EmpArray[minOrmax]; this->m_EmpArray[minOrmax] = temp; } } cout << "排序成功!排序後的結果爲: " << endl; this->save();//把排序後的結果保存到文件中 this->Show_Emp();//展示所有職工 } } //清空文件操作 void WorkManger::Clean_File() { cout << "確定清空? " << endl; cout << "1、確定" << endl; cout << "2、返回" << endl; int select = 0; cin >> select; if (select == 1) { //清空文件 ofstream ofs(FILENAME, ios::trunc);//刪除文件,重新創建一個新的空文件 ofs.close(); if (this->m_EmpArray != NULL) { //刪除堆區的每個職工給對象 for (int i = 0; i < this->m_EmpNum; i++) { delete this->m_EmpArray[i]; this->m_EmpArray[i] = NULL; } //刪除堆區數組指針 delete[] this->m_EmpArray; this->m_EmpArray = NULL; this->m_EmpNum = 0; this->m_FileIsEmpty = true; } cout << "清空成功" << endl; } //按任意鍵清屏 system("pause"); system("cls"); } WorkManger::~WorkManger() { if (this->m_EmpArray != NULL) { for (int i = 0; i < this->m_EmpNum; i++) { if (this->m_EmpArray[i] != NULL ) { delete this->m_EmpArray[i]; } } delete[] this->m_EmpArray; this->m_EmpArray = NULL; } }
職工管理系統.cpp的代碼
#include<iostream> #include "workManger.h" using namespace std; //#include "worker.h" //#include "employee.h" //#include "manager.h" //#include "Boss.h" int main() { WorkManger wm; int choice = 0; while (true) { //調用菜單函數 wm.Show_Menu(); cout << "請輸入你的選擇: " << endl; cin >> choice;//接受用戶的選項 switch (choice) { case 0: //退出系統 wm.ExitSystem(); break; case 1: //增加職工 wm.Add_Emp(); break; case 2: //顯示職工 wm.Show_Emp(); break; case 3: //刪除職工 wm.Del_Emp(); break; case 4: //修改職工、 wm.Mod_Emp(); break; case 5: //查找職工 wm.Find_Emp(); break; case 6: //排序職工 wm.Sort_Emp(); break; case 7: //清空文檔 wm.Clean_File(); break; default: break; } } system("pause"); return 0; }
代碼使用說明:
- 我用的是VS2019寫的,如果要使用源代碼,你可以去VS裏面創一個新的項目,名字可以命名爲職工管理系統
- 然後就就創建一些頭文件和cpp文件,這些文件的名稱如下圖
注意這文件名的大小寫,以及字母的拼寫不要錯誤,我裏面的manager有的好像拼寫有些問題,不過你跟着我圖片裏的命名就可以保證你的正常運行,創建好之後,把上面對應的源代碼複製到對應的文件中去。然後點擊運行就可以。
- 根據圖片創建對應的文件
- 把上面的源代碼填入到對應的文件中去
如果上面的步驟嫌麻煩,可以直接去下載我上傳的資源,裏面有這個職工管理系統的壓縮包,打開就可以直接運行。
如果代碼和命名都沒有錯誤,但是還無法運行,那就可以在評論出說出你的問題,我會及時回覆的!!!