概述
詳細
一、概述
本系統的主要任務是實現人事管理系統的系統化和自動化管理, 主要包括招聘入
職、到期離職和員工調動信息管理等功能。具體完成的功能如下:
員工信息管理:員工信息查詢、員工入職登記,員工信息更改、刪除等
員工調動管理:員工調動登記、員工調動記錄查詢,員工調動信息更改、刪除等
銀行賬戶管理:
公司銀行賬戶管理:公司銀行賬戶登記和公司銀行賬戶信息更改。
員工銀行賬戶管理:員工銀行賬戶登記、員工銀行賬戶更改和刪除等
公司信息管理:
職位類別管理:職位類別添加、職位類別信息更改、刪除等
部門信息管理:部門類別添加、部門信息更改、刪除等
系統管理:
登錄密碼修改模塊
管理員管理模塊:管理員添加、管理員信息更改和管理員刪除等
系統幫助:關於使用該系統的一些幫助文檔信息。
二、 開發平台與環境
本系統是 基於 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) 系統管理模塊實現
該模塊主要是實現系統管理員的管理,主要包括管理員添加、更新和刪除等功能,
相關核心代碼與上面的類似,在此不累贅,詳見源代碼。 實現界面如下:
四、項目代碼目錄結構圖
