基于javaweb+mysql的ssm+maven员工考勤请假管理系统(java+ssm+jsp+bootstrap+mysql)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SSM+Maven员工考勤请假管理系统(java+ssm+jsp+bootstrap+mysql)
项目介绍
本项目包含管理员、部门经理、员工三种角色;
部门经理角色包含以下功能: 个人信息管理,请假信息审批,部门考勤记录,考勤系统管理等功能。
管理员角色包含以下功能: 管理员登录,员工管理,请假统计等功能。
员工角色包含以下功能: 员工登录,员工签到,考勤记录,请假,请假记录查询等功能。
环境需要
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本; 6.是否Maven项目:是;
技术栈
- 后端:Spring+SpringMVC+Mybatis 2. 前端:JSP+CSS+JavaScript+jquery+bootstrap
使用说明
- 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven; 若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中mysql.properties配置文件中的数据库配置改为自己的配置; 4. 运行项目,输入localhost:8080/ 登录
String result = String.valueOf(unHandled);
return result;
}
//查询请假记录及状态
@RequestMapping(value = "/leaveRecord")
public String leaveRecordShow(Model model, Integer page) throws Exception {
//获取当前用户id
Subject subject = SecurityUtils.getSubject();
String id = (String) subject.getPrincipal();
Staff staff = staffService.findById(id);
int departmentId = staff.getDepartmentId();
List<Leave> list = null;
//页码对象
PagingVO pagingVO = new PagingVO();
//设置总页数
pagingVO.setTotalCount(leaveService.getDepartmentLeaveCount(departmentId));
if (page == null || page == 0) {
pagingVO.setToPageNo(1);
//按页码和用户id查询请假记录
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("departmentId",staff.getDepartmentId());
list = leaveService.findByPagingD(paramMap);
} else {
pagingVO.setToPageNo(page);
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("departmentId",staff.getDepartmentId());
list = leaveService.findByPagingD(paramMap);
}
model.addAttribute("leaveList", list);
model.addAttribute("pagingVO", pagingVO);
return "/managers/leaveRecord";
}
// 显示请假申请详细信息
@RequestMapping(value = "/leaveDetail")
public String gradeCourse(Integer recordId, Model model) throws Exception {
if (recordId == null) {
return "";
}
Leave leaveDetail= leaveService.findByRecordId(recordId);
model.addAttribute("leaveDetail", leaveDetail);
return "/managers/showLeaveDetail";
}
//更新请假单审核信息
String tel = request.getParameter("tel");
String email = request.getParameter("email");
String hobby = request.getParameter("hobby");
String password = request.getParameter("password");
// 正则表达式,用于验证整数和日期
String intRegex = "^-?[1-9]\\d*$";
String dateRegex = "^\\d{4}-\\d{2}-\\d{2}$";
Pattern intPattern = Pattern.compile(intRegex);
Pattern datePattern = Pattern.compile(dateRegex);
// 判断departmentId是否为整数
String departmentIdStr = request.getParameter("departmentId");
if (departmentIdStr != null && !departmentIdStr.isEmpty() && intPattern.matcher(departmentIdStr).matches()) {
departmentId = Integer.parseInt(departmentIdStr);
}
// 判断role是否为整数
String roleStr = request.getParameter("role");
if (roleStr != null && !roleStr.isEmpty() && intPattern.matcher(roleStr).matches()) {
role = Integer.parseInt(roleStr);
}
// 判断grade是否为日期
String gradeStr = request.getParameter("grade");
if (gradeStr != null && !gradeStr.isEmpty() && datePattern.matcher(gradeStr).matches()) {
grade = new SimpleDateFormat("yyyy-MM-dd").parse(gradeStr);
}
// 判断birthday是否为日期
String birthdayStr = request.getParameter("birthday");
if (birthdayStr != null && !birthdayStr.isEmpty() && datePattern.matcher(birthdayStr).matches()) {
birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthdayStr);
}
Staff staff = new Staff();
staff.setStaffId(staffId);
staff.setStaffName(staffName);
staff.setSex(sex);
staff.setDepartmentId(departmentId);
staff.setRole(role);
staff.setGrade(grade);
staff.setBirthday(birthday);
staff.setTel(tel);
staff.setEmail(email);
staff.setHobby(hobby);
staff.setPassword(password);
staffService.updateById(staff);
/**
*/
@Controller
public class LoginController {
//登录跳转
@RequestMapping(value = "/login", method = {RequestMethod.GET})
public String loginUI() throws Exception {
return "/login";
}
@RequestMapping(value="/logout",method = {RequestMethod.GET})
public String logout() throws Exception{
return "/login";
}
//登录表单处理
@RequestMapping(value = "/login", method = {RequestMethod.POST})
public String login(Model model,Staff staff) throws Exception {
//Shiro实现登录
UsernamePasswordToken token = new UsernamePasswordToken(staff.getStaffId(),
staff.getPassword());
Subject subject = SecurityUtils.getSubject();
//如果获取不到用户名就是登录失败,但登录失败的话,会直接抛出异常
subject.login(token);
}
//错误信息
String message = customException.getMessage();
//错误信息传递和错误页面跳转
modelAndView.addObject("message", message);
modelAndView.setViewName("/error");
return modelAndView;
}
}
/**
*/
@Controller
public class LoginController {
//登录跳转
@RequestMapping(value = "/login", method = {RequestMethod.GET})
public String loginUI() throws Exception {
return "/login";
List<Leave> list = null;
//页码对象
PagingVO pagingVO = new PagingVO();
//设置总页数
pagingVO.setTotalCount(leaveService.getDepartmentLeaveCount(departmentId));
if (page == null || page == 0) {
pagingVO.setToPageNo(1);
//按页码和用户id查询请假记录
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("departmentId",staff.getDepartmentId());
list = leaveService.findByPagingD(paramMap);
} else {
pagingVO.setToPageNo(page);
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("departmentId",staff.getDepartmentId());
list = leaveService.findByPagingD(paramMap);
}
model.addAttribute("leaveList", list);
model.addAttribute("pagingVO", pagingVO);
return "/managers/leaveRecord";
}
// 显示请假申请详细信息
@RequestMapping(value = "/leaveDetail")
public String gradeCourse(Integer recordId, Model model) throws Exception {
if (recordId == null) {
return "";
}
Leave leaveDetail= leaveService.findByRecordId(recordId);
model.addAttribute("leaveDetail", leaveDetail);
return "/managers/showLeaveDetail";
}
//更新请假单审核信息
@RequestMapping(value="/handleLeave")
//用户名错误异常
modelAndView.addObject("message", "密码错误");
modelAndView.setViewName("/error");
return modelAndView;
}
else {
customException = new CustomException(e.getMessage());
}
//错误信息
String message = customException.getMessage();
//错误信息传递和错误页面跳转
modelAndView.addObject("message", message);
modelAndView.setViewName("/error");
return modelAndView;
}
}
/**
*/
@Controller
public class LoginController {
//登录跳转
@RequestMapping(value = "/login", method = {RequestMethod.GET})
public String loginUI() throws Exception {
// 修改员工信息处理
@RequestMapping(value = "/editStaff", method = {RequestMethod.POST})
@ResponseBody
public boolean editStaff(int role,int department,String staffId) throws Exception {
Map<String,Object> paramMap = new HashMap<String, Object>();
paramMap.put("staffId",staffId);
paramMap.put("department",department);
paramMap.put("role",role);
staffCustomService.editStaff(paramMap);
return true;
}
// 删除员工
@RequestMapping(value = "/removeStaff"/*, method = {RequestMethod.GET} */)
public String removeStaff(String id) throws Exception {
if (id == null) {
//加入没有带员工id就进来的话就返回员工显示页面
return "/admin/showStaff";
}
staffCustomService.removeById(id);
loginService.removeById(id);
return "redirect:/admin/showStaff";
}
// 搜索员工
@RequestMapping(value = "/selectStaff")
public String selectStaff(String findByName, Model model) throws Exception {
List<StaffCustom> list = staffCustomService.findByName(findByName);
model.addAttribute("staffList", list);
return "/admin/showStaff";
}
// 考勤记录统计查询页面显示
@RequestMapping(value = "/showSign")
public String showSign() throws Exception {
return "/admin/showSign";
}
// 考勤记录统计查询
@RequestMapping(value = "/loadReportInfoData")
public String loadReportInfoData(Model model,ReportInfo reportInfo) throws Exception {
List<ReportInfo> reportInfoList = new ArrayList<ReportInfo>();
try {
reportInfoList = adminService.loadReportInfoData(reportInfo);
} catch (Exception e) {
// 搜索员工
@RequestMapping(value = "/selectStaff")
public String selectStaff(String findByName, Model model) throws Exception {
List<StaffCustom> list = staffCustomService.findByName(findByName);
model.addAttribute("staffList", list);
return "/admin/showStaff";
}
// 考勤记录统计查询页面显示
@RequestMapping(value = "/showSign")
public String showSign() throws Exception {
return "/admin/showSign";
}
// 考勤记录统计查询
@RequestMapping(value = "/loadReportInfoData")
public String loadReportInfoData(Model model,ReportInfo reportInfo) throws Exception {
List<ReportInfo> reportInfoList = new ArrayList<ReportInfo>();
try {
reportInfoList = adminService.loadReportInfoData(reportInfo);
} catch (Exception e) {
e.printStackTrace();
}
model.addAttribute("reportInfoList", reportInfoList);
return "/admin/showSign";
}
//考勤记录详细信息显示
@RequestMapping(value = "/loadReportDetailData")
public void loadReportDetailData(PrintWriter printWriter,String reportId, Model model) throws Exception {
List<ReportDetail> reportDetailList = new ArrayList<ReportDetail>();
try {
reportDetailList = adminService.loadReportDetailData(reportId);
} catch (Exception e) {
e.printStackTrace();
}
/*model.addAttribute("reportDetailList", reportDetailList);*/
/*System.out.println(reportDetailList.size());*/
String resultJson = JSON.toJSONString(reportDetailList);
printWriter.write(resultJson);
printWriter.flush();
printWriter.close();
}
}
Staff staff = new Staff();
staff.setStaffId(staffId);
staff.setStaffName(staffName);
staff.setSex(sex);
staff.setDepartmentId(departmentId);
staff.setRole(role);
staff.setGrade(grade);
staff.setBirthday(birthday);
staff.setTel(tel);
staff.setEmail(email);
staff.setHobby(hobby);
staff.setPassword(password);
staffService.updateById(staff);
return "redirect:/staff/showMassage";
}
//查询考勤记录
@RequestMapping(value = "/signRecord")
public String signRecordShow(Model model, Integer page) throws Exception {
//获取当前用户id
Subject subject = SecurityUtils.getSubject();
String id = (String) subject.getPrincipal();
List<Sign> list = null;
//页码对象
PagingVO pagingVO = new PagingVO();
//设置总页数
pagingVO.setTotalCount(signService.getCountSign(id));
if (page == null || page == 0) {
pagingVO.setToPageNo(1);
//按页码和用户id查询考勤记录
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("id", id);
list = signService.findByPaging(paramMap);
} else {
pagingVO.setToPageNo(page);
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("id", id);
list = signService.findByPaging(paramMap);
}
model.addAttribute("signList", list);
@Controller
@RequestMapping(value = "/staff")
public class StaffController {
@Resource(name = "staffServiceImpl")
private StaffService staffService;
@Resource(name = "signServiceImpl")
private SignService signService;
@Resource(name = "leaveServiceImpl")
private LeaveService leaveService;
@Resource(name = "departmentServiceImpl")
private DepartmentService departmentService;
//签到签退
@RequestMapping(value="/sign")
public String staffSign() throws Exception {
return "/staff/sign";
}
//签到
@RequestMapping(value="/signIn")
public void staffSignIn(HttpServletResponse response) throws Exception {
//获取当前用户id
Subject subject = SecurityUtils.getSubject();
String id = (String) subject.getPrincipal();
Staff staff = staffService.findById(id);
//获取当前时间
public String signRecordShow(Model model, Integer page) throws Exception {
//获取当前用户id
Subject subject = SecurityUtils.getSubject();
String id = (String) subject.getPrincipal();
List<Sign> list = null;
//页码对象
PagingVO pagingVO = new PagingVO();
//设置总页数
pagingVO.setTotalCount(signService.getCountSign(id));
if (page == null || page == 0) {
pagingVO.setToPageNo(1);
//按页码和用户id查询考勤记录
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("id", id);
list = signService.findByPaging(paramMap);
} else {
pagingVO.setToPageNo(page);
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("id", id);
list = signService.findByPaging(paramMap);
}
model.addAttribute("signList", list);
model.addAttribute("pagingVO", pagingVO);
return "/staff/signRecord";
}
//请假申请
@RequestMapping(value="/leave")
public String leave() throws Exception {
return "/staff/leave";
}
@RequestMapping(value="/handinLeave")
public String handinLeave(String leavetime,String reason) throws Exception {
//获取当前用户id
Subject subject = SecurityUtils.getSubject();
@Controller
@RequestMapping(value = "/managers")
public class ManagerController {
@Resource(name = "staffServiceImpl")
private StaffService staffService;
@Resource(name = "departmentServiceImpl")
private DepartmentService departmentService;
@Resource(name = "signServiceImpl")
private SignService signService;
@Resource(name = "leaveServiceImpl")
private LeaveService leaveService;
//显示个人信息
@RequestMapping(value="/showMassage", method = {RequestMethod.GET})
public String staffMassageShow(Model model) throws Exception {
//获取当前用户id
Subject subject = SecurityUtils.getSubject();
String id = (String) subject.getPrincipal();
//通过id获取员工信息
Staff staff = staffService.findById(id);
if (staff == null) {
throw new CustomException("未找到员工信息");
}
List<Department> list = departmentService.finAll();
model.addAttribute("departmentList", list);
model.addAttribute("staff", staff);
return "/managers/showMassage";
}
//更新个人信息
@RequestMapping(value="/showMassage", method = {RequestMethod.POST})
public String staffMassageUpdate(String tel,String email,String hobby) throws Exception {
//获取当前用户id
Subject subject = SecurityUtils.getSubject();
String id = (String) subject.getPrincipal();
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("id",id);
paramMap.put("tel",tel);
paramMap.put("email",email);
paramMap.put("hobby",hobby);
@RequestMapping(value = "/login", method = {RequestMethod.POST})
public String login(Model model,Staff staff) throws Exception {
//Shiro实现登录
UsernamePasswordToken token = new UsernamePasswordToken(staff.getStaffId(),
staff.getPassword());
Subject subject = SecurityUtils.getSubject();
//如果获取不到用户名就是登录失败,但登录失败的话,会直接抛出异常
subject.login(token);
if (subject.hasRole("admin")) {
return "redirect:/admin/showStaff";
} else if (subject.hasRole("manager")) {
return "redirect:/managers/showMassage";
} else if (subject.hasRole("staff")) {
return "redirect:/staff/sign";
}
return "/login";
}
}
/**
*/
@Controller
public class RestPasswordController {
@Resource(name = "loginServiceImpl")
private LoginService loginService;
// 本账户密码重置
@RequestMapping(value = "/passwordReset", method = {RequestMethod.POST})
}
//查询请假记录及状态
@RequestMapping(value = "/leaveRecord")
public String leaveRecordShow(Model model, Integer page) throws Exception {
//获取当前用户id
Subject subject = SecurityUtils.getSubject();
String id = (String) subject.getPrincipal();
List<Leave> list = null;
//页码对象
PagingVO pagingVO = new PagingVO();
//设置总页数
pagingVO.setTotalCount(leaveService.getCountLeave(id));
if (page == null || page == 0) {
pagingVO.setToPageNo(1);
//按页码和用户id查询请假记录
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("id", id);
list = leaveService.findByPaging(paramMap);
} else {
pagingVO.setToPageNo(page);
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("toPageNo", pagingVO.getTopageNo());
paramMap.put("pageSize", pagingVO.getPageSize());
paramMap.put("id", id);
list = leaveService.findByPaging(paramMap);
}
model.addAttribute("leaveList", list);
model.addAttribute("pagingVO", pagingVO);
return "/staff/leaveRecord";
}
// 显示请假申请详细信息
@RequestMapping(value = "/leaveDetail")
public String gradeCourse(Integer recordId, Model model) throws Exception {
if (recordId == null) {
return "";
}
Leave leaveDetail= leaveService.findByRecordId(recordId);
model.addAttribute("leaveDetail", leaveDetail);
return "/staff/showLeaveDetail";
}
//修改密码
@RequestMapping(value = "/passwordReset")
}
model.addAttribute("reportInfoList", reportInfoList);
return "/admin/showSign";
}
//考勤记录详细信息显示
@RequestMapping(value = "/loadReportDetailData")
public void loadReportDetailData(PrintWriter printWriter,String reportId, Model model) throws Exception {
List<ReportDetail> reportDetailList = new ArrayList<ReportDetail>();
try {
reportDetailList = adminService.loadReportDetailData(reportId);
} catch (Exception e) {
e.printStackTrace();
}
/*model.addAttribute("reportDetailList", reportDetailList);*/
/*System.out.println(reportDetailList.size());*/
String resultJson = JSON.toJSONString(reportDetailList);
printWriter.write(resultJson);
printWriter.flush();
printWriter.close();
}
// 请假记录查询页面显示
@RequestMapping(value = "/showLeave")
public String showLeave() throws Exception {
return "/admin/showLeave";
}
// 请假记录查询页面显示
@RequestMapping(value = "/showLeaveRecord")
@ResponseBody
public Map<String, Object> showLeaveRecord(String searchText) throws Exception {
searchText = searchText == null?"":searchText;
List<Leave> leaveList = new ArrayList<Leave>();
List<Leave> returnLeaves = new ArrayList<Leave>();
try {
leaveList = adminService.loadLeaveList();
String resultJson = JSON.toJSONString(reportDetailList);
printWriter.write(resultJson);
printWriter.flush();
printWriter.close();
}
// 请假记录查询页面显示
@RequestMapping(value = "/showLeave")
public String showLeave() throws Exception {
return "/admin/showLeave";
}
// 请假记录查询页面显示
@RequestMapping(value = "/showLeaveRecord")
@ResponseBody
public Map<String, Object> showLeaveRecord(String searchText) throws Exception {
searchText = searchText == null?"":searchText;
List<Leave> leaveList = new ArrayList<Leave>();
List<Leave> returnLeaves = new ArrayList<Leave>();
try {
leaveList = adminService.loadLeaveList();
} catch (Exception e) {
e.printStackTrace();
}
for(Leave leave:leaveList) {
if(String.valueOf(leave.getStaffId()).contains(searchText)) {
returnLeaves.add(leave);
}
}
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
JSONArray jarray = JSONArray.fromObject(returnLeaves,jsonConfig);
for (int i = 0; i < jarray.size(); i++) {
JSONObject json=new JSONObject();
json=jarray.getJSONObject(i);
if(json.get("handleTime")==null||!"".equals(json.get("handleTime"))){//因为在添加的时候只有这个值可能为NULL所以我就判断了这个。
json.put("handleTime", "--");
jarray.set(i,json);
}
}
}
//更新请假单审核信息
@RequestMapping(value="/handleLeave")
@ResponseBody
public boolean handleLeave(String reply,String result,Integer recordId) throws Exception {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("recordId",recordId);
paramMap.put("reply",reply);
paramMap.put("result",result);
leaveService.handleLeave(paramMap);
return true;
}
}
/**
* 全局异常处理器
* springmvc提供一个HandlerExceptionResolver接口
* 只要实现该接口,并配置到spring 容器里,该类就能
* 成为默认全局异常处理类
*
* 全局异常处理器只有一个,配置多个也没用。
*/
public class CustomExceptionResolver implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
CustomException customException;
if (e instanceof CustomException) {
customException = (CustomException)e;
return "/admin/showLeave";
}
// 请假记录查询页面显示
@RequestMapping(value = "/showLeaveRecord")
@ResponseBody
public Map<String, Object> showLeaveRecord(String searchText) throws Exception {
searchText = searchText == null?"":searchText;
List<Leave> leaveList = new ArrayList<Leave>();
List<Leave> returnLeaves = new ArrayList<Leave>();
try {
leaveList = adminService.loadLeaveList();
} catch (Exception e) {
e.printStackTrace();
}
for(Leave leave:leaveList) {
if(String.valueOf(leave.getStaffId()).contains(searchText)) {
returnLeaves.add(leave);
}
}
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
JSONArray jarray = JSONArray.fromObject(returnLeaves,jsonConfig);
for (int i = 0; i < jarray.size(); i++) {
JSONObject json=new JSONObject();
json=jarray.getJSONObject(i);
if(json.get("handleTime")==null||!"".equals(json.get("handleTime"))){//因为在添加的时候只有这个值可能为NULL所以我就判断了这个。
json.put("handleTime", "--");
jarray.set(i,json);
}
}
Map<String, Object> map = new HashMap<String, Object>();
if(returnLeaves != null) {
map.put("total", jarray.size());
map.put("rows", jarray);
}
/*String resultJson = JSON.toJSONString(leaveList);
System.out.println(resultJson);*/
return map;