码云地址: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,做个总结。