1. 项目概述:经方药食两用服务平台的技术架构
这个基于SpringBoot+Vue的经方药食两用服务平台,本质上是一个融合传统中医药理论与现代IT技术的数字化解决方案。作为一套完整的毕设/课设参考项目,它采用了典型的前后端分离架构:后端使用SpringBoot构建RESTful API,前端采用Vue.js实现动态交互,数据存储则依赖MySQL关系型数据库。
从技术选型来看,这套方案非常符合当前企业级应用开发的主流趋势。SpringBoot的约定优于配置理念大幅降低了Java后端开发的复杂度,而Vue的响应式特性则能高效处理中医药数据复杂的展示逻辑。特别值得注意的是,项目中"药食两用"这个核心业务概念,指的是那些既是药品又是食品的中药材(比如枸杞、山药等),这类物质的管理需要特殊的业务规则和展示逻辑。
2. 技术栈深度解析
2.1 SpringBoot后端技术要点
后端采用SpringBoot 2.7.x版本构建,这是目前企业Java开发的事实标准。核心配置在application.yml中体现了典型的三层架构:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/herb_db?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
show-sql: true
hibernate:
ddl-auto: update
关键依赖包括:
spring-boot-starter-data-jpa:用于数据库操作spring-boot-starter-web:提供RESTful支持lombok:简化实体类编写hibernate-validator:参数校验
实体类设计特别考虑了中医药特性,例如药材实体包含性味归经等专业字段:
java复制@Entity
@Data
public class Herb {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name; // 药材名称
private String taste; // 性味
private String meridian; // 归经
private String efficacy; // 功效
private Boolean isFood; // 是否属于药食同源
}
2.2 Vue前端架构设计
前端采用Vue 3组合式API,项目结构清晰:
code复制src/
├── api/ # 接口定义
├── assets/ # 静态资源
├── components/ # 通用组件
├── router/ # 路由配置
├── store/ # Vuex状态管理
├── utils/ # 工具函数
└── views/ # 页面组件
特色功能包括:
- 药材分类树形展示(使用Element Plus的Tree组件)
- 配伍禁忌颜色警示(基于规则引擎的计算结果)
- 响应式表单验证(针对中医药特殊字段)
典型页面组件示例:
vue复制<template>
<el-table :data="herbList" style="width: 100%">
<el-table-column prop="name" label="药材名称" />
<el-table-column label="性味归经">
<template #default="{row}">
{{row.taste}} | {{row.meridian}}
</template>
</el-table-column>
<el-table-column label="药食两用">
<template #default="{row}">
<el-tag :type="row.isFood ? 'success' : 'info'">
{{row.isFood ? '是' : '否'}}
</el-tag>
</template>
</el-table-column>
</el-table>
</template>
2.3 数据库关键设计
MySQL数据库设计考虑了中医药数据的特殊性:
sql复制CREATE TABLE `herb` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '药材名称',
`pinyin` varchar(100) DEFAULT NULL COMMENT '拼音',
`latin_name` varchar(100) DEFAULT NULL COMMENT '拉丁名',
`taste` varchar(50) DEFAULT NULL COMMENT '性味',
`meridian` varchar(50) DEFAULT NULL COMMENT '归经',
`efficacy` text COMMENT '功效',
`contraindication` text COMMENT '禁忌',
`is_food` tinyint(1) DEFAULT '0' COMMENT '是否药食同源',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
特别设计了药方关联表,体现中药配伍关系:
sql复制CREATE TABLE `prescription_herb` (
`id` bigint NOT NULL AUTO_INCREMENT,
`prescription_id` bigint NOT NULL,
`herb_id` bigint NOT NULL,
`dosage` varchar(20) DEFAULT NULL COMMENT '用量',
`processing` varchar(50) DEFAULT NULL COMMENT '炮制方法',
`role` enum('monarch','minister','assistant','guide') DEFAULT NULL COMMENT '君臣佐使',
PRIMARY KEY (`id`),
KEY `idx_prescription` (`prescription_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心业务功能实现
3.1 药食两用分类系统
项目核心功能之一是智能识别药食两用物品,实现逻辑如下:
java复制@Service
@RequiredArgsConstructor
public class HerbServiceImpl implements HerbService {
private final HerbRepository herbRepository;
@Override
public Page<Herb> findFoodHerbs(Pageable pageable) {
// 获取国家卫健委公布的药食同源目录
List<String> officialFoodHerbs = Arrays.asList(
"山药", "山楂", "枸杞子", "阿胶", "茯苓" // 简略示例
);
return herbRepository.findByNameIn(officialFoodHerbs, pageable);
}
@Override
public List<Herb> checkCompatibility(Long herbId1, Long herbId2) {
// 实现十八反十九畏检查逻辑
Herb herb1 = herbRepository.findById(herbId1).orElseThrow();
Herb herb2 = herbRepository.findById(herbId2).orElseThrow();
Map<String, List<String>> incompatibilityRules = Map.of(
"乌头", List.of("贝母", "瓜蒌", "半夏"),
"甘草", List.of("甘遂", "大戟")
// 其他配伍禁忌规则...
);
List<Herb> result = new ArrayList<>();
if (incompatibilityRules.getOrDefault(herb1.getName(), List.of())
.contains(herb2.getName())) {
result.add(herb1);
result.add(herb2);
}
return result;
}
}
3.2 智能配伍禁忌检查
前端实现实时配伍检查的典型代码:
vue复制<script setup>
import { ref, watch } from 'vue'
import { checkHerbCompatibility } from '@/api/herb'
const selectedHerbs = ref([])
const incompatiblePairs = ref([])
watch(selectedHerbs, async (newVal) => {
incompatiblePairs.value = []
if (newVal.length < 2) return
// 两两检查配伍
for (let i = 0; i < newVal.length; i++) {
for (let j = i + 1; j < newVal.length; j++) {
const res = await checkHerbCompatibility(
newVal[i].id,
newVal[j].id
)
if (res.data.length > 0) {
incompatiblePairs.value.push({
herb1: newVal[i],
herb2: newVal[j],
reason: '存在配伍禁忌:十八反'
})
}
}
}
}, { deep: true })
</script>
3.3 经方推荐算法
基于症状的经方推荐核心逻辑:
java复制public List<Prescription> recommendPrescriptions(List<String> symptoms) {
// 1. 症状关键词提取
Set<String> keywords = extractKeywords(symptoms);
// 2. 查询匹配症状的经方
List<Prescription> candidates = prescriptionRepository
.findBySymptomsContaining(keywords);
// 3. 基于规则排序
return candidates.stream()
.sorted((a, b) -> {
int scoreA = calculateMatchScore(a, keywords);
int scoreB = calculateMatchScore(b, keywords);
return scoreB - scoreA;
})
.limit(5)
.collect(Collectors.toList());
}
private int calculateMatchScore(Prescription p, Set<String> keywords) {
int score = 0;
for (String kw : keywords) {
if (p.getSymptoms().contains(kw)) score += 3;
if (p.getEfficacy().contains(kw)) score += 2;
if (p.getName().contains(kw)) score += 1;
}
return score;
}
4. 项目部署与开发要点
4.1 环境配置指南
后端开发环境配置关键步骤:
-
JDK 11+环境变量配置:
bash复制# 检查Java版本 java -version # 设置环境变量(示例) export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:$PATH -
MySQL 8.0初始化:
sql复制CREATE DATABASE herb_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'herb_user'@'%' IDENTIFIED BY 'Herb@1234'; GRANT ALL PRIVILEGES ON herb_db.* TO 'herb_user'@'%'; FLUSH PRIVILEGES; -
前端Node环境:
bash复制# 使用nvm管理Node版本 nvm install 16.14.0 nvm use 16.14.0 # 安装依赖 npm install -g @vue/cli npm install
4.2 常见问题解决方案
-
跨域问题处理方案:
java复制@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .maxAge(3600); } } -
前端API请求封装示例:
javascript复制// src/api/request.js import axios from 'axios' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 }) // 请求拦截器 service.interceptors.request.use(config => { if (store.getters.token) { config.headers['Authorization'] = 'Bearer ' + getToken() } return config }, error => { return Promise.reject(error) }) -
数据字典缓存方案:
java复制@Service @CacheConfig(cacheNames = "dictCache") public class DictServiceImpl implements DictService { @Cacheable(key = "'herb_categories'") public List<DictItem> getHerbCategories() { return dictMapper.selectByType("herb_category"); } }
5. 项目扩展方向建议
5.1 中医药知识图谱构建
基于现有数据可扩展的知识图谱方案:
python复制# 示例:使用Py2neo构建中医药知识图谱
from py2neo import Graph, Node, Relationship
graph = Graph("bolt://localhost:7687", auth=("neo4j", "123456"))
# 创建节点
herb = Node("Herb", name="黄芪", category="补气药")
disease = Node("Disease", name="气虚", category="证候")
# 建立关系
rel = Relationship(herb, "治疗", disease,
efficacy="补气升阳",
source="《本草纲目》"
)
graph.create(rel)
5.2 微信小程序集成方案
Uniapp跨平台集成关键配置:
javascript复制// manifest.json
{
"mp-weixin": {
"appid": "YOUR_APPID",
"setting": {
"urlCheck": false
},
"usingComponents": true
}
}
// 调用API示例
uni.request({
url: 'https://api.example.com/herb/list',
success: (res) => {
this.herbList = res.data
}
})
5.3 智能推荐系统增强
基于用户行为的协同过滤算法示例:
java复制public List<Prescription> recommendByUserBehavior(Long userId) {
// 1. 获取用户历史行为
List<UserBehavior> behaviors = behaviorRepository.findByUserId(userId);
// 2. 找到相似用户
Map<Long, Integer> similarUsers = findSimilarUsers(behaviors);
// 3. 加权推荐
return similarUsers.entrySet().stream()
.flatMap(entry -> {
Long similarUserId = entry.getKey();
Integer weight = entry.getValue();
return behaviorRepository
.findByUserId(similarUserId).stream()
.map(b -> new Tuple<>(b.getPrescription(), weight));
})
.collect(Collectors.groupingBy(
Tuple::getFirst,
Collectors.summingInt(Tuple::getSecond)
))
.entrySet().stream()
.sorted(Map.Entry.<Prescription, Integer>comparingByValue().reversed())
.map(Map.Entry::getKey)
.limit(10)
.collect(Collectors.toList());
}
6. 项目开发经验总结
在开发中医药类系统时需要特别注意的几个要点:
-
中医药术语标准化处理:
- 建立统一的中医药术语词表
- 实现术语自动识别和标注
- 处理同义词和别名映射关系
-
复杂业务规则实现技巧:
java复制// 使用规则引擎处理复杂的配伍逻辑 KieServices kieServices = KieServices.Factory.get(); KieContainer kContainer = kieServices.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession("herbRules"); kSession.insert(new HerbCompatibilityCheck(herb1, herb2)); kSession.fireAllRules(); -
性能优化实践经验:
- 药材图片采用CDN加速
- 复杂查询结果使用Redis缓存
- 分页查询优化:最后时间戳分页法
-
中医药数据特殊处理:
sql复制/* 处理特殊字符的存储方案 */ CREATE TABLE `herb_alias` ( `id` bigint NOT NULL AUTO_INCREMENT, `herb_id` bigint NOT NULL, `alias` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idx_alias` (`alias`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -
前后端协作最佳实践:
- 使用Swagger UI维护API文档
- 制定统一的日期格式处理方案
- 错误代码标准化规范
