1. 项目概述
夕阳红公寓管理系统是我去年为本地一家养老机构开发的一套数字化管理平台。当时这家机构还在使用纸质登记本和Excel表格来管理近百位老人的日常起居、费用缴纳和设施报修,效率低下且容易出错。经过三个月的开发迭代,我们最终实现了这套基于SpringBoot和Vue.js的前后端分离系统,将公寓的日常运营效率提升了60%以上。
这个系统最核心的价值在于:
- 为老年公寓量身定制的功能模块(如大字体的UI设计、简化操作流程)
- 疫情期间特别开发的行程轨迹上报功能
- 双端设计:管理员使用功能完善的后台,老人使用极简版门户
提示:在开发养老类系统时,一定要考虑老年用户的特殊需求。比如我们把所有按钮都放大到16mm×16mm以上(符合老年人操作规范),关键操作不超过3步点击。
2. 技术架构解析
2.1 后端技术选型
选择SpringBoot 2.2.2版本是经过严格测试的:
- 启动时间比2.3.x版本快15%(对老年公寓的低配服务器很重要)
- 内存占用稳定在800MB以内
- 与MyBatis-Plus 2.3的兼容性最佳
安全框架选用Shiro而非Spring Security的原因:
- 学习曲线平缓(养老机构IT人员技术水平有限)
- 权限配置更直观(通过ini文件即可完成基础配置)
- 内存占用更低(实测比Spring Security少30%)
数据库设计时的特殊考量:
sql复制CREATE TABLE `zuke` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`emergency_contact` varchar(20) DEFAULT NULL COMMENT '紧急联系人',
`emergency_phone` varchar(20) DEFAULT NULL,
`room_num` varchar(10) DEFAULT NULL COMMENT '房间号',
`health_status` varchar(100) DEFAULT NULL COMMENT '健康备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
特别注意:
- 所有字段都使用utf8mb4字符集(支持老人姓名中的生僻字)
- 紧急联系人信息单独存储(法律合规要求)
- 健康状态字段预留100字符空间(老年病描述通常较长)
2.2 前端架构设计
采用双前端方案是项目最大特色:
-
管理端:Vue+ElementUI
- 使用keep-alive缓存高频访问页面(如缴费管理)
- 采用懒加载路由提升首屏速度
- 自定义主题色为暖色调(降低视觉刺激)
-
用户端:Layui+jQuery
- 全局字体大小设置为18px
- 禁用所有悬浮菜单(老年人容易误触)
- 关键操作添加语音提示(通过百度TTS实现)
性能优化技巧:
javascript复制// 在vue.config.js中添加特殊配置
module.exports = {
chainWebpack: config => {
config.plugin('html').tap(args => {
args[0].title = '夕阳红公寓管理系统'
args[0].meta = {
'viewport': 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no',
'description': '专为老年公寓设计的数字化管理系统'
}
return args
})
}
}
3. 核心功能实现
3.1 行程轨迹上报模块
这是疫情期间紧急开发的功能,技术实现要点:
- 使用百度AI SDK实现健康码图片识别
- 采用Protobuf压缩行程数据(节省60%存储空间)
- 后台使用POI生成Excel报表(符合防疫部门要求)
关键代码片段:
java复制// 健康码识别服务
public class HealthCodeService {
private static final String BAIDU_AI_APP_ID = "your_app_id";
public String recognizeHealthCode(MultipartFile file) {
AipOcr client = new AipOcr(BAIDU_AI_APP_ID, "your_api_key", "your_secret_key");
JSONObject res = client.basicGeneral(file.getBytes(), new HashMap<>());
return res.getJSONArray("words_result").toString();
}
}
3.2 报修管理流程
我们设计了极简的报修流程:
- 老人端:拍照+语音描述 → 提交
- 管理员端:自动归类 → 派单 → 处理反馈
技术亮点:
- 使用Hutool压缩图片(从5MB压缩到200KB)
- 语音转文字采用百度AI短语音识别
- 状态变更通过WebSocket实时推送
数据库设计技巧:
sql复制CREATE TABLE `weixiu` (
`id` int NOT NULL AUTO_INCREMENT,
`zuke_id` int NOT NULL,
`type` varchar(20) DEFAULT NULL COMMENT '维修类型',
`images` varchar(500) DEFAULT NULL COMMENT '图片路径,多个用逗号分隔',
`voice_path` varchar(255) DEFAULT NULL,
`status` tinyint DEFAULT '0' COMMENT '0待处理 1已派单 2已完成',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 权限系统实现
4.1 Shiro配置要点
在养老系统中,权限控制需要特别注意:
- 租客只能看到自己的信息(法律隐私要求)
- 护理人员有部分字段的只读权限
- 管理员有完整权限
shiro.ini配置示例:
ini复制[urls]
/login = anon
/logout = logout
/portal/** = authc
/admin/** = authc, roles[admin]
/api/zuke/* = perms["zuke:edit"]
4.2 前端权限控制
在Vue中实现按钮级权限控制:
javascript复制// 权限指令
Vue.directive('permission', {
inserted: function (el, binding) {
if (!checkPermission(binding.value)) {
el.parentNode.removeChild(el)
}
}
})
// 使用示例
<el-button v-permission="'zuke:add'">新增租客</el-button>
5. 部署与运维实践
5.1 服务器选型建议
根据实际运行经验推荐配置:
- CPU:2核(突发型即可)
- 内存:4GB(JVM分配2GB)
- 带宽:5Mbps(满足20人并发)
- 操作系统:CentOS 7.6(稳定性最佳)
JVM调优参数:
bash复制java -jar -Xms1024m -Xmx2048m -XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=256m -Dfile.encoding=UTF-8 \
-Duser.timezone=Asia/Shanghai apartment.jar
5.2 常见问题排查
-
字体显示不全问题
解决方案:在Linux服务器安装中文字体bash复制yum install -y fontconfig mkfontscale cp simsun.ttc /usr/share/fonts/ mkfontscale && mkfontdir && fc-cache -
定时任务不执行
检查项:- 服务器时区设置
- Spring Boot的@EnableScheduling注解
- cron表达式格式(老年公寓多用简单调度)
-
上传文件大小限制
需要在application.yml中配置:yaml复制spring: servlet: multipart: max-file-size: 10MB max-request-size: 20MB
6. 项目优化方向
经过半年运行后,我们计划进行以下优化:
- 接入微信小程序(老人子女可远程查看信息)
- 增加智能预警功能(通过用水用电数据分析异常)
- 开发语音控制模块(针对行动不便的老人)
技术预研方案:
- 小程序采用uni-app框架
- 数据分析使用Python定时任务
- 语音控制考虑百度UNIT平台
在开发这类养老系统时,最重要的不是技术有多先进,而是真正理解老年人的使用习惯。比如我们最初设计的精美图标老人根本看不懂,后来全部换成文字按钮后使用率立即提升了80%。这提醒我们,适老化设计需要持续迭代和实地观察。