高校宿舍管理一直是校园后勤工作的重点难点。传统纸质登记、Excel表格统计的方式效率低下,信息更新滞后,学生报修、查寝等流程繁琐。我们团队开发的这款基于SpringBoot和小程序的宿舍管理系统,正是为了解决这些痛点而生。
这个系统最核心的价值在于:
去年在某师范院校试点时,宿舍报修响应时间从平均3天缩短到6小时,查寝效率提升400%,管理员每周节省约20小时手工统计时间。
后端采用SpringBoot 2.7 + MyBatis Plus组合,主要考虑因素:
数据库选用MySQL 8.0,关键设计点:
小程序端技术要点:
宿舍分配接口伪代码:
java复制@PostMapping("/assign")
public Result assignDorm(
@RequestParam String studentId,
@RequestParam String dormId,
@RequestParam Integer bedNo) {
// 校验床位是否空闲
if(dormService.isBedOccupied(dormId, bedNo)){
throw new BusinessException("该床位已被占用");
}
// 更新学生-宿舍关联关系
studentDormMapper.insert(new StudentDorm(studentId, dormId, bedNo));
// 记录分配日志
logService.record(LogType.DORM_ASSIGN,
"管理员"+currentUser+"分配"+studentId+"至"+dormId+"-"+bedNo);
return Result.success();
}
采用矩阵式数据存储方案:
sql复制CREATE TABLE dorm_bed (
dorm_id VARCHAR(20) NOT NULL,
floor TINYINT NOT NULL,
room_no VARCHAR(10) NOT NULL,
bed_no TINYINT NOT NULL,
status TINYINT DEFAULT 0 COMMENT '0空置 1已分配 2维修中',
PRIMARY KEY (dorm_id, floor, room_no, bed_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
前端渲染技巧:
核心状态机设计:
mermaid复制stateDiagram
[*] --> 待受理: 学生提交报修单
待受理 --> 处理中: 管理员接单
处理中 --> 已完成: 维修员确认修复
处理中 --> 待受理: 发现需补充材料
已完成 --> [*]: 学生评价后闭环
关键业务规则:
采用多级缓存架构:
缓存更新策略对比:
| 策略 | 适用场景 | 实现复杂度 | 数据一致性 |
|---|---|---|---|
| 定时刷新 | 变化不频繁的数据 | 低 | 一般 |
| 写时更新 | 关键业务数据 | 高 | 强 |
| 消息通知 | 分布式环境 | 中 | 最终一致 |
实测数据:新生选宿舍期间瞬时QPS可达2500+
采取的措施:
RBAC模型设计:
Shiro配置示例:
java复制@RequiresRoles("dorm_admin")
@PostMapping("/checkin")
public Result recordCheckIn(
@RequestBody CheckInRecord record) {
// 实现查寝登记逻辑
}
Docker Compose编排示例:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql-data:/var/lib/mysql
redis:
image: redis:6
ports:
- "6379:6379"
backend:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
Prometheus监控指标:
告警规则示例:
code复制groups:
- name: dorm-alert
rules:
- alert: HighErrorRate
expr: rate(http_server_requests_errors_total[1m]) > 0.1
labels:
severity: critical
annotations:
summary: "高错误率报警 (实例 {{ $labels.instance }})"
问题现象:iOS设备偶尔获取不到openid
排查过程:
javascript复制// 正确调用顺序
async function login() {
const { code } = await Taro.login()
const { encryptedData, iv } = await Taro.getUserProfile({
desc: '用于绑定宿舍管理系统账号'
})
// 发送code+encryptedData到后端解密
}
原始方案:foreach拼接SQL语句
xml复制<insert id="batchInsert">
INSERT INTO dorm_bed VALUES
<foreach collection="list" item="item" separator=",">
(#{item.dormId},#{item.floor},#{item.roomNo},#{item.bedNo})
</foreach>
</insert>
发现问题:当插入1000+条数据时SQL语句过长
优化方案:
最终性能对比:
| 方案 | 1000条耗时 | 内存占用 |
|---|---|---|
| 原始方案 | 3200ms | 高 |
| 批量模式 | 800ms | 低 |
特别提醒:小程序上线前务必完成
- 隐私政策合规审查
- 敏感权限使用说明
- 数据加密传输验证