毕业设计实战:基于SpringBoot的疫情居家办公系统全流程指南

18 阅读6分钟

毕业设计实战:基于SpringBoot的疫情居家办公系统全流程指南

在开发“基于SpringBoot的疫情居家办公系统”毕业设计时,曾因“签到与外出报备时间冲突校验不完整”踩过关键坑——初期仅校验同一天的数据,忽略了时间段重叠问题,导致用户在同时间段既签到又外出,耗费1.5天重构时间校验逻辑才解决问题📝。本文分享从需求到部署的全流程要点,为同类毕设提供实战指南。

一、需求分析:聚焦居家办公核心场景

核心功能模块

管理员端
  • 员工管理:部门分配、权限设置、账号审核
  • 考勤管理:查看签到记录、审批外出报备、处理请假申请
  • 办公管理:办公设备申领审批、公司资料发布
  • 薪资管理:工资条生成、统计报表
  • 公告管理:发布通知、政策文件
员工端
  • 签到打卡:每日位置/状态签到(支持异常上报)
  • 外出报备:填写外出事由、时间、地点、健康状态
  • 请假申请:在线提交请假,附带证明材料
  • 设备申领:申请办公设备(电脑、网络等)
  • 沟通反馈:留言板、查看公告、下载资料

二、技术选型:简洁高效的组合

推荐技术栈

  • 后端:SpringBoot 2.7 + MyBatis-Plus + MySQL 8.0
  • 前端:Vue 2.x + ElementUI + Axios
  • 工具:IDEA + Maven + Git
  • 部署:Tomcat 8.5

技术优势

  • SpringBoot:快速启动,简化配置
  • MyBatis-Plus:CRUD零SQL,开发高效
  • Vue+ElementUI:组件丰富,界面美观
  • MySQL 8.0:性能稳定,支持事务

三、数据库设计:关键表结构优化

核心表设计(精简版)

签到表(sign_in)

CREATE TABLE `sign_in` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int NOT NULL COMMENT '用户ID',
  `sign_time` datetime NOT NULL COMMENT '签到时间',
  `sign_type` tinyint DEFAULT 1 COMMENT '1正常 2迟到 3早退',
  `location` varchar(200) COMMENT '签到位置',
  `work_status` tinyint COMMENT '1在家办公 2外出办公',
  `remark` varchar(500) COMMENT '备注',
  PRIMARY KEY (`id`),
  INDEX `idx_user_date` (`user_id`, `sign_time`)
);

外出报备表(out_report)

CREATE TABLE `out_report` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int NOT NULL,
  `reason` varchar(500) NOT NULL COMMENT '外出事由',
  `start_time` datetime NOT NULL COMMENT '开始时间',
  `end_time` datetime NOT NULL COMMENT '结束时间',
  `destination` varchar(200) NOT NULL COMMENT '目的地',
  `transport` tinyint COMMENT '交通工具',
  `health_status` tinyint COMMENT '1正常 2异常',
  `status` tinyint DEFAULT 1 COMMENT '1待审核 2通过 3拒绝',
  `approve_remark` varchar(500) COMMENT '审批意见',
  PRIMARY KEY (`id`),
  CHECK (`end_time` > `start_time`)
);

请假表(leave_apply)

CREATE TABLE `leave_apply` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int NOT NULL,
  `leave_type` tinyint NOT NULL COMMENT '1年假 2病假 3事假',
  `start_date` date NOT NULL,
  `end_date` date NOT NULL,
  `days` int COMMENT '请假天数',
  `reason` text NOT NULL,
  `attachment` varchar(500) COMMENT '附件路径',
  `status` tinyint DEFAULT 1 COMMENT '1待审批 2通过 3拒绝',
  PRIMARY KEY (`id`)
);

设计要点

  1. 时间校验:外出报备的结束时间必须晚于开始时间
  2. 状态管理:统一使用tinyint表示各种状态
  3. 关联清晰:所有员工相关表都关联user_id
  4. 数据完整性:关键字段设置NOT NULL约束

四、核心业务逻辑实现

1. 签到冲突校验

@Service
public class SignInService {
    
    public Result checkSignConflict(Integer userId, LocalDateTime signTime) {
        // 1. 检查今日是否已签到
        long todayCount = signInMapper.countTodaySign(userId, 
            signTime.toLocalDate());
        if (todayCount > 0) {
            return Result.error("今日已签到");
        }
        
        // 2. 检查是否有冲突的外出报备
        List<OutReport> reports = outReportMapper
            .selectByUserAndTime(userId, signTime);
        if (!reports.isEmpty()) {
            OutReport report = reports.get(0);
            return Result.error(String.format(
                "与外出报备时间冲突:%s - %s",
                report.getStartTime(),
                report.getEndTime()
            ));
        }
        
        return Result.success();
    }
}

2. 外出报备审批流程

@Service
public class OutReportService {
    
    @Transactional
    public Result approveOutReport(Integer reportId, Integer status, 
                                   String remark, Integer approverId) {
        OutReport report = outReportMapper.selectById(reportId);
        if (report == null) {
            return Result.error("报备记录不存在");
        }
        
        // 状态流转校验
        if (report.getStatus() != 1) {
            return Result.error("报备记录已处理");
        }
        
        // 更新状态
        report.setStatus(status);
        report.setApproveRemark(remark);
        report.setApproveTime(LocalDateTime.now());
        report.setApproverId(approverId);
        outReportMapper.updateById(report);
        
        // 发送通知
        notificationService.sendOutReportResult(
            report.getUserId(), status, remark);
            
        return Result.success("审批完成");
    }
}

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、测试要点

核心测试场景

  1. 签到冲突测试:同一用户同一天多次签到
  2. 时间重叠测试:签到时间与外出报备时间重叠
  3. 审批流程测试:外出报备的审批状态流转
  4. 数据一致性测试:请假天数自动计算

测试数据示例

-- 测试用户
INSERT INTO users VALUES (1, '张三', '研发部', '13800138000');

-- 测试外出报备
INSERT INTO out_report VALUES 
(1, 1, '客户拜访', '2024-06-01 09:00:00', 
 '2024-06-01 18:00:00', '客户公司', 1, 1, 1, NULL);

-- 测试签到(应该失败)
INSERT INTO sign_in VALUES 
(1, 1, '2024-06-01 09:30:00', 1, '公司', 1, '');

六、部署与优化

快速部署

  1. 后端部署
# 打包
mvn clean package -DskipTests

# 运行
java -jar home-office-system.jar \
  --spring.datasource.url=jdbc:mysql://localhost:3306/home_office \
  --server.port=8080
  1. 前端部署
npm install
npm run build
# 将dist目录部署到Nginx或直接放入SpringBoot的static目录

性能优化建议

  1. 数据库优化

    • 为user_id、sign_time等字段添加索引
    • 分表存储历史签到数据(按月分表)
    • 使用连接池(默认HikariCP)
  2. 缓存策略

    • 公告信息加入Redis缓存
    • 部门信息等基础数据缓存
  3. 安全措施

    • 密码加密存储(BCrypt)
    • 敏感操作日志记录
    • 接口访问频率限制

答辩准备要点

1. 演示流程(3分钟)

  • 管理员端:审批外出报备 → 查看签到统计 → 发布公告
  • 员工端:签到打卡 → 提交外出报备 → 查看薪资

2. 技术亮点

  • 时间冲突校验:完整的业务规则校验
  • 审批流程:状态机模式实现
  • 数据统计:多维度考勤报表

3. 常见问题准备

  • Q:如何防止签到作弊? A:结合位置信息+IP地址+时间多重校验
  • Q:外出报备超时怎么办? A:系统自动标记异常,需要补充说明
  • Q:如何保证数据安全? A:HTTPS传输+数据加密+操作日志

结语

疫情居家办公系统的核心在于考勤的准确性流程的完整性。重点关注以下三点:

  1. 时间管理:签到、外出、请假的时间冲突校验
  2. 审批流程:清晰的状态流转和权限控制
  3. 数据统计:多维度的考勤和办公数据分析

采用SpringBoot+Vue技术栈可快速实现,数据库设计时注意业务约束的完整性。测试阶段重点验证时间冲突场景。

资源获取:需要完整源码和数据库脚本,评论区留言"居家办公系统"。

关键提醒:务必设计完善的时间冲突校验逻辑,这是系统的核心业务规则。

收藏本文,开发过程随时参考。祝各位毕设顺利!🎉