1. 项目概述:大健康养老公寓管理系统的技术架构
这套大健康养老公寓管理系统采用当前主流的企业级开发技术栈,实现了前后端完全分离的架构模式。前端基于Vue3的Composition API构建响应式界面,后端采用SpringBoot快速搭建RESTful API服务,数据持久层通过MyBatis与MySQL数据库交互。系统专为养老机构设计,涵盖住户管理、健康监测、护理排班、费用结算等核心业务模块。
在技术选型上,我们特别考虑了养老行业的实际需求:
- Vue3+TypeScript 保障前端代码的可维护性,配合Element Plus组件库快速搭建管理后台界面
- SpringBoot 2.7.x 提供稳定的后端基础,内嵌Tomcat简化部署
- MyBatis-Plus 增强单表操作效率,同时保留原生MyBatis的灵活SQL编写能力
- MySQL 8.0 作为关系型数据库,满足事务性操作需求
提示:实际部署时建议使用MySQL 8.0.23以上版本,其窗口函数和CTE特性在复杂报表查询中表现优异
2. 环境准备与项目初始化
2.1 开发环境配置清单
| 组件 | 版本要求 | 备注 |
|---|---|---|
| JDK | 1.8+ | 推荐Amazon Corretto 11 |
| Node.js | 16.x+ | 需包含npm 8.x |
| MySQL | 8.0+ | 需开启大小写敏感配置 |
| IDE | IntelliJ IDEA/VSCode | 需安装Lombok插件 |
2.2 后端项目初始化
使用Spring Initializr创建项目时,关键依赖选择:
xml复制<dependencies>
<!-- Web核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis整合 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 开发工具包 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2.3 前端项目搭建
使用Vite创建Vue3项目:
bash复制npm create vite@latest elderly-care-admin --template vue-ts
cd elderly-care-admin
npm install element-plus axios vue-router pinia --save
关键配置项:
- 在
vite.config.ts中配置代理,解决开发环境跨域 - 使用Pinia替代Vuex进行状态管理
- 按需引入Element Plus组件减少打包体积
3. 数据库设计与MyBatis集成
3.1 核心表结构设计
养老公寓系统的数据库设计需特别关注:
- 住户健康数据的时序性存储
- 护理操作的审计追踪
- 费用计算的准确性保障
主要表结构示例:
sql复制CREATE TABLE `resident` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`id_card` varchar(18) NOT NULL,
`gender` tinyint DEFAULT '0',
`birth_date` date NOT NULL,
`check_in_date` datetime NOT NULL,
`health_status` varchar(20) DEFAULT 'NORMAL',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_id_card` (`id_card`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `health_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`resident_id` bigint NOT NULL,
`measure_time` datetime NOT NULL,
`blood_pressure` varchar(20) DEFAULT NULL,
`blood_sugar` decimal(5,2) DEFAULT NULL,
`temperature` decimal(3,1) DEFAULT NULL,
`nurse_id` bigint NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_resident` (`resident_id`),
KEY `idx_measure_time` (`measure_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
3.2 MyBatis动态SQL实践
在健康记录查询场景中,我们使用MyBatis的动态SQL处理多条件筛选:
xml复制<select id="selectHealthRecords" resultType="HealthRecordVO">
SELECT r.*, res.name as resident_name
FROM health_record r
JOIN resident res ON r.resident_id = res.id
<where>
<if test="residentId != null">
AND r.resident_id = #{residentId}
</if>
<if test="startTime != null and endTime != null">
AND r.measure_time BETWEEN #{startTime} AND #{endTime}
</if>
<if test="minBloodSugar != null">
AND r.blood_sugar >= #{minBloodSugar}
</if>
</where>
ORDER BY r.measure_time DESC
</select>
注意:MyBatis参数传递时,对于日期类型建议使用@Param注解明确参数名,避免因时区转换导致查询条件失效
4. 前后端分离架构实现
4.1 RESTful API设计规范
养老管理系统API设计遵循以下原则:
- 资源命名使用复数形式(如
/api/residents) - 状态码规范:
- 200:常规成功响应
- 201:资源创建成功
- 400:参数校验失败
- 401:未授权访问
- 响应体统一结构:
typescript复制interface ApiResponse<T> {
code: number;
message: string;
data: T;
timestamp: number;
}
4.2 Vue3前端工程实践
4.2.1 基于Composition API的组件封装
以住户信息卡片组件为例:
typescript复制// ResidentCard.vue
<script setup lang="ts">
import { computed } from 'vue';
const props = defineProps<{
resident: ResidentDTO;
showDetail?: boolean;
}>();
const age = computed(() => {
const birthYear = new Date(props.resident.birthDate).getFullYear();
return new Date().getFullYear() - birthYear;
});
</script>
<template>
<el-card class="resident-card">
<template #header>
<div class="card-header">
<span>{{ resident.name }}</span>
<el-tag :type="resident.healthStatus === 'NORMAL' ? 'success' : 'danger'">
{{ resident.healthStatus }}
</el-tag>
</div>
</template>
<div class="card-body">
<p>年龄: {{ age }}岁</p>
<p>身份证: {{ resident.idCard }}</p>
<el-button v-if="showDetail" type="text">查看详情</el-button>
</div>
</el-card>
</template>
4.2.2 状态管理方案对比
针对养老系统的特点,我们采用Pinia进行状态管理:
| 方案 | 适用场景 | 本系统应用案例 |
|---|---|---|
| 组件状态 | 局部状态 | 表单输入状态 |
| Pinia | 全局共享 | 登录用户信息、系统配置 |
| URL参数 | 页面间传递 | 住户ID传递 |
5. 系统安全与性能优化
5.1 安全防护措施
-
JWT认证流程:
- 前端在登录后存储token于localStorage
- axios拦截器自动添加Authorization头
- 后端使用Spring Security校验token有效性
-
SQL注入防护:
- 强制使用MyBatis参数绑定
- 禁止拼接SQL语句
- 定期使用SQLMap进行漏洞扫描
-
XSS防护:
- 前端使用vue-dompurify处理富文本
- 后端对字符串字段进行HTML转义
5.2 性能优化实践
5.2.1 MyBatis二级缓存配置
在SpringBoot中启用MyBatis二级缓存:
yaml复制mybatis:
configuration:
cache-enabled: true
local-cache-scope: session
缓存使用注意事项:
- 对高频读取、低频修改的表开启缓存
- 关联查询结果慎用缓存
- 更新操作需清空相关缓存
5.2.2 Vue3组件性能优化
- 使用
v-memo缓存静态内容 - 复杂列表采用虚拟滚动
- 按需加载ECharts等重型组件
6. 典型业务场景实现
6.1 健康数据趋势分析
后端实现步骤:
- 创建定时任务,每天凌晨统计健康指标
- 使用MySQL窗口函数计算周环比
- 暴露REST接口供前端调用
关键SQL示例:
sql复制SELECT
resident_id,
AVG(blood_sugar) OVER (PARTITION BY resident_id ORDER BY measure_date RANGE BETWEEN INTERVAL 7 DAY PRECEDING AND CURRENT ROW) AS weekly_avg,
measure_date
FROM health_record
WHERE measure_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
6.2 护理任务自动分配
基于规则的自动分配算法:
java复制public List<NurseAssignment> autoAssignTasks(LocalDate date) {
// 1. 获取当日可用护理人员
List<Nurse> availableNurses = nurseMapper.selectAvailable(date);
// 2. 获取需要护理的住户
List<Resident> residents = residentMapper.selectNeedCare();
// 3. 基于权重分配算法
return assignmentStrategy.distribute(availableNurses, residents);
}
算法考虑因素:
- 护理人员专业等级
- 住户护理等级
- 历史分配均衡性
7. 部署与运维方案
7.1 生产环境部署
推荐使用Docker Compose编排服务:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
MYSQL_DATABASE: elderly_care
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/elderly_care
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
7.2 监控与日志
- SpringBoot Actuator暴露健康检查端点
- 使用Prometheus+Grafana监控系统指标
- ELK收集分析业务日志
关键监控指标:
- API响应时间P99
- MySQL连接池使用率
- JVM内存占用
8. 项目演进方向
在实际开发中,我们发现以下改进点值得关注:
- 移动端适配:开发微信小程序版本,方便家属查看老人状况
- 智能预警:引入机器学习模型分析健康数据异常
- 物联网集成:对接智能床垫、手环等设备自动采集数据
- 微服务改造:将健康监测、费用管理等模块拆分为独立服务
技术债解决方案:
- 使用Flyway管理数据库变更
- 建立API契约测试保障接口兼容性
- 实施SonarQube代码质量门禁
这套技术栈组合经过多个养老机构项目的验证,在开发效率、系统性能和可维护性方面取得了良好平衡。特别是在处理老年健康数据这种既有结构化数据又有时序特征的业务场景时,MySQL+MyBatis的组合展现了出色的灵活性。
