1. 疫情居家办公系统管理系统概述
2020年以来的特殊时期让远程办公从可选变成了刚需,传统OA系统在应对突发性全员居家办公时暴露出诸多不足。我参与开发的这套系统正是为了解决这一痛点——基于SpringBoot+Vue技术栈构建的轻量化办公管理平台,特别适合中小企业在特殊时期的快速部署需求。
系统核心功能模块包括:
- 员工健康状态每日申报
- 远程考勤与工作日志管理
- 在线会议预约系统
- 文件共享与协作空间
- 任务分配与进度追踪
技术选型上,后端采用SpringBoot 2.7 + MyBatis Plus组合,前端使用Vue 3 + Element Plus,数据库选用MySQL 8.0。这套技术栈的优势在于:
- 开发效率高:SpringBoot的自动配置和起步依赖大幅减少XML配置
- 性能稳定:MyBatis Plus提供的CRUD接口比原生MyBatis效率提升40%以上
- 前后端分离:Vue的响应式特性完美适配动态表单需求
实际开发中发现,Element Plus的Form组件在处理动态字段时存在渲染性能问题,建议对超过50个字段的表单采用分步加载策略。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计与技术实现
2.1 后端核心架构
采用经典的三层架构设计,但针对疫情场景做了特殊优化:
code复制Controller层
└─AOP日志切面(记录敏感操作)
Service层
└─业务逻辑隔离(不同部门数据权限控制)
DAO层
└─MyBatis Plus增强(自动分页/乐观锁)
数据库设计中特别加入了:
sql复制CREATE TABLE `health_report` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL COMMENT '关联用户ID',
`temp` DECIMAL(3,1) NOT NULL COMMENT '体温',
`symptom` VARCHAR(255) COMMENT '症状JSON数组',
`location` POINT NOT NULL COMMENT '地理坐标',
`report_date` DATE NOT NULL COMMENT '上报日期',
SPATIAL INDEX(`location`),
UNIQUE KEY `udx_user_date` (`user_id`, `report_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2 前端工程化实践
Vue 3的组合式API大幅提升了代码组织效率。典型会议预约组件实现:
vue复制<script setup>
const form = reactive({
title: '',
participants: [],
startTime: dayjs().format('YYYY-MM-DD HH:mm'),
duration: 60
})
const availableUsers = computed(() =>
store.state.users.filter(u =>
u.department === store.state.currentUser.department
)
)
</script>
特别优化点:
- 使用vue-router的懒加载分割代码包
- 采用Pinia替代Vuex进行状态管理
- 对m3u8视频会议录制文件使用vue-video-player插件
2.3 安全防护方案
针对居家办公的特殊风险,系统实现了:
- JWT+Redis的双重认证机制
- 基于Spring Security的RBAC模型
- 文件上传的病毒扫描接口(调用ClamAV)
- 防止XSS攻击的HTML净化过滤器
测试发现,MyBatis的$参数绑定方式存在SQL注入风险,务必使用#预处理方式。对于动态表名场景,建议采用白名单校验机制。
3. 关键业务模块实现细节
3.1 健康打卡智能预警
核心算法流程:
- 接收GPS定位和体温数据
- 计算与登记住址的距离(使用Haversine公式)
- 结合体温和症状关键词进行风险评估
- 触发不同级别的预警(邮件/短信/系统通知)
java复制public RiskLevel evaluateRisk(HealthReport report) {
double distance = GeoUtils.distance(
report.getLocation(),
userService.getHomeLocation(report.getUserId())
);
if(report.getTemp() > 37.3 || containsSymptom(report)) {
return distance > 5000 ? RiskLevel.HIGH : RiskLevel.MEDIUM;
}
return distance > 10000 ? RiskLevel.LOW : RiskLevel.NONE;
}
3.2 分布式考勤校验
解决居家办公的考勤真实性问题:
- 客户端采集:GPS定位+WiFi指纹+屏幕活动快照
- 服务端验证:
- 定位与登记住址的偏差
- 设备指纹一致性检查
- 活动模式分析(鼠标/键盘事件频率)
sql复制SELECT
COUNT(DISTINCT DATE(check_time)) AS attendance_days
FROM attendance_record
WHERE
user_id = #{userId}
AND YEARWEEK(check_time) = YEARWEEK(NOW())
AND ST_Distance_Sphere(
POINTOF(location),
POINTOF(#{homeLocation})
) < 1000;
4. 性能优化实战记录
4.1 MySQL查询优化
针对日报统计查询的优化过程:
- 原始执行计划:全表扫描health_report
- 添加复合索引:(department_id, report_date)
- 引入汇总表预计算常用统计指标
- 对历史数据实施按月分表
优化前后对比:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 查询耗时 | 1200ms | 80ms |
| CPU占用 | 45% | 8% |
| 锁等待 | 12次 | 0次 |
4.2 Vue组件性能提升
会议列表页的渲染优化措施:
- 虚拟滚动替代完整渲染(vue-virtual-scroller)
- 使用v-memo缓存静态节点
- 防抖处理筛选条件变化
- 按需加载参会者头像
实测数据:
- 首次加载时间从4.2s降至1.1s
- 内存占用减少60%
- 滚动帧率稳定在60fps
5. 部署与运维方案
5.1 容器化部署
Docker Compose编排文件关键配置:
yaml复制services:
app:
image: openjdk:17-jdk
environment:
- SPRING_PROFILES_ACTIVE=prod
volumes:
- ./logs:/app/logs
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
redis:
image: redis:6-alpine
command: redis-server --requirepass ${REDIS_PASSWORD}
5.2 监控告警配置
Prometheus监控指标示例:
- http_server_requests_seconds_sum
- system_cpu_usage
- jvm_memory_used_bytes
Grafana看板包含:
- 实时在线人数
- API成功率
- 日报提交趋势
- 系统资源水位
6. 典型问题排查实录
6.1 MyBatis批量插入内存溢出
现象:导入5000+员工数据时出现OOM
分析:MyBatis默认批处理缓存所有SQL
解决:配置rewriteBatchedStatements=true并分批次提交
xml复制<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO employee
(name, department) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.department})
</foreach>
</insert>
6.2 Vue路由懒加载失效
现象:生产环境首屏加载缓慢
排查:webpack-bundle-analyzer显示所有路由打包到app.js
修复:使用import()动态导入语法
js复制const MeetingRoom = () => import('../views/MeetingRoom.vue')
7. 源码结构与工程实践
项目采用标准的Maven多模块设计:
code复制epidemic-office
├── office-admin -- 管理后台模块
├── office-api -- REST接口模块
├── office-common -- 通用工具类
├── office-generator -- 代码生成器
└── office-ui -- Vue前端工程
开发规范要求:
- 所有DTO类以DTO后缀结尾
- Service接口命名规范:IXXXService
- 前端组件目录结构按feature组织
- Git提交信息遵循Conventional Commits
代码生成器的使用示例:
bash复制mvn mybatis-generator:generate \
-DtableName=health_report \
-DdomainObjectName=HealthReport
这套系统在3家中小企业实际部署后,居家办公期间的关键指标表现:
- 日报提交率从68%提升至93%
- 平均会议组织时间缩短40%
- 文件协作冲突减少75%
- 管理员操作效率提升60%
