1. 项目概述与背景
这个经方药食两用服务平台是我去年指导的一个本科毕业设计项目,核心目标是搭建一个融合传统中医药理论与现代信息技术的服务平台。平台采用SpringBoot+Vue的前后端分离架构,实现了经方查询、药食同源食材推荐、体质辨识等特色功能。
在实际开发过程中,我们发现现有中医药类平台普遍存在两个痛点:一是专业术语晦涩难懂,二是缺乏个性化推荐。我们这个平台特别注重用户体验,通过可视化方式展示药材属性,并基于用户体质测试结果智能匹配经方和食材。
2. 技术架构解析
2.1 后端技术选型
SpringBoot 2.7.12作为后端框架,主要考虑了以下因素:
- 内嵌Tomcat简化部署
- 自动配置减少XML配置
- 丰富的Starter依赖
- 与MyBatis-Plus的完美整合
数据库选用MySQL 8.0,关键配置参数:
spring: datasource: url: jdbc:mysql://localhost:3306/tcm_platform?useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver2.2 前端技术方案
Vue 3 + Element Plus构建管理后台,主要特性:
- 采用Composition API
- 使用Vite构建工具
- 按需引入组件减小打包体积
- 配置了动态路由和权限控制
// 典型API调用示例 const getHerbList = async () => { try { const res = await axios.get('/api/herbs', { params: { page: 1, size: 10 } }) herbList.value = res.data.data } catch (err) { ElMessage.error('获取药材列表失败') } }3. 核心功能实现
3.1 智能推荐系统
基于用户体质测试结果的推荐算法:
- 使用改良的AHP层次分析法计算体质维度权重
- 构建药材-功效-体质三维关系矩阵
- 采用改进的协同过滤算法生成推荐
// 推荐算法核心代码片段 public List<HerbDTO> recommendHerbs(UserPhysiqueDTO physique) { // 1. 计算体质得分 Map<String, Double> dimensionScores = calculateDimensionScores(physique); // 2. 获取候选药材 List<Herb> candidates = herbMapper.selectByConditions(dimensionScores); // 3. 加权排序 return candidates.stream() .map(h -> new HerbDTO(h, calculateMatchScore(h, dimensionScores))) .sorted(Comparator.comparing(HerbDTO::getMatchScore).reversed()) .limit(10) .collect(Collectors.toList()); }3.2 经方知识图谱
构建过程:
- 数据采集:《伤寒论》等典籍结构化处理
- 实体识别:使用HanLP进行中药名、症状识别
- 关系抽取:基于规则的模式匹配
- 可视化:使用Echarts实现交互式图谱
4. 数据库设计要点
4.1 核心表结构
主要表格及其关系:
- 用户表(t_user):存储用户基本信息
- 体质测试表(t_physique_test):记录测试结果
- 药材表(t_herb):1200+种药材数据
- 经方表(t_prescription):400+经典方剂
- 食材表(t_food):800+种药食同源食材
CREATE TABLE `t_herb` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL COMMENT '药材名称', `alias` varchar(200) DEFAULT NULL COMMENT '别名', `category` varchar(20) DEFAULT NULL COMMENT '分类', `nature` varchar(10) DEFAULT NULL COMMENT '性味', `meridian` varchar(50) DEFAULT NULL COMMENT '归经', `efficacy` text COMMENT '功效', `contraindication` text COMMENT '禁忌', `image_url` varchar(255) DEFAULT NULL COMMENT '图片URL', PRIMARY KEY (`id`), FULLTEXT KEY `ft_idx` (`name`,`alias`,`efficacy`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;4.2 性能优化措施
- 为高频查询字段添加索引
- 使用全文检索提高模糊查询效率
- 热点数据Redis缓存
- 大文本字段单独分表
5. 部署实践
5.1 环境准备
服务器最低配置要求:
- CPU:2核
- 内存:4GB
- 磁盘:50GB
- 系统:CentOS 7.6+
必备组件:
- JDK 11
- Node.js 16.x
- MySQL 8.0
- Redis 6.x
- Nginx 1.20+
5.2 部署步骤
后端部署流程:
- 打包SpringBoot应用
mvn clean package -DskipTests- 配置application-prod.yml
- 使用systemd管理服务
[Unit] Description=TCM Platform Service After=syslog.target network.target [Service] User=appuser ExecStart=/usr/bin/java -jar /opt/tcm-platform/tcm-platform.jar SuccessExitStatus=143 [Install] WantedBy=multi-user.target前端部署要点:
- 修改API基础地址
- 构建生产环境包
npm run build- 配置Nginx
server { listen 80; server_name tcm.example.com; location / { root /opt/tcm-platform/frontend/dist; index index.html; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://localhost:8080; proxy_set_header Host $host; } }6. 开发经验总结
6.1 中医药数据处理技巧
- 非结构化数据处理:
- 使用正则表达式提取典籍中的方剂组成
- 建立同义词词典解决别名问题
- 开发专用的标注工具辅助人工校验
- 数据质量控制:
- 设置多级审核流程
- 建立版本控制系统
- 实现数据变更追溯
6.2 性能优化实践
- 接口响应时间从1200ms优化到300ms的关键措施:
- 添加多级缓存(Redis + 本地缓存)
- 优化SQL查询,避免N+1问题
- 使用Hutool的BloomFilter防止缓存穿透
- 前端加载优化:
- 图片懒加载
- 路由级代码分割
- Gzip压缩静态资源
7. 常见问题解决方案
7.1 跨域问题处理
开发环境解决方案:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowCredentials(true) .maxAge(3600); } }生产环境推荐方案:
- 使用Nginx反向代理
- 配置CORS响应头
- 对于复杂请求启用OPTIONS预检缓存
7.2 中医药术语匹配难题
我们采用的解决方案:
- 构建领域词典
- 实现拼音模糊匹配
- 开发上下文感知的纠错算法
- 引入词向量计算语义相似度
// 术语匹配示例 public List<String> matchHerbNames(String input) { // 1. 精确匹配 List<String> exactMatches = herbMapper.selectNamesByName(input); if (!exactMatches.isEmpty()) return exactMatches; // 2. 拼音匹配 List<String> pinyinMatches = herbMapper.selectNamesByPinyin(input); // 3. 别名匹配 List<String> aliasMatches = herbMapper.selectNamesByAlias(input); // 合并并去重 return Stream.concat(pinyinMatches.stream(), aliasMatches.stream()) .distinct() .limit(5) .collect(Collectors.toList()); }8. 项目扩展方向
- 移动端适配:
- 开发微信小程序版本
- 实现扫码识药功能
- 增加AR药材展示
- 智能问诊:
- 集成NLP引擎
- 构建症状-方剂关联模型
- 开发对话式问诊流程
- 电商功能扩展:
- 药材溯源系统
- 在线问诊开方
- 智能煎药预约
这个项目从技术实现到业务逻辑都有不少值得深入的点,特别是在处理中医药这种专业领域数据时,需要特别注重数据的准确性和专业性。我们在开发过程中建立了严格的数据审核流程,并邀请中医药专家参与校验,这是保证平台专业度的关键