作为一名有10年Java全栈开发经验的工程师,我经常被问到如何选择一个既有技术深度又具备实用价值的毕业设计项目。基于SpringBoot的电子健康档案管理系统就是一个非常不错的选择,它不仅涵盖了企业级应用开发的核心技术栈,还能解决医疗信息化中的实际问题。
这个系统采用前后端分离架构,后端使用SpringBoot+MyBatisPlus,前端采用Vue.js,数据库使用MySQL,实现了完整的个人健康档案管理功能。系统最大的亮点在于:
在技术选型上,我们经过多方考量最终确定了以下技术栈:
后端技术栈:
前端技术栈:
数据库:
技术选型心得:SpringBoot的自动配置特性大大简化了项目搭建过程,而Vue3的组合式API让前端开发更加灵活。MyBatis-Plus的代码生成器可以快速生成基础CRUD代码,节省了大量重复劳动。
系统采用经典的三层架构:
code复制┌───────────────────────────────────────┐
│ 表现层 │
│ (Vue前端 + RESTful API接口) │
└───────────────────────────────────────┘
▲
│
┌───────────────────────────────────────┐
│ 业务逻辑层 │
│ (Service层 + 健康评估算法) │
└───────────────────────────────────────┘
▲
│
┌───────────────────────────────────────┐
│ 数据访问层 │
│ (MyBatis-Plus + MySQL) │
└───────────────────────────────────────┘
数据库设计遵循第三范式,主要表结构如下:
用户表(sys_user)
sql复制CREATE TABLE `sys_user` (
`user_id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`real_name` varchar(100) DEFAULT NULL COMMENT '真实姓名',
`gender` tinyint DEFAULT '0' COMMENT '性别(0:未知 1:男 2:女)',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
`status` tinyint DEFAULT '1' COMMENT '状态(0:禁用 1:正常)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`user_id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户';
健康档案表(health_record)
sql复制CREATE TABLE `health_record` (
`record_id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '用户ID',
`height` decimal(5,2) DEFAULT NULL COMMENT '身高(cm)',
`weight` decimal(5,2) DEFAULT NULL COMMENT '体重(kg)',
`blood_pressure` varchar(20) DEFAULT NULL COMMENT '血压',
`blood_sugar` decimal(5,2) DEFAULT NULL COMMENT '血糖(mmol/L)',
`cholesterol` decimal(5,2) DEFAULT NULL COMMENT '胆固醇(mmol/L)',
`heart_rate` int DEFAULT NULL COMMENT '心率(次/分)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`record_date` date NOT NULL COMMENT '记录日期',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`record_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_record_date` (`record_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='健康档案';
数据库设计技巧:为常用查询字段添加索引,如user_id和record_date;使用utf8mb4字符集支持emoji;对数值类型精确控制小数位。
健康评分是系统的核心功能,我们采用多维度加权算法:
java复制public HealthEvaluation evaluateHealth(Long userId) {
// 获取用户最新健康数据
HealthRecord record = recordService.getLatestRecord(userId);
// BMI计算
double bmi = calculateBMI(record.getHeight(), record.getWeight());
int bmiScore = evaluateBMI(bmi);
// 血压评估
int bloodPressureScore = evaluateBloodPressure(record.getBloodPressure());
// 血糖评估
int bloodSugarScore = evaluateBloodSugar(record.getBloodSugar());
// 综合评分(权重可配置)
double totalScore = bmiScore * 0.3
+ bloodPressureScore * 0.4
+ bloodSugarScore * 0.3;
// 生成评估报告
HealthEvaluation evaluation = new HealthEvaluation();
evaluation.setUserId(userId);
evaluation.setScore(totalScore);
evaluation.setLevel(getHealthLevel(totalScore));
evaluation.setSuggestions(generateSuggestions(bmiScore, bloodPressureScore, bloodSugarScore));
return evaluation;
}
private String generateSuggestions(int bmiScore, int bpScore, int bsScore) {
StringBuilder sb = new StringBuilder();
if(bmiScore < 60) {
sb.append("您的体重指数不理想,建议调整饮食结构并适当运动。");
}
if(bpScore < 60) {
sb.append("血压指标异常,建议定期监测并咨询医生。");
}
// 其他建议...
return sb.toString();
}
系统采用RBAC权限模型,通过Shiro实现:
java复制@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
// 权限配置
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/login", "anon");
filterMap.put("/register", "anon");
filterMap.put("/**", "authc");
factoryBean.setFilterChainDefinitionMap(filterMap);
return factoryBean;
}
@Bean
public Realm customRealm() {
return new CustomRealm();
}
}
// 自定义Realm
public class CustomRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
User user = userService.findByUsername(username);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 添加角色
info.setRoles(userService.getRoles(user.getUserId()));
// 添加权限
info.setStringPermissions(userService.getPermissions(user.getUserId()));
return info;
}
// 认证逻辑...
}
难点1:健康数据的动态表单存储
健康档案需要支持不同用户自定义字段,传统的关系型数据库表结构难以满足。
解决方案:
采用混合存储方案:
java复制// HealthRecord实体类中添加扩展字段
public class HealthRecord {
// ...其他字段
@TableField(typeHandler = JacksonTypeHandler.class)
private Map<String, Object> extraFields;
}
难点2:健康评估算法的可配置性
医疗评估标准会随时间变化,需要支持动态调整。
解决方案:
java复制// 规则引擎评估示例
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieContainer.newKieSession("healthEvaluationSession");
kieSession.insert(healthData);
kieSession.fireAllRules();
kieSession.dispose();
推荐使用Docker Compose进行一键部署:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: health_db
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:6.0
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
frontend:
build: ./frontend
ports:
- "80:80"
volumes:
mysql_data:
我们采用分层测试策略:
示例测试用例:健康评估服务测试
java复制@SpringBootTest
class HealthEvaluationServiceTest {
@Autowired
private HealthEvaluationService evaluationService;
@Test
void testEvaluateHealth() {
HealthRecord record = new HealthRecord();
record.setHeight(175.0);
record.setWeight(70.0);
record.setBloodPressure("120/80");
record.setBloodSugar(5.0);
HealthEvaluation evaluation = evaluationService.evaluateHealth(record);
assertNotNull(evaluation);
assertTrue(evaluation.getScore() > 0);
assertNotNull(evaluation.getSuggestions());
}
}
这个基础框架可以进一步扩展为:
对于想要深入学习的同学,我建议可以从以下方面进行扩展:
这个项目不仅适合作为毕业设计,经过完善后完全可以作为创业项目或实际应用于社区医疗系统。我在开发过程中积累的完整文档和注释详细的代码,可以帮助你快速理解和扩展系统功能。