作为一名长期从事医疗信息化系统开发的工程师,我最近完成了一个基于SpringBoot+Vue的医疗陪护服务平台项目。这个平台主要解决住院患者家属无法全程陪护时的服务需求,通过线上对接专业陪护人员,为患者提供生活照料、医疗协助等服务。下面我将从架构设计到具体实现,完整分享这个项目的开发经验。
随着社会老龄化加剧和医疗需求增长,住院患者的陪护服务缺口日益突出。传统陪护服务存在信息不对称、服务质量参差不齐等问题。我们这个平台主要解决以下痛点:
平台核心功能包括:
采用前后端分离的B/S架构:
code复制前端:Vue.js + ElementUI
后端:SpringBoot + MyBatis Plus
数据库:MySQL 8.0
缓存:Redis
消息队列:RabbitMQ(用于异步处理订单状态变更)
文件存储:阿里云OSS
选择这套技术栈主要基于以下考虑:
核心表结构设计:
sql复制CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`role` enum('patient','caregiver','admin') NOT NULL,
`phone` varchar(20) NOT NULL,
`avatar` varchar(255) DEFAULT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `caregiver_info` (
`user_id` bigint NOT NULL,
`real_name` varchar(50) NOT NULL,
`id_card` varchar(18) NOT NULL,
`gender` enum('male','female') NOT NULL,
`age` tinyint NOT NULL,
`certificate_no` varchar(50) DEFAULT NULL,
`service_type` varchar(100) NOT NULL,
`work_experience` smallint NOT NULL DEFAULT '0',
`hourly_rate` decimal(10,2) NOT NULL,
`introduction` text,
`status` enum('available','unavailable','in_service') NOT NULL DEFAULT 'available',
PRIMARY KEY (`user_id`),
CONSTRAINT `fk_caregiver_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
重要提示:医疗相关系统必须特别注意数据安全和隐私保护。我们采用以下措施:
- 敏感字段如身份证号在数据库层加密存储
- 接口传输全部使用HTTPS
- 实现严格的RBAC权限控制
- 操作日志完整记录
采用Spring Security + JWT实现安全的认证授权体系。下面是核心登录逻辑:
java复制@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private UserService userService;
@Autowired
private JwtTokenProvider tokenProvider;
@PostMapping("/login")
public ResponseEntity<?> authenticateUser(
@Valid @RequestBody LoginRequest loginRequest) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
loginRequest.getUsername(),
loginRequest.getPassword()
)
);
SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = tokenProvider.generateToken(authentication);
return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
}
@PostMapping("/register")
public ResponseEntity<?> registerUser(
@Valid @RequestBody SignUpRequest signUpRequest) {
if(userService.existsByUsername(signUpRequest.getUsername())) {
return ResponseEntity
.badRequest()
.body(new ApiResponse(false, "Username is already taken!"));
}
User user = new User(signUpRequest.getUsername(),
signUpRequest.getPassword(),
signUpRequest.getRole());
userService.save(user);
return ResponseEntity.ok(new ApiResponse(true, "User registered successfully"));
}
}
陪护人员匹配是本系统的核心功能,我们实现了基于多维度评分的匹配算法:
java复制public List<Caregiver> matchCaregivers(PatientNeed need) {
// 基础筛选:服务类型、当前状态
List<Caregiver> candidates = caregiverRepository.findByServiceTypeAndStatus(
need.getServiceType(),
CaregiverStatus.AVAILABLE);
// 多维度评分
candidates.forEach(c -> {
// 距离分(基于医院坐标)
double distanceScore = calculateDistanceScore(c, need.getHospitalId());
// 经验分
double expScore = c.getWorkExperience() * 0.1;
// 评价分
double ratingScore = c.getAverageRating() * 2;
// 价格分(越接近患者预算得分越高)
double priceScore = 1 - Math.abs(c.getHourlyRate() - need.getBudget()) / need.getBudget();
c.setMatchScore(distanceScore*0.3 + expScore*0.2 + ratingScore*0.3 + priceScore*0.2);
});
// 排序并返回TOP10
return candidates.stream()
.sorted(Comparator.comparing(Caregiver::getMatchScore).reversed())
.limit(10)
.collect(Collectors.toList());
}
为确保陪护服务质量,我们实现了以下监管机制:
实时位置上报:
服务节点确认:
javascript复制// Vue组件中的服务确认逻辑
methods: {
confirmServiceStep(step) {
this.$axios.post('/api/service/confirm', {
orderId: this.order.id,
step: step
}).then(response => {
this.$message.success('服务步骤已确认');
}).catch(error => {
this.$message.error('确认失败');
});
}
}
紧急情况处理:
支付流程采用沙箱模式设计,核心类图如下:
code复制PaymentService
├── createPayment(Order)
├── processCallback(PaymentCallback)
└── refund(Order)
PaymentStrategy
├── AlipayStrategy
├── WechatPayStrategy
└── BankTransferStrategy
关键支付处理逻辑:
java复制@Transactional
public PaymentResult processPayment(Order order, PaymentMethod method) {
// 验证订单状态
if (!order.getStatus().equals(OrderStatus.WAITING_PAYMENT)) {
throw new IllegalStateException("订单当前状态不可支付");
}
// 根据支付方式选择策略
PaymentStrategy strategy = PaymentStrategyFactory.getStrategy(method);
// 执行支付
PaymentResult result = strategy.pay(order);
// 更新订单状态
if (result.isSuccess()) {
order.setStatus(OrderStatus.PAID);
orderRepository.save(order);
// 发送支付成功通知
notificationService.sendPaymentSuccessNotification(order);
}
return result;
}
缓存策略:
数据库优化:
sql复制-- 为常用查询添加索引
CREATE INDEX idx_caregiver_service ON caregiver_info(service_type, status);
CREATE INDEX idx_order_status ON `order`(status, create_time);
-- 大表分表策略
-- 订单表按月份分表 order_202301, order_202302...
前端性能优化:
接口安全:
数据安全:
java复制// 敏感数据加密示例
public class DataEncryptor {
private static final String AES_KEY = "secure-key-12345";
public static String encrypt(String data) {
// AES加密实现
// ...
}
public static String decrypt(String encrypted) {
// AES解密实现
// ...
}
}
日志审计:
采用Docker + Kubernetes的部署架构:
dockerfile复制# SpringBoot服务Dockerfile示例
FROM openjdk:11-jre
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Kubernetes部署文件关键部分:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: caregiver-service
spec:
replicas: 3
selector:
matchLabels:
app: caregiver-service
template:
metadata:
labels:
app: caregiver-service
spec:
containers:
- name: caregiver-service
image: registry.example.com/caregiver-service:1.0.0
ports:
- containerPort: 8080
resources:
limits:
cpu: "1"
memory: 1Gi
requests:
cpu: "0.5"
memory: 512Mi
使用Prometheus + Grafana构建监控体系:
关键监控指标:
这个项目从需求分析到上线历时6个月,期间遇到了不少挑战也积累了很多宝贵经验:
医疗行业特殊性:
技术决策反思:
性能优化经验:
这个项目让我深刻体会到,医疗类系统的开发不仅要考虑技术实现,更需要深入理解医疗行业的运作规律和特殊要求。下一步我们计划接入更多医院的HIS系统,实现更深度的数据互通,同时探索AI技术在服务匹配和质量评估中的应用。