1. 项目背景与技术选型
中医养生系统作为传统医学与现代信息技术结合的典型应用,近年来在健康管理领域需求日益增长。这个毕业设计项目采用SpringBoot+Vue的前后端分离架构,既符合当前企业级开发的主流技术路线,又能充分展现全栈开发能力。
技术栈选择上,后端采用SpringBoot 2.7.x版本,主要基于以下考虑:
- 自动配置特性简化了传统SSM框架的复杂XML配置
- 内嵌Tomcat服务器便于打包部署
- 丰富的Starter依赖可快速集成MyBatis、Redis等常用组件
- Actuator端点提供完善的系统监控能力
前端选用Vue 3.x组合式API,优势在于:
- 响应式编程模型更符合现代前端开发思维
- Composition API使代码组织更灵活
- Vite构建工具显著提升开发体验
- 丰富的生态系统(Vue Router、Pinia、Element Plus等)
2. 系统架构设计
2.1 整体架构分层
系统采用经典的三层架构,但针对中医领域特性做了特殊设计:
code复制├── 表现层
│ ├── Web前端(Vue3 + Element Plus)
│ └── 移动端API(预留Restful接口)
├── 业务逻辑层
│ ├── 中医体质辨识模块
│ ├── 养生方案推荐模块
│ └── 数据统计分析模块
└── 数据持久层
├── 关系型数据库(MySQL 8.0)
└── 缓存数据库(Redis 7.0)
2.2 核心数据模型设计
中医特色数据模型需要特别注意:
java复制// 体质类型枚举
public enum ConstitutionType {
YANG_DEFICIENT, // 阳虚质
YIN_DEFICIENT, // 阴虚质
PHLEGM_DAMP, // 痰湿质
QI_DEFICIENT, // 气虚质
BLOOD_STASIS, // 血瘀质
SPECIAL_DIATHESIS // 特禀质
}
// 养生方案实体
@Entity
public class HealthPlan {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
private ConstitutionType targetConstitution;
@Lob
private String dietaryAdvice; // 饮食建议
@Lob
private String acupointMassage; // 穴位按摩
@ElementCollection
private List<String> recommendedRecipes; // 推荐药膳
}
2.3 接口安全设计
考虑到健康数据的敏感性,采用JWT+RBAC的组合方案:
- 使用jjwt库生成Token
- 自定义注解实现接口权限控制
java复制@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequiresRoles {
String[] value() default {};
}
3. 核心功能实现
3.1 体质辨识问卷模块
前端采用动态表单生成技术:
vue复制<template>
<el-form :model="questionnaire">
<div v-for="(q,index) in questions" :key="q.id">
<h3>{{ q.content }}</h3>
<el-radio-group v-model="answers[index]">
<el-radio
v-for="opt in q.options"
:label="opt.score"
:key="opt.text"
>
{{ opt.text }}
</el-radio>
</el-radio-group>
</div>
</template>
<script setup>
// 从API加载问卷问题
const { data: questions } = await useFetch('/api/constitution/questions')
</script>
后端采用规则引擎处理评分:
java复制public ConstitutionResult evaluate(List<Integer> answers) {
Map<ConstitutionType, Integer> scores = new EnumMap<>(ConstitutionType.class);
// 根据中医体质判定规则计算各维度得分
for (int i = 0; i < answers.size(); i++) {
Question question = questionRepo.getById(i);
question.getAffectedTypes().forEach(type -> {
scores.merge(type, answers.get(i) * question.getWeight(), Integer::sum);
});
}
// 找出主导体质
ConstitutionType primary = Collections.max(scores.entrySet(),
Map.Entry.comparingByValue()).getKey();
return new ConstitutionResult(primary, scores);
}
3.2 智能推荐算法实现
结合规则引擎和协同过滤算法:
java复制public List<HealthPlan> recommendPlans(ConstitutionType type, UserPreference pref) {
// 基础规则推荐
List<HealthPlan> basePlans = planRepo.findByConstitution(type);
// 协同过滤增强
List<Long> similarUserChoices = cfService.findSimilarUsers(pref);
List<HealthPlan> cfPlans = planRepo.findByIdIn(similarUserChoices);
// 混合排序
return hybridSorter.sort(basePlans, cfPlans);
}
3.3 中医知识图谱构建
使用Neo4j存储中医实体关系:
cypher复制// 创建节点
CREATE (d:Herb {name:"黄芪", property:"温", effect:"补气升阳"})
CREATE (s:Symptom {name:"乏力", category:"气虚表现"})
// 建立关系
MATCH (a:Herb {name:"黄芪"}), (b:Symptom {name:"乏力"})
CREATE (a)-[r:TREATS]->(b)
4. 关键技术难点解决方案
4.1 中医术语标准化处理
建立术语转换中间层:
java复制public class TermConverter {
private static final Map<String, String> STANDARD_TERMS = Map.of(
"畏寒肢冷", "阳虚",
"五心烦热", "阴虚",
"痰多苔腻", "痰湿"
);
public String standardize(String rawTerm) {
return STANDARD_TERMS.getOrDefault(rawTerm,
NLPUtil.extractKeyTerm(rawTerm));
}
}
4.2 复杂业务事务管理
使用Spring的声明式事务管理:
java复制@Transactional
public void completeQuestionnaire(Long userId, List<AnswerDTO> answers) {
// 1. 保存答案记录
answerRepo.saveAll(convertToEntities(answers));
// 2. 计算体质结果
ConstitutionResult result = evaluator.evaluate(answers);
// 3. 生成推荐方案
List<HealthPlan> plans = recommender.recommend(result);
// 4. 更新用户档案
userProfileRepo.updateConstitution(userId, result);
}
4.3 高并发场景优化
采用多级缓存策略:
java复制@Cacheable(cacheNames = "plans", key = "#type")
public List<HealthPlan> getByConstitution(ConstitutionType type) {
return planRepo.findByConstitution(type);
}
@CacheEvict(cacheNames = "plans", key = "#plan.targetConstitution")
public void updatePlan(HealthPlan plan) {
planRepo.save(plan);
}
5. 部署与运维方案
5.1 容器化部署
Docker Compose编排文件示例:
yaml复制version: '3.8'
services:
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- redis
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
redis:
image: redis:7.0-alpine
5.2 监控配置
SpringBoot Actuator关键配置:
properties复制management.endpoints.web.exposure.include=health,metrics,info
management.metrics.tags.application=${spring.application.name}
management.health.redis.enabled=true
5.3 性能调优实战经验
- Vue组件懒加载方案:
javascript复制const Questionnaire = () => import('./components/Questionnaire.vue')
- MyBatis二级缓存配置陷阱:
xml复制<!-- 必须实现Serializable接口 -->
<cache readOnly="true" size="1024"/>
- Nginx静态资源优化:
nginx复制location /static {
expires 1y;
add_header Cache-Control "public";
access_log off;
}
6. 项目扩展方向
- 微信小程序集成:通过uni-app框架复用现有Vue代码
- AI辅助诊断:集成TensorFlow.js实现舌象分析
- 物联网设备对接:通过MQTT协议连接智能艾灸仪
- 区块链存证:使用Hyperledger Fabric存储诊疗记录
这个项目完整展示了如何将传统中医理论与现代软件开发技术相结合,在实现基础CRUD功能的同时,更需要深入理解中医领域的专业知识和业务规则。通过合理的架构设计和技术创新,最终打造出一个具有实用价值的中医养生系统。
