page.jsp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>员工列表</title>
  9. <%
  10. pageContext.setAttribute("APP_PATH", request.getContextPath());
  11. %>
  12. <!-- web路径:
  13. 不以/开始的相对路径,找资源,以当前资源的路径为基准,经常容易出问题。
  14. 以/开始的相对路径,找资源,以服务器的路径为标准(http://localhost:3306);需要加上项目名
  15. http://localhost:3306/crud
  16. -->
  17. <script type="text/javascript"
  18. src="${APP_PATH }/static/js/jquery-1.12.4.min.js"></script>
  19. <link
  20. href="${APP_PATH }/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"
  21. rel="stylesheet">
  22. <script
  23. src="${APP_PATH }/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
  24. </head>
  25. <body>
  26. <!-- 员工修改的模态框 -->
  27. <div class="modal fade" id="empUpdateModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  28. <div class="modal-dialog" role="document">
  29. <div class="modal-content">
  30. <div class="modal-header">
  31. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  32. <h4 class="modal-title">员工修改</h4>
  33. </div>
  34. <div class="modal-body">
  35. <form class="form-horizontal">
  36. <div class="form-group">
  37. <label class="col-sm-2 control-label">empName</label>
  38. <div class="col-sm-10">
  39. <p class="form-control-static" id="empName_update_static"></p>
  40. </div>
  41. </div>
  42. <div class="form-group">
  43. <label class="col-sm-2 control-label">email</label>
  44. <div class="col-sm-10">
  45. <input type="text" name="email" class="form-control" id="email_update_input" placeholder="email@gmial.com">
  46. <span class="help-block"></span>
  47. </div>
  48. </div>
  49. <div class="form-group">
  50. <label class="col-sm-2 control-label">gender</label>
  51. <div class="col-sm-10">
  52. <label class="radio-inline">
  53. <input type="radio" name="gender" id="gender1_update_input" value="M" checked="checked"> 男
  54. </label>
  55. <label class="radio-inline">
  56. <input type="radio" name="gender" id="gender2_update_input" value="F"> 女
  57. </label>
  58. </div>
  59. </div>
  60. <div class="form-group">
  61. <label class="col-sm-2 control-label">deptName</label>
  62. <div class="col-sm-4">
  63. <!-- 部门提交部门id即可 -->
  64. <select class="form-control" name="dId">
  65. </select>
  66. </div>
  67. </div>
  68. </form>
  69. </div>
  70. <div class="modal-footer">
  71. <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
  72. <button type="button" class="btn btn-primary" id="emp_update_btn">更新</button>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <!-- 员工添加的模态框 -->
  78. <div class="modal fade" id="empAddModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  79. <div class="modal-dialog" role="document">
  80. <div class="modal-content">
  81. <div class="modal-header">
  82. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  83. <h4 class="modal-title" id="myModalLabel">员工添加</h4>
  84. </div>
  85. <div class="modal-body">
  86. <form class="form-horizontal">
  87. <div class="form-group">
  88. <label class="col-sm-2 control-label">empName</label>
  89. <div class="col-sm-10">
  90. <input type="text" name="empName" class="form-control" id="empName_add_input" placeholder="empName">
  91. <span class="help-block"></span>
  92. </div>
  93. </div>
  94. <div class="form-group">
  95. <label class="col-sm-2 control-label">email</label>
  96. <div class="col-sm-10">
  97. <input type="text" name="email" class="form-control" id="email_add_input" placeholder="email@gmail.com">
  98. <span class="help-block"></span>
  99. </div>
  100. </div>
  101. <div class="form-group">
  102. <label class="col-sm-2 control-label">gender</label>
  103. <div class="col-sm-10">
  104. <label class="radio-inline">
  105. <input type="radio" name="gender" id="gender1_add_input" value="M" checked="checked"> 男
  106. </label>
  107. <label class="radio-inline">
  108. <input type="radio" name="gender" id="gender2_add_input" value="F"> 女
  109. </label>
  110. </div>
  111. </div>
  112. <div class="form-group">
  113. <label class="col-sm-2 control-label">deptName</label>
  114. <div class="col-sm-4">
  115. <!-- 部门提交部门id即可 -->
  116. <select class="form-control" name="dId">
  117. </select>
  118. </div>
  119. </div>
  120. </form>
  121. </div>
  122. <div class="modal-footer">
  123. <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
  124. <button type="button" class="btn btn-primary" id="emp_save_btn">保存</button>
  125. </div>
  126. </div>
  127. </div>
  128. </div>
  129. <!-- 搭建显示页面 -->
  130. <div class="container">
  131. <!-- 标题 -->
  132. <div class="row">
  133. <div class="col-md-12">
  134. <h1>员工管理系统</h1>
  135. </div>
  136. </div>
  137. <!-- 按钮 -->
  138. <div class="row">
  139. <div class="col-md-4 col-md-offset-8">
  140. <button class="btn btn-primary" id="emp_add_modal_btn">新增</button>
  141. <button class="btn btn-danger" id="emp_delete_all_btn">删除</button>
  142. </div>
  143. </div>
  144. <!-- 显示表格数据 -->
  145. <div class="row">
  146. <div class="col-md-12">
  147. <table class="table table-hover" id="emps_table">
  148. <thead>
  149. <tr>
  150. <th>
  151. <input type="checkbox" id="check_all"/>
  152. </th>
  153. <th>#</th>
  154. <th>empName</th>
  155. <th>gender</th>
  156. <th>email</th>
  157. <th>deptName</th>
  158. <th>操作</th>
  159. </tr>
  160. </thead>
  161. <tbody>
  162. </tbody>
  163. </table>
  164. </div>
  165. </div>
  166. <!-- 显示分页信息 -->
  167. <div class="row">
  168. <!--分页文字信息 -->
  169. <div class="col-md-6" id="page_info_area"></div>
  170. <!-- 分页条信息 -->
  171. <div class="col-md-6" id="page_nav_area">
  172. </div>
  173. </div>
  174. </div>
  175. <script type="text/javascript">
  176. var totalRecord,currentPage;
  177. //1、页面加载完成以后,直接去发送ajax请求,要到分页数据
  178. $(function(){
  179. //去首页
  180. to_page(1);
  181. });
  182. function to_page(pn){
  183. $.ajax({
  184. url:"${APP_PATH}/emps",
  185. data:"pn="+pn,
  186. type:"GET",
  187. success:function(result){
  188. //console.log(result);
  189. //1、解析并显示员工数据
  190. build_emps_table(result);
  191. //2、解析并显示分页信息
  192. build_page_info(result);
  193. //3、解析显示分页条数据
  194. build_page_nav(result);
  195. }
  196. });
  197. }
  198. function build_emps_table(result){
  199. //清空table表格
  200. $("#emps_table tbody").empty();
  201. var emps = result.extend.pageInfo.list;
  202. $.each(emps,function(index,item){
  203. var checkBoxTd = $("<td><input type='checkbox' class='check_item'/></td>");
  204. var empIdTd = $("<td></td>").append(item.empId);
  205. var empNameTd = $("<td></td>").append(item.empName);
  206. var genderTd = $("<td></td>").append(item.gender=='M'?"男":"女");
  207. var emailTd = $("<td></td>").append(item.email);
  208. var deptNameTd = $("<td></td>").append(item.department.deptName);
  209. /**
  210. <button class="">
  211. <span class="" aria-hidden="true"></span>
  212. 编辑
  213. </button>
  214. */
  215. var editBtn = $("<button></button>").addClass("btn btn-primary btn-sm edit_btn")
  216. .append($("<span></span>").addClass("glyphicon glyphicon-pencil")).append("编辑");
  217. //为编辑按钮添加一个自定义的属性,来表示当前员工id
  218. editBtn.attr("edit-id",item.empId);
  219. var delBtn = $("<button></button>").addClass("btn btn-danger btn-sm delete_btn")
  220. .append($("<span></span>").addClass("glyphicon glyphicon-trash")).append("删除");
  221. //为删除按钮添加一个自定义的属性来表示当前删除的员工id
  222. delBtn.attr("del-id",item.empId);
  223. var btnTd = $("<td></td>").append(editBtn).append(" ").append(delBtn);
  224. //var delBtn =
  225. //append方法执行完成以后还是返回原来的元素
  226. $("<tr></tr>").append(checkBoxTd)
  227. .append(empIdTd)
  228. .append(empNameTd)
  229. .append(genderTd)
  230. .append(emailTd)
  231. .append(deptNameTd)
  232. .append(btnTd)
  233. .appendTo("#emps_table tbody");
  234. });
  235. }
  236. //解析显示分页信息
  237. function build_page_info(result){
  238. $("#page_info_area").empty();
  239. $("#page_info_area").append("当前"+result.extend.pageInfo.pageNum+"页,总"+
  240. result.extend.pageInfo.pages+"页,总"+
  241. result.extend.pageInfo.total+"条记录");
  242. totalRecord = result.extend.pageInfo.total;
  243. currentPage = result.extend.pageInfo.pageNum;
  244. }
  245. //解析显示分页条,点击分页要能去下一页....
  246. function build_page_nav(result){
  247. //page_nav_area
  248. $("#page_nav_area").empty();
  249. var ul = $("<ul></ul>").addClass("pagination");
  250. //构建元素
  251. var firstPageLi = $("<li></li>").append($("<a></a>").append("首页").attr("href","#"));
  252. var prePageLi = $("<li></li>").append($("<a></a>").append("&laquo;"));
  253. if(result.extend.pageInfo.hasPreviousPage == false){
  254. firstPageLi.addClass("disabled");
  255. prePageLi.addClass("disabled");
  256. }else{
  257. //为元素添加点击翻页的事件
  258. firstPageLi.click(function(){
  259. to_page(1);
  260. });
  261. prePageLi.click(function(){
  262. to_page(result.extend.pageInfo.pageNum -1);
  263. });
  264. }
  265. var nextPageLi = $("<li></li>").append($("<a></a>").append("&raquo;"));
  266. var lastPageLi = $("<li></li>").append($("<a></a>").append("末页").attr("href","#"));
  267. if(result.extend.pageInfo.hasNextPage == false){
  268. nextPageLi.addClass("disabled");
  269. lastPageLi.addClass("disabled");
  270. }else{
  271. nextPageLi.click(function(){
  272. to_page(result.extend.pageInfo.pageNum +1);
  273. });
  274. lastPageLi.click(function(){
  275. to_page(result.extend.pageInfo.pages);
  276. });
  277. }
  278. //添加首页和前一页 的提示
  279. ul.append(firstPageLi).append(prePageLi);
  280. //1,2,3遍历给ul中添加页码提示
  281. $.each(result.extend.pageInfo.navigatepageNums,function(index,item){
  282. var numLi = $("<li></li>").append($("<a></a>").append(item));
  283. if(result.extend.pageInfo.pageNum == item){
  284. numLi.addClass("active");
  285. }
  286. numLi.click(function(){
  287. to_page(item);
  288. });
  289. ul.append(numLi);
  290. });
  291. //添加下一页和末页 的提示
  292. ul.append(nextPageLi).append(lastPageLi);
  293. //把ul加入到nav
  294. var navEle = $("<nav></nav>").append(ul);
  295. navEle.appendTo("#page_nav_area");
  296. }
  297. //清空表单样式及内容
  298. function reset_form(ele){
  299. $(ele)[0].reset();
  300. //清空表单样式
  301. $(ele).find("*").removeClass("has-error has-success");
  302. $(ele).find(".help-block").text("");
  303. }
  304. //点击新增按钮弹出模态框。
  305. $("#emp_add_modal_btn").click(function(){
  306. //清除表单数据(表单完整重置(表单的数据,表单的样式))
  307. reset_form("#empAddModal form");
  308. //s$("")[0].reset();
  309. //发送ajax请求,查出部门信息,显示在下拉列表中
  310. getDepts("#empAddModal select");
  311. //弹出模态框
  312. $("#empAddModal").modal({
  313. backdrop:"static"
  314. });
  315. });
  316. //查出所有的部门信息并显示在下拉列表中
  317. function getDepts(ele){
  318. //清空之前下拉列表的值
  319. $(ele).empty();
  320. $.ajax({
  321. url:"${APP_PATH}/depts",
  322. type:"GET",
  323. success:function(result){
  324. //{"code":100,"msg":"处理成功!",
  325. //"extend":{"depts":[{"deptId":1,"deptName":"开发部"},{"deptId":2,"deptName":"测试部"}]}}
  326. //console.log(result);
  327. //显示部门信息在下拉列表中
  328. //$("#empAddModal select").append("")
  329. $.each(result.extend.depts,function(){
  330. var optionEle = $("<option></option>").append(this.deptName).attr("value",this.deptId);
  331. optionEle.appendTo(ele);
  332. });
  333. }
  334. });
  335. }
  336. //校验表单数据
  337. function validate_add_form(){
  338. //1、拿到要校验的数据,使用正则表达式
  339. var empName = $("#empName_add_input").val();
  340. var regName = /(^[a-zA-Z0-9_-]{6,16}$)|(^[\u2E80-\u9FFF]{2,5})/;
  341. if(!regName.test(empName)){
  342. //alert("用户名可以是2-5位中文或者6-16位英文和数字的组合");
  343. show_validate_msg("#empName_add_input", "error", "用户名可以是2-5位中文或者6-16位英文和数字的组合");
  344. return false;
  345. }else{
  346. show_validate_msg("#empName_add_input", "success", "");
  347. };
  348. //2、校验邮箱信息
  349. var email = $("#email_add_input").val();
  350. var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
  351. if(!regEmail.test(email)){
  352. //alert("邮箱格式不正确");
  353. //应该清空这个元素之前的样式
  354. show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
  355. /* $("#email_add_input").parent().addClass("has-error");
  356. $("#email_add_input").next("span").text("邮箱格式不正确"); */
  357. return false;
  358. }else{
  359. show_validate_msg("#email_add_input", "success", "");
  360. }
  361. return true;
  362. }
  363. //显示校验结果的提示信息
  364. function show_validate_msg(ele,status,msg){
  365. //清除当前元素的校验状态
  366. $(ele).parent().removeClass("has-success has-error");
  367. $(ele).next("span").text("");
  368. if("success"==status){
  369. $(ele).parent().addClass("has-success");
  370. $(ele).next("span").text(msg);
  371. }else if("error" == status){
  372. $(ele).parent().addClass("has-error");
  373. $(ele).next("span").text(msg);
  374. }
  375. }
  376. //校验用户名是否可用
  377. $("#empName_add_input").change(function(){
  378. //发送ajax请求校验用户名是否可用
  379. var empName = this.value;
  380. $.ajax({
  381. url:"${APP_PATH}/checkuser",
  382. data:"empName="+empName,
  383. type:"POST",
  384. success:function(result){
  385. if(result.code==100){
  386. show_validate_msg("#empName_add_input","success","用户名可用");
  387. $("#emp_save_btn").attr("ajax-va","success");
  388. }else{
  389. show_validate_msg("#empName_add_input","error",result.extend.va_msg);
  390. $("#emp_save_btn").attr("ajax-va","error");
  391. }
  392. }
  393. });
  394. });
  395. //点击保存,保存员工。
  396. $("#emp_save_btn").click(function(){
  397. //1、模态框中填写的表单数据提交给服务器进行保存
  398. //1、先对要提交给服务器的数据进行校验
  399. if(!validate_add_form()){
  400. return false;
  401. };
  402. //1、判断之前的ajax用户名校验是否成功。如果成功。
  403. if($(this).attr("ajax-va")=="error"){
  404. return false;
  405. }
  406. //2、发送ajax请求保存员工
  407. $.ajax({
  408. url:"${APP_PATH}/emp",
  409. type:"POST",
  410. data:$("#empAddModal form").serialize(),
  411. success:function(result){
  412. //alert(result.msg);
  413. if(result.code == 100){
  414. //员工保存成功;
  415. //1、关闭模态框
  416. $("#empAddModal").modal('hide');
  417. //2、来到最后一页,显示刚才保存的数据
  418. //发送ajax请求显示最后一页数据即可
  419. to_page(totalRecord);
  420. }else{
  421. //显示失败信息
  422. //console.log(result);
  423. //有哪个字段的错误信息就显示哪个字段的;
  424. if(undefined != result.extend.errorFields.email){
  425. //显示邮箱错误信息
  426. show_validate_msg("#email_add_input", "error", result.extend.errorFields.email);
  427. }
  428. if(undefined != result.extend.errorFields.empName){
  429. //显示员工名字的错误信息
  430. show_validate_msg("#empName_add_input", "error", result.extend.errorFields.empName);
  431. }
  432. }
  433. }
  434. });
  435. });
  436. //1、我们是按钮创建之前就绑定了click,所以绑定不上。
  437. //1)、可以在创建按钮的时候绑定。 2)、绑定点击.live()
  438. //jquery新版没有live,使用on进行替代
  439. $(document).on("click",".edit_btn",function(){
  440. //alert("edit");
  441. //1、查出部门信息,并显示部门列表
  442. getDepts("#empUpdateModal select");
  443. //2、查出员工信息,显示员工信息
  444. getEmp($(this).attr("edit-id"));
  445. //3、把员工的id传递给模态框的更新按钮
  446. $("#emp_update_btn").attr("edit-id",$(this).attr("edit-id"));
  447. $("#empUpdateModal").modal({
  448. backdrop:"static"
  449. });
  450. });
  451. function getEmp(id){
  452. $.ajax({
  453. url:"${APP_PATH}/emp/"+id,
  454. type:"GET",
  455. success:function(result){
  456. //console.log(result);
  457. var empData = result.extend.emp;
  458. $("#empName_update_static").text(empData.empName);
  459. $("#email_update_input").val(empData.email);
  460. $("#empUpdateModal input[name=gender]").val([empData.gender]);
  461. $("#empUpdateModal select").val([empData.dId]);
  462. }
  463. });
  464. }
  465. //点击更新,更新员工信息
  466. $("#emp_update_btn").click(function(){
  467. //验证邮箱是否合法
  468. //1、校验邮箱信息
  469. var email = $("#email_update_input").val();
  470. var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
  471. if(!regEmail.test(email)){
  472. show_validate_msg("#email_update_input", "error", "邮箱格式不正确");
  473. return false;
  474. }else{
  475. show_validate_msg("#email_update_input", "success", "");
  476. }
  477. //2、发送ajax请求保存更新的员工数据
  478. $.ajax({
  479. url:"${APP_PATH}/emp/"+$(this).attr("edit-id"),
  480. type:"PUT",
  481. data:$("#empUpdateModal form").serialize(),
  482. success:function(result){
  483. //alert(result.msg);
  484. //1、关闭对话框
  485. $("#empUpdateModal").modal("hide");
  486. //2、回到本页面
  487. to_page(currentPage);
  488. }
  489. });
  490. });
  491. //单个删除
  492. $(document).on("click",".delete_btn",function(){
  493. //1、弹出是否确认删除对话框
  494. var empName = $(this).parents("tr").find("td:eq(2)").text();
  495. var empId = $(this).attr("del-id");
  496. //alert($(this).parents("tr").find("td:eq(1)").text());
  497. if(confirm("确认删除【"+empName+"】吗?")){
  498. //确认,发送ajax请求删除即可
  499. $.ajax({
  500. url:"${APP_PATH}/emp/"+empId,
  501. type:"DELETE",
  502. success:function(result){
  503. alert(result.msg);
  504. //回到本页
  505. to_page(currentPage);
  506. }
  507. });
  508. }
  509. });
  510. //完成全选/全不选功能
  511. $("#check_all").click(function(){
  512. //attr获取checked是undefined;
  513. //我们这些dom原生的属性;attr获取自定义属性的值;
  514. //prop修改和读取dom原生属性的值
  515. $(".check_item").prop("checked",$(this).prop("checked"));
  516. });
  517. //check_item
  518. $(document).on("click",".check_item",function(){
  519. //判断当前选择中的元素是否5个
  520. var flag = $(".check_item:checked").length==$(".check_item").length;
  521. $("#check_all").prop("checked",flag);
  522. });
  523. //点击全部删除,就批量删除
  524. $("#emp_delete_all_btn").click(function(){
  525. //
  526. var empNames = "";
  527. var del_idstr = "";
  528. $.each($(".check_item:checked"),function(){
  529. //this
  530. empNames += $(this).parents("tr").find("td:eq(2)").text()+",";
  531. //组装员工id字符串
  532. del_idstr += $(this).parents("tr").find("td:eq(1)").text()+"-";
  533. });
  534. //去除empNames多余的,
  535. empNames = empNames.substring(0, empNames.length-1);
  536. //去除删除的id多余的-
  537. del_idstr = del_idstr.substring(0, del_idstr.length-1);
  538. if(confirm("确认删除【"+empNames+"】吗?")){
  539. //发送ajax请求删除
  540. $.ajax({
  541. url:"${APP_PATH}/emp/"+del_idstr,
  542. type:"DELETE",
  543. success:function(result){
  544. alert(result.msg);
  545. //回到当前页面
  546. to_page(currentPage);
  547. }
  548. });
  549. }
  550. });
  551. </script>
  552. </body>
  553. </html>