1. 项目背景与核心价值
作为一名长期从事Java企业级开发的工程师,最近帮学弟评审了一个基于SpringBoot的中药科普平台毕业设计。这个选题让我眼前一亮——它不仅契合当下传统文化复兴的热潮,更解决了中医药知识传播中的几个痛点问题。
传统的中医药知识获取存在三个明显断层:专业典籍过于晦涩难懂,网络信息又鱼龙混杂缺乏权威性,而民间口口相传的经验往往缺乏科学验证。我们开发的这个平台,正是要搭建一座连接专业中医药知识和普通大众的桥梁。
从技术角度看,这个毕设项目完美融合了SpringBoot的敏捷开发优势和中医药领域的专业特性。采用B/S架构使得用户无需安装任何客户端,通过浏览器就能获取权威的中药材知识、经典方剂配伍和养生典籍。我在架构设计阶段特别强调了一点:要让系统既保持专业严谨性,又具备互联网产品的易用性。
2. 系统架构设计与技术选型
2.1 整体技术栈解析
这个项目采用了经典的SpringBoot+Vue前后端分离架构,这种组合在毕业设计中具有明显优势:
- 后端:SpringBoot 2.7 + MyBatis-Plus 3.5 + Lombok
- 前端:Vue 3 + Element Plus + Axios
- 数据库:MySQL 8.0(特别配置了utf8mb4字符集以支持生僻中药名)
- 构建工具:Maven 3.8 + Webpack 4
选择MyBatis-Plus而非JPA是经过慎重考虑的。中医药数据具有复杂的关联关系(如药材-方剂-病症的多对多映射),MyBatis-Plus的Wrapper条件构造器能更灵活地处理这类复杂查询。我在项目中就实现了一个典型的关联查询:
java复制// 根据病症查询相关方剂
LambdaQueryWrapper<Prescription> wrapper = new LambdaQueryWrapper<>();
wrapper.inSql(Prescription::getId,
"SELECT prescription_id FROM prescription_disease WHERE disease_id = " + diseaseId);
List<Prescription> prescriptions = prescriptionMapper.selectList(wrapper);
2.2 核心模块划分
系统采用领域驱动设计(DDD)思想划分模块,这是很多初学者容易忽视的:
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── tcm/
│ │ ├── application/ # 应用层
│ │ ├── domain/ # 领域层
│ │ │ ├── entity/ # 实体类
│ │ │ ├── repo/ # 仓储接口
│ │ │ └── service/ # 领域服务
│ │ ├── infrastructure/ # 基础设施层
│ │ └── interfaces/ # 接口层
│ └── resources/
│ ├── mapper/ # MyBatis映射文件
│ └── static/ # 前端资源
特别要说明的是中药材领域模型的设计。传统药材属性复杂,我们采用组合模式处理:
java复制public class ChineseMedicine {
private Long id;
private String name;
private String alias; // 别名
private String origin; // 产地
private List<MedicineProperty> properties; // 性味归经等属性
private List<MedicineImage> images; // 药材图片
}
3. 关键功能实现细节
3.1 智能搜索功能实现
中药搜索面临特殊挑战:用户可能输入药材学名、别名、甚至错别字(如"黄茋"代替"黄芪")。我们采用Elasticsearch构建搜索引擎,并加入特殊处理:
- 同义词扩展:在索引阶段建立同义词库
json复制PUT /medicines
{
"settings": {
"analysis": {
"filter": {
"medicine_synonym": {
"type": "synonym",
"synonyms": [
"黄芪, 黄茋, 元芪",
"当归, 干归, 秦归"
]
}
}
}
}
}
- 实现拼音搜索插件,支持拼音首字母检索
java复制// 自定义拼音分析器
public class PinyinAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
StandardTokenizer src = new StandardTokenizer();
TokenStream result = new PinyinTokenFilter(src);
return new TokenStreamComponents(src, result);
}
}
3.2 方剂配伍可视化
中医方剂的君臣佐使关系用文本描述难以理解。我们使用ECharts实现配伍关系可视化:
javascript复制// 在前端处理配伍数据
function renderHerbRelation(prescription) {
const nodes = prescription.herbs.map(herb => ({
name: herb.name,
category: herb.role // 君/臣/佐/使
}));
const links = prescription.herbs.map(herb => ({
source: prescription.mainHerb,
target: herb.name
}));
myChart.setOption({
series: [{
type: 'graph',
layout: 'circular',
data: nodes,
links: links
}]
});
}
4. 开发中的典型问题与解决方案
4.1 生僻字处理方案
中药材名称包含大量生僻字(如"䗪虫"、"莪术"),我们遇到三个典型问题:
- 数据库存储:MySQL必须配置utf8mb4字符集
sql复制CREATE DATABASE tcm_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 前端显示:引入专用字体库
html复制<!-- 在HTML中引入思源字体 -->
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC&display=swap" rel="stylesheet">
- 拼音转换:扩展pinyin4j库
java复制// 自定义生僻字拼音映射
static {
Dictionary.addPinyinDict('䗪', "zhe");
Dictionary.addPinyinDict('莪', "e");
}
4.2 药材图片智能处理
用户上传的药材图片质量参差不齐,我们采用OpenCV进行预处理:
java复制// 使用JavaCV进行图像增强
public static Mat enhanceImage(Mat src) {
Mat dst = new Mat();
// 直方图均衡化
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2YCrCb);
List<Mat> channels = new ArrayList<>();
Core.split(dst, channels);
Imgproc.equalizeHist(channels.get(0), channels.get(0));
Core.merge(channels, dst);
Imgproc.cvtColor(dst, dst, Imgproc.COLOR_YCrCb2BGR);
return dst;
}
5. 部署与性能优化
5.1 多环境配置方案
毕业设计常需要演示,我们设计了灵活的配置体系:
code复制resources/
├── application.yml # 公共配置
├── application-dev.yml # 开发环境
├── application-test.yml # 测试环境
└── application-prod.yml # 生产环境
通过Profile实现环境切换:
bash复制# 启动测试环境
mvn spring-boot:run -Dspring-boot.run.profiles=test
5.2 缓存策略设计
中药数据具有读多写少的特点,我们采用多级缓存:
- 本地Caffeine缓存高频访问数据
java复制@Bean
public CaffeineCacheManager cacheManager() {
return new CaffeineCacheManager("herbs", "prescriptions") {
@Override
protected Cache<Object, Object> createNativeCache(String name) {
return Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(1, TimeUnit.HOURS)
.build();
}
};
}
- Redis缓存共享数据
java复制@Cacheable(value = "prescription", key = "#id")
public Prescription getPrescriptionById(Long id) {
return prescriptionMapper.selectById(id);
}
6. 项目扩展方向
这个基础平台还有很大的扩展空间,我在项目文档中建议了以下几个方向:
- 中医药知识图谱构建
python复制# 使用Neo4j构建药材-功效-病症关系网
CREATE (d:Herb {name:'当归'})-[:HAS_EFFECT]->(e:Effect {name:'补血活血'})
CREATE (e)-[:TREATS]->(s:Disease {name:'月经不调'})
- 移动端适配方案
css复制/* 使用flex布局实现响应式 */
.herb-card {
display: flex;
flex-direction: column;
@media (max-width: 768px) {
flex-direction: row;
}
}
- 智能推荐算法
java复制// 基于用户行为的协同过滤
public List<Prescription> recommendPrescriptions(Long userId) {
List<UserBehavior> behaviors = behaviorMapper.selectByUser(userId);
// 实现推荐逻辑...
}
在开发过程中,我特别强调要处理好三个平衡:传统医学的严谨性与互联网的开放性、专业术语的准确性与大众理解的易读性、系统功能的完整性与毕业设计的时间限制。这个项目不仅是一个技术实践,更是对传统文化数字化传播的有益探索。
