1. 项目概述与技术栈选型
这套疗养院管理系统采用前后端分离架构,后端基于Spring Boot 2.7.x构建,前端使用Vue 3组合式API开发,数据库选用MySQL 8.0。系统设计目标是实现疗养院日常运营的数字化管理,包含床位管理、老人档案、护理记录、药品库存等核心模块。
技术栈选择上,Spring Boot提供了快速启动和自动配置的优势,配合内嵌Tomcat服务器,开发者只需关注业务逻辑实现。Vue 3的响应式特性特别适合管理系统的表单交互场景,而Element Plus组件库则大幅提升了界面开发效率。MySQL作为成熟的关系型数据库,在事务处理和复杂查询方面表现稳定。
提示:系统默认使用JDK 17运行环境,这是考虑到Spring Boot 3.x对Java 17的全面支持,虽然当前项目基于Spring Boot 2.x,但为后续升级预留了兼容性空间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构与模块设计
2.1 后端工程结构
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── nursinghome/
│ │ ├── config/ # Spring配置类
│ │ ├── controller/ # REST接口层
│ │ ├── service/ # 业务逻辑层
│ │ ├── dao/ # 数据访问层
│ │ ├── entity/ # 数据库实体
│ │ └── NursingHomeApplication.java
│ └── resources/
│ ├── application.yml # 主配置文件
│ ├── mapper/ # MyBatis映射文件
│ └── static/ # 静态资源
2.2 前端工程结构
code复制src/
├── api/ # 接口定义
├── assets/ # 静态资源
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Pinia状态管理
├── utils/ # 工具类
├── views/ # 页面组件
└── main.js # 入口文件
数据库设计遵循第三范式,核心表包括:
resident_info(老人信息表)bed_management(床位管理表)medical_record(医疗记录表)staff(员工表)inventory(药品库存表)
3. 环境准备与项目启动
3.1 后端环境配置
-
安装JDK 17并配置环境变量
-
MySQL 8.0安装与配置:
bash复制# 创建数据库 CREATE DATABASE nursing_home DEFAULT CHARACTER SET utf8mb4; # 创建用户并授权 CREATE USER 'nursing_admin'@'%' IDENTIFIED BY 'SecurePass123!'; GRANT ALL PRIVILEGES ON nursing_home.* TO 'nursing_admin'@'%'; -
修改
application.yml中的数据库连接配置:yaml复制spring: datasource: url: jdbc:mysql://localhost:3306/nursing_home?useSSL=false&serverTimezone=Asia/Shanghai username: nursing_admin password: SecurePass123! driver-class-name: com.mysql.cj.jdbc.Driver
3.2 前端环境配置
- 安装Node.js 16.x LTS版本
- 安装项目依赖:
bash复制
npm install - 配置API基础路径(
.env.development):ini复制VUE_APP_BASE_API = 'http://localhost:8080/api'
3.3 启动顺序
- 先启动MySQL服务
- 运行后端Spring Boot应用(默认端口8080)
- 启动前端开发服务器:
bash复制
npm run dev
注意:首次启动时,系统会自动执行
db/migration/V1__Init_Schema.sql初始化数据库表结构,并插入基础测试数据。
4. 核心功能实现解析
4.1 老人信息管理模块
采用RBAC权限模型控制数据访问,核心接口包括:
java复制@RestController
@RequestMapping("/api/resident")
public class ResidentController {
@Autowired
private ResidentService residentService;
@GetMapping
public PageResult<ResidentVO> list(ResidentQueryDTO queryDTO) {
return residentService.queryByPage(queryDTO);
}
@PostMapping
public Result<String> add(@Valid @RequestBody ResidentDTO dto) {
return residentService.addResident(dto);
}
@PutMapping("/{id}")
public Result<String> update(@PathVariable Long id,
@Valid @RequestBody ResidentDTO dto) {
return residentService.updateResident(id, dto);
}
}
前端使用Vue3的<script setup>语法实现表单联动:
vue复制<script setup>
const formState = reactive({
name: '',
gender: 1,
idCard: '',
checkRules: {
name: [{ required: true, message: '请输入姓名' }],
idCard: [{
validator: (_, value) =>
/^\d{17}[\dXx]$/.test(value),
message: '身份证格式错误'
}]
}
});
</script>
4.2 床位状态可视化
使用ECharts实现床位占用率实时展示:
javascript复制import * as echarts from 'echarts';
const initBedChart = () => {
const chart = echarts.init(document.getElementById('bed-chart'));
chart.setOption({
tooltip: { trigger: 'item' },
series: [{
type: 'pie',
data: [
{ value: 85, name: '已占用' },
{ value: 15, name: '空闲' }
]
}]
});
};
4.3 药品库存预警
后端定时任务检查库存量:
java复制@Scheduled(cron = "0 0 9 * * ?")
public void checkInventory() {
List<Inventory> lowStockItems = inventoryMapper.selectLowStock(10);
lowStockItems.forEach(item -> {
String message = String.format("药品%s库存不足,当前剩余%d",
item.getName(), item.getQuantity());
alertService.sendStockWarning(item.getResponsibleStaffId(), message);
});
}
5. 系统安全与性能优化
5.1 安全防护措施
-
接口签名验证(基于HMAC-SHA256)
java复制public class ApiSignInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String sign = request.getHeader("X-Sign"); String timestamp = request.getHeader("X-Timestamp"); // 验证签名有效性 } } -
SQL注入防护(MyBatis参数化查询)
xml复制<select id="selectByCondition" resultType="Resident"> SELECT * FROM resident_info <where> <if test="name != null"> AND name LIKE CONCAT('%', #{name}, '%') </if> </where> </select>
5.2 性能优化方案
-
二级缓存配置(Ehcache + Redis):
java复制@Cacheable(value = "residentCache", key = "#id") public Resident getById(Long id) { return residentMapper.selectById(id); } -
接口响应压缩:
yaml复制server: compression: enabled: true mime-types: text/html,text/xml,text/plain,application/json -
前端路由懒加载:
javascript复制const routes = [ { path: '/resident', component: () => import('@/views/resident/Index.vue') } ];
6. 常见问题排查指南
6.1 跨域问题解决
当出现Access-Control-Allow-Origin错误时,检查后端配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*");
}
}
6.2 MyBatis映射异常
若遇到Invalid bound statement错误,需确认:
- Mapper接口与XML文件命名一致
application.yml中配置了mapper路径:yaml复制mybatis: mapper-locations: classpath:mapper/*.xml
6.3 Vue页面刷新空白
可能是路由history模式问题,修改路由配置:
javascript复制const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
});
7. 扩展开发建议
7.1 微服务化改造
-
按功能拆分为:
- 用户服务
- 床位服务
- 医疗记录服务
- 库存服务
-
使用Spring Cloud Alibaba组件:
xml复制<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
7.2 移动端适配
- 基于Uniapp开发跨平台应用
- 使用Vant Weapp组件库
- 接口适配RESTful规范
7.3 智能设备对接
-
健康监测设备接入(HTTP/WebSocket)
java复制@RestController @RequestMapping("/api/device") public class DeviceController { @PostMapping("/health-data") public Result<?> receiveData(@RequestBody HealthDataDTO data) { // 处理设备上报数据 } } -
门禁系统集成(SDK调用)
java复制public class DoorAccessService { public boolean grantAccess(Long residentId) { // 调用门禁厂商API } }
8. 项目部署方案
8.1 传统部署方式
-
后端打包:
bash复制
mvn clean package -DskipTests生成的
target/nursing-home-0.0.1-SNAPSHOT.jar可直接运行:bash复制
java -jar nursing-home-0.0.1-SNAPSHOT.jar -
前端构建:
bash复制
npm run build将
dist目录内容部署到Nginx:nginx复制server { listen 80; server_name nursing.home; location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://localhost:8080; } }
8.2 Docker容器化部署
-
后端Dockerfile:
dockerfile复制FROM openjdk:17-jdk-slim COPY target/nursing-home-*.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"] -
前端Dockerfile:
dockerfile复制FROM nginx:alpine COPY dist/ /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf -
使用docker-compose编排:
yaml复制version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 backend: build: ./backend ports: ["8080:8080"] frontend: build: ./frontend ports: ["80:80"]
9. 二次开发建议
-
自定义字段扩展:
- 在
resident_info表中添加extended_fieldsJSON类型列 - 使用MyBatis的
@TypeHandler处理复杂类型
- 在
-
报表模块增强:
java复制@GetMapping("/export") public void exportResidents(HttpServletResponse response) { List<Resident> residents = residentService.listAll(); ExcelUtil.export(response, "老人列表", residents); } -
工作流引擎集成:
- 引入Activiti或Flowable
- 实现护理计划审批流程
-
消息推送优化:
java复制@Async public void sendNotification(Long staffId, String message) { // 集成WebSocket/短信/邮件通知 }
10. 运维监控方案
-
Spring Boot Actuator健康检查:
yaml复制management: endpoints: web: exposure: include: health,info,metrics -
Prometheus监控指标:
xml复制<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> -
ELK日志收集:
java复制@Slf4j @RestController public class ResidentController { @GetMapping public List<Resident> list() { log.info("查询老人列表"); return residentService.listAll(); } } -
SkyWalking分布式追踪:
bash复制
java -javaagent:/path/to/skywalking-agent.jar \ -Dskywalking.agent.service_name=nursing-home \ -jar nursing-home.jar
