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