Java Web 開發進階案例之人事管理系統的完整實現


技術:Java+ jsp + servlet+ javabeans +sql+tomcat
 

概述

本系統的主要任務是實現人事管理系統的系統化和自動化管理, 主要包括招聘入 職、到期離職和員工調動信息管理等功能。具體完成的功能如下: 員工信息管理:員工信息查詢、員工入職登記,員工信息更改、刪除等 員工調動管理:員工調動登記、員工調動記錄查詢,員工調動信息更改、刪除等 銀行賬戶管理: 公司銀行賬戶管理:公司銀行賬戶登記和公司銀行賬戶信息更改。 員工銀行賬戶管理:員工銀行賬戶登記、員工銀行賬戶更改和刪除等 公司信息管理: 職位類別管理:職位類別添加、職位類別信息更改、刪除等 部門信息管理:部門類別添加、部門信息更改、刪除等 系統管理: 登錄密碼修改模塊 管理員管理模塊:管理員添加、管理員信息更改和管理員刪除等 系統幫助:關於使用該系統的一些幫助文檔信息。 MyEclipse 8.5 +java+jsp + servlet+ javabeans + tomcat

詳細

 

一、概述
本系統的主要任務是實現人事管理系統的系統化和自動化管理, 主要包括招聘入
職、到期離職和員工調動信息管理等功能。具體完成的功能如下:
員工信息管理:員工信息查詢、員工入職登記,員工信息更改、刪除等
員工調動管理:員工調動登記、員工調動記錄查詢,員工調動信息更改、刪除等
銀行賬戶管理:
公司銀行賬戶管理:公司銀行賬戶登記和公司銀行賬戶信息更改。
員工銀行賬戶管理:員工銀行賬戶登記、員工銀行賬戶更改和刪除等
公司信息管理:
職位類別管理:職位類別添加、職位類別信息更改、刪除等
部門信息管理:部門類別添加、部門信息更改、刪除等
系統管理:
登錄密碼修改模塊
管理員管理模塊:管理員添加、管理員信息更改和管理員刪除等
系統幫助:關於使用該系統的一些幫助文檔信息。

 

二、 開發平台與環境

本系統是 基於 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) 系統管理模塊實現
該模塊主要是實現系統管理員的管理,主要包括管理員添加、更新和刪除等功能,
相關核心代碼與上面的類似,在此不累贅,詳見源代碼。 實現界面如下:

 

四、項目代碼目錄結構圖

 

 

注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM