1. 项目概述
这个基于SpringBoot和Vue的学生宿舍卫生管理系统,是我去年为某高校后勤部门开发的一套实用型管理工具。系统通过信息化手段解决了传统纸质检查表效率低下、数据难以统计的痛点,目前已在3栋宿舍楼稳定运行8个月,平均节省管理人员30%的工作时间。
系统最核心的创新点在于将卫生检查、奖惩机制和任务分配三个模块有机整合。不同于市面上简单的检查记录系统,我们设计了动态权重算法来自动计算宿舍卫生评分,并关联到学生的综合素质考评。每周生成的卫生报告会自动推送给辅导员,成为评优评奖的重要参考依据。
2. 系统角色与功能设计
2.1 三权分立的角色体系
系统采用经典的RBAC权限模型,但针对宿舍管理场景做了特殊优化:
- 管理员角色(后勤处老师)
- 楼栋/宿舍基础数据维护
- 检查标准制定与权重配置
- 奖惩规则设置与审批
- 系统运行监控与数据备份
- 检查员角色(学生干部)
- 移动端检查单填写(支持拍照取证)
- 异常情况上报
- 历史检查记录查询
- 个人检查任务看板
- 学生角色(住宿学生)
- 个人卫生得分查询
- 整改通知确认
- 奖惩记录申诉
- 宿舍排名查看
实际开发中发现,检查员和学生角色需要特别注意数据隔离。我们通过Spring Security的@PreAuthorize注解配合自定义权限表达式,确保学生只能看到本宿舍数据。
2.2 卫生检查流程设计
标准检查流程包含5个关键环节:
- 任务派发:管理员按周生成检查任务池
- 随机分配:系统通过轮询算法避免检查员固定检查相同宿舍
- 现场检查:检查员使用PWA应用离线操作,支持图片水印
- 自动评分:根据预设权重计算(如地面清洁度占30%)
- 结果公示:延迟24小时发布给学生(留出申诉窗口期)
// 评分计算核心逻辑示例 public BigDecimal calculateScore(CheckRecord record) { return record.getItems().stream() .map(item -> item.getScore() .multiply(item.getStandard().getWeight())) .reduce(BigDecimal.ZERO, BigDecimal::add) .setScale(2, RoundingMode.HALF_UP); }3. 技术实现关键点
3.1 前后端分离架构
采用现在主流的SpringBoot+Vue技术栈:
- 后端:SpringBoot 2.7 + MyBatis-Plus + Redis
- 前端:Vue3 + Element Plus + Vite
- 通信:RESTful API + WebSocket(用于实时通知)
特别在文件上传模块做了优化:
- 图片使用腾讯云COS存储
- 前端实现分片上传(解决大图问题)
- 后端通过MD5校验去重
3.2 动态权重算法
卫生评分不是简单的加减法,我们设计了可配置的权重体系:
| 检查项 | 基础分 | 权重系数 | 计算公式 |
|---|---|---|---|
| 地面清洁 | 10 | 0.3 | 得分×0.3 |
| 物品摆放 | 5 | 0.2 | 得分×0.2 |
| 安全隐患 | 20 | 0.5 | 扣分项 |
管理员可以随时调整权重,系统会自动重新计算历史数据。这里用到了MySQL的存储过程来提高批量计算效率。
3.3 奖惩联动机制
系统实现了与学校教务系统的数据对接:
- 奖励:连续3次优秀宿舍,成员加综合素质分0.5
- 惩罚:累计3次不合格,触发辅导员约谈流程
-- 奖惩记录表设计 CREATE TABLE `reward_punish` ( `id` BIGINT PRIMARY KEY, `type` ENUM('REWARD','PUNISH') NOT NULL, `dorm_id` VARCHAR(20) NOT NULL, `student_ids` JSON NOT NULL, -- 存储学号数组 `semester` VARCHAR(10) NOT NULL, `effective_date` DATE NOT NULL ) ENGINE=InnoDB;4. 开发中的典型问题
4.1 移动端适配问题
最初使用纯PC端设计时,检查员反映现场操作不便。解决方案:
- 增加PWA支持,实现离线检查
- 优化Element Plus的响应式布局
- 开发专用的拍照压缩组件
4.2 数据一致性问题
在初期版本中,出现过奖惩状态不同步的情况。最终通过以下措施解决:
- 引入Redis分布式锁
- 关键操作增加事务注解
- 建立定时核对任务
@Transactional public void handlePunish(Long recordId) { // 1. 获取分布式锁 String lockKey = "punish_lock:" + recordId; try { boolean locked = redisTemplate.opsForValue() .setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS); if (!locked) throw new ConcurrentAccessException(); // 2. 业务处理... } finally { redisTemplate.delete(lockKey); } }4.3 性能优化实践
在数据看板页面遇到加载缓慢问题(超过5s),通过以下优化降到800ms内:
- 增加检查结果的按月汇总表
- 使用多线程并行加载不同模块数据
- 前端实现虚拟滚动加载
5. 部署与运维经验
5.1 服务器配置建议
经过压测得出的最低配置要求:
- 后端服务器:2核4G(建议4核8G)
- 数据库:MySQL 5.7+,单独部署
- Redis:持久化开启,内存1G以上
5.2 监控方案
我们搭建的监控体系包含:
- Spring Boot Admin监控服务健康状态
- ELK收集业务日志
- Prometheus+Grafana监控系统指标
特别要注意检查图片存储的容量增长,我们设置了自动清理3个月前的图片。
6. 项目演进方向
目前正在规划中的功能增强:
- 引入AI图像识别自动评分(试点中)
- 增加宿舍设备报修联动模块
- 开发微信小程序版本
这个项目给我的最大启示是:校园管理系统需要特别注重用户体验。我们通过每周收集检查员和学生的反馈,持续迭代了17个版本,最终用户满意度达到92%。比如增加"申诉时自动附带历史检查照片对比"这个小功能,就让纠纷减少了40%。