碼雲地址:https://gitee.com/kssj-jyw-zy/text
一、實驗選題
1.1實驗內容
本次課程設計內容為基於JavaWeb的人力資源管理系統。主要的工作如下:
①管理員用戶的登錄。
②實現管理企業的員工信息。
③實現管理企業的部門信息。
④實現企業的應聘信息的管理功能。
⑤實現企業員工培訓的一系列相關信息的管理。
⑥實現企業獎懲信息的管理。
⑦實現員工薪酬信息的管理。
⑧實現管理員賬戶信息的管理。
⑨實現安全退出系統
1.2相關技術及工具
主要工具為Java+Tomcat8.5+Mysql8.0.18。
開發平台是Ecplise。
主要運用了JSP+JavaBean+Servlet模式進行開發,還運用到了Ajax網頁開發技術、Jquery庫、DataTable插件、layui前端UI框架。
Ajax:Ajax 即“Asynchronous Javascript And XML”(異步 JavaScript 和 XML),是指一種創建交互式、快速動態網頁應用的網頁開發技術,無需重新加載整個網頁的情況下,能夠更新部分網頁的技術。運用Ajax主要是考慮完成一些數據庫操作時不需要刷新整個網頁即可更新表格中顯示的內容,它具有更好的交互性。
Jquery:JQuery是一個快速、簡潔的JavaScript框架,一個優秀的JavaScript代碼庫。運用Jqeury主要是因為用到的Ajax、DataTable、layui等和JavaScript的地方需要它來支持,簡化了JavaScript代碼的編寫。
DataTable:Datatable是一款Jquery表格插件。它是一個高度靈活的工具,可以將任何HTML表格添加高級的交互功能,如分頁、即時搜索和排序。運用DataTable主要是為了方便的顯示和操作數據庫中的數據,當初在搜索表格插件的時候先看到的是Bootstrap Table,后來經過了解后選擇了感覺更適合本項目的DataTable,雖然剛開始學習的時候感覺無從入手,但在學會之后發現還是很方便的,功能十分強大。
layui:layui(諧音:類UI) 是一款采用自身模塊規范編寫的前端 UI 框架,遵循原生 HTML/CSS/JS 的書寫與組織形式,門檻極低,拿來即用。最先用到的是layui下的模塊layer,它是一個web彈層組件,因為在考慮修改和插入數據時,感覺點擊按鈕后跳轉到一個新的頁面過於繁瑣,所以考慮可不可以用彈窗來做,后來經過查詢看到了十分簡潔的layer,試着用了下,發現效果很不錯。后來接着用了layui下的一些樣式和laydate等模塊優化系統的頁面細節和操作細節。
二、總體設計(含背景知識或基本原理與算法、或模塊介紹、設
計步驟等)
2.1需求概述
- 對企業人力資源管理的基本信息進行管理。
- 管理企業的員工信息(即人事管理功能)。
- 實現為個人提供網絡工作平台的功能。
- 實現企業的應聘信息的管理功能。
- 實現企業員工培訓的一系列相關信息的管理。
- 員工薪酬信息管理。
- 系統用戶信息的管理。
圖2.1系統角色與用例分析模型
2.2系統業務流程分析
(1)用戶輸入賬號、密碼后登錄到管理界面。
(2)單擊“部門管理”導航按鈕,對部門信息進行添加、查詢及刪除操作。
(3)單擊“員工管理”導航按鈕,對員工信息進行添加、修改、查詢及刪除操作。
(4)單擊“招聘管理”導航按鈕,對招聘人信息進行添加、查詢、刪除及錄用操作。
(5)單擊“培訓管理”導航按鈕,對培訓信息進行添加、查詢及刪除操作。
(6)單擊“獎懲管理”導航按鈕,對獎懲信息進行添加、查詢及刪除操作。
(7)單擊“薪資管理”導航按鈕,對薪資信息進行添加、查詢及刪除操作。
(8)單擊“系統管理”導航按鈕,對管理員信息進行添加、查詢、刪除操作。
(9)單擊“用戶修改”按鈕,對當前用戶密碼進行修改操作。
(10)單擊“安全退出”按鈕,退出當前操作系統。
2.3功能分析及系統模塊設計
管理員通過輸入正確的賬戶和密碼可以登入系統。進入首頁后可在首頁添加所有記錄。然后可以分別通過導航欄進入相應模塊進行數據操作,包括數據的刪除,修改,查詢,還有可以對數據進行排序。系統的功能總的可以分為下圖的這些模塊,主要是用戶登錄驗證和各模塊的增刪查改還有各種模塊所有記錄的排序,還有一些在不同表之間實現的操作,如在招聘表中的信息可經過錄用進入員工表。
圖2.2模塊功能圖
2.4系統架構設計
整個系統以這個架構進行搭建,用戶按照這個順序實現數據操作。
圖2.3 項目架構圖
四、詳細設計(含主要的數據結構、程序流程圖、關鍵代碼等)
3.1數據庫設計
(1)概念結構設計
圖3.1 數據庫的ER圖
(2)物理結構設計
表結構設計
員工表
id:員工號 name:員工姓名 sex:性別 department:部門號 job:職務 education:學歷 date:入職時間
部門表
id:部門號 name:部門名 date:創建時間 count:部門人數 remark:備注
招聘表
id:編號 name:姓名 sex:性別 job:工作 education:學歷 experience:工作經驗
獎懲表
id:編號 subject:獎懲主題 type:獎懲類型 money:獎懲金額 date:獎懲時間 name:獎懲人員
培訓表
id:編號 name:培訓人 subject:培訓主題 date:培訓時間 place:培訓地點
薪酬表
id:員工編號 name:員工姓名 date:當前月份 money:基本工資 etc_money1:加班費 etc_money2:工齡費 etc_money3:考勤費 etc_money4:曠工費 etc_money5:保險費 total:實發工資
管理員賬戶表
id:序號 account:賬號 password:密碼
3.2系統子模塊流程設計
圖3.3前端模塊的所有文件 圖3.4后端模塊的所有文件
以上為所有的代碼模塊,還有配置servlet的web.xml在WEB-INF下。總體上管理員用戶在JSP頁面上通過Js交互將數據用ajax以Json的格式傳輸到對應的servlet的doGet方法,doGet方法中定義了一個action對象,存儲操作類型,以switch case的模式獲取前端傳來的action參數,從而在Servlet中調用相應的Dao函數,與數據庫進行連接操作,操作完成后返回數據操作結果,將相應的結果存儲進Json對象中,用out對象輸出Json數據通過ajax到前端。前端獲得相應的數據后動態更新網頁部分內容,完成一次完整的操作。
(1) 算法描述
以下已招聘模塊為例,用到的文件為Dbutil.java、RecruitDao.java、Recruit.java、RecruitServlet、recruit.js、recruitPage.jsp.
① 管理員用戶在前台瀏覽器操作rectuitPage.jsp,通過在rectuit.js中的ajax將相應的數據和操作類型action傳輸到RecruitServlet中。
② Recruit的doGet方法中通過switch case識別action操作類型,轉到對應的處理方法中。
③ 處理方法中實例化RecruitDao對象並調用DBUtil.java提供的方法連接和操作數據庫。
④ 返回的數據放入json格式的對象中,然后通過ajax將輸送到recruitPage.jsp。
(2) 關鍵類說明
RecruitDao.java:封裝了關於招聘表在數據庫中增刪改查的方法,可實例化對象后調用方法。
Recruit.java:一個JavaBean類,用於封裝招聘表中的數據。
RecruitServlet.java:接收前台發送的操作指令,負責處理招聘表中需要進行的所有操作,同時也是在此調用Dao里面的方法。
DBUtil.java:封裝了獲取數據庫連接和釋放數據庫連接的方法,可用類名加方法名直接調用。
recruit.js:在此調用DataTable表格插件,設置DataTable屬性實現分頁排序等功能,同時用ajax傳遞數據顯示在表格上,調用layer彈窗組件優化用戶體驗。
recruitPage.jsp:招聘信息操作界面。
login.jsp:用戶登錄界面。
mainPage.jsp:首頁,由所有表的添加構成。
其他的模塊的頁面都與上述相差不大,各模塊大多都由這幾個關鍵文件構成。
3.3關系技術設計及實現(這里只展現招聘模塊的實現)
recruitPage.jsp(這是招聘管理界面)
1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta charset="utf-8" /> 8 <title>人力資源管理系統主頁</title> 9 <link rel="stylesheet" media="screen" href="${pageContext.request.contextPath}/css/login.css"> 10 <link rel="stylesheet" type="text/css" href="http://cdn.datatables.net/1.10.15/css/jquery.dataTables.css"> 11 <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/table.css"> 12 <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/layui/css/layui.css"> 13 14 </head> 15 <body> 16 <!-- particles.js con tainer --> 17 <div id="particles-js" style="display: flex;align-items: center;justify-content: center"> 18 <canvas class="particles-js-canvas-el" style="width: 100%; height: 100%;" width="472" height="625"></canvas> 19 </div> 20 <!-- 以上為背景 --> 21 <!-- 以下為導航欄 --> 22 <div id="nav"> 23 <p>人力資源管理系統</p> 24 <ul> 25 <li><a href="mainPage.jsp">首頁</a></li> 26 <li><a href="departmentPage.jsp" >部門管理</a></li> 27 <li><a href="personPage.jsp" >員工管理</a></li> 28 <li><a href="recruitPage.jsp">招聘管理</a></li> 29 <li><a href="cultivatePage.jsp" >培訓管理</a></li> 30 <li><a href="rewardPage.jsp">獎懲管理</a></li> 31 <li><a href="salaryPage.jsp" >薪酬管理</a></li> 32 <li><a href="addAccountPage.jsp">系統管理</a></li> 33 </ul> 34 <div id="exit"> 35 <a id="xiu" href="changeAccountPage.jsp">修改賬戶 </a> 36 <a href="login.jsp">安全退出</a> 37 </div> 38 </div> 39 <!-- 以上為導航欄 --> 40 <div id="content"> 41 <!--內容在這里加 --> 42 <!-- 設置顯示數據的表格--> 43 <table id="recruitTable" class="dataTable" > 44 <thead> 45 <tr> 46 <th width="10%">編號</th> 47 <th width="15%">姓名</th> 48 <th width="10%">性別</th> 49 <th width="20%">應聘職務</th> 50 <th width="15%">學歷</th> 51 <th width="10%">工作經驗</th> 52 <th width="30%">操作<th> 53 </tr> 54 </thead> 55 <tbody> 56 57 </tbody> 58 </table> 59 </div> 60 <!-- scripts --> 61 <script src="${pageContext.request.contextPath}/js/login.js"></script> 62 <script src="${pageContext.request.contextPath}/js/loginApp.js"></script> 63 <script src="https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> 64 <script type="text/javascript" charset="utf8" src="http://cdn.datatables.net/1.10.15/js/jquery.dataTables.js"></script> 65 <script src="${pageContext.request.contextPath}/js/recruit.js"></script> 66 <script src="${pageContext.request.contextPath}/layer/layer.js"></script> 67 <script src="${pageContext.request.contextPath}/laydate/laydate.js"></script> 68 <script> 69 function changeImg() { 70 let pic = document.getElementById('picture'); 71 console.log(pic.src) 72 if (pic.getAttribute("src", 2) == "img/check.png") { 73 pic.src = "img/checked.png" 74 } else { 75 pic.src = "img/check.png" 76 } 77 } 78 79 //以下實現導航欄高亮 80 var urlstr = location.href; 81 //alert(urlstr); 82 var urlstatus=false; 83 $("#nav a").each(function () { 84 if ((urlstr + '/').indexOf($(this).attr('href')) > -1&&$(this).attr('href')!='') { 85 $(this).addClass('cur'); urlstatus = true; 86 } else { 87 $(this).removeClass('cur'); 88 } 89 }); 90 if (!urlstatus) {$("#nav a").eq(0).addClass('cur'); } 91 </script> 92 </body> 93 </html>
recruit.js(這里設置表格內的數據傳遞和一些按鈕的作用)
1 /* 2 * @Author: Marte 3 * @Date: 2020-06-06 16:49:52 4 * @Last Modified by: Marte 5 * @Last Modified time: 2020-06-06 22:16:54 6 */ 7 /*招聘表*/ 8 //$(function(){ 9 10 11 //$(function() { 12 $('#recruitTable').DataTable({ 13 "processing": true,//數據加載時顯示進度條 14 "serverSide": false,//啟用服務端分頁,我這里使用的是前端分頁,所以直接禁止 15 "searching": true,//是否啟用搜索功能 16 "ajax": { 17 url:"RecruitServlet?action=select_all",//ajax傳輸數據的地址,action是操作類型 18 type:"Get", 19 }, 20 columns: [//以下為招聘表的數據,要與后台的數據名對應 21 {"data":"id"}, 22 {"data":"name"}, 23 {"data":"sex"}, 24 {"data":"job"}, 25 {"data":"education"}, 26 {"data":"experience"}, 27 {"data": "null","render":function (data, type, full, meta) {//這里是行內刪除、修改、錄用按鈕 28 var content="<td> <div>"; 29 content+="<button type='button' onclick='fnDelete(this)' class='layui-btn layui-btn-sm layui-btn-danger'><i class='layui-icon'></i>刪除</button>" ; 30 content+="<button type='button' onclick='fnUpdate(this)' class='layui-btn layui-btn-sm'><i class='layui-icon'></i>修改</button>"; 31 content+="<button type='button' onclick='fnAddPerson(this)' id='isRecruit' class='layui-btn layui-btn-sm layui-btn-normal'><i class='layui-icon'></i>錄用</button>"; 32 content+="</div></td>"; 33 return content; 34 }}, 35 36 ], 37 "fixedHeader": true,//固定表頭 38 "iDisplayLength" :10, //一頁顯示的記錄數 39 destroy: true, 40 autoWidth: false, //禁用自動調整列寬 41 "ordering": true,//排序 42 "lengthMenu":true,//顯示記錄信息的 43 "info": true, //分頁信息提示等等 44 "paging": true,//是否分頁 45 "pagingType": "full_numbers",//分頁按鈕有首頁、上一頁、下一頁、尾頁、頁碼 46 "bLengthChange": false, //開關,是否顯示每頁顯示多少條數據的下拉框 47 "oLanguage":{ //將英文信息轉換未中文 48 "sProcessing": "處理中...", 49 "sLengthMenu": "顯示 _MENU_ 項結果", 50 "sZeroRecords": "沒有匹配結果", 51 "sInfo": "顯示第 _START_ 至 _END_ 項結果,共 _TOTAL_ 項", 52 "sInfoEmpty": "顯示第 0 至 0 項結果,共 0 項", 53 "sInfoFiltered": "(由 _MAX_ 項結果過濾)", 54 "sInfoPostFix": "", 55 "sSearch": "搜索:", 56 "sUrl": "", 57 "sEmptyTable": "表中數據為空", 58 "sLoadingRecords": "載入中...", 59 "sInfoThousands": ",", 60 "oPaginate": { 61 "sFirst": " 首頁 ", 62 "sPrevious": " 上一頁 ", 63 "sNext": " 下一頁 ", 64 "sLast": " 末頁 " 65 } 66 } 67 68 }); 69 //}); 70 /*刪除功能*/ 71 function fnDelete(obj){//行內按鈕點擊事件綁定的函數 72 layer.confirm('確認刪除?', {icon: 3, title:'提示',anim: 0}, function(){ 73 //以下為點擊確認實現的內容 74 //layer.confirm(content, options, yes, cancel) 75 var id = $(obj).parents("tr").children().eq(0).html();//獲取該行的id值 76 $.ajax({ 77 url:"RecruitServlet?action=delete", 78 type: "post", 79 data:{id:id},//此處為傳輸給后台的data數據格式 80 success: function(data){ 81 layer.alert(data,{icon:6});//使用layer彈窗 82 $('#recruitTable').DataTable().ajax.reload();//重新繪制表格 83 } 84 }); 85 }); 86 }//以下還有修改功能等 87 88 /*修改功能*/ 89 function fnUpdate(obj){ 90 var id = $(obj).parents("tr").children().eq(0).html();//獲取該行的id值 91 var name=$(obj).parents("tr").children().eq(1).html();//獲取該行的name值 92 var sex=$(obj).parents("tr").children().eq(2).html();//獲取該行的sex值 93 var job=$(obj).parents("tr").children().eq(3).html();//獲取該行的job值 94 var education=$(obj).parents("tr").children().eq(4).html();//獲取該行的education值 95 var experience=$(obj).parents("tr").children().eq(5).html();//獲取該行的experience值 96 layer.open({ 97 tpye:1, 98 area:['300px','500px'], 99 btn:['確定','取消'], 100 yes:function(index, layero){ 101 var cid=$("#cid").val(); 102 var cname=$("#cname").val(); 103 var csex=$("#csex").val(); 104 var cjob=$("#cjob").val(); 105 var ceducation=$("#ceducation").val(); 106 var cexperience=$("#cexperience").val(); 107 $.ajax({ 108 url:"RecruitServlet?action=update", 109 type: "post", 110 data:{id:cid,name:cname,sex:csex,job:cjob,education:ceducation,experience:cexperience},//此處為傳輸給后台的data數據格式 111 success: function(data){ 112 layer.alert(data,{icon:6}); 113 $('#recruitTable').DataTable().ajax.reload();//重新繪制表格 114 } 115 }); 116 layer.close(index); 117 } 118 ,btn2: function(index, layero){ 119 //按鈕【取消】的回調 120 layer.close(index); 121 }, 122 content: '<form class="layui-form-item">'+'編號: ' + '<input type="text" name="" id="cid" readonly="readonly" class="layui-input" />' + '姓名: ' 123 + '<input type="text" name="" id="cname" class="layui-input" />' + '性別: ' 124 + '<select name="" id="csex" class="cselect" >' 125 +'<option value="男">男</option>' 126 +'<option value="女">女</option>' 127 +'</select>' 128 +'工作: ' 129 + '<input type="text" name="" id="cjob" class="layui-input" />'+'學歷: ' 130 + '<input type="text" name="" id="ceducation" class="layui-input" />'+'工作經驗:' 131 + '<input type="text" name="" id="cexperience" class="layui-input" />'+'</form>' 132 133 }); 134 $("#cid").val(id); 135 $("#cname").val(name); 136 $("#csex").val(sex); 137 $("#cjob").val(job); 138 $("#ceducation").val(education); 139 $("#cexperience").val(experience); 140 141 } 142 function rdelete(obj){//實現錄用后自動刪除 143 144 var id = $(obj).parents("tr").children().eq(0).html();//獲取該行的id值 145 $.ajax({ 146 url:"RecruitServlet?action=delete", 147 type: "post", 148 data:{id:id},//此處為傳輸給后台的data數據格式 149 success: function(data){ 150 $('#recruitTable').DataTable().ajax.reload();//重新繪制表格 151 } 152 }); 153 } 154 function fnAddPerson(obj){ 155 var name=$(obj).parents("tr").children().eq(1).html();//獲取該行的name值 156 var sex=$(obj).parents("tr").children().eq(2).html();//獲取該行的sex值 157 var job=$(obj).parents("tr").children().eq(3).html();//獲取該行的job值 158 var education=$(obj).parents("tr").children().eq(4).html();//獲取該行的education值 159 layer.open({ 160 tpye:1, 161 area:['350px','500px'], 162 btn:['確定','取消'], 163 yes:function(index, layero){ 164 var cname=$("#cname").val(); 165 var csex=$("#csex").val(); 166 var cdepartment=$("#cdepartment").val(); 167 var cjob=$("#cjob").val(); 168 var ceducation=$("#ceducation").val(); 169 var cdate=$("#cdate").val(); 170 $.ajax({ 171 url:"person_servlet?action=add", 172 type: "post", 173 data:{name:cname,sex:csex,department:cdepartment,job:cjob,education:ceducation,date:cdate},//此處為傳輸給后台的data數據格式 174 success: function(data){ 175 layer.alert(data,{icon:6}); 176 rdelete(obj); 177 } 178 }); 179 layer.close(index); 180 } 181 ,btn2: function(index, layero){ 182 //按鈕【取消】的回調 183 layer.close(index); 184 }, 185 content: '姓名: ' 186 + '<input type="text" name="" id="cname" class="layui-input"/>' + '性別: ' 187 + '<input type="text" name="" id="csex" class="layui-input"/>' + '部門號: ' 188 + '<input type="text" name="" id="cdepartment" class="layui-input"/>'+'職務: ' 189 + '<input type="text" name="" id="cjob" class="layui-input"/>'+'學歷:' 190 + '<input type="text" name="" id="ceducation" class="layui-input"/>'+'入職時間:' 191 + '<input type="text" name="" id="cdate" class="layui-input"/>' 192 193 }); 194 $("#cname").val(name); 195 $("#csex").val(sex); 196 $("#cjob").val(job); 197 $("#ceducation").val(education); 198 laydate.render({ 199 elem: '#cdate' 200 }); 201 }
RecruitServlet.java(接收前台傳來的數據和操作類型,並設定返回數據)
1 package com.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 import java.util.ArrayList; 13 import java.util.Map; 14 15 import com.alibaba.fastjson.JSON; 16 import com.alibaba.fastjson.JSONArray; 17 import com.alibaba.fastjson.JSONObject; 18 19 20 import com.util.DbUtil; 21 import com.javabean.Recruit; 22 import com.dao.DepartmentDao; 23 import com.dao.PersonDao; 24 import com.dao.RecruitDao; 25 26 /** 27 * Servlet implementation class RecruitServlet 28 */ 29 @WebServlet("/RecruitServlet") 30 public class RecruitServlet extends HttpServlet { 31 private static final long serialVersionUID = 1L; 32 private String action;//存儲操作描述 33 34 /** 35 * @see HttpServlet#HttpServlet() 36 */ 37 public RecruitServlet() { 38 super(); 39 // TODO Auto-generated constructor stub 40 } 41 42 /** 43 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 44 */ 45 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 46 // TODO Auto-generated method stub 47 request.setCharacterEncoding("utf-8"); 48 action = request.getParameter("action"); 49 switch(action) {//根據用戶傳過來的操作選擇下列操作,增刪查改 50 case "select_all": 51 select_all(request,response);break;//轉到本頁面的select_all函數 52 case "delete": 53 delete(request,response);break;//轉到本頁面的delete函數 54 case "update": 55 update(request,response);break;//轉到本頁面的update函數 56 case "add": 57 add(request,response);break; 58 59 } 60 61 } 62 63 /** 64 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 65 */ 66 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 67 // TODO Auto-generated method stub 68 doGet(request, response); 69 } 70 71 protected void select_all(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 72 response.setContentType("text/html;charset=utf-8");//返回的格式和編碼方式 73 PrintWriter out = response.getWriter();//實例化out對象 74 //接收dataTables發過來的數據 75 String draw="1"; 76 RecruitDao recruitDao=new RecruitDao();//實例化操作對象 77 JSONArray recruitJsonArray=new JSONArray();//實例化一個json數組 78 ArrayList<Recruit> results=recruitDao.select_all();//獲取查詢所有的結果放入數組中 79 if(results!=null) 80 { 81 recruitJsonArray=JSONArray.parseArray(JSON.toJSONString(results)); //將數組轉化為JSON數組 82 } 83 JSONObject obj=new JSONObject();//實例化一個json對象 84 int recordsTotal=recruitJsonArray.size();//獲取記錄數 85 obj.put("draw", draw);//返回給datatable接收的必要數據,瀏覽器cache的編號,遞增不可重復 86 obj.put("recordsTotal",recordsTotal);//返回給datatable接收的必要數據,總記錄數 87 obj.put("recordsFiltered",recordsTotal);//返回給datatable接收的必要數據,過濾的總記錄數 88 obj.put("data", recruitJsonArray);//返回的表中顯示的數據 89 out.println(obj);//返回整個json對象 90 System.out.println(recruitJsonArray); 91 out.close(); 92 } 93 94 protected void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 95 response.setContentType("text/html;charset=utf-8"); 96 String id=request.getParameter("id");//獲取從ajax傳來的數據,id值 97 System.out.print(id+"測試id值"); 98 RecruitDao recruitDao=new RecruitDao();//實例化招聘操作對象 99 int flag=recruitDao.delete_recruit(id);//調用刪除方法 100 String info = null;//返回信息 101 PrintWriter out = response.getWriter(); 102 if(flag == 1){ 103 info = "成功刪除編號為"+id+"的記錄!"; 104 }else{ 105 info = "錯誤:刪除記錄失敗!"; 106 } 107 JSONObject obj=new JSONObject();//返回的是json格式的數據 108 obj.put("success",info);//所以要把info放入json對象中 109 out.println(info); 110 out.flush(); 111 out.close(); 112 } 113 protected void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 114 response.setContentType("text/html;charset=utf-8"); 115 String id=request.getParameter("id"); 116 String name=request.getParameter("name"); 117 String sex=request.getParameter("sex"); 118 String job=request.getParameter("job"); 119 String education=request.getParameter("education"); 120 String experience=request.getParameter("experience"); 121 System.out.print("id:"+id); 122 System.out.print("name:"+name); 123 System.out.print("sex:"+sex); 124 System.out.print("job:"+job); 125 System.out.print("education:"+education); 126 System.out.print("experience"+experience); 127 RecruitDao recruitDao=new RecruitDao(); 128 129 String info = null; 130 PrintWriter out = response.getWriter(); 131 if(name.length()!=0&&sex.length()!=0&&job.length()!=0&&education.length()!=0&&experience.length()!=0) { 132 int flag=recruitDao.update_recruit(id,name,sex,job,education,experience); 133 if(flag == 1){ 134 info = "修改成功"; 135 }else{ 136 info = "修改失敗,請重新輸入並檢查數據"; 137 } 138 } 139 else 140 { 141 info="你輸入的數據存在錯誤,請重新輸入"; 142 } 143 JSONObject obj=new JSONObject(); 144 obj.put("success",info); 145 out.println(info); 146 out.flush(); 147 out.close(); 148 } 149 protected void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 150 response.setContentType("text/html;charset=utf-8"); 151 String name=request.getParameter("name"); 152 String sex=request.getParameter("sex"); 153 String job=request.getParameter("job"); 154 String education=request.getParameter("education"); 155 String experience=request.getParameter("experience"); 156 157 System.out.print("name:"+name); 158 System.out.print("sex:"+sex); 159 System.out.print("job:"+job); 160 System.out.print("education:"+education); 161 162 RecruitDao recruitDao=new RecruitDao(); 163 164 String info = null; 165 PrintWriter out = response.getWriter(); 166 if(name.length()!=0&&sex.length()!=0&&job.length()!=0&&education.length()!=0&&experience.length()!=0) { 167 int flag=recruitDao.add(name,sex,job,education,experience); 168 if(flag == 1){ 169 info = "添加成功"; 170 }else{ 171 info = "添加失敗,請重新輸入並檢查數據"; 172 } 173 } 174 else 175 { 176 info="你輸入的數據存在錯誤,請重新輸入"; 177 } 178 JSONObject obj=new JSONObject(); 179 obj.put("success",info); 180 out.println(info); 181 out.flush(); 182 out.close(); 183 } 184 185 186 }
RecruitDao.java(這是封裝了增刪查改的類)
1 package com.dao; 2 import java.sql.Connection; 3 import java.sql.PreparedStatement; 4 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.util.ArrayList; 8 9 import com.util.DbUtil; 10 import com.javabean.Recruit; 11 12 public class RecruitDao { 13 public ArrayList<Recruit> select_all() {//這是全查 14 Connection conn=DbUtil.getConnection();//通過類名+方法名調用數據庫連接(這是一個靜態方法) 15 String sql="select * from recuit;";//SQL語句 16 ArrayList<Recruit> results=new ArrayList<Recruit>();//創建招聘管理的數據模型數組 17 try { 18 PreparedStatement ps=(PreparedStatement) conn.prepareStatement(sql);//執行sql 19 ResultSet rs = ps.executeQuery();//返回結果集 20 while(rs.next()) 21 { 22 Recruit temp=new Recruit(); 23 temp.setId(rs.getInt("id"));//數據庫獲取的數據存入javabean模型中 24 temp.setName(rs.getString("name")); 25 temp.setSex(rs.getString("sex")); 26 temp.setJob(rs.getString("job")); 27 temp.setEducation(rs.getString("education")); 28 temp.setExperience(rs.getString("experience")); 29 results.add(temp); //將數據放入Recruit對象構成的數組 30 } 31 //關閉資源 32 rs.close(); 33 ps.close(); 34 } catch (SQLException e) { 35 e.printStackTrace(); 36 System.out.println("數據庫連接異常"+sql); 37 } finally { 38 System.out.println(sql); 39 DbUtil.closeConnection(conn); 40 } 41 return results; 42 } //以下還有刪除、修改、添加 43 public int delete_recruit(String id) { 44 //刪除,成功返回1,失敗返回0; 45 Connection con=DbUtil.getConnection();//實例化con,調用靜態方法連接數據庫 46 int flag=0;//判斷更改成功與否的標志 47 String sql="delete from recuit where id=?";//刪除的sql語句 48 try { 49 PreparedStatement ps=(PreparedStatement) con.prepareStatement(sql); 50 ps.setString(1, id); 51 flag=ps.executeUpdate();//成功執行返回1 52 ps.close(); 53 }catch(SQLException e) { 54 e.printStackTrace(); 55 }finally { 56 DbUtil.closeConnection(con);//關閉數據庫連接 57 if(flag==1) 58 System.out.println("刪除成功"); 59 else 60 { 61 System.out.println("刪除失敗"); 62 } 63 } 64 return flag; 65 } 66 public int update_recruit(String id,String name,String sex,String job,String education,String experience) { 67 //修改,成功返回1,失敗返回0; 68 Connection con=DbUtil.getConnection();//實例化con,調用靜態方法連接數據庫 69 int flag=0;//判斷更改成功與否的標志 70 String sql="update recuit set name= ?,sex= ?,job= ? ,education=?,experience=? where id= ?;";//更新的sql語句 71 try { 72 PreparedStatement ps=(PreparedStatement) con.prepareStatement(sql); 73 ps.setString(1, name); 74 ps.setString(2, sex); 75 ps.setString(3, job); 76 ps.setString(4, education); 77 ps.setString(5, experience); 78 ps.setString(6, id); 79 flag=ps.executeUpdate();//成功執行返回1 80 ps.close(); 81 }catch(SQLException e) { 82 e.printStackTrace(); 83 }finally { 84 DbUtil.closeConnection(con);//關閉數據庫連接 85 if(flag==1) 86 System.out.println("更新成功"); 87 else 88 { 89 System.out.println("更新失敗"); 90 } 91 } 92 return flag; 93 } 94 public int add(String name,String sex,String job,String education,String experience) { 95 //更改密碼,成功返回1,失敗返回0; 96 Connection con=DbUtil.getConnection();//實例化con,調用靜態方法連接數據庫 97 int flag=0;//判斷更改成功與否的標志 98 String sql="insert into recuit(name,sex,job,education,experience) values(?,?,?,?,?);";//更新的sql語句 99 try { 100 PreparedStatement ps=(PreparedStatement) con.prepareStatement(sql); 101 ps.setString(1, name); 102 ps.setString(2, sex); 103 ps.setString(3, job); 104 ps.setString(4, education); 105 ps.setString(5, experience); 106 107 flag=ps.executeUpdate();//成功執行返回1 108 ps.close(); 109 }catch(SQLException e) { 110 e.printStackTrace(); 111 }finally { 112 DbUtil.closeConnection(con);//關閉數據庫連接 113 if(flag==1) 114 System.out.println("添加成功"); 115 else 116 { 117 System.out.println("添加失敗"); 118 } 119 } 120 return flag; 121 } 122 123 }
DbUtil.java(數據庫連接類)
1 package com.util; 2 import java.sql.Connection; 3 import java.sql.DriverManager; 4 import java.sql.Statement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 //這是定義連接數據庫的類 9 public class DbUtil { 10 public static Connection getConnection() { 11 //定義靜態方法,可直接通過類名.方法名使用連接數據庫方法 12 Connection con=null; 13 final String JDBC_Driver="com.mysql.cj.jdbc.Driver";//mysql8.0以上的驅動名,8.0以下去掉cj 14 final String DB_URL="jdbc:mysql://localhost:3306/manage?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"; 15 //jdbc:mysql://url/數據庫名---useSSL指是否使用SSL安全驗證,serverTimezone指定服務器上的時區 16 try { 17 Class.forName(JDBC_Driver);//注冊驅動名 18 con=DriverManager.getConnection(DB_URL,"root","123456");//連接數據庫 19 }catch(ClassNotFoundException e) { 20 //數據庫驅動類異常處理 21 System.out.println("Sorry,can`t find the Driver!"); 22 e.printStackTrace(); 23 }catch(SQLException e) { 24 //數據庫連接失敗異常處理 25 System.out.println("Sorry,數據庫連接異常"); 26 e.printStackTrace(); 27 }catch(Exception e) { 28 e.printStackTrace(); 29 } 30 finally { 31 System.out.println("數據庫連接成功"); 32 } 33 return con; 34 } 35 36 public static void closeConnection(Connection con) { 37 //定義靜態方法,可通過類名.方法名直接釋放資源 38 if(con!=null) 39 { 40 try { 41 con.close(); 42 }catch(SQLException e) { 43 e.printStackTrace(); 44 } 45 } 46 } 47 48 49 } 50
五、實驗結果與功能展示
①登錄功能:
用戶在登錄頁面可以輸入賬戶密碼進行登錄。
②首頁:
首先歡迎登錄的管理員,然后管理員可根據需求實現各表的插入。
通過彈窗實現插入數據的輸入,同時插入數據有着限制,如果輸入空值或不符合數據格式的值,將會報錯並要求重新輸入。
③招聘管理
點擊招聘管理后轉到招聘管理頁面,自動查詢所有數據,然后可以實現所有字段的排序和搜索功能,最底下還有分頁按鈕,可在操作列進行數據的刪除,修改。還有招聘的錄用功能,即把改人員添加到員工表中,並實現了添加后自動在招聘表中刪除記錄。
④薪酬管理
點擊薪酬管理后跳轉至薪酬管理頁面,自動查詢所有數據,同樣有排序、搜索、分頁功能。還有數據的刪除、修改,同時實現了輸入基本工資和其他工資后自動計算實發工資。
⑤修改賬戶
點擊后跳轉至修改賬戶頁面,賬戶文本框通過session自動獲取管理員賬戶,然后需要輸入舊密碼,並輸入兩次新密碼,點擊保存后彈出確認修改彈窗,點擊確定后,如果數據正確,彈出修改成功。
其他模塊就不一一展示了。
以上為持續了兩周的web課程設計項目6.1-6.12,做個總結。