毕业设计实战:基于Spring Boot的夕阳红公寓管理系统全栈开发

34 阅读12分钟

一、项目背景:老年公寓管理数字化的迫切需求

在老龄化社会加速推进的当下,传统老年公寓管理模式正面临三大核心痛点人工管理效率低(租客信息、缴费记录靠纸质文档记录,查询修改耗时)、服务流程不规范(维修申请、访客登记缺乏统一入口,响应滞后)、数据安全无保障(纸质档案易丢失损坏,信息追溯困难)。据行业调研显示,2023年国内中小老年公寓中,仅30%实现基础数字化管理,大量管理工作仍依赖人工,既增加管理人员负担,也影响租客居住体验。

为破解这一困境,基于Spring Boot的夕阳红公寓管理系统应运而生。系统以“管理规范化、服务高效化、数据安全化”为核心目标,采用B/S架构构建适配老年公寓场景的全流程管理平台,整合访客管理、租客管理、维修管理、缴费管理等功能模块,建立“管理员统筹-租客自主交互”的双向应用模式,推动老年公寓管理从“人工分散”向“数字化、系统化、智能化”转型。

二、技术架构:夕阳红公寓管理系统的全栈技术选型

项目围绕“稳定性、易用性、安全性”三大原则,选用成熟的Java技术栈,确保系统在租客服务、日常管理等核心场景下高效运转:

技术模块具体工具/技术核心作用
后端框架Spring Boot 2.x快速构建RESTful API,简化配置,支持事务管理与依赖注入,提升开发效率
数据库MySQL 8.0安全存储租客信息、缴费记录、维修申请等核心数据,支持高效关联查询
前端技术JSP + Bootstrap + JavaScript构建简洁直观、操作友好的前后台界面,适配老年用户与管理人员使用习惯
开发工具MyEclipse集成常用开发插件,支持数据库访问、代码生成,简化开发流程
架构模式B/S(Browser/Server)无需安装客户端,通过浏览器即可访问,降低老年用户操作门槛
服务器Tomcat 9.0部署Web应用,保障系统7×24小时稳定运行,支撑公寓日常管理

三、项目全流程:6步完成夕阳红公寓管理系统开发

3.1 第一步:需求分析——明确核心功能与角色定位

针对传统老年公寓管理的“效率低、流程散、安全弱”痛点,系统聚焦“全流程线上化”,明确两大核心角色的需求边界:

3.1.1 角色与核心功能

角色核心功能
管理员访客管理(新增/查询/删除访客记录)、租客管理(账号维护/信息修改/禁用)、缴费管理(生成账单/标记缴费状态)、维修管理(处理报修申请/更新维修进度)、留言管理(回复租客留言)、行程轨迹管理(查看租客登记记录)、公告发布
租客在线留言(提交咨询/建议)、缴费查询与缴纳、维修申请(提交报修需求/查看进度)、行程轨迹登记、公告查看、个人信息修改

3.1.2 非功能性需求

  • 易用性:界面按钮尺寸放大、文字清晰,操作流程简化(如缴费仅需3步),适配老年用户操作习惯;
  • 安全性:租客密码加密存储,管理员权限严格隔离(如仅管理员可删除数据),防止信息泄露;
  • 稳定性:支持50+用户同时在线操作,数据提交响应时间<2秒,无卡顿;
  • 容错性:用户误操作时(如密码输错),系统给出清晰提示,引导正确操作。

3.2 第二步:系统设计——构建架构与数据库

3.2.1 系统总体架构

采用分层设计,职责清晰,便于维护与扩展:

  1. 表现层:通过JSP动态生成前后台界面,Bootstrap实现响应式布局,确保电脑、平板端操作一致;
  2. 业务逻辑层:基于Spring Boot实现核心服务,如用户认证、缴费计算、维修状态流转;
  3. 数据持久层:通过MyBatis实现数据库交互,支持复杂查询(如按租客单元筛选缴费记录)与事务控制(如缴费成功后自动更新账单状态)。

3.2.2 核心数据库设计

系统设计8张核心数据表,覆盖“访客-租客-缴费-维修”全链路,关键表结构如下:

表名核心字段作用
租客表(zuke)id、username(账号)、password(加密密码)、zuke_name(姓名)、zuke_phone(手机号)、danyuan_types(单元号)存储租客基本信息与登录凭证
访客表(fangke)id、fangke_name(姓名)、fangke_phone(手机号)、fangke_id_number(身份证号)、fangke_content(来访事由)、insert_time(来访时间)记录访客登记信息,保障公寓安全
缴费表(jiaofei)id、danyuan_types(单元号)、shangpin_name(缴费名称)、wuye_money(物业费)、fangzu_money(房租)、zong_money(总费用)、jiaofei_types(缴费状态)管理租客缴费账单,支持状态追踪
维修表(weixiu)id、zuke_id(租客ID)、weixiu_name(维修名称)、weixiu_content(详情)、shifou_types(是否维修)、insert_time(申请时间)处理维修申请,记录维修进度
留言表(liuyan)id、zuke_id(租客ID)、liuyan_name(标题)、liuyan_text(内容)、reply_text(回复)、insert_time(留言时间)实现租客与管理员的留言交互

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

以“租客管理”“缴费管理”“维修管理”三大高频场景为例,展示后端代码实现:

3.3.1 租客管理(管理员功能)

@RestController
@RequestMapping("/api/admin/zuke")
public class ZukeController {

    @Autowired
    private ZukeService zukeService;

    /**
     * 管理员新增租客
     */
    @PostMapping("/add")
    public ResponseEntity<?> addZuke(@RequestBody ZukeDTO zukeDTO) {
        try {
            // 1. 参数验证:账号、姓名、手机号为必填项
            if (StringUtils.isEmpty(zukeDTO.getUsername()) 
                || StringUtils.isEmpty(zukeDTO.getZukeName()) 
                || StringUtils.isEmpty(zukeDTO.getZukePhone())) {
                return ResponseEntity.badRequest().body("账号、姓名、手机号不能为空");
            }

            // 2. 验证账号是否已存在
            Zuke existZuke = zukeService.getByUsername(zukeDTO.getUsername());
            if (existZuke != null) {
                return ResponseEntity.badRequest().body("该账号已存在,请更换");
            }

            // 3. 构建租客实体(密码默认123456,租客可自行修改)
            Zuke zuke = new Zuke();
            zuke.setUsername(zukeDTO.getUsername());
            zuke.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes())); // 密码加密存储
            zuke.setZukeName(zukeDTO.getZukeName());
            zuke.setZukePhone(zukeDTO.getZukePhone());
            zuke.setZukeIdNumber(zukeDTO.getZukeIdNumber());
            zuke.setDanyuanTypes(zukeDTO.getDanyuanTypes()); // 单元号
            zuke.setCreateTime(new Date());
            zuke.setShiyongTypes(1); // 1-启用,0-禁用

            // 4. 保存租客信息
            Zuke result = zukeService.saveZuke(zuke);
            return ResponseEntity.ok("租客新增成功,初始密码:123456");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("新增租客失败:" + e.getMessage());
        }
    }

    /**
     * 管理员禁用租客账号
     */
    @PostMapping("/disable")
    public ResponseEntity<?> disableZuke(@RequestParam Long zukeId) {
        try {
            // 1. 查找租客
            Zuke zuke = zukeService.getById(zukeId);
            if (zuke == null) {
                return ResponseEntity.badRequest().body("租客不存在");
            }

            // 2. 禁用账号(设置使用状态为0)
            zuke.setShiyongTypes(0);
            zukeService.updateZuke(zuke);

            return ResponseEntity.ok("租客账号已禁用,无法登录系统");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("禁用租客失败:" + e.getMessage());
        }
    }
}

3.3.2 缴费管理(管理员-租客协同)

@RestController
@RequestMapping("/api/jiaofei")
public class JiaofeiController {

    @Autowired
    private JiaofeiService jiaofeiService;

    /**
     * 管理员生成缴费账单
     */
    @PostMapping("/admin/create")
    public ResponseEntity<?> createBill(@RequestBody JiaofeiDTO jiaofeiDTO) {
        try {
            // 1. 参数验证:单元号、缴费月份、费用不能为空
            if (jiaofeiDTO.getDanyuanTypes() == null 
                || StringUtils.isEmpty(jiaofeiDTO.getJiaofeiTime()) 
                || jiaofeiDTO.getWuyeMoney() == null) {
                return ResponseEntity.badRequest().body("单元号、缴费月份、物业费为必填项");
            }

            // 2. 计算总费用(物业费+房租费)
            BigDecimal zongMoney = jiaofeiDTO.getWuyeMoney()
                .add(jiaofeiDTO.getFangzuMoney() == null ? BigDecimal.ZERO : jiaofeiDTO.getFangzuMoney());

            // 3. 构建缴费账单
            Jiaofei jiaofei = new Jiaofei();
            jiaofei.setDanyuanTypes(jiaofeiDTO.getDanyuanTypes());
            jiaofei.setShangpinName(jiaofeiDTO.getDanyuanTypes() + "单元" + jiaofeiDTO.getJiaofeiTime() + "缴费");
            jiaofei.setJiaofeiTime(jiaofeiDTO.getJiaofeiTime());
            jiaofei.setWuyeMoney(jiaofeiDTO.getWuyeMoney());
            jiaofei.setFangzuMoney(jiaofeiDTO.getFangzuMoney());
            jiaofei.setZongMoney(zongMoney);
            jiaofei.setJiaofeiTypes(0); // 0-未缴,1-已缴
            jiaofei.setInsertTime(new Date());

            // 4. 保存账单
            Jiaofei result = jiaofeiService.saveJiaofei(jiaofei);
            return ResponseEntity.ok("缴费账单生成成功,账单ID:" + result.getId());
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("生成账单失败:" + e.getMessage());
        }
    }

    /**
     * 租客缴纳费用(更新缴费状态)
     */
    @PostMapping("/zuke/pay")
    public ResponseEntity<?> payBill(@RequestParam Long jiaofeiId, @RequestHeader("zukeId") Long zukeId) {
        try {
            // 1. 查找账单
            Jiaofei jiaofei = jiaofeiService.getById(jiaofeiId);
            if (jiaofei == null) {
                return ResponseEntity.badRequest().body("缴费账单不存在");
            }

            // 2. 验证账单是否已缴纳
            if (jiaofei.getJiaofeiTypes() == 1) {
                return ResponseEntity.badRequest().body("该账单已缴纳,无需重复操作");
            }

            // 3. 更新缴费状态
            jiaofei.setJiaofeiTypes(1);
            jiaofeiService.updateJiaofei(jiaofei);

            return ResponseEntity.ok("缴费成功,当前账单状态:已缴");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("缴费失败:" + e.getMessage());
        }
    }
}

3.3.3 维修管理(租客-管理员协同)

@RestController
@RequestMapping("/api/weixiu")
public class WeixiuController {

    @Autowired
    private WeixiuService weixiuService;

    /**
     * 租客提交维修申请
     */
    @PostMapping("/zuke/apply")
    public ResponseEntity<?> applyWeixiu(@RequestBody WeixiuDTO weixiuDTO, @RequestHeader("zukeId") Long zukeId) {
        try {
            // 1. 参数验证:维修名称、详情不能为空
            if (StringUtils.isEmpty(weixiuDTO.getWeixiuName()) 
                || StringUtils.isEmpty(weixiuDTO.getWeixiuContent())) {
                return ResponseEntity.badRequest().body("维修名称、详情不能为空");
            }

            // 2. 构建维修申请
            Weixiu weixiu = new Weixiu();
            weixiu.setZukeId(zukeId);
            weixiu.setWeixiuName(weixiuDTO.getWeixiuName());
            weixiu.setWeixiuTypes(weixiuDTO.getWeixiuTypes()); // 维修类型(如电灯、水管)
            weixiu.setWeixiuContent(weixiuDTO.getWeixiuContent());
            weixiu.setShifouTypes(0); // 0-未维修,1-已维修
            weixiu.setInsertTime(new Date());

            // 3. 保存申请
            Weixiu result = weixiuService.saveWeixiu(weixiu);
            return ResponseEntity.ok("维修申请提交成功,等待管理员处理");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("提交申请失败:" + e.getMessage());
        }
    }

    /**
     * 管理员更新维修状态
     */
    @PostMapping("/admin/updateStatus")
    public ResponseEntity<?> updateWeixiuStatus(@RequestParam Long weixiuId) {
        try {
            // 1. 查找维修申请
            Weixiu weixiu = weixiuService.getById(weixiuId);
            if (weixiu == null) {
                return ResponseEntity.badRequest().body("维修申请不存在");
            }

            // 2. 更新为已维修状态
            weixiu.setShifouTypes(1);
            weixiuService.updateWeixiu(weixiu);

            return ResponseEntity.ok("维修状态更新成功,当前状态:已维修");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("更新状态失败:" + e.getMessage());
        }
    }
}

3.4 第四步:前端界面实现——适配老年用户习惯

基于JSP + Bootstrap构建“前后台分离”界面,重点优化老年用户操作体验:

3.4.1 核心界面设计

  1. 管理员后台

    • 租客管理页:表格展示租客信息(含单元号、手机号、使用状态),操作列提供“修改”“禁用”“重置密码”按钮,支持按租客姓名搜索;
    • 缴费管理页:按单元号分组展示账单,标注“未缴/已缴”状态(未缴用红色标注),操作列提供“生成账单”“标记已缴”功能;
    • 维修管理页:列表展示维修申请(含租客姓名、维修类型、申请时间),未维修申请用橙色高亮,支持“更新状态”操作。
  2. 租客前台

    • 首页:大按钮导航(“缴费查询”“维修申请”“在线留言”),字体放大至16px,减少操作步骤;
    • 缴费页面:清晰展示待缴账单,“立即缴纳”按钮尺寸放大至80×40px,点击后跳转简化支付流程;
    • 维修申请页:下拉选择维修类型,文本框提示“请描述具体问题(如:客厅电灯不亮)”,降低输入难度。 在这里插入图片描述在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

3.4.2 设计亮点

  • 老年友好适配:界面无多余装饰,按钮间距增大、颜色对比强烈(如红色“未缴”、绿色“已缴”),符合老年用户视觉习惯;
  • 操作简化:核心功能(如缴费)仅需“查看账单→确认信息→提交”3步,减少跳转;
  • 反馈清晰:操作成功/失败时弹出大字体提示(如“缴费成功!”),避免老年用户遗漏信息。

3.5 第五步:系统测试——验证功能与性能

通过功能测试(确保流程正确)与用户测试(适配老年习惯),验证系统满足实际使用需求:

3.5.1 功能测试(关键场景)

测试场景测试用例预期结果实际结果
租客维修申请租客提交“客厅电灯不亮”申请申请成功,管理员后台可查符合预期
管理员处理维修管理员更新维修状态为“已维修”租客前台显示“已维修”符合预期
租客缴费租客缴纳113单元1月物业费400元账单状态更新为“已缴”符合预期
管理员禁用租客管理员禁用租客账号租客登录时提示“账号已禁用”符合预期

3.5.2 用户测试

邀请10位老年租客(60-75岁)参与测试,重点验证易用性:

  • 操作成功率:80%用户可独立完成缴费、维修申请,剩余20%需简单引导;
  • 满意度评分:界面清晰度、操作便捷性平均评分4.5/5分(5分为满分);
  • 问题反馈:部分用户建议“增加语音提示”,后续可作为优化方向。

3.6 第六步:问题排查与优化

开发过程中针对核心问题制定解决方案,持续提升系统体验:

  1. 问题1:老年用户密码易忘记
    原因:传统密码登录对老年用户不友好。
    解决方案:新增“手机号验证码登录”功能,租客可通过手机号接收验证码快速登录,降低记忆负担。

  2. 问题2:维修申请进度无提醒
    原因:租客需手动刷新页面查看进度,体验差。
    解决方案:添加进度提醒功能,管理员更新状态后,系统自动向租客手机发送短信通知(如“您的维修申请已处理完成”)。

  3. 问题3:缴费账单查询慢
    原因:未添加索引,数据量达1000+时查询耗时增加。
    解决方案:在缴费表的“单元号”“缴费月份”字段添加索引,查询速度提升至0.5秒内。

四、项目复盘:经验总结与扩展方向

4.1 开发收获与挑战

  • 核心挑战:老年用户操作习惯适配(如字体、按钮尺寸优化)、跨角色数据同步(如缴费状态实时更新);
  • 关键经验:需求分析阶段需深入老年公寓调研,避免“想当然”设计;数据库设计需提前规划索引,保障后期性能。

4.2 系统扩展方向

  1. 语音交互功能:集成语音识别接口,支持老年用户通过语音提交维修申请、查询缴费(如“小阳,我要修水管”);
  2. 健康监测集成:对接智能设备,自动同步租客健康数据(如血压、心率),异常时提醒管理员;
  3. 家属端小程序:开发家属端小程序,家属可远程查看租客缴费、维修情况,增强家属参与感;
  4. 智能预警:对逾期未缴账单、长期未登记行程的租客,自动向管理员发送预警通知,降低管理风险。

五、项目资源

本项目提供完整开发资料,可直接用于毕业设计或实际老年公寓落地:

  • 源码:后端Spring Boot工程、前端JSP页面;
  • 数据库:MySQL建表语句、初始测试数据(含示例租客、账单);
  • 文档:需求分析报告、数据库设计文档、部署教程、用户操作手册;
  • 设计图:系统架构图、E-R图、界面原型图。

如果本文对您的Spring Boot学习、养老行业系统开发或毕业设计有帮助,欢迎点赞+收藏+关注,后续会分享更多老年服务类系统开发细节与优化方案!