news 2026/10/15 14:24:44

SpringBoot+Vue考勤管理系统开发实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot+Vue考勤管理系统开发实践

1. 项目概述

考勤管理是企业日常运营中不可或缺的一环,传统的人工考勤方式效率低下且容易出错。这个基于SpringBoot的考勤管理系统正是为了解决这些问题而设计的。系统采用B/S架构,实现了员工信息管理、考勤记录、请假审批、数据统计等核心功能模块。

我在开发这个系统时,特别注重实际业务场景的适配性。比如针对制造业常见的三班倒考勤需求,系统支持灵活设置班次规则;针对外勤人员,开发了基于地理位置的移动端签到功能。整个系统采用前后端分离架构,前端使用Vue.js+ElementUI,后端基于SpringBoot+MyBatisPlus,数据库选用MySQL 8.0。

2. 技术架构解析

2.1 后端技术栈

SpringBoot 2.7作为基础框架,其自动配置特性大大简化了项目搭建过程。我特别使用了以下关键配置:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class }) public class AttendanceApplication { public static void main(String[] args) { SpringApplication.run(AttendanceApplication.class, args); } }

这种排除自动配置的方式,是为了实现多数据源的灵活切换。系统支持同时连接考勤机数据库和业务数据库,通过自定义的DynamicDataSource类实现数据源路由:

public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceType(); } }

2.2 前端技术方案

Vue3组合式API的使用让前端代码更易维护。考勤统计模块使用了ECharts实现可视化展示,关键配置如下:

const initChart = () => { const chartDom = document.getElementById('attendance-chart'); const myChart = echarts.init(chartDom); const option = { tooltip: { trigger: 'axis' }, legend: { data: ['正常', '迟到', '早退', '缺勤'] }, xAxis: { type: 'category', data: dates }, yAxis: { type: 'value' }, series: [ { name: '正常', type: 'bar', data: normalData }, { name: '迟到', type: 'bar', data: lateData } ] }; myChart.setOption(option); };

2.3 数据库设计

数据库设计遵循第三范式,主要表结构包括:

  • 员工表(employee): 存储员工基本信息
  • 考勤记录表(attendance): 记录每日考勤状态
  • 请假表(leave_application): 管理请假审批流程
  • 部门表(department): 组织结构管理

特别设计了考勤规则表(attendance_rule)来支持灵活的考勤策略:

CREATE TABLE `attendance_rule` ( `id` bigint NOT NULL AUTO_INCREMENT, `rule_name` varchar(50) NOT NULL COMMENT '规则名称', `work_start_time` time NOT NULL COMMENT '上班时间', `work_end_time` time NOT NULL COMMENT '下班时间', `late_minutes` int DEFAULT '30' COMMENT '迟到分钟数阈值', `early_minutes` int DEFAULT '30' COMMENT '早退分钟数阈值', `flexible_time` int DEFAULT '0' COMMENT '弹性时间(分钟)', `department_id` bigint DEFAULT NULL COMMENT '适用部门', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. 核心功能实现

3.1 考勤打卡流程

系统支持多种打卡方式:

  1. Web端打卡:适用于办公室人员
  2. 移动端GPS打卡:适用于外勤人员
  3. 考勤机对接:通过TCP协议与中控考勤机通信

打卡业务逻辑处理流程:

public AttendanceRecord handleCheckIn(CheckInDTO dto) { // 1. 验证员工状态 Employee employee = employeeService.getById(dto.getEmployeeId()); if (employee == null || employee.getStatus() != 1) { throw new BusinessException("员工不存在或已离职"); } // 2. 获取当日考勤规则 AttendanceRule rule = ruleService.getRuleByEmployee(employee.getId()); // 3. 计算考勤状态 AttendanceStatus status = calculateStatus(dto.getCheckTime(), rule); // 4. 保存记录 AttendanceRecord record = new AttendanceRecord(); record.setEmployeeId(employee.getId()); record.setCheckTime(dto.getCheckTime()); record.setStatus(status.getValue()); record.setLocation(dto.getLocation()); attendanceMapper.insert(record); return record; }

3.2 请假审批工作流

使用Activiti引擎实现多级审批流程,关键配置:

<process id="leaveApproval" name="请假审批流程"> <startEvent id="startEvent"/> <userTask id="deptLeaderAudit" name="部门领导审批"/> <userTask id="hrAudit" name="人事审批" activiti:candidateGroups="hr"/> <exclusiveGateway id="exclusiveGw"/> <endEvent id="endEvent"/> <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="deptLeaderAudit"/> <sequenceFlow id="flow2" sourceRef="deptLeaderAudit" targetRef="hrAudit"/> <sequenceFlow id="flow3" sourceRef="hrAudit" targetRef="exclusiveGw"/> <sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="endEvent"> <conditionExpression xsi:type="tFormalExpression"> <![CDATA[${approved}]]> </conditionExpression> </sequenceFlow> </process>

3.3 考勤统计报表

使用JasperReport生成PDF报表,核心SQL:

SELECT e.employee_name, d.department_name, COUNT(CASE WHEN a.status = 1 THEN 1 END) AS normal_days, COUNT(CASE WHEN a.status = 2 THEN 1 END) AS late_days, COUNT(CASE WHEN a.status = 3 THEN 1 END) AS early_days, COUNT(CASE WHEN a.status = 4 THEN 1 END) AS absent_days FROM attendance a JOIN employee e ON a.employee_id = e.id JOIN department d ON e.department_id = d.id WHERE a.check_time BETWEEN :startDate AND :endDate GROUP BY e.employee_name, d.department_name

4. 系统部署方案

4.1 开发环境配置

推荐使用以下开发环境:

  • JDK 17
  • IntelliJ IDEA 2023+
  • Node.js 16+
  • MySQL 8.0
  • Redis 6.2

Maven依赖管理特别注意这些核心依赖:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M6</version> </dependency>

4.2 生产环境部署

采用Docker容器化部署方案,docker-compose.yml关键配置:

version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - ./mysql/data:/var/lib/mysql ports: - "3306:3306" redis: image: redis:6.2-alpine ports: - "6379:6379" app: build: . ports: - "8080:8080" depends_on: - mysql - redis environment: - SPRING_PROFILES_ACTIVE=prod

Nginx配置示例,实现前后端分离部署:

server { listen 80; server_name attendance.example.com; location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://app:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

5. 开发经验与优化建议

5.1 性能优化实践

  1. 考勤数据缓存策略:
@Cacheable(value = "attendance", key = "#employeeId+'-'+#date") public AttendanceRecord getDailyRecord(Long employeeId, LocalDate date) { return attendanceMapper.selectByEmployeeAndDate(employeeId, date); }
  1. 批量导入优化:使用MyBatis的批量插入功能
@Transactional public void batchImport(List<AttendanceRecord> records) { SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH); AttendanceMapper mapper = session.getMapper(AttendanceMapper.class); records.forEach(mapper::insert); session.commit(); session.close(); }

5.2 安全防护措施

  1. JWT认证实现:
public String generateToken(UserDetails userDetails) { Map<String, Object> claims = new HashMap<>(); claims.put("roles", userDetails.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.toList())); return Jwts.builder() .setClaims(claims) .setSubject(userDetails.getUsername()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + expiration)) .signWith(SignatureAlgorithm.HS512, secret) .compact(); }
  1. SQL注入防护:始终使用预编译语句
<select id="selectByCondition" resultType="AttendanceRecord"> SELECT * FROM attendance WHERE employee_id = #{employeeId} <if test="startDate != null"> AND check_time >= #{startDate} </if> <if test="endDate != null"> AND check_time <= #{endDate} </if> </select>

5.3 常见问题排查

  1. 考勤机连接超时问题:
  • 检查网络连通性:telnet 考勤机IP 端口
  • 确认考勤机协议版本
  • 验证心跳包发送间隔(建议30秒)
  1. 移动端定位不准解决方案:
  • 增加GPS信号强度检测
  • 使用高德/百度地图API进行坐标纠偏
  • 设置合理的位置误差范围(建议300米内)
  1. 并发打卡冲突处理:
@Transactional(isolation = Isolation.SERIALIZABLE) public AttendanceRecord handleConcurrentCheckIn(CheckInDTO dto) { // 检查是否已打卡 AttendanceRecord existing = getDailyRecord(dto.getEmployeeId(), LocalDate.now()); if (existing != null) { throw new BusinessException("今日已打卡"); } return handleCheckIn(dto); }

6. 论文文档要点

论文文档包含以下核心章节:

  1. 系统需求分析
  2. 技术方案选型
  3. 系统架构设计
  4. 数据库设计
  5. 核心功能实现
  6. 系统测试方案
  7. 部署与维护指南

特别在系统测试章节,提供了详细的测试用例:

  • 考勤打卡功能测试用例表
  • 请假审批流程测试场景
  • 性能压力测试结果(支持500并发用户)
  • 安全测试报告(包括OWASP Top 10防护措施)

论文最后附有完整的系统界面截图,展示主要功能页面:

  1. 登录界面
  2. 员工考勤看板
  3. 请假申请表单
  4. 考勤统计报表
  5. 系统管理后台
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 14:24:35

深度拆解 PiDeck 工作原理:Electron 外壳如何启动与管理多个 pi RPC 进程

人工智能AI 应用代码智能体桌面应用开发工具dsh-plugin 【免费下载链接】PiDeck PiDeck 是一个开源的桌面工作台&#xff0c;用于在本地项目目录中统一管理 pi Agent 会话&#xff0c;并支持导入 Codex、Claude 本地会话以便统一浏览和恢复。支持多项目工作区、会话历史、Git 集…

作者头像 李华
网站建设 2026/10/15 14:24:22

导弹六自由度仿真模型:MATLAB/Simulink实战解析

1. 项目概述&#xff1a;导弹六自由度仿真模型的价值与意义导弹六自由度&#xff08;6-DOF&#xff09;仿真模型是航空航天领域最经典的动力学仿真案例之一。这个模型完整模拟了导弹在三维空间中的三个平移自由度和三个旋转自由度运动特性&#xff0c;涵盖了从控制系统设计到弹…

作者头像 李华
网站建设 2026/10/15 14:24:19

视频孪生产品哪家好?2026年最新避坑选型清单

视频孪生在2026年已经不算新概念了&#xff0c;但选型这件事反而比三年前更难。三年前市面上能叫得出名字的产品也就那么几家&#xff0c;现在一搜&#xff0c;做数字孪生的、做安防的、做物联网平台的&#xff0c;都说自己能做视频孪生。我们把市面上主流的几类方案都摸过一遍…

作者头像 李华
网站建设 2026/10/15 14:24:15

SpringBoot游泳用品电商系统设计与实践

1. 游泳用品电商系统设计背景去年夏天帮朋友改造他的游泳装备实体店时&#xff0c;发现传统零售模式存在三个致命伤&#xff1a;库存更新滞后导致热销泳镜断货三个月&#xff0c;手工记账造成促销价格录入错误&#xff0c;线下客流受天气影响波动极大。这促使我开始设计这套基于…

作者头像 李华
网站建设 2026/10/15 14:23:57

助农公益微信小程序开发实战:云开发架构与核心模块设计

1. 项目概述与需求拆解1.1 为什么是微信小程序&#xff0c;而不是App或者H5先聊一个很多人问过我的问题&#xff1a;做助农公益平台&#xff0c;为什么第一选择是微信小程序&#xff1f;最直接的原因有三个。第一&#xff0c;微信小程序的触达成本几乎是所有载体里最低的。对于…

作者头像 李华
网站建设 2026/10/15 14:23:11

Qwen-Image在ComfyUI中GGUF本地部署实战

1. 项目概述&#xff1a;为什么这个“便携包”值得你花40秒等一张图Qwen-Image-2.1-viggle-turbo 这个名字一出来&#xff0c;很多人第一反应是&#xff1a;又一个大模型&#xff1f;名字里带 viggle、turbo&#xff0c;听着像视频生成工具&#xff0c;但标题明确说“在 ComfyU…

作者头像 李华