💕💕作者:计算机源码社
💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!
💕💕学习资料、程序开发、技术解答、文档报告
💕💕如需要源码,可以扫取文章下方二维码联系咨询
💕💕Java项目
💕💕微信小程序项目
💕💕Android项目
💕💕Python项目
💕💕PHP项目
💕💕ASP.NET项目
💕💕Node.js项目
💕💕选题推荐
项目实战|基于springboot企业单位考勤打卡管理系统
文章目录
- 1、选题背景
- 2、研究目的和意义
- 3、系统功能设计
- 4、系统页面设计
- 5、参考文献
- 6、核心代码
1、选题背景
在当今这个企业众多,员工众多的时代,那么保障企业基础的员工信息的考勤管理问题就显得尤为重要。有条有序的人力管理模式能提供企业最稳定的保障,是企业体现生产力的核心后援之一。随着现在网络时代的到来,互联网的冲击是所有当代人都无法避免的存在,因此,本文想设计的就是一个基于SpringBoot+Vue的企业单位考勤打卡管理系统,使得企业的考勤管理模式能更符合时代潮流的发展。基于SpringBoot Vue的企业单位考勤打卡管理系统是为了方便企业或领导人员对企业员工的管理能更加简单,提高企业对员工管理的业务效率,减轻工作量。以IDEA为开发平台,采用B/S架构。经过细心的调研和衡量,以Java技术为核心实现业务接口,以JSP进行数据的展示和操作。为了编程便捷性采用Spring框架进行项目架构管理和MySQL关系型数据库进行数据存储管理。由于基于SpringBoot Vue的企业单位考勤打卡管理系统是一个管理系统,涉及了员工的考勤、请假等信息的处理,这就触及到了大量数据信息存储的问题。因此本系统后期会对数据安全存储这一模块进行重点研究和优化,确保各个模块的信息准确性和安全性。
2、研究目的和意义
如今互联网信息技术的飞速进步,彻彻底底改变了人们的生活方式,各行各业都受到了冲击,众多企业的管理模式和方式也基本离不开网络。再加上在现在这个看重人才的时代,以人才为第一核心竞争力,大部分企业的人才储备会越来越多,就导致假如一个企业没有好的合理的企业管理模式,就会产生大量的繁琐工作,在一定程度上浪费企业成本和消耗企业人才,并且在企业组织架构重组或者大量人员变动时,那更是一大绞尽脑汁的工作。
所以假如企业拥有了一套完整合理的企业单位考勤打卡管理系统的话,可以很快解决繁琐的人员变动问题,同时企业的领导也可以根据管理系统中的信息进行工作上的安排和调整,例如系统中的考勤功能可以详细的看出员工的上班出勤情况,是否存在迟到早退甚至缺到的人员。也可以查看员工具体信息和薪资信息,进一步的对整个部门或者某个团队的生产能力有一定的把控,同时还有通讯录可以快速查看指定员工的通讯信息,增加工作效率。
总的来说,在这样的企业单位考勤打卡管理系统的帮助下,可以对员工信息管理工作以及考勤工作进行信息化管理,加强上下级之间的联系,有效地记录并查询员工信息、考勤等情况,使企业对员工的管理更加高效,大大地增加了一个企业的生产效率,给企业在这个竞争激烈的行业市场中,提高了很强的竞争力。
3、系统功能设计
员工关键功能包含员工登陆、个人信息修改、加班申请管理、打卡信息管理、工作汇报管理、请假信息管理、考勤信息管理、工资信息管理等有关功能。员工用例如下
管理员的权限是最高的,可以对系统所在功能进行查看,修改和删除等,管理员用例如下
4、系统页面设计
如需要源码,可以扫取文章下方二维码联系咨询
5、参考文献
[1]谭钊,齐杨,陈浩然,等.智慧考勤系统设计与应用[J].信息技术与标准化,2024,(Z1):93-97.
[2]汪涛.基于SpringBoot和人脸识别的企业考勤管理系统设计与实现[D].阜阳师范大学,2023. DOI:10.27846/d.cnki.gfysf.2023.000144.
[3]苏荣聪,董玉霞.基于Android技术的企业考勤信息系统的设计与实现[J].成都工业学院学报,2021,24(03):43-47.DOI:10.13542/j.cnki.51-1747/tn.2021.03.009.
[4]刘欣,王竹宁,葛妍娇,等.基于企业微信的移动考勤系统设计[J].电脑知识与技术,2021,17(26):65-68.DOI:10.14004/j.cnki.ckt.2021.2597.
[5]肖航,杨智,余茜.一种基于WEB技术的企业考勤管理系统[J].中国科技信息,2021,(15):52-54.
[6]张嘉涛,赵传超,王力华.基于企业微信平台医院健康系统的快速设计与实现[J].中国医学装备,2021,18(07):130-134.
[7]靳尹,骆文杰,江朝晖.基于人脸识别的企业考勤系统设计与实现[J].智能计算机与应用,2021,11(05):152-154+159.
[8]靳尹.基于人脸识别的企业移动考勤系统设计与实现[D].合肥工业大学,2021. DOI:10.27101/d.cnki.ghfgu.2021.001097.
[9]王鑫,乐晋昆.基于人脸识别的企业考勤系统分析与设计[J].电子世界,2021,(03):158-159.DOI:10.19353/j.cnki.dzsj.2021.03.067.
[10]范伟村.基于无线AP网络日志的考勤系统的设计与实现[D].哈尔滨工业大学,2020. DOI:10.27061/d.cnki.ghgdu.2020.006704.
[11]赵振华.智能化在企业管理中的应用[J].大众投资指南,2020,(12):81-82.
[12]欧阳志东.大型集团企业考勤自动结算系统的设计与实现[J].信息与电脑(理论版),2020,32(08):53-55.
[13]李铭钧.人脸识别技术在石化企业考勤系统的应用[J].工业控制计算机,2020,33(01):87-88.
[14]段修亮,赵霞.小型企业人事管理系统的设计与实现[J].科技风,2020,(01):76.DOI:10.19392/j.cnki.1671-7341.202001066.
[15]冯汝君.基于MIS的RS公司考勤系统设计及实施研究[D].天津大学,2019. DOI:10.27356/d.cnki.gtjdu.2019.003370.
[16]曹智.基于SSM框架的企业人事管理考勤系统的设计与实现[D].电子科技大学,2019. DOI:10.27005/d.cnki.gdzku.2019.000414.
[17]宫大伟.基于SAP HCM模块与OA系统搭建企业考勤管理框架[C]//天津市电子工业协会.天津市电子工业协会2019年年会论文集.中远海运(天津)有限公司;,2019:3.
[18]张春悦,韩飞.人脸识别系统设计[J].湖北农机化,2019,(12):85.
[19]李宇翔.企业外勤人员考勤系统的研究与实现[D].西安科技大学,2019.
[20]李雅琴.钢铁企业考勤信息系统的开发[J].数字技术与应用,2019,37(02):182-183.DOI:10.19695/j.cnki.cn12-1369.2019.02.99.
6、核心代码
/**
* 打卡信息
* 后端接口
* @author
* @email
*/
@RestController
@RequestMapping("/dakaxinxi")
public class DakaxinxiController {
@Autowired
private DakaxinxiService dakaxinxiService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,DakaxinxiEntity dakaxinxi,
HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yuangong")) {
dakaxinxi.setGonghao((String)request.getSession().getAttribute("username"));
}
EntityWrapper<DakaxinxiEntity> ew = new EntityWrapper<DakaxinxiEntity>();
PageUtils page = dakaxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, dakaxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,DakaxinxiEntity dakaxinxi,
HttpServletRequest request){
EntityWrapper<DakaxinxiEntity> ew = new EntityWrapper<DakaxinxiEntity>();
PageUtils page = dakaxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, dakaxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( DakaxinxiEntity dakaxinxi){
EntityWrapper<DakaxinxiEntity> ew = new EntityWrapper<DakaxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( dakaxinxi, "dakaxinxi"));
return R.ok().put("data", dakaxinxiService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(DakaxinxiEntity dakaxinxi){
EntityWrapper< DakaxinxiEntity> ew = new EntityWrapper< DakaxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( dakaxinxi, "dakaxinxi"));
DakaxinxiView dakaxinxiView = dakaxinxiService.selectView(ew);
return R.ok("查询打卡信息成功").put("data", dakaxinxiView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
DakaxinxiEntity dakaxinxi = dakaxinxiService.selectById(id);
return R.ok().put("data", dakaxinxi);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
DakaxinxiEntity dakaxinxi = dakaxinxiService.selectById(id);
return R.ok().put("data", dakaxinxi);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody DakaxinxiEntity dakaxinxi, HttpServletRequest request){
dakaxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(dakaxinxi);
dakaxinxiService.insert(dakaxinxi);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody DakaxinxiEntity dakaxinxi, HttpServletRequest request){
dakaxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(dakaxinxi);
dakaxinxiService.insert(dakaxinxi);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody DakaxinxiEntity dakaxinxi, HttpServletRequest request){
//ValidatorUtils.validateEntity(dakaxinxi);
dakaxinxiService.updateById(dakaxinxi);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
dakaxinxiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<DakaxinxiEntity> wrapper = new EntityWrapper<DakaxinxiEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yuangong")) {
wrapper.eq("gonghao", (String)request.getSession().getAttribute("username"));
}
int count = dakaxinxiService.selectCount(wrapper);
return R.ok().put("count", count);
}
/**
* (按值统计)
*/
@RequestMapping("/value/{xColumnName}/{yColumnName}")
public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
EntityWrapper<DakaxinxiEntity> ew = new EntityWrapper<DakaxinxiEntity>();
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yuangong")) {
ew.eq("gonghao", (String)request.getSession().getAttribute("username"));
}
List<Map<String, Object>> result = dakaxinxiService.selectValue(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* (按值统计)时间统计类型
*/
@RequestMapping("/value/{xColumnName}/{yColumnName}/{timeStatType}")
public R valueDay(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
params.put("timeStatType", timeStatType);
EntityWrapper<DakaxinxiEntity> ew = new EntityWrapper<DakaxinxiEntity>();
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yuangong")) {
ew.eq("gonghao", (String)request.getSession().getAttribute("username"));
}
List<Map<String, Object>> result = dakaxinxiService.selectTimeStatValue(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* 分组统计
*/
@RequestMapping("/group/{columnName}")
public R group(@PathVariable("columnName") String columnName,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("column", columnName);
EntityWrapper<DakaxinxiEntity> ew = new EntityWrapper<DakaxinxiEntity>();
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yuangong")) {
ew.eq("gonghao", (String)request.getSession().getAttribute("username"));
}
List<Map<String, Object>> result = dakaxinxiService.selectGroup(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
}
💕💕作者:计算机源码社
💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!
💕💕学习资料、程序开发、技术解答、文档报告
💕💕如需要源码,可以扫取文章下方二维码联系咨询