毕业设计实战:基于Spring Boot的学生宿舍信息管理系统全栈开发

66 阅读12分钟

一、项目背景:数字化时代的校园管理革新

随着高校规模的不断扩大和学生人数的持续增长,传统的学生宿舍管理方式面临效率低下、信息分散、服务不及时等严峻挑战。据教育统计数据显示,超过95%的高校希望通过数字化手段优化宿舍管理流程,近90%的学生期待更加便捷、智能的宿舍服务体验。

在"智慧校园"建设快速发展的背景下,基于Spring Boot的学生宿舍信息管理系统成为连接学校管理者、学生、维修人员和商家的综合性数字化平台。系统采用成熟的B/S架构,通过信息化手段实现了从宿舍分配、报修处理到生活服务的全流程数字化管理。本毕业设计以高校宿舍管理需求为导向,建立了"管理员统筹-多角色协同"的四级管理机制,为高校宿舍信息化建设提供了完整的技术解决方案。

二、技术架构:宿舍管理系统的全栈技术选型

项目以"高效性、稳定性、易用性"为核心理念,采用业界成熟的Java Web开发技术栈,确保系统能够满足高校宿舍管理的高标准要求:

技术模块具体工具/技术核心作用
后端框架Spring Boot 2.x + MyBatis构建高性能后端服务,提供完整的MVC解决方案
数据库MySQL 8.0存储用户信息、宿舍数据、报修记录、订单信息等
前端技术JSP + Bootstrap + JavaScript构建现代化管理界面,实现良好的用户交互
架构模式B/S结构实现跨平台访问,各角色用户只需浏览器即可使用
开发工具Eclipse + NavicatEclipse集成开发,Navicat数据库管理
服务器Tomcat 9.0Web应用部署和业务请求处理
权限控制基于角色的访问控制实现管理员、学生、维修人员、商家的权限分离

三、项目全流程:6步完成宿舍管理系统开发

3.1 第一步:需求分析——明确系统核心价值

传统宿舍管理存在"流程繁琐、响应迟缓、服务单一"三大痛点,本系统聚焦"高效、便捷、全面",核心需求分为功能性与非功能性两类:

3.1.1 功能性需求

  1. 四角色权限体系
    • 管理员:个人中心、班级管理、学生管理、维修人员管理、商家管理、宿舍信息管理、宿舍安排管理、报修信息管理、报修处理管理、假期留宿管理、卫生检查管理、文明宿舍管理、缴费信息管理、桶装水品牌管理、桶装水预定管理、物品类别管理、失物信息管理、招领信息管理、系统管理、我的收藏管理;
    • 学生:个人信息管理、报修申请、假期留宿申请、缴费查询、桶装水预订、失物招领;
    • 维修人员:报修处理、维修进度更新、工作记录管理;
    • 商家:商品管理、订单处理、配送服务。
  2. 核心宿舍管理功能
    • 宿舍资源管理:宿舍信息维护、床位分配、入住管理;
    • 报修服务系统:在线报修、维修派单、进度跟踪、服务评价;
    • 生活服务功能:水电缴费、桶装水预订、失物招领;
    • 安全管理功能:假期留宿审批、卫生检查、文明评比。
  3. 辅助管理功能
    • 数据统计分析:宿舍使用率、报修统计、缴费情况;
    • 信息发布系统:公告通知、规章制度、服务指南。

3.1.2 非功能性需求

  • 系统安全性:严格的权限控制和数据保护机制;
  • 数据准确性:确保宿舍分配和费用计算的准确无误;
  • 响应及时性:报修请求和服务的快速响应;
  • 系统稳定性:开学季和毕业季高并发访问的稳定性保证。

3.2 第二步:系统设计——构建整体架构

系统采用经典的三层架构模式,实现表现层、业务逻辑层和数据访问层的有效分离:

3.2.1 系统总体架构

  1. 表现层(Web层)
    • 用户界面:基于JSP的动态页面,适配不同角色需求;
    • 权限控制:根据用户角色显示相应功能模块。
  2. 业务逻辑层(Service层)
    • 核心业务:宿舍服务、报修服务、缴费服务、生活服务;
    • 业务规则:权限验证、流程控制、状态管理、通知提醒。
  3. 数据访问层(DAO层)
    • 数据持久化:通过MyBatis框架实现数据库操作;
    • 事务管理:确保业务操作的数据一致性。

3.2.2 核心数据库设计

系统包含21个核心业务表,确保宿舍管理数据的完整性和业务关联性:

表名核心字段作用
users(管理员表)id、username、password、role存储管理员账户信息
xuesheng(学生表)id、xuehao、mima、xueshengxingming、banji、sushehao存储学生基本信息
weixiurenyuan(维修人员表)id、weixiugonghao、mima、xingming、lianxidianhua存储维修人员信息
shangjia(商家表)id、shangjiazhanghao、mima、shangjiamingcheng、lianxidianhua存储商家信息
sushexinxi(宿舍信息表)id、sushehao、susheleixing、loudong、kezhurenshu存储宿舍资源信息
susheanpai(宿舍安排表)id、sushehao、xuehao、xueshengxingming、anpairiqi记录宿舍分配信息
baoxiuxinxi(报修信息表)id、baoxiushebei、leixing、xuehao、sushehao、baoxiuriqi记录报修申请信息
baoxiuchuli(报修处理表)id、baoxiushebei、weixiujindu、weixiugonghao、gengxinriqi记录维修处理信息
jiaqiliusu(假期留宿表)id、xuehao、sushehao、liuxiaoliyou、sfsh、shhf管理假期留宿申请
weishengjiancha(卫生检查表)id、sushehao、weishengpingfen、jianchajieguo、jianchariqi记录卫生检查信息
wenmingsushe(文明宿舍表)id、sushehao、weishengpingfen、pingbiriqi记录文明宿舍评比
jiaofeixinxi(缴费信息表)id、xuehao、sushehao、jiaofeimingcheng、jiaofeijine、ispay管理缴费信息
tongzhuangshui(桶装水表)id、mingcheng、pinpai、jiage、shangjiazhanghao存储桶装水商品信息
tongzhuangshuiyuding(桶装水预订表)id、mingcheng、shuliang、zongjine、xuehao、sfsh、ispay记录桶装水预订信息
shiwuxinxi(失物信息表)id、wupinmingcheng、wupinleibie、xuehao、xunwuzhuangtai记录失物信息
zhaolingxinxi(招领信息表)id、wupinmingcheng、wupinleibie、xuehao、renlingzhuangtai记录招领信息

3.3 第三步:后端核心功能实现——Spring Boot架构

基于Spring Boot框架实现系统后端核心功能,重点解决"宿舍分配"和"报修处理"问题:

3.3.1 宿舍管理功能实现

@RestController
@RequestMapping("/api/dormitory")
public class DormitoryController {
    
    @Autowired
    private DormitoryService dormitoryService;
    
    @Autowired
    private StudentService studentService;
    
    /**
     * 获取宿舍列表
     */
    @GetMapping("/list")
    public ResponseEntity<?> getDormitoryList(
            @RequestParam(required = false) String loudong,
            @RequestParam(required = false) String susheleixing,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size) {
        try {
            DormitoryQuery query = new DormitoryQuery();
            query.setLoudong(loudong);
            query.setSusheleixing(susheleixing);
            query.setPage(page);
            query.setSize(size);
            
            PageResult<Dormitory> result = dormitoryService.getDormitoryList(query);
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("获取宿舍列表失败");
        }
    }
    
    /**
     * 分配宿舍
     */
    @PostMapping("/assign")
    public ResponseEntity<?> assignDormitory(@RequestBody DormitoryAssignDTO assignDTO) {
        try {
            // 验证管理员权限
            if (!hasDormitoryManagementPermission()) {
                return ResponseEntity.badRequest().body("无操作权限");
            }
            
            // 验证学生信息
            Student student = studentService.getStudentByXuehao(assignDTO.getXuehao());
            if (student == null) {
                return ResponseEntity.badRequest().body("学生信息不存在");
            }
            
            // 验证宿舍信息
            Dormitory dormitory = dormitoryService.getDormitoryByNumber(assignDTO.getSushehao());
            if (dormitory == null) {
                return ResponseEntity.badRequest().body("宿舍信息不存在");
            }
            
            // 检查宿舍是否已满
            if (dormitoryService.isDormitoryFull(assignDTO.getSushehao())) {
                return ResponseEntity.badRequest().body("该宿舍已满员");
            }
            
            // 检查学生是否已分配宿舍
            if (dormitoryService.hasAssignedDormitory(assignDTO.getXuehao())) {
                return ResponseEntity.badRequest().body("该学生已分配宿舍");
            }
            
            DormitoryAssignment assignment = dormitoryService.assignDormitory(assignDTO);
            return ResponseEntity.ok("宿舍分配成功");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("宿舍分配失败");
        }
    }
    
    /**
     * 调整宿舍
     */
    @PostMapping("/adjust")
    public ResponseEntity<?> adjustDormitory(@RequestBody DormitoryAdjustDTO adjustDTO) {
        try {
            if (!hasDormitoryManagementPermission()) {
                return ResponseEntity.badRequest().body("无操作权限");
            }
            
            // 验证原宿舍信息
            DormitoryAssignment oldAssignment = dormitoryService.getAssignmentByStudent(adjustDTO.getXuehao());
            if (oldAssignment == null) {
                return ResponseEntity.badRequest().body("学生未分配宿舍");
            }
            
            // 验证新宿舍信息
            Dormitory newDormitory = dormitoryService.getDormitoryByNumber(adjustDTO.getNewSushehao());
            if (newDormitory == null) {
                return ResponseEntity.badRequest().body("新宿舍信息不存在");
            }
            
            if (dormitoryService.isDormitoryFull(adjustDTO.getNewSushehao())) {
                return ResponseEntity.badRequest().body("新宿舍已满员");
            }
            
            DormitoryAssignment newAssignment = dormitoryService.adjustDormitory(adjustDTO);
            return ResponseEntity.ok("宿舍调整成功");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("宿舍调整失败");
        }
    }
    
    /**
     * 获取宿舍空余床位
     */
    @GetMapping("/vacant")
    public ResponseEntity<?> getVacantBeds(@RequestParam(required = false) String loudong) {
        try {
            List<DormitoryVacancy> vacancies = dormitoryService.getVacantBeds(loudong);
            return ResponseEntity.ok(vacancies);
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("获取空余床位失败");
        }
    }
    
    /**
     * 宿舍卫生统计
     */
    @GetMapping("/hygiene/stats")
    public ResponseEntity<?> getHygieneStats(@RequestParam(required = false) String startDate,
                                           @RequestParam(required = false) String endDate) {
        try {
            HygieneStats stats = dormitoryService.getHygieneStats(startDate, endDate);
            return ResponseEntity.ok(stats);
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("获取卫生统计失败");
        }
    }
}

3.3.2 报修管理服务实现

@Service
@Transactional
public class RepairService {
    
    @Autowired
    private RepairMapper repairMapper;
    
    @Autowired
    private RepairWorkerMapper repairWorkerMapper;
    
    @Autowired
    private StudentService studentService;
    
    @Autowired
    private NotificationService notificationService;
    
    /**
     * 学生提交报修申请
     */
    public RepairApplication submitRepair(RepairSubmitDTO submitDTO) {
        // 验证学生信息
        Student student = studentService.getStudentByXuehao(submitDTO.getXuehao());
        if (student == null) {
            throw new RuntimeException("学生信息不存在");
        }
        
        // 验证宿舍信息
        if (!dormitoryService.isStudentInDormitory(submitDTO.getXuehao(), submitDTO.getSushehao())) {
            throw new RuntimeException("学生不在该宿舍");
        }
        
        // 创建报修申请
        RepairApplication application = new RepairApplication();
        application.setBaoxiushebei(submitDTO.getBaoxiushebei());
        application.setLeixing(submitDTO.getLeixing());
        application.setTupian(submitDTO.getTupian());
        application.setBaoxiuneirong(submitDTO.getBaoxiuneirong());
        application.setBaoxiuriqi(new Date());
        application.setXuehao(submitDTO.getXuehao());
        application.setXueshengxingming(student.getXueshengxingming());
        application.setBanji(student.getBanji());
        application.setSushehao(submitDTO.getSushehao());
        application.setShouji(student.getShouji());
        application.setSfsh("否"); // 待审核
        application.setAddtime(new Date());
        
        repairMapper.insertRepairApplication(application);
        
        // 发送通知给管理员
        notificationService.sendRepairNotification(application);
        
        return application;
    }
    
    /**
     * 管理员审核报修申请
     */
    public boolean reviewRepairApplication(Long applicationId, ReviewDTO reviewDTO) {
        RepairApplication application = repairMapper.selectRepairApplicationById(applicationId);
        if (application == null) {
            throw new RuntimeException("报修申请不存在");
        }
        
        if (!"否".equals(application.getSfsh())) {
            throw new RuntimeException("报修申请已审核");
        }
        
        // 更新审核状态
        application.setSfsh(reviewDTO.getSfsh());
        application.setShhf(reviewDTO.getShhf());
        repairMapper.updateRepairApplication(application);
        
        if ("是".equals(reviewDTO.getSfsh())) {
            // 审核通过,自动分配给维修人员
            assignRepairToWorker(applicationId);
        }
        
        // 发送审核结果通知给学生
        notificationService.sendReviewResultNotification(application);
        
        return true;
    }
    
    /**
     * 分配维修任务给维修人员
     */
    private void assignRepairToWorker(Long applicationId) {
        RepairApplication application = repairMapper.selectRepairApplicationById(applicationId);
        
        // 根据维修类型和当前工作量分配维修人员
        RepairWorker worker = repairWorkerMapper.selectSuitableWorker(application.getLeixing());
        
        if (worker != null) {
            // 创建维修处理记录
            RepairProcess process = new RepairProcess();
            process.setBaoxiushebei(application.getBaoxiushebei());
            process.setLeixing(application.getLeixing());
            process.setBaoxiuriqi(application.getBaoxiuriqi());
            process.setWeixiujindu("待处理");
            process.setXuehao(application.getXuehao());
            process.setXueshengxingming(application.getXueshengxingming());
            process.setSushehao(application.getSushehao());
            process.setBanji(application.getBanji());
            process.setWeixiugonghao(worker.getWeixiugonghao());
            process.setXingming(worker.getXingming());
            process.setLianxidianhua(worker.getLianxidianhua());
            process.setGengxinriqi(new Date());
            
            repairMapper.insertRepairProcess(process);
            
            // 发送维修任务通知给维修人员
            notificationService.sendRepairTaskNotification(worker, application);
        }
    }
    
    /**
     * 维修人员更新维修进度
     */
    public boolean updateRepairProgress(Long processId, ProgressUpdateDTO progressDTO) {
        RepairProcess process = repairMapper.selectRepairProcessById(processId);
        if (process == null) {
            throw new RuntimeException("维修记录不存在");
        }
        
        // 更新维修进度
        process.setWeixiujindu(progressDTO.getWeixiujindu());
        process.setWeixiufankui(progressDTO.getWeixiufankui());
        process.setGengxinriqi(new Date());
        
        repairMapper.updateRepairProcess(process);
        
        // 发送进度更新通知给学生
        notificationService.sendProgressUpdateNotification(process);
        
        return true;
    }
    
    /**
     * 获取维修统计信息
     */
    public RepairStats getRepairStats(String startDate, String endDate) {
        RepairStats stats = new RepairStats();
        
        // 统计各类维修数量
        stats.setElectricalCount(repairMapper.countRepairsByType("电器维修", startDate, endDate));
        stats.setPlumbingCount(repairMapper.countRepairsByType("水管维修", startDate, endDate));
        stats.setFurnitureCount(repairMapper.countRepairsByType("家具维修", startDate, endDate));
        stats.setOtherCount(repairMapper.countRepairsByType("其他维修", startDate, endDate));
        
        // 统计完成率
        int totalRepairs = repairMapper.countTotalRepairs(startDate, endDate);
        int completedRepairs = repairMapper.countCompletedRepairs(startDate, endDate);
        stats.setCompletionRate(totalRepairs > 0 ? (double) completedRepairs / totalRepairs * 100 : 0);
        
        // 统计平均处理时间
        stats.setAvgProcessTime(repairMapper.getAverageProcessTime(startDate, endDate));
        
        return stats;
    }
}

3.4 第四步:前端界面实现——多角色适配界面

基于JSP + Bootstrap构建适配多角色的宿舍管理界面,确保界面清晰、操作便捷:

3.4.1 学生功能界面

  • 个人中心:基本信息、宿舍信息、我的报修、我的申请;
  • 报修服务:在线报修、进度查询、历史记录;
  • 生活服务:水电缴费、桶装水预订、失物招领;
  • 申请服务:假期留宿申请、状态查询。

3.4.2 管理员功能界面

  • 宿舍管理:宿舍信息维护、床位分配、调整管理;
  • 报修管理:报修审核、任务分配、进度监控;
  • 卫生管理:检查安排、评分统计、文明评比;
  • 数据统计:各类数据的统计分析报表。

3.4.3 维修人员功能界面

  • 任务管理:待处理任务、进行中任务、已完成任务;
  • 进度更新:维修进度反馈、完成确认;
  • 工作统计:工作量统计、效率分析。

3.4.4 商家功能界面

  • 商品管理:桶装水信息维护、库存管理;
  • 订单处理:预订订单处理、配送管理;
  • 销售统计:销售数据、客户分析。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

3.5 第五步:系统测试——确保系统稳定可靠

通过全面的测试策略确保系统质量,重点测试多角色协同和业务流程:

3.5.1 功能测试

设计完整测试用例,覆盖主要业务场景:

测试场景预期结果实际结果是否通过
学生报修申请申请提交成功,状态正确申请提交成功,状态正确
管理员审核分配审核分配正常,通知及时审核分配正常,通知及时
维修进度更新进度更新准确,状态同步进度更新准确,状态同步
宿舍分配调整分配调整成功,数据一致分配调整成功,数据一致
多角色权限控制权限分离正确,功能隔离权限分离正确,功能隔离

3.5.2 性能测试

  • 并发测试:系统支持500用户同时在线操作;
  • 数据准确性:宿舍分配和费用计算准确无误;
  • 安全测试:用户权限和数据安全得到有效保障。

3.6 第六步:问题排查与优化——提升系统性能

开发过程中遇到的主要技术问题及解决方案:

  1. 多角色权限管理:基于角色的精细化权限控制实现;
  2. 业务流程协同:报修流程的多角色协同工作机制;
  3. 数据一致性:宿舍分配和床位管理的并发控制;
  4. 通知机制:多场景下的实时消息通知系统。

四、毕业设计复盘:经验总结与实践建议

4.1 开发过程中的技术挑战

  1. 复杂的业务流程:报修、分配、检查等多流程的协同管理;
  2. 多角色权限设计:四类用户角色的功能权限和数据权限分离;
  3. 数据关联性:学生、宿舍、报修等数据的复杂关联关系;
  4. 系统性能优化:高并发场景下的系统响应和数据处理。

4.2 给后续开发者的建议

  1. 重视业务流程梳理:宿舍管理系统涉及多个业务流程,要建立清晰的流程规范;
  2. 完善权限管理体系:多角色系统的权限设计要细致、灵活;
  3. 数据一致性保证:关键业务操作要保证数据的准确性和一致性;
  4. 用户体验优化:不同角色的操作界面要符合各自的使用习惯;
  5. 扩展性考虑:系统设计要支持后续的功能扩展和规模扩展。

五、项目资源与发展展望

5.1 项目核心资源

本项目提供完整的开发资料:

  • 后端源码:完整的Spring Boot项目源码;
  • 前端页面:基于JSP的前端页面资源;
  • 数据库脚本:MySQL数据库建表语句和测试数据;
  • API文档:完整的业务接口文档;
  • 部署文档:详细的系统部署和配置指南。

5.2 系统扩展方向

  1. 移动端支持:开发微信小程序或APP移动端;
  2. 物联网集成:集成智能门锁、水电表等物联网设备;
  3. 数据分析:学生行为分析和宿舍使用效率分析;
  4. 智能推荐:基于历史数据的智能宿舍分配推荐;
  5. 微服务架构:系统功能模块的微服务化改造。

如果本文对您的Spring Boot学习、宿舍管理系统相关毕业设计有帮助,欢迎点赞 + 收藏 + 关注,后续会分享更多企业级管理系统实战案例!