Java Web 開發進階案例之人事管理系統的完整實作
本系統的主要任務是實作人事管理系統的系統化和自動化管理, 主要包括招聘入 職、到期離職和員工調動資訊管理等功能。具體完成的功能如下: 員工資訊管理:員工資訊查詢、員工入職登記,員工資訊更改、删除等 員工調動管理:員工調動登記、員工調動記錄查詢,員工調動資訊更改、删除等 銀行賬戶管理: 公司銀行賬戶管理:公司銀行賬戶登記和公司銀行賬戶資訊更改。 員工銀行賬戶管理:員工銀行賬戶登記、員工銀行賬戶更改和删除等 公司資訊管理: 職位類别管理:職位類别添加、職位類别資訊更改、删除等 部門資訊管理:部門類别添加、部門資訊更改、删除等 系統管理: 登入密碼修改子產品 管理者管理子產品:管理者添加、管理者資訊更改和管理者删除等 系統幫助:關于使用該系統的一些幫助文檔資訊。 MyEclipse 8.5 +java+jsp + servlet+ javabeans + tomcat
技術:Java+ jsp + servlet+ javabeans +sql+tomcat
概述
本系統的主要任務是實作人事管理系統的系統化和自動化管理, 主要包括招聘入 職、到期離職和員工調動資訊管理等功能。具體完成的功能如下: 員工資訊管理:員工資訊查詢、員工入職登記,員工資訊更改、删除等 員工調動管理:員工調動登記、員工調動記錄查詢,員工調動資訊更改、删除等 銀行賬戶管理: 公司銀行賬戶管理:公司銀行賬戶登記和公司銀行賬戶資訊更改。 員工銀行賬戶管理:員工銀行賬戶登記、員工銀行賬戶更改和删除等 公司資訊管理: 職位類别管理:職位類别添加、職位類别資訊更改、删除等 部門資訊管理:部門類别添加、部門資訊更改、删除等 系統管理: 登入密碼修改子產品 管理者管理子產品:管理者添加、管理者資訊更改和管理者删除等 系統幫助:關于使用該系統的一些幫助文檔資訊。 MyEclipse 8.5 +java+jsp + servlet+ javabeans + tomcat
詳細
代碼下載下傳:http://www.demodashi.com/demo/14725.html
一、概述
本系統的主要任務是實作人事管理系統的系統化和自動化管理, 主要包括招聘入
職、到期離職和員工調動資訊管理等功能。具體完成的功能如下:
員工資訊管理:員工資訊查詢、員工入職登記,員工資訊更改、删除等
員工調動管理:員工調動登記、員工調動記錄查詢,員工調動資訊更改、删除等
銀行賬戶管理:
公司銀行賬戶管理:公司銀行賬戶登記和公司銀行賬戶資訊更改。
員工銀行賬戶管理:員工銀行賬戶登記、員工銀行賬戶更改和删除等
公司資訊管理:
職位類别管理:職位類别添加、職位類别資訊更改、删除等
部門資訊管理:部門類别添加、部門資訊更改、删除等
系統管理:
登入密碼修改子產品
管理者管理子產品:管理者添加、管理者資訊更改和管理者删除等
系統幫助:關于使用該系統的一些幫助文檔資訊。
二、 開發平台與環境
本系統是 基于 B/S 平台的系統,利用 jsp + servlet+ javabeans 技術,基于 MVC 三層模式,
開發工具使用 MyEclipse 8.5 內建開發環境,資料庫管理工具 SQL Server 2005 等。
三、系統的分析、設計與實作
1 系統分析:
(1) 角色分析:由于該系統屬于典型的 MIS 管理系統,系統主要使用對象是管理者,分
為兩類普通管理者和系統管理者;普通管理者隻具有一般的檢視、查詢和檢索權限;
系統管理者除了普通管理者所具有的權限外,還有進階權限:對所有資訊做出更改,
删除等權限功能。
(2) 用例分析:根據用例分析所得到如下系統用例圖:
2 系統設計:
2.1 資料庫設計:
根據系統的分析與設計,如下設計資料庫的資料表和資料結構:
2.1.1 邏輯表設計:
管理者表: id,登入名,登入密碼,管理者類型号
管理者類型表: id,管理者類型号,管理者類型
員工基本資訊表: id,員工編号,姓名,性别,出生日期,職位,部門,工資,入職時
間,身份證号
職位類别表: id,崗位編号,崗位名稱,崗位工資
部門資訊表: id,部門編号,部門名稱,部門職能,部門上司
職位設定表: id,部門編号,崗位編号)
員工調動表: id,職工編号,原職位,調任職位,原部門編号,調任部門編号,性質,備
注
公司基本資訊表: id,公司名稱,公司性質,法人代表,公司位址,電話,郵箱:
公司銀行賬戶表: id,銀行賬号,銀行賬戶類型,開戶行,備注:
員工銀行賬戶表: id,員工編号,銀行賬号,銀行賬戶,開戶行,備注:
2.1.2 資料字典設計:
資料字典:
管理者表(admins)
字段 | 類型 | 備注 |
id | Int | 主鍵,自增 |
aName | Nvarchar(20) | 管理者登入名 |
aPwd | Nvarchar(20) | 管理者登陸密碼 |
aTypeId | Int | 管理者類型号 |
管理者類型表(admintype)
字段 | 類型 | 備注 |
id | Int | 主鍵,自增 |
aTypeId | Nvarchar(20) | 管理者類型 |
aTypeName | Nvarchar(20) | 管理者類型名稱 |
員工基本資訊表(staff)
字段 | 類型 | 備注 |
id | Int | 主鍵,自增 |
sId | Nvarchar(14) | 員工編号 |
sName | Nvarchar(20) | 員工姓名 |
sSex | Nvarchar(2) | 員工性别 |
sBirthday | Datetime | 出生日期 |
sPost | Nvarchar(20) | 職位,崗位 |
sDepartment | Nvarchar(20) | 部門 |
sSalary | Int | 工資 |
sEntry | Datetime | 入職時間 |
sIdentityId | Nvarchar(20) | 身份證号 |
職位類别表(postcategory)
字段 | 類型 | 備注 |
id | Int | 主鍵,自增 |
pId | Nvarchar(20) | 職位編号 |
pName | Nvarchar(20) | 職位名稱 |
pSalary | int | 職位工資 |
部門資訊表(department)
字段 | 類型 | 備注 |
id | Int | 主鍵,自增 |
dId | Nvarchar(20) | 部門編号 |
dName | Nvarchar(20) | 部門名稱 |
dFunction | Text | 部門職能 |
dLeader | Nvarchar(20) | 部門上司(經理) |
職位設定表(postsetting)
字段 | 類型 | 備注 |
id | Int | 主鍵,自增 |
pId | Nvarchar(20) | 職位編号 |
dId | Nvarchar(20) | 部門編号 |
員工調動表(staffchange)
字段 | 類型 | 備注 |
id | Int | 主鍵,自增 |
sId | Nvarchar(10) | 員工編号 |
pIdOld | Nvarchar(20) | 原職位編号 |
pIdNew | Nvarchar(20) | 調任職位編号 |
dIdOld | Nvarchar(20) | 原部門編号 |
dIdNew | Nvarchar(20) | 調任部門編号 |
sNature | Nvarchar(20) | 性質(長期或短期) |
sRemark | Text | 備注 |
公司基本資訊表(company)
字段 | 類型 | 備注 |
id | Int | 主鍵 |
cName | Nvarchar(50) | 公司名稱 |
cNature | Nvarchar(20) | 公司性質 |
cLegalPerson | Nvarchar(20) | 法人代表 |
cAddress | Nvarchar(100) | 公司位址 |
cTel | Nvarchar(20) | 電話 |
cEmail | Nvarchar(40) | 郵箱 |
公司銀行賬戶表(companybank)
字段 | 類型 | 備注 |
id | Int | 主鍵 |
bId | Nvarchar(30) | 銀行賬号 |
cBankType | Nvarchar(20) | 銀行賬戶類型 |
cBankName | Nvarchar(60) | 開戶行 |
cRemark | Text | 備注 |
員工銀行賬戶表(staffbank)
字段 | 類型 | 備注 |
id | Int | 主鍵,自增 |
sId | Nvarchar(20) | 員工編号 |
bId | Nvarchar(30) | 銀行賬号 |
cBankType | Nvarchar(20) | 銀行賬戶類型 |
cBankName | Nvarchar(60) | 開戶行 |
cRemark | Text | 備注 |
2.2 系統設計思想
(1)系統界面設計
由于該系統是個典型的 MIS 管理系統,本系統采用架構頁面設計模式。常用
的頭部和尾巴設計成單獨子產品,提高開發效率,提高子產品重用性,友善系統更新。
(2)系統架構模式
本系統采用的是基于 Web 的 Java EE MVC 三層架構模式。
三層架構模式的原理圖如下:
而将 MVC 三層模式應用于 Java EE 中,就是基于 JSP+Servlet+javabeans,其中, JSP 是視圖,
servlet 是控制器,而 javabeans 則是模型。原理圖如下:
3 系統實作:
(1)公用子產品:
Commons Dbutils jar 包:該包是 apache 開發的一個用來常用操作的工具包。
位元組編碼過濾功能:該子產品是使用過濾器技術對所有 servlet 編碼設定進行過濾,主要用來解
決 jsp 中漢字問題。核心代碼如下:
public class CharacterEncodingFilter implements Filter {
private FilterConfig config ;
private String encoding="ISO-8859-1";
public void destroy() {
// TODO Auto-generated method stub
config = null;
}
public void doFilter(ServletRequest request, ServletResponse
response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
this.config = config;
String s = config.getInitParameter("encoding");
if(s!=null){
encoding = s;
}
}
}
Tomcat 資料庫連接配接池技術:本系統采用 tomcat 資料池技術,便于資料庫的配置和通路。 具
體配置是在 tomcat 安裝目錄下的 conf 檔案下的 context.xml 檔案中添加如下代碼:
<Resource name="jdbc/permanageds"
auth="Container"
type="javax.sql.DataSource"
maxActive = "100"
maxIdle="30"
maxWait="10000"
username="sa"
password="caizhiming"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;DatabaseName=permanage"
/>
SQL 資料庫操作工具類:該類主要用來處理與資料庫相關的操作,核心代碼如下:
public class SqlDbUtil {
private String dataSourceName;
private DataSource ds;
public SqlDbUtil() {
// TODO Auto-generated constructor stub
}
public SqlDbUtil(String dataSourceName){
this.dataSourceName = dataSourceName;
}
public void setDataSourceName(String dataSourceName) {
this.dataSourceName = dataSourceName;
}
public void setDs(DataSource ds) {
this.ds = ds;
}
//初始化資料源
public void init(){
try {
Context initContext = new InitialContext();
this.ds = (DataSource)initContext.lookup(dataSourceName);
initContext.close();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//更新資料庫語句,結果傳回int類型
public int update(String sql,String[] params){
QueryRunner qr = new QueryRunner(ds);
int result = 0;
try {
if(params!=null)
result = qr.update(sql, params);
else {
result = qr.update(sql);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
//更新資料庫語句,結果傳回為Object類型,建立javabeans類型時用
public Object query(String sql,String[] params,ResultSetHandler
rsh){
QueryRunner qr = new QueryRunner(ds);
Object results = null;
try {
results=qr.query(sql, params, rsh);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return results;
}
}
字元串工具類: 該類主要用類處理一些字元串相關操作等所用到的工具方法,相關核心代碼
如下:
public class StringUtil {
//驗證字元串是否為空
public static boolean validateNull(String s){
if(s==null || s.length()==0)
return true;
else {
return false;
}
}
//改變空字元串
public static String changeNull(String source,String target){
if(source==null || source.length()==0 ||
source.equalsIgnoreCase("null"))
return target;
else {
return source;
}
}
//過濾 html标記符
public static String filterHtml(String s){
if(s==null)
return null;
if(s.length()==0)
return s;
s.replaceAll("&", "&");
s.replaceAll("<", "<");
s.replaceAll(">", ">");
s.replaceAll(" ", " ");
s.replaceAll("\'", "\';");
s.replaceAll("\"", """);
s.replaceAll("\n", "<br/>");
return s;
}
}
(2) 系統登入子產品實作: 該子產品是系統的使用入口,通過該入口進入系統。 登入驗證采用
Session 驗證機制。
核心代碼如下:
String path =request.getContextPath();
request.setCharacterEncoding("utf-8");
int typeId = 1;
String name = request.getParameter("name").trim();
String pwd = request.getParameter("pwd");
String type = request.getParameter("type");
if(type.equalsIgnoreCase("普通管理者"))
typeId = 0;
String strCmd ="select * from admins where aName=\'"+name+"\' and
aPwd=\'"+pwd+"\' and aTypeId=\'"+typeId+"\' ";
SqlDbUtil dbUtil = new
SqlDbUtil("java:/comp/env/jdbc/permanageds");
dbUtil.init();
List list = (List)dbUtil.query(strCmd, null, new
BeanListHandler(Admins.class));
if(list.size()!=0){
HttpSession session = request.getSession();
Admins ad = (Admins)list.get(0);
session.setAttribute("aId", ad.getId());
session.setAttribute("name", name);
session.setAttribute("type", type);
response.sendRedirect(path+"/index.jsp");
}
else {
response.sendRedirect(path+"/login.jsp");
request.setAttribute("msg", "使用者名或密碼錯誤,請重新登入!");
}
登入界面如下:
(3) 員工資訊管理子產品實作
該子產品主要有員工資訊查詢、入職登記以及修改删除等。
員工資訊查詢主要是通過搜尋檢索查詢員工的資訊,查詢結果分頁形式顯示出來,
具體核心代碼如下:
String text = "%"+request.getParameter("search").trim()+"%";
String type = request.getParameter("type").trim();
SqlDbUtil dbUtil = new
SqlDbUtil("java:/comp/env/jdbc/permanageds");
dbUtil.init();
//每頁顯示記錄數
int PageSize =8;
int StartRow = 0; //開始顯示記錄的編号
int PageNo = 0;//需要顯示的頁數
int CounterStart = 0;//每頁頁碼的初始值
int CounterEnd = 0;//顯示頁碼的最大值
int RecordCount = 0;//總記錄數;
int MaxPage = 0;//總頁數
int PrevStart = 0;//前一頁
int NextPage = 0;//下一頁
int LastRec = 0;
//int LastStartRecord = 0;//最後一頁開始顯示記錄的編号
//擷取需要顯示的頁數,由使用者送出
if (request.getParameter("page") == null) { //如果為空,則表示第1
頁
if (StartRow == 0) {
PageNo = StartRow + 1; //設定為1
}
} else {
PageNo = Integer.parseInt(request.getParameter("page")); //
獲得使用者送出的頁數
StartRow = (PageNo - 1) * PageSize; //獲得開始顯示的記錄編号
}
//因為顯示頁碼的數量是動态變化的,假如總共有一百頁,則不可能同時顯示100個鍊
接。而是根據目前的頁數顯示
//一定數量的頁面連結
//設定顯示頁碼的初始值!!
if (PageNo % PageSize == 0) {
CounterStart = PageNo - (PageSize - 1);
} else {
CounterStart = PageNo - (PageNo % PageSize) + 1;
}
CounterEnd = CounterStart + (PageSize - 1);
String strSql1 = null;
if(type.equals("sId"))
strSql1 = "select * from staff where sId like \'"+text+"\'";
if(type.equals("sName"))
strSql1 = "select * from staff where sName like \'" +text+ "\'";
if(text.isEmpty())
strSql1 = "select * from staff ";
List list = (List) dbUtil.query(strSql1, null, new
BeanListHandler(Staff.class));
RecordCount = list.size();
//取特定頁數的資料
String strColumn = " * ";
String strTable = " staff ";
String strSort = " id desc ";
String PKID = "id";
String strSql2 = "";
String strWhere = "where " + type +" like "+ "\'"+text+"\'" ;
String START_ID = Integer.toString((PageNo - 1) * PageSize + 1);
String END_ID = Integer.toString(PageNo * PageSize);
strSql2 = " SELECT " + strColumn
+ " FROM (SELECT ROW_NUMBER() OVER(ORDER BY " + strSort
+ ") AS rownum," + strColumn + " FROM " + strTable
+ " WITH(NOLOCK) " + strWhere
+ ") AS D WHERE rownum BETWEEN " + START_ID + " AND "
+ END_ID + " ORDER BY " + strSort;
//擷取總頁數
MaxPage = RecordCount % PageSize;
if (RecordCount % PageSize == 0) {
MaxPage = RecordCount / PageSize;
}
else {
MaxPage = RecordCount / PageSize + 1;
}
List list2 = (List) dbUtil.query(strSql2, null, new
BeanListHandler(Staff.class));
request.setAttribute("staff", list2);
request.setAttribute("PageSize", PageSize);
request.setAttribute("StartRow", StartRow);
request.setAttribute("PageNo", PageNo);
request.setAttribute("CounterStart", CounterStart);
request.setAttribute("CounterEnd", CounterEnd);
request.setAttribute("RecordCount", RecordCount);
request.setAttribute("MaxPage", MaxPage);
request.setAttribute("PrevStart", PrevStart);
request.setAttribute("NextPage", NextPage);
request.setAttribute("LastRec", LastRec);
request.getRequestDispatcher("/staff/staffsearch.jsp").forward(re
quest, response);
系統主界面如下:
入職登記是登記新入職員工資訊,具體核心代碼如下:
String path = request.getContextPath();
int result = 0;
String sId = null;
String sName = request.getParameter("sName").trim();
String sSex = request.getParameter("sSex").trim();
String
birth=request.getParameter("birthyear")+"-"+request.getParameter("bir
thmon");
birth+="-"+request.getParameter("birthday");
String job =
request.getParameter("jobyear")+"-"+request.getParameter("jobmon");
job += "-"+request.getParameter("jobday");
Date birthDate =null;
Date jobDate = null;
Date sIdDate=null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf2=new SimpleDateFormat("yyyyMMddHHmmss");
try {
birthDate = sdf.parse(birth);
jobDate = sdf.parse(job);
sId = sdf2.format(new java.util.Date());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String pId = request.getParameter("sPost").trim();// 擷取的是職位
對應的職位編号
String sSalary = request.getParameter("sSalary").trim();
String sIdentityId =
request.getParameter("sIdentityId").trim();
SqlDbUtil db = new SqlDbUtil("java:/comp/env/jdbc/permanageds");
db.init();
String strCmd2 = "select * from postsetting where pId =\'" + pId
+ "\'";
List list2 = (List) db.query(strCmd2, null, new
BeanListHandler(Postsetting.class));
Postsetting ps = (Postsetting) list2.get(0);
String dId = ps.getdId();
String strCmd4 = "select * from postcategory where pId =\'" + pId
+ "\'";
List list4 = (List) db.query(strCmd4, null, new
BeanListHandler(Postcategory.class));
Postcategory pc = (Postcategory) list4.get(0);
String sPost =pc.getpName();
String strCmd3 = "select * from department where dId =\'" + dId +
"\'";
List list3 = (List) db.query(strCmd3, null, new
BeanListHandler(Department.class));
Department dt = (Department) list3.get(0);
String sDepartment = dt.getdName();// 擷取到職位所隸屬的部門名稱
String strCmd = "insert into staff
(sId,sName,sSex,sBirthday,sPost,sDepartment,sSalary,sEntry,sIdentityI
d) values(?,?,?,?,?,?,?,?,?)";
String[] params = { sId, sName, sSex, sdf.format(birthDate),
sPost,sDepartment, sSalary, sdf.format(jobDate), sIdentityId };
for(int i=0;i<100000;i++){
result = db.update(strCmd, params);
}
if (result == 0) {
String message = "對不起,内容更新失敗,請重新更新! <br/>";
request.getRequestDispatcher("/company/addpostcategory.jsp")
.forward(request, response);
} else {
response.sendRedirect(path + "/servlet/manageStaff");
}
員工資訊管理主要是負責員工資訊的修改和删除功能。
資訊修改的核心代碼如下:
String path = request.getContextPath();
int result = 0;
request.setCharacterEncoding("utf-8");
String sName = request.getParameter("sName").trim();
String sSex = request.getParameter("sSex").trim();
String
birth=request.getParameter("birthyear")+"-"+request.getParameter("bir
thmon");
birth+="-"+request.getParameter("birthday");
String job =
request.getParameter("jobyear")+"-"+request.getParameter("jobmon");
job += "-"+request.getParameter("jobday");
Date birthDate =null;
Date jobDate = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
try {
birthDate = sdf.parse(birth);
jobDate = sdf.parse(job);
} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String sId = request.getParameter("sId").trim();
String pId = request.getParameter("sPost").trim();// 擷取的是職位
對應的職位編号
String sSalary = request.getParameter("sSalary").trim();
String sIdentityId =
request.getParameter("sIdentityId").trim();
SqlDbUtil db = new SqlDbUtil("java:/comp/env/jdbc/permanageds");
db.init();
String strCmd2 = "select * from postsetting where pId =\'" + pId
+ "\'";
List list2 = (List) db.query(strCmd2, null, new
BeanListHandler(Postsetting.class));
Postsetting ps = (Postsetting) list2.get(0);
String dId = ps.getdId();
String strCmd4 = "select * from postcategory where pId =\'" + pId
+ "\'";
List list4 = (List) db.query(strCmd4, null, new
BeanListHandler(Postcategory.class));
Postcategory pc = (Postcategory) list4.get(0);
String sPost =pc.getpName();
String strCmd3 = "select * from department where dId =\'" + dId +
"\'";
List list3 = (List) db.query(strCmd3, null, new
BeanListHandler(Department.class));
Department dt = (Department) list3.get(0);
String sDepartment = dt.getdName();// 擷取到職位所隸屬的部門名稱
String strCmd="update staff set sName=?, sSex=?, sBirthday=?,
sPost=?, sDepartment=?, sSalary=?, sEntry=?, sIdentityId=? where
sId=\'"+sId+"\'";
String[] params = { sName, sSex, sdf.format(birthDate),
sPost,sDepartment, sSalary, sdf.format(jobDate), sIdentityId };
result = db.update(strCmd, params);
if (result == 0) {
String message = "對不起,内容更新失敗,請重新更新! <br/>";
request.getRequestDispatcher("/staff/addstaff.jsp")
.forward(request, response);
} else {
response.sendRedirect(path + "/servlet/manageStaff");
//request.getRequestDispatcher("/servlet/manageStaff").forward(re
quest, response);
}
删除功能的核心代碼如下:
String path = request.getContextPath();
int result = 0;
request.setCharacterEncoding("utf-8");
String sId = request.getParameter("sId").toString();
//String strCmd = "delete from where id=\'"+id+"\'";
String strCmd = "delete from staff where sId=\'"+sId+"\'";
SqlDbUtil dbUtil = new
SqlDbUtil("java:/comp/env/jdbc/permanageds");
dbUtil.init();
result = dbUtil.update(strCmd, null);
if(result > 0)
response.sendRedirect(path+"/servlet/manageStaff");
(4) 員工調動資訊管理子產品實作
該子產品主要是實作員工調動資訊的管理,主要包括員工調動資訊登記,更改和删除,
相關核心代碼與員工資訊管理類似,詳見源代碼。 實作界面如下:
(5) 銀行賬戶資訊子產品實作
該子產品主要是實作公司銀行和員工工資賬戶的管理,主要包括公司銀行賬戶的建立、
檢視和修改以及員工工資賬戶的登記、修改和删除等功能,相關核心代碼與員工信
息管理類似, 在此不累贅, 詳見源代碼。 實作界面如下:
(6) 公司資訊管理子產品實作
該子產品主要是實作公司相關資訊的管理,主要包括公司基本資訊的檢視和更新、公
司部門資訊管理以及公司職位類别管理, 該子產品的相關核心代碼實作與員工資訊管
理類似, 在此不累贅, 詳見源代碼。
(7) 系統管理子產品實作
該子產品主要是實作系統管理者的管理,主要包括管理者添加、更新和删除等功能,
相關核心代碼與上面的類似,在此不累贅,詳見源代碼。 實作界面如下:
四、項目代碼目錄結構圖