基于Java的人事考勤签到管理系统设计与实现(源码+lw+部署文档+讲解等)

news2024/11/17 13:56:12

文章目录

  • 前言
  • 具体实现截图
  • 论文参考
  • 详细视频演示
  • 为什么选择我
    • 自己的网站
    • 自己的小程序(小蔡coding)
  • 代码参考
  • 数据库参考
  • 源码获取

前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐✅

2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐✅

Java精品实战案例《500套》

微信小程序项目精品案例《500套》

🌟文末获取源码+数据库🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

具体实现截图

主要功能:
基于java(ssm)企业人事考勤管理系统

系统分为员工和部门经理,管理员三个角色

员工 的主要功能有:
1.员工输入账户密码登陆系统
2.员工个人中心修改密码,和修改个人资料
3.员工可以查看企业的部门信息
4.员工在线打卡考勤,查询搜索考勤记录,查看考勤统计
5.员工在线签到,查看搜索签到记录
6.员工在线请假申请,查询搜索请假申请记录
7.员工查看工资发放记录,在线导出工资记录
8.退出登陆

部门经理的主要功能有:
1.部门经理注册和登陆系统
2.个人中心:部门经理修改个人资料和密码
3.员工管理:部门经理对公司的员工信息进行添加,查询,修改,删除
4.部门管理: 部门经理可以对部门信息进行添加,查询,修改,删除
5.员工考勤管理:部门经理对员工的考勤信息进行添加,查询,修改,统计,删除
6.签到管理:部门经理可以添加,查询,审核员工的签到信息
7.请假申请管理:部门经理查看员工的请假申请,对其进行请假审核
8.工资查询管理:部门经理对员工的工资进行添加,查询,修改,删除,审核,导出工资记录
9.退出登陆

管理员的主要功能有:
1.管理员输入账户登陆后台
2.个人中心:管理员修改密码和账户信息
3.员工管理:管理员对公司的员工信息进行添加,查询,修改,删除
4.部门经理管理:管理员对公司的部门经理信息进行添加,查询,修改,删除,审核
5.部门信息管理: 管理员对部门信息进行添加,查询,修改,删除
6.员工考勤管理:管理员对员工的考勤信息进行添加,查询,修改,统计,删除
7.签到管理:管理员可以添加,查询,审核员工的签到信息
8.请假申请管理:管理员查看员工的请假申请,对其进行请假审核
9.工资查询管理:管理员对员工的工资进行添加,查询,修改,删除,审核,导出工资记录
10.部门类型管理:管理员对部门的类型进行添加,修改,删除,查询
11.退出系统
Image
Image
Image

论文参考

Image

详细视频演示

请联系我获取更详细的演示视频

为什么选择我

自己的网站

网站上传的项目均为博主自己收集和开发的,质量都可以得到保障,适合自己懂一点程序开发的同学使用!

自己的小程序(小蔡coding)

为了方便同学们使用,我开发了小程序版的,名字叫小蔡coding。同学们可以通过小程序快速搜索和定位到自己想要的程序

代码参考

@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
   UsersEntity user = userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
   if(user==null || !user.getPassword().equals(password)) {
      return R.error("账号或密码不正确");
   }
   String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
   return R.ok().put("token", token);
}

	@Override
	public String generateToken(Long userid,String username, String tableName, String role) {
		TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
		String token = CommonUtil.getRandomString(32);
		Calendar cal = Calendar.getInstance();   
    	cal.setTime(new Date());   
    	cal.add(Calendar.HOUR_OF_DAY, 1);
		if(tokenEntity!=null) {
			tokenEntity.setToken(token);
			tokenEntity.setExpiratedtime(cal.getTime());
			this.updateById(tokenEntity);
		} else {
			this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime()));
		}
		return token;
	}



/**
 * 权限(Token)验证
 */
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {

    public static final String LOGIN_TOKEN_KEY = "Token";

    @Autowired
    private TokenService tokenService;
    
	@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

		//支持跨域请求
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
	// 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态
	if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
        	response.setStatus(HttpStatus.OK.value());
            return false;
        }
        
        IgnoreAuth annotation;
        if (handler instanceof HandlerMethod) {
            annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
        } else {
            return true;
        }

        //从header中获取token
        String token = request.getHeader(LOGIN_TOKEN_KEY);
        
        /**
         * 不需要验证权限的方法直接放过
         */
        if(annotation!=null) {
        	return true;
        }
        
        TokenEntity tokenEntity = null;
        if(StringUtils.isNotBlank(token)) {
        	tokenEntity = tokenService.getTokenEntity(token);
        }
        
        if(tokenEntity != null) {
        	request.getSession().setAttribute("userId", tokenEntity.getUserid());
        	request.getSession().setAttribute("role", tokenEntity.getRole());
        	request.getSession().setAttribute("tableName", tokenEntity.getTablename());
        	request.getSession().setAttribute("username", tokenEntity.getUsername());
        	return true;
        }
        
		PrintWriter writer = null;
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		try {
		    writer = response.getWriter();
		    writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
		} finally {
		    if(writer != null){
		        writer.close();
		    }
		}
//				throw new EIException("请先登录", 401);
		return false;
    }
}

数据库参考

-- ----------------------------
-- Table structure for token
-- ----------------------------
DROP TABLE IF EXISTS `token`;
CREATE TABLE `token` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `userid` bigint(20) NOT NULL COMMENT '用户id',
  `username` varchar(100) NOT NULL COMMENT '用户名',
  `tablename` varchar(100) DEFAULT NULL COMMENT '表名',
  `role` varchar(100) DEFAULT NULL COMMENT '角色',
  `token` varchar(200) NOT NULL COMMENT '密码',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
  `expiratedtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '过期时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='token表';

-- ----------------------------
-- Records of token
-- ----------------------------
INSERT INTO `token` VALUES ('9', '23', 'cd01', 'xuesheng', '学生', 'al6svx5qkei1wljry5o1npswhdpqcpcg', '2023-02-23 21:46:45', '2023-03-15 14:01:36');
INSERT INTO `token` VALUES ('10', '11', 'xh01', 'xuesheng', '学生', 'fahmrd9bkhqy04sq0fzrl4h9m86cu6kx', '2023-02-27 18:33:52', '2023-03-17 18:27:42');
INSERT INTO `token` VALUES ('11', '17', 'ch01', 'xuesheng', '学生', 'u5km44scxvzuv5yumdah2lhva0gp4393', '2023-02-27 18:46:19', '2023-02-27 19:48:58');
INSERT INTO `token` VALUES ('12', '1', 'admin', 'users', '管理员', 'h1pqzsb9bldh93m92j9m2sljy9bt1wdh', '2023-02-27 19:37:01', '2023-03-17 18:23:02');
INSERT INTO `token` VALUES ('13', '21', 'xiaohao', 'shezhang', '社长', 'zdm7j8h1wnfe27pkxyiuzvxxy27ykl2a', '2023-02-27 19:38:07', '2023-03-17 18:25:20');
INSERT INTO `token` VALUES ('14', '27', 'djy01', 'xuesheng', '学生', 'g3teq4335pe21nwuwj2sqkrpqoabqomm', '2023-03-15 12:56:17', '2023-03-15 14:00:16');
INSERT INTO `token` VALUES ('15', '29', 'dajiyue', 'shezhang', '社长', '0vb1x9xn7riewlp5ddma5ro7lp4u8m9j', '2023-03-15 12:58:08', '2023-03-15 14:03:48');

源码获取

文章下方名片联系我即可~
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻
精彩专栏推荐订阅:在下方专栏👇🏻
Java精品实战案例《500套》
微信小程序项目精品案例《500套》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1115772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pnpm的环境安装以及安装成功后无法使用的问题

文章目录 前言1、使用npm 安装2、安装后的注意点3、遇到问题4、配置path的环境变量&#xff08;1&#xff09;找到环境变量&#xff08;2&#xff09;找到并双击path的系统变量&#xff08;3&#xff09;复制第1步中使用npm安装的红框部分的路径&#xff08;4&#xff09;将第&…

推荐《幽游白书》

《幽游白书》是日本漫画家富坚义博于1990年12月3日—1994年7月25日于集英社旗下杂志《周刊少年Jump》上连载的少年漫画作品&#xff0c;全175话&#xff08;含外传一话&#xff09;。现时发行的单行本共计19册&#xff0c;电子版由漫番漫画、哔哩哔哩漫画发布 [1-2] 。 本作最…

零基础入门网络渗透到底要怎么学?_网络渗透技术自学

前言&#xff1a; 很多朋友问我&#xff0c;想搞网络安全&#xff0c;编程重要吗&#xff0c;选什么语言呢&#xff1f; 国内其实正经开设网络安全专业的学校很少&#xff0c;大部分同学是来自计算机科学、网络工程、软件工程专业的&#xff0c;甚至很多非计算机专业自学的。…

跨界合作兰博基尼,泡泡玛特带你驾驭时空“玩”有引力

近期&#xff0c;泡泡玛特携手兰博基尼汽车&#xff0c;于上海国际赛车场进行了一场玩味十足的赛道体验。25位兰博基尼车主&#xff0c;及多位汽车领域知名媒体人、kol到场参与。兰博基尼跑车巡游、专业车手驾驶的兰博基尼涂装赛车试乘、MEGA SPACE MOLLY 1000%/400%兰博基尼汽…

驱动编写应用程序控制三盏灯亮灭

应用程序 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main(int argc, char const *argv[]) {char buf[128] {0};int fd open("/dev/mych…

接口响应慢该如何排查

不知道大家有没有遇到这种情况&#xff0c;接口业务逻辑写完后&#xff0c;用 postman 一调&#xff0c;发现接口响应时间好长&#xff0c;不得不对接口进行优化。但是此时接口的代码往往逻辑比较复杂&#xff0c;调用层次也比较多&#xff0c;很难定位到耗时较长的代码块。 遇…

并发编程-线程池ForkJoinPool(二)

Fork/Join框架介绍 什么是Fork/Join Fork/Join是一个是一个并行计算的框架&#xff0c;主要就是用来支持分治任务模型。 Fork 对应的是分治任务模型里的任务分解&#xff0c;Join 对应的是结果合并。 核心思想&#xff1a;将一个大任务分成许多小任务&#xff0c;然后并行执…

【ROS 2 基础-常用工具】-7 Rviz仿真机器人

所有内容请查看&#xff1a;博客学习目录_Howe_xixi的博客-CSDN博客

学习记录683@类别不平衡问题解决的基本策略之再缩放的数学解释

什么是类别不平衡问题 分类学习方法都有一个共同的基本假设&#xff0c;即不同类别的训练样例数目相当。如果不同类别的训练样例数目稍有差别&#xff0c;通常影响不大&#xff0c;但若差别很大&#xff0c;则会对学习过程造成困扰。例如有998个反例&#xff0c;但正例只有2个…

LLDB 三种输出方式 对比及原理探索

前言 当我们的项目过大时,就会使我们项目的编译耗时过长,如何在项目运行时进项代码调试,熟练使用LLDB就可以解决这个难题,大幅度提高我们的开发效率。 什么是 LLDB? LLDB是英文Low Lever Debug的缩写,是XCode内置的为我们开发者提供的调试工具,它与LLVM编译器一起,存…

程序被加载到进程的哪个位置?

程序被加载器加载到内存后&#xff0c;通过/proc/$pid/maps文件&#xff0c;我们可以观测到程序被加载的内存位置。那么&#xff0c;通过打印进程内存的方式&#xff0c;让我们确认程序是不是真的加载到内存&#xff0c;以及加载到内存的程序和硬盘中的文件有没有区别。 编写测…

未来数字化转型发展的前景如何,企业又该怎么实现?

商业世界有一个认识&#xff0c;互联网只用看中国和美国&#xff0c;其他国家已经被远远甩在了后边&#xff0c;移动互联网的出现更是将互联网的跨地域、跨国、互联等属性发挥到了极致&#xff0c;让众多互联网巨头开启了争夺世界各国市场的脚步。 移动互联网的飞速发展以及物…

drawio模板以及示例

drawio都能做那些事情和模板示例 你可以使用drawio&#xff0c;并使用drawio提供的扩展模板库和大量的形状库&#xff0c;针对很多不同的工业领域创建不同类型的图表。 针对如下的内容中的所有的图&#xff0c;均可以下载源文件并导入到drawio中再次编辑&#xff08;供学习者…

pytorch教程

文章目录 1 pytorch的安装2 PyTorch基础知识2.1 张量简介2.2 初始化2.3 张量的属性2.4 ndarray与tensor互转2.5 索引、切片、变形、聚合、矩阵拼接、切割、转置 3 pytorch自动微分4 线性回归5 分类5.1 写法一5.2 写法二 1 pytorch的安装 pytorch官网 https://pytorch.org/get-…

Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?

一、Object.defineProperty 定义&#xff1a;Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回此对象 为什么能实现响应式 通过defineProperty 两个属性&#xff0c;get及set get 属性的 getter 函…

攻防世界web篇-backup

这是链接中的网页&#xff0c;只有一句话 试着使用.bak点缀看看是否有效 这里链接中加上index.php.bak让下在东西 是一个bak文件&#xff0c;将.bak文件改为.php文件试试 打开.php文件后就可以得到flag值

【proteus】8086仿真、汇编语言

1.创建好新项目 2.点击source code 弹出VSM 3. 4.注意两个都不勾选 可以看到schematic有原理图出现 5. 再次点击source code 6.project/project settings&#xff0c;取消勾选embed 7. add 8.输入文件名保存后&#xff1a; 注意&#xff1a;proteus不用写dos的相关语句 。

【Linux升级之路】8_Linux多线程

目录 一、【Linux初阶】多线程1 | 页表的索引作用&#xff0c;线程基础&#xff08;优缺点、异常、用途&#xff09;&#xff0c;线程VS进程&#xff0c;线程控制&#xff0c;C多线程引入二、【Linux初阶】多线程2 | 分离线程&#xff0c;线程库&#xff0c;线程互斥&#xff0…

GCC优化相关

文章目录 优化选项博文链接 单独设置某段代码优化等级博文链接 优化选项 -O/-O0:无优化(默认)-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。该模式在编译大型程序的时候会花费更多的时间和内存。在-O1 下&#xff0c;编译会尝试减少代码体积和代码…

【试题030】C语言之关系表达式例题

1.关系表达式是用关系运算符将两个表达式连接起来 错误示例&#xff1a;a<bc &#xff08;不是关系运算符&#xff0c;是赋值运算符&#xff09; 2.题目&#xff1a;设int m160,m280,m3100;&#xff0c;表达式m3>m2>m1的值是 &#xff1f; 3.代码分析&#xff1a; …