1. 项目背景与核心需求
随着我国老龄化程度不断加深,老年公寓的管理正面临着前所未有的挑战。传统的手工登记、纸质档案管理方式已经难以满足现代养老机构对效率、准确性和服务质量的要求。我曾参与过多个养老机构的IT系统改造项目,亲眼目睹了管理员们翻找厚厚登记簿的窘境,也深刻理解护工们需要同时照顾多位老人时的压力。
这个夕阳红公寓管理系统正是为了解决这些痛点而生。系统需要实现三个核心目标:
- 住户信息数字化管理:将原本分散在各类纸质表格中的老人基本信息、健康数据、紧急联系人等集中管理,支持快速查询和统计
- 费用管理自动化:实现水电费、物业费等费用的自动计算、账单生成和缴费记录,减少人工计算错误
- 健康监测系统化:建立完整的健康档案,记录血压、血糖等关键指标的变化趋势,为护理工作提供数据支持
2. 技术选型与架构设计
2.1 为什么选择SpringBoot+Vue技术栈
在技术选型阶段,我们对比了多种方案,最终确定使用SpringBoot+Vue.js的全栈方案,主要基于以下考虑:
-
开发效率:SpringBoot的约定优于配置原则和丰富的Starter依赖,可以快速搭建后端服务。我们实测从零开始搭建一个具备基础CRUD功能的RESTful API,仅需不到2小时。
-
前后端分离优势:
- 前端团队可以独立开发,不受后端进度影响
- 接口定义好后,前后端可以并行开发
- 更利于后期维护和功能扩展
-
社区生态:SpringBoot和Vue.js都拥有庞大的开发者社区,遇到问题容易找到解决方案。以健康档案模块为例,我们直接使用了社区推荐的ECharts组件来实现健康数据可视化。
2.2 数据库设计考量
MySQL作为关系型数据库,在保证事务特性的同时,也提供了足够的性能。我们在设计表结构时特别注意了以下几点:
-
数据完整性:通过外键约束确保关联数据的一致性。例如住户信息删除时,相关的费用和健康记录也会级联删除。
-
查询优化:为高频查询字段添加索引。如resident_info表的room_number字段添加了普通索引,使房间查询速度提升约40%。
-
敏感数据保护:虽然系统不存储支付密码等敏感信息,但我们仍对联系电话等个人隐私字段进行了加密存储。
提示:在实际部署时,建议将数据库服务与应用服务分离部署,并使用定期备份策略。我们曾遇到过一个客户因为服务器硬盘故障导致数据丢失的情况。
3. 核心功能模块实现
3.1 住户信息管理模块
这个模块是系统的基础,我们实现了以下功能点:
-
信息录入与编辑:
- 支持批量导入Excel数据(很多养老院已有电子版花名册)
- 表单验证确保必填字段完整
- 身份证号自动校验和年龄计算
-
高级搜索功能:
java复制// 后端搜索接口示例
@GetMapping("/residents")
public Page<Resident> searchResidents(
@RequestParam(required = false) String name,
@RequestParam(required = false) String roomNumber,
@RequestParam(required = false) Integer status,
Pageable pageable) {
Specification<Resident> spec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.hasText(name)) {
predicates.add(cb.like(root.get("residentName"), "%" + name + "%"));
}
// 其他条件类似...
return cb.and(predicates.toArray(new Predicate[0]));
};
return residentRepository.findAll(spec, pageable);
}
- 入住状态管理:
- 图形化展示各楼栋入住率
- 房间状态看板(已住/空置/维修中)
3.2 费用管理模块
这个模块的开发过程中,我们踩过几个坑:
-
费用类型动态配置:初期硬编码了水电、物业等费用类型,后来改为可配置方式,使公寓可以自定义费用项目。
-
账单生成逻辑:
- 水电费支持按固定单价和分段计价两种模式
- 物业费支持按面积计算
- 所有费用项目支持设置滞纳金规则
-
缴费提醒功能:
- 支持短信和系统消息两种提醒方式
- 可设置提前提醒天数
- 欠费住户列表导出
注意:金额计算一定要使用BigDecimal而非Double,我们曾因浮点数精度问题导致分项合计与总和不符,被财务人员严肃批评过。
3.3 健康档案模块
健康管理是老年公寓的核心需求,我们实现了:
-
数据采集:
- 支持手动录入和智能设备对接(如血压计数据直接上传)
- 异常值自动标记(如血压超过警戒值)
-
健康趋势分析:
- 使用Vue-ECharts展示历史数据折线图
- 支持按周/月/季度查看变化
-
预警机制:
- 关键指标超出阈值自动通知护工
- 生成健康周报供家属查看
4. 系统安全与权限设计
4.1 基于RBAC的权限控制
系统设计了三种角色:
| 角色 | 权限说明 | 典型操作 |
|---|---|---|
| 管理员 | 全系统权限 | 用户管理、数据导出 |
| 护工 | 护理相关功能 | 健康记录、日常护理 |
| 住户 | 个人信息查看 | 查看账单、健康数据 |
权限控制采用Spring Security实现,核心配置如下:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/staff/**").hasAnyRole("STAFF", "ADMIN")
.antMatchers("/resident/**").hasAnyRole("RESIDENT", "STAFF", "ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
4.2 安全防护措施
- 接口防刷:敏感操作如费用缴纳添加验证码和频率限制
- XSS防护:前端使用DOMPurify对输入内容进行消毒
- 密码安全:采用BCryptPasswordEncoder进行密码哈希
- 会话管理:设置合理的会话超时时间(建议15-30分钟)
5. 部署与运维建议
5.1 服务器环境配置
推荐的最低配置:
- 2核CPU
- 4GB内存
- 100GB存储空间
我们建议的部署架构:
code复制前端Nginx(Vue静态文件)
↓
后端SpringBoot(内嵌Tomcat)
↓
MySQL数据库(建议5.7+版本)
5.2 常见问题排查
-
前端页面空白:
- 检查Nginx配置是否正确指向dist目录
- 确认API地址配置正确(vue.config.js中的proxy设置)
-
数据库连接失败:
- 检查application.yml中的数据库连接参数
- 确认MySQL用户有远程连接权限(如果分开部署)
-
文件上传失败:
- 检查服务器存储目录权限
- 确认SpringBoot配置了multipart支持
6. 项目扩展方向
在实际使用中,我们发现系统还可以进一步扩展:
- 移动端应用:开发家属小程序,方便查看老人状态和缴费
- 智能设备集成:对接智能手环、房间传感器等IoT设备
- 餐饮管理模块:记录老人饮食偏好和特殊需求
- 活动管理:组织文娱活动并记录参与情况
这个项目采用了完全开源的架构,所有代码都遵循MIT协议。对于想要学习SpringBoot和Vue.js的同学,我建议可以从住户管理模块开始研究,逐步理解前后端交互的全过程。在开发过程中,一定要多写单元测试,我们为每个核心模块都提供了测试用例示例。