项目介绍
进入21世纪网络和计算机得到了飞速发展,并和生活进行了紧密的结合。目前,网络的运行速度以达到了千兆,覆盖范围更是深入到生活中的角角落落。这就促使管理系统的发展。网上办公可以实现远程处理事务,远程提交工作和随时追踪工作的状态。网上管理系统给人们带来前所未有的体验,满足了新时代人们的办公需求,所以网上管理系统模式得到大力发展。
本系统为企业人事管理系统,是采用计算机和网络技术进行开发的在线人事管理平台,可以实现考勤管理、在线请假、薪资管理、基础数据管理、合同管理等。本系统采用JAVA语言SSM框架,数据库为Mysql,运行环境为Idea。使用角色分为员工、管理员、人事,本系统的功能包括合同管理、考勤管理、请假管理、人事管理、薪资管理、员工管理等。其中,员工负责浏览信息、可以在线请假,查看自己的考勤信息,查看自己的薪资等。人事负责员工管理。本系统实现了人事的在线管理,方便了员工、人事和管理员三方的利益,提高人事管理的效率,更符合现代人生活。
3.2系统功能结构
系统的功能结构是系统实现的框架,本系统的主要结构为管理员和员工、人事。管理员的功能为个人中心管理、员工管理、部门信息管理、考勤信息管理、薪资信息管理、请假信息管理等。员工的功能为申请请假、查询考勤、管理个人资料、查询薪资、查看合同等。人事的功能为管理员工信息。本企业人事管理系统功能结构图如下图3-1所示:
开发环境
编程语言:Java
数据库 :Mysql
系统架构:B/S
后端框架:SSM
编译工具:idea或者eclipse,jdk1.8,maven
支持定做:java/php/python/android/小程序/vue/爬虫/c#/asp.net
系统实现
4.2登录功能的界面实现
系统运行调试后,需要登录。登录界面设计的目的是保证当前的使用角色等级。管理员同样需要登录后才可以进行操作。在登录时只需要填写用户账号和密码、选择权限就可以实现。用户登录的运行界面如下图4-2所示:
图4-2用户登录的运行界面
在登录的界面中包含的元素有系统题目、输入框、登录按钮、选择框。本系统的使用权限为管理员和员工、人事。权限选择框的运行界面如下图4-3所示:
图4-3权限选择框运行界面
4.3管理员功能的设计实现
4.3.1员工信息管理功能的实现界面
员工的信息可由管理员添加,本功能设计的目的是添加和审核员工的资料,当发现不当的使用员工可以删除其账号。当删除员工信息后相对应的员工信息表里的信息也会随着删除掉。查询员工信息功能的运行界面如下图4-4所示:
图4-4查询员工信息功能的运行界面
4.3.2 个人中心管理功能的实现界面
个人中心管理的内容包括当前登录账号修改、密码信息。本系统中可以拥有多个管理员。个人中心管理功能的运行界面如下图4-5所示:
图4-5个人中心管理功能的运行界面
4.3.3基础数据管理功能的实现界面
基础数据包括部门信息、职位信息以及请假类型。管理员可以添加部门和管理员工的职位以及设置请假的类型。部门信息管理功能的运行界面如下图4-6所示:
图4-6部门信息管理功能的运行界面
职位信息可以查询和更新、修改。查询职位信息的运行界面如下图4-7所示:
图4-7查询职位信息的运行界面
4.3.4 考勤管理功能的实现界面
管理员可以查看所有员工的考勤信息,可以进行查找和统计。考勤统计功能的运行界面如下图4-8所示:
图4.8考勤统计管理运行界面
管理员可以添加和管理员工的考勤信息,添加考勤运行界面如下图4-9所示:
图4-9添加考勤信息的运行界面展示
4.3.5请假信息管理功能的实现界面
管理员可以收到员工的请假申请,可以进行审核和修改管理。请假信息管理功能的实现界面如下图4-10所示:
图4-10请假信息管理功能的实现界面
4.3.6员工薪资管理功能的实现界面
管理员可以发布员工的薪资,员工查询的薪资都是由此功能进行发布的。管理员查询员工薪资的实现界面如下图4-11所示:
图4-11管理员查询薪资的实现界面
4.3.7合同管理功能的实现界面
可以查看合同和制定合同,实现界面如下图4-12所示:
图4-12合同管理界面
4.3.8人事管理功能的实现界面
管理员可以审核人事的资料信息,实现界面如下图4-13所示:
图4-13查询人事信息的实现界面
4.4员工角色功能的界面实现
4.4.1请假信息管理功能的界面实现
员工的功能主要为申请请假、考勤管理和薪资、合同查询。在申请请假时需要填写请假原因、请假时间等。员工在线请假功能的运行界面如下图4-14所示:
图4-14员工在线请假功能的运行界面
4.4.2考勤管理功能的实现界面
员工可以查询考勤信息。考勤信息功能的运行界面如下图4-15所示:
图4-15考勤管理功能的运行界面
4.4.3个人资料管理功能的实现界面
员工可以修改个人的资料,可以使个人的资料更准确。修改个人资料的实现界面如下图4-16所示:
图4-16修改个人资料的功能实现界面
4.4.4薪资信息管理功能的实现界面
员工可以查询薪资详情。员工查询薪资的实现界面如下图4-17所示:
图4-17员工查询薪资的实现界面
4.4.5合同管理功能的实现界面
员工也可以查询自己的合同,然后进行签订,实现界面如下图4-18所示:
图4-18查询合同功能的实现界面
4.5人事权限的功能实现
人事的功能为管理个人资料和员工信息。人事权限的功能实现界面如下图4-19所示:
图4-19人事权限的功能实现界面
核心代码
package com.controller;
import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;
/**
* 人事
* 后端接口
* @author
* @email
*/
@RestController
@Controller
@RequestMapping("/renshi")
public class RenshiController {
private static final Logger logger = LoggerFactory.getLogger(RenshiController.class);
@Autowired
private RenshiService renshiService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private YuangongService yuangongService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("员工".equals(role))
params.put("yuangongId",request.getSession().getAttribute("userId"));
else if("人事".equals(role))
params.put("renshiId",request.getSession().getAttribute("userId"));
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = renshiService.queryPage(params);
//字典表数据转换
List<RenshiView> list =(List<RenshiView>)page.getList();
for(RenshiView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
RenshiEntity renshi = renshiService.selectById(id);
if(renshi !=null){
//entity转view
RenshiView view = new RenshiView();
BeanUtils.copyProperties( renshi , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody RenshiEntity renshi, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,renshi:{}",this.getClass().getName(),renshi.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
Wrapper<RenshiEntity> queryWrapper = new EntityWrapper<RenshiEntity>()
.eq("username", renshi.getUsername())
.or()
.eq("renshi_phone", renshi.getRenshiPhone())
.or()
.eq("renshi_id_number", renshi.getRenshiIdNumber())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
RenshiEntity renshiEntity = renshiService.selectOne(queryWrapper);
if(renshiEntity==null){
renshi.setInsertTime(new Date());
renshi.setCreateTime(new Date());
renshi.setPassword("123456");
renshiService.insert(renshi);
return R.ok();
}else {
return R.error(511,"账户或者人事手机号或者人事身份证号已经被使用");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody RenshiEntity renshi, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,renshi:{}",this.getClass().getName(),renshi.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
//根据字段查询是否有相同数据
Wrapper<RenshiEntity> queryWrapper = new EntityWrapper<RenshiEntity>()
.notIn("id",renshi.getId())
.andNew()
.eq("username", renshi.getUsername())
.or()
.eq("renshi_phone", renshi.getRenshiPhone())
.or()
.eq("renshi_id_number", renshi.getRenshiIdNumber())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
RenshiEntity renshiEntity = renshiService.selectOne(queryWrapper);
if("".equals(renshi.getRenshiPhoto()) || "null".equals(renshi.getRenshiPhoto())){
renshi.setRenshiPhoto(null);
}
if(renshiEntity==null){
renshiService.updateById(renshi);//根据id更新
return R.ok();
}else {
return R.error(511,"账户或者人事手机号或者人事身份证号已经被使用");
}
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
renshiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
try {
List<RenshiEntity> renshiList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
RenshiEntity renshiEntity = new RenshiEntity();
// renshiEntity.setUsername(data.get(0)); //账户 要改的
// //renshiEntity.setPassword("123456");//密码
// renshiEntity.setRenshiName(data.get(0)); //人事姓名 要改的
// renshiEntity.setRenshiPhone(data.get(0)); //人事手机号 要改的
// renshiEntity.setRenshiIdNumber(data.get(0)); //人事身份证号 要改的
// renshiEntity.setRenshiPhoto("");//照片
// renshiEntity.setSexTypes(Integer.valueOf(data.get(0))); //性别 要改的
// renshiEntity.setRenshiEmail(data.get(0)); //电子邮箱 要改的
// renshiEntity.setInsertTime(date);//时间
// renshiEntity.setCreateTime(date);//时间
renshiList.add(renshiEntity);
//把要查询是否重复的字段放入map中
//账户
if(seachFields.containsKey("username")){
List<String> username = seachFields.get("username");
username.add(data.get(0));//要改的
}else{
List<String> username = new ArrayList<>();
username.add(data.get(0));//要改的
seachFields.put("username",username);
}
//人事手机号
if(seachFields.containsKey("renshiPhone")){
List<String> renshiPhone = seachFields.get("renshiPhone");
renshiPhone.add(data.get(0));//要改的
}else{
List<String> renshiPhone = new ArrayList<>();
renshiPhone.add(data.get(0));//要改的
seachFields.put("renshiPhone",renshiPhone);
}
//人事身份证号
if(seachFields.containsKey("renshiIdNumber")){
List<String> renshiIdNumber = seachFields.get("renshiIdNumber");
renshiIdNumber.add(data.get(0));//要改的
}else{
List<String> renshiIdNumber = new ArrayList<>();
renshiIdNumber.add(data.get(0));//要改的
seachFields.put("renshiIdNumber",renshiIdNumber);
}
}
//查询是否重复
//账户
List<RenshiEntity> renshiEntities_username = renshiService.selectList(new EntityWrapper<RenshiEntity>().in("username", seachFields.get("username")));
if(renshiEntities_username.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(RenshiEntity s:renshiEntities_username){
repeatFields.add(s.getUsername());
}
return R.error(511,"数据库的该表中的 [账户] 字段已经存在 存在数据为:"+repeatFields.toString());
}
//人事手机号
List<RenshiEntity> renshiEntities_renshiPhone = renshiService.selectList(new EntityWrapper<RenshiEntity>().in("renshi_phone", seachFields.get("renshiPhone")));
if(renshiEntities_renshiPhone.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(RenshiEntity s:renshiEntities_renshiPhone){
repeatFields.add(s.getRenshiPhone());
}
return R.error(511,"数据库的该表中的 [人事手机号] 字段已经存在 存在数据为:"+repeatFields.toString());
}
//人事身份证号
List<RenshiEntity> renshiEntities_renshiIdNumber = renshiService.selectList(new EntityWrapper<RenshiEntity>().in("renshi_id_number", seachFields.get("renshiIdNumber")));
if(renshiEntities_renshiIdNumber.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(RenshiEntity s:renshiEntities_renshiIdNumber){
repeatFields.add(s.getRenshiIdNumber());
}
return R.error(511,"数据库的该表中的 [人事身份证号] 字段已经存在 存在数据为:"+repeatFields.toString());
}
renshiService.insertBatch(renshiList);
return R.ok();
}
}
}
}catch (Exception e){
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
/**
* 登录
*/
@IgnoreAuth
@RequestMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
RenshiEntity renshi = renshiService.selectOne(new EntityWrapper<RenshiEntity>().eq("username", username));
if(renshi==null || !renshi.getPassword().equals(password))
return R.error("账号或密码不正确");
// // 获取监听器中的字典表
// ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
// Map<String, Map<Integer, String>> dictionaryMap= (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
// Map<Integer, String> role_types = dictionaryMap.get("role_types");
// role_types.get(.getRoleTypes());
String token = tokenService.generateToken(renshi.getId(),username, "renshi", "人事");
R r = R.ok();
r.put("token", token);
r.put("role","人事");
r.put("username",renshi.getRenshiName());
r.put("tableName","renshi");
r.put("userId",renshi.getId());
return r;
}
/**
* 注册
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody RenshiEntity renshi){
// ValidatorUtils.validateEntity(user);
Wrapper<RenshiEntity> queryWrapper = new EntityWrapper<RenshiEntity>()
.eq("username", renshi.getUsername())
.or()
.eq("renshi_phone", renshi.getRenshiPhone())
.or()
.eq("renshi_id_number", renshi.getRenshiIdNumber())
;
RenshiEntity renshiEntity = renshiService.selectOne(queryWrapper);
if(renshiEntity != null)
return R.error("账户或者人事手机号或者人事身份证号已经被使用");
renshi.setInsertTime(new Date());
renshi.setCreateTime(new Date());
renshiService.insert(renshi);
return R.ok();
}
/**
* 重置密码
*/
@GetMapping(value = "/resetPassword")
public R resetPassword(Integer id){
RenshiEntity renshi = new RenshiEntity();
renshi.setPassword("123456");
renshi.setId(id);
renshi.setInsertTime(new Date());
renshiService.updateById(renshi);
return R.ok();
}
/**
* 忘记密码
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request) {
RenshiEntity renshi = renshiService.selectOne(new EntityWrapper<RenshiEntity>().eq("username", username));
if(renshi!=null){
renshi.setPassword("123456");
boolean b = renshiService.updateById(renshi);
if(!b){
return R.error();
}
}else{
return R.error("账号不存在");
}
return R.ok();
}
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrRenshi(HttpServletRequest request){
Integer id = (Integer)request.getSession().getAttribute("userId");
RenshiEntity renshi = renshiService.selectById(id);
if(renshi !=null){
//entity转view
RenshiView view = new RenshiView();
BeanUtils.copyProperties( renshi , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
}
论文参考
目 录
摘 要 1
Abstract 2
第1章 绪论 5
1.1课题研究背景 5
1.2课题现状与实现意义 5
1.3课题内容 6
1.4论文结构安排 6
第2章 系统分析 6
2.1系统使用相关技术分析 7
2.1.1Java语言介绍 7
2.1.2Mysql数据库介绍 7
2.1.3Tomcat服务器介绍 7
2.1.4Vue技术介绍 8
2.2系统可行性分析 8
2.2.1系统经济可行性分析 8
2.2.2系统技术可行性分析 8
2.2.3系统操作可行性分析 9
2.3系统需求分析 9
2.3.1传统管理系统优缺点分析 9
2.3.2本企业人事管理系统分析 10
2.4系统功能分析 10
2.5系统性能分析 11
2.6用例图 12
2.7系统业务流程 13
第3章 系统设计 16
3.1系统体系结构 16
3.2系统功能结构 16
3.3数据库设计 17
3.3.1ER图设计 17
3.3.2数据库表设计 19
第4章 系统实现 24
4.1系统调试运行 24
4.2登录功能的界面实现 24
4.3管理员功能的设计实现 25
4.3.1员工信息管理功能的实现界面 25
4.3.2 个人中心管理功能的实现界面 26
4.3.3基础数据管理功能的实现界面 26
4.3.4 考勤管理功能的实现界面 27
4.3.5请假信息管理功能的实现界面 28
4.3.6员工薪资管理功能的实现界面 29
4.3.7合同管理功能的实现界面 29
4.3.8人事管理功能的实现界面 29
4.4员工角色功能的界面实现 30
4.4.1请假信息管理功能的界面实现 30
4.4.2考勤管理功能的实现界面 30
4.4.3个人资料管理功能的实现界面 31
4.4.4薪资信息管理功能的实现界面 31
4.4.5合同管理功能的实现界面 32
4.5人事权限的功能实现 32
第5章 系统测试 33
5.1系统测试的方法 33
5.2测试环境与测试条件 33
5.3实例测试表格 33
5.4测试总结 34
总 结 35
致 谢 36
参考文献 37