高校宿舍管理一直是校园后勤工作的重点难点。传统的人工登记、纸质档案管理方式存在效率低下、信息滞后、查询不便等问题。我曾参与某高校数字化校园建设项目,负责开发这套基于SpringBoot和微信小程序的宿舍管理系统,经过三个月的开发和测试,系统已稳定运行一年,日均处理各类宿舍事务300余件。
系统采用前后端分离架构,后端基于SpringBoot+MyBatisPlus实现RESTful API,前端采用微信小程序+Vue.js组合。这种架构选择主要基于三点考虑:一是微信小程序无需安装的特性特别适合校园高频使用场景;二是SpringBoot的快速开发能力能缩短项目周期;三是前后端分离便于团队协作和后期维护。
SpringBoot 2.7.5版本提供了完善的starter依赖管理,我们主要集成了:
数据库选用MySQL 8.0,考虑到宿舍数据的关系型特征和事务需求。这里特别说明MyBatisPlus的配置技巧:
yaml复制mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
global-config:
db-config:
logic-delete-field: delFlag # 全局逻辑删除字段
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true # 自动驼峰转换
微信小程序端采用原生框架+WeUI组件库,主要考虑:
关键目录结构说明:
code复制pages/
├── index/ # 首页
├── repair/ # 报修模块
├── notice/ # 通知公告
├── profile/ # 个人中心
utils/
├── api.js # 封装网络请求
├── util.js # 工具函数
系统采用改进的最优匹配算法进行自动分房,核心逻辑:
java复制public List<RoomAssignment> autoAssign(List<Student> students) {
// 1. 按专业、班级分组
Map<String, List<Student>> groupMap = students.stream()
.collect(Collectors.groupingBy(s -> s.getMajor() + "_" + s.getClassNo()));
// 2. 获取可用宿舍
List<DormRoom> rooms = dormRoomMapper.selectAvailableRooms();
// 3. 分配逻辑
return groupMap.entrySet().stream()
.flatMap(entry -> {
List<Student> group = entry.getValue();
return assignGroupToRooms(group, rooms);
})
.collect(Collectors.toList());
}
实际项目中还需要考虑特殊需求处理,如:
微信小程序端报修流程采用状态机模式:
mermaid复制stateDiagram
[*] --> 待处理: 学生提交
待处理 --> 已分配: 管理员派单
已分配 --> 维修中: 维修员接单
维修中 --> 已完成: 维修确认
已完成 --> 已评价: 学生评价
对应的数据库设计:
sql复制CREATE TABLE `repair_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`student_id` bigint NOT NULL COMMENT '报修学生',
`dorm_id` bigint NOT NULL COMMENT '宿舍ID',
`fault_type` varchar(20) NOT NULL COMMENT '故障类型',
`description` text COMMENT '详细描述',
`images` varchar(500) DEFAULT NULL COMMENT '图片URL,多个用逗号分隔',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0-待处理 1-已分配 2-维修中 3-已完成 4-已评价',
`worker_id` bigint DEFAULT NULL COMMENT '维修工ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
采用自定义的JWT鉴权方案,关键类设计:
java复制@Component
public class JwtTokenProvider {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private long expiration;
public String generateToken(UserDetails userDetails) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + expiration);
return Jwts.builder()
.setSubject(userDetails.getUsername())
.setIssuedAt(now)
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
return true;
} catch (Exception ex) {
log.error("JWT验证失败: {}", ex.getMessage());
}
return false;
}
}
基于Spring Security实现RBAC模型,核心表结构:
sql复制CREATE TABLE `sys_role` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '角色名称',
`code` varchar(20) NOT NULL COMMENT '角色编码',
PRIMARY KEY (`id`)
);
CREATE TABLE `sys_permission` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`url` varchar(255) DEFAULT NULL,
`permission` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `sys_role_permission` (
`role_id` bigint NOT NULL,
`permission_id` bigint NOT NULL,
PRIMARY KEY (`role_id`,`permission_id`)
);
采用多级缓存方案:
缓存配置示例:
java复制@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(500)
.expireAfterWrite(10, TimeUnit.MINUTES));
return cacheManager;
}
}
针对宿舍查询场景添加的索引:
sql复制ALTER TABLE `dorm_room` ADD INDEX `idx_building_floor` (`building_no`, `floor_no`);
ALTER TABLE `student` ADD INDEX `idx_class_major` (`class_no`, `major_code`);
慢查询监控配置:
yaml复制spring:
datasource:
hikari:
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
采用分层测试方案:
关键测试用例示例:
java复制@Test
@DisplayName("宿舍分配算法测试")
void testRoomAssignment() {
// 准备测试数据
List<Student> students = createTestStudents(50);
List<DormRoom> rooms = createTestRooms(10);
// 执行分配
List<RoomAssignment> assignments = service.autoAssign(students, rooms);
// 验证结果
assertEquals(50, assignments.size());
assertTrue(assignments.stream()
.noneMatch(a -> a.getRoom().getCurrentCount() > 4));
}
采用Docker Compose部署:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:6.2
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
微信小程序适配问题:
性能优化心得:
异常处理建议:
这个项目让我深刻体会到,校园信息化系统开发不仅要考虑技术实现,更需要理解教育场景的特殊需求。比如宿舍分配要考虑学生作息习惯,报修流程要简化到极致,通知公告要有强提醒机制等。这些细节往往决定了系统的实际使用效果。