毕业设计实战:基于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`)
);
设计要点
- 时间校验:外出报备的结束时间必须晚于开始时间
- 状态管理:统一使用tinyint表示各种状态
- 关联清晰:所有员工相关表都关联user_id
- 数据完整性:关键字段设置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("审批完成");
}
}
五、测试要点
核心测试场景
- 签到冲突测试:同一用户同一天多次签到
- 时间重叠测试:签到时间与外出报备时间重叠
- 审批流程测试:外出报备的审批状态流转
- 数据一致性测试:请假天数自动计算
测试数据示例
-- 测试用户
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, '');
六、部署与优化
快速部署
- 后端部署
# 打包
mvn clean package -DskipTests
# 运行
java -jar home-office-system.jar \
--spring.datasource.url=jdbc:mysql://localhost:3306/home_office \
--server.port=8080
- 前端部署
npm install
npm run build
# 将dist目录部署到Nginx或直接放入SpringBoot的static目录
性能优化建议
-
数据库优化
- 为user_id、sign_time等字段添加索引
- 分表存储历史签到数据(按月分表)
- 使用连接池(默认HikariCP)
-
缓存策略
- 公告信息加入Redis缓存
- 部门信息等基础数据缓存
-
安全措施
- 密码加密存储(BCrypt)
- 敏感操作日志记录
- 接口访问频率限制
答辩准备要点
1. 演示流程(3分钟)
- 管理员端:审批外出报备 → 查看签到统计 → 发布公告
- 员工端:签到打卡 → 提交外出报备 → 查看薪资
2. 技术亮点
- 时间冲突校验:完整的业务规则校验
- 审批流程:状态机模式实现
- 数据统计:多维度考勤报表
3. 常见问题准备
- Q:如何防止签到作弊? A:结合位置信息+IP地址+时间多重校验
- Q:外出报备超时怎么办? A:系统自动标记异常,需要补充说明
- Q:如何保证数据安全? A:HTTPS传输+数据加密+操作日志
结语
疫情居家办公系统的核心在于考勤的准确性与流程的完整性。重点关注以下三点:
- 时间管理:签到、外出、请假的时间冲突校验
- 审批流程:清晰的状态流转和权限控制
- 数据统计:多维度的考勤和办公数据分析
采用SpringBoot+Vue技术栈可快速实现,数据库设计时注意业务约束的完整性。测试阶段重点验证时间冲突场景。
资源获取:需要完整源码和数据库脚本,评论区留言"居家办公系统"。
关键提醒:务必设计完善的时间冲突校验逻辑,这是系统的核心业务规则。
收藏本文,开发过程随时参考。祝各位毕设顺利!🎉