1. 项目背景与核心需求
宿舍管理是高校后勤工作中的重要环节,传统的人工登记方式效率低下且容易出错。我去年为某职业技术学院开发的这套系统,成功将宿舍分配、维修申报、访客登记等流程的办理时间从平均45分钟缩短至8分钟。系统采用前后端分离架构,前端使用Vue 3组合式API开发,后端基于Spring Boot 2.7实现RESTful API,这种架构选择使得移动端App和微信小程序可以复用90%的后端接口。
2. 技术栈选型分析
2.1 Spring Boot的优势实践
选择Spring Boot而非传统SSM框架,主要考虑到其嵌入式Tomcat和自动配置特性。在实际部署时,我们通过spring-boot-maven-plugin的<executable>true</executable>配置,直接将jar包设置为Linux系统服务。特别要注意的是,在宿舍电费计算模块中,Spring Schedule的@Scheduled注解需要配合@EnableScheduling使用,我们采用了cron表达式"0 0 18 * * ?"实现每日下午6点自动扣费。
2.2 Vue 3的组合式API实践
前端选用Vue 3而非React,主要考虑到高校运维团队的技术储备。在宿舍楼栋选择组件中,我们使用<script setup>语法配合Pinia状态管理,实现了跨楼层房间数据的实时同步。一个值得分享的技巧:在访客登记表单中,通过watchEffect自动计算停留时长,比传统的事件监听方式代码量减少40%。
3. 数据库设计与优化
3.1 MySQL表结构设计
核心的dorm_student表采用垂直分表设计,将频繁更新的水电费字段单独放在dorm_utility表中。这里有个踩坑经验:最初没有为room_id建立复合索引,导致分页查询超过200ms,通过ALTER TABLE dorm_student ADD INDEX idx_floor_room (floor_num, room_num)优化后降至35ms。
3.2 MyBatis动态SQL技巧
在维修工单查询接口中,我们大量使用MyBatis的<where>标签:
xml复制<select id="selectRepairs" resultMap="repairMap">
SELECT * FROM dorm_repair
<where>
<if test="status != null">AND status = #{status}</if>
<if test="dormId != null">AND dorm_id = #{dormId}</if>
<if test="startDate != null">AND create_time >= #{startDate}</if>
</where>
ORDER BY urgency_level DESC
</select>
配合PageHelper分页插件,完美解决了后勤处提出的多条件筛选需求。
4. 关键业务模块实现
4.1 宿舍分配算法
核心的分配逻辑采用贪心算法实现:
java复制public List<Assignment> autoAssign(List<Student> students) {
students.sort(Comparator.comparing(Student::getEnrollDate));
return availableRooms.stream()
.filter(r -> r.getRemainBeds() > 0)
.map(r -> new Assignment(r, students.remove(0)))
.collect(Collectors.toList());
}
实际运行中发现,单纯按入学日期排序会导致同专业学生分散,后来增加了专业匹配权重系数。
4.2 水电费计算服务
采用策略模式实现不同宿舍楼的计价规则:
java复制public interface FeeCalculator {
BigDecimal calculate(UsageRecord record);
}
@Service
@Qualifier("buildingA")
public class BuildingACalculator implements FeeCalculator {
@Override
public BigDecimal calculate(UsageRecord record) {
return record.getElectricity().multiply(new BigDecimal("0.85"));
}
}
通过@Resource(name = "${dorm.building.type}Calculator")实现运行时动态注入。
5. 系统安全与权限控制
5.1 基于Spring Security的RBAC
自定义DormAdminDetailsService实现了宿舍管理员、楼管、学生三级权限体系。特别注意:在修改密码接口必须使用BCryptPasswordEncoder:
java复制@PostMapping("/change-pwd")
public Result changePassword(@Valid @RequestBody PwdDTO dto) {
String encoded = passwordEncoder.encode(dto.getNewPassword());
// 更新数据库...
}
5.2 Vue前端路由守卫
在router.beforeEach中实现权限校验:
javascript复制const routes = [
{
path: '/admin',
component: AdminLayout,
meta: { requiresAuth: true, roles: ['SUPER_ADMIN'] }
}
]
router.beforeEach((to) => {
if (to.meta.requiresAuth && !store.getters.isLoggedIn) {
return { path: '/login', query: { redirect: to.fullPath } }
}
})
6. 部署与性能调优
6.1 Nginx配置要点
生产环境采用如下配置解决Vue路由刷新404问题:
nginx复制location / {
try_files $uri $uri/ /index.html;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
同时启用gzip压缩,使静态资源体积减少70%。
6.2 JVM参数优化
在application.yml中配置:
yaml复制server:
tomcat:
max-threads: 200
min-spare-threads: 20
配合JVM参数-XX:+UseG1GC -Xmx512m,使系统在2核4G的云服务器上稳定支持800+并发。
7. 项目扩展与二次开发
系统预留了三个重要扩展点:
- 通过实现
WechatNotifyHandler接口可以接入微信消息模板 - 在
application-event.properties中配置事件监听器 - 水电表读数接口支持Modbus RTU协议扩展
我在实际开发中发现,使用Lombok的@Builder注解可以极大简化实体类的构造过程,但要注意在JDK 16+环境中需要添加--add-opens参数。另一个实用技巧:在Vue组件中使用<teleport>将模态框渲染到body末端,避免z-index层级问题。
