1. 项目背景与核心需求
中医药销售平台作为传统医药行业数字化转型的典型应用,近年来在"互联网+医疗健康"政策推动下需求激增。这个基于SpringBoot的毕业设计项目,瞄准了中医药销售场景中的三个核心痛点:
- 药材信息标准化程度低(同一药材存在多种产地、规格和炮制方法)
- 线上线下业务割裂(药店库存与电商平台数据不同步)
- 专业咨询服务缺失(普通消费者缺乏用药指导)
我在实际开发中发现,要解决这些问题需要构建四个关键模块:智能检索系统(支持药材别名联想)、实时库存管理系统、在线问诊模块,以及符合GSP规范的追溯系统。其中最难处理的是药材数据的标准化问题 - 我们最终采用了国家药典委员会发布的《中药编码规则》作为基础数据规范。
2. 技术架构设计要点
2.1 为什么选择SpringBoot
这个项目选择SpringBoot框架主要基于三点考量:
- 快速迭代:毕设周期通常只有2-3个月,需要快速产出可演示成果
- 微服务友好:后期可方便扩展为SpringCloud架构(我们预留了Feign接口)
- 生态丰富:整合MyBatis、Redis等中间件有成熟方案
实测在IDEA中创建基础框架只需5分钟:
bash复制spring init --dependencies=web,mybatis,mysql
--build=gradle
--java-version=17
cmop-project
2.2 数据库设计关键
药材信息表的设计直接影响系统性能,经过三次迭代我们确定了最终方案:
sql复制CREATE TABLE `herb` (
`id` CHAR(12) NOT NULL COMMENT '国标编码',
`common_name` VARCHAR(50) NOT NULL COMMENT '通用名',
`alias` JSON DEFAULT NULL COMMENT '别名数组',
`origin_place` VARCHAR(100) NOT NULL COMMENT '道地产区',
`specification` ENUM('片','段','粉','整枝') NOT NULL,
`processing_method` VARCHAR(20) COMMENT '炮制方法',
`price` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '每克价格',
`inventory` INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
FULLTEXT KEY `ft_search` (`common_name`,`alias`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键技巧:使用JSON类型存储别名实现模糊查询,配合FULLTEXT索引提升检索效率
3. 核心功能实现细节
3.1 智能检索系统
采用Elasticsearch+MySQL双写方案解决复杂查询问题:
- 构建同义词库(将"川贝"映射到"川贝母")
- 实现拼音搜索(通过pinyin4j转换)
- 权重算法设计:
java复制// 搜索评分公式
Score =
(名称匹配度 * 0.6) +
(别名匹配度 * 0.3) +
(搜索热度 * 0.1)
3.2 库存实时同步
使用Redis+RabbitMQ实现多终端库存同步:
- 数据库变更时发送MQ消息
- 各终端监听消息更新本地缓存
- 采用Redisson实现分布式锁防止超卖
java复制@Transactional
public boolean reduceStock(String herbId, int quantity) {
RLock lock = redissonClient.getLock("stock:" + herbId);
try {
lock.lock(3, TimeUnit.SECONDS);
// 检查库存
// 扣减操作
} finally {
lock.unlock();
}
}
4. 典型问题与解决方案
4.1 事务一致性难题
在问诊开方流程中,需要保证:
- 问诊记录生成
- 处方保存
- 库存预扣减
三个操作的事务一致性。最终采用Saga模式解决:
mermaid复制[违规内容已移除]
替代方案是通过本地事件表实现最终一致性:
- 在主事务中记录事件
- 定时任务扫描事件表
- 补偿机制处理失败事件
4.2 高并发场景优化
在促销活动期间,我们遭遇了500QPS的并发压力。通过以下措施将响应时间从1200ms降至200ms:
-
多级缓存策略:
- Guava Cache(本地缓存)
- Redis(分布式缓存)
- MySQL(持久层)
-
库存预热方案:
java复制@Scheduled(cron = "0 0 3 * * ?")
public void preheatInventory() {
// 提前加载热销商品数据到Redis
}
5. 部署与监控方案
5.1 容器化部署
采用Docker Compose实现一键部署:
yaml复制version: '3'
services:
app:
image: openjdk:17-jdk
ports:
- "8080:8080"
volumes:
- ./app.jar:/app.jar
command: java -jar /app.jar
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- ./sql:/docker-entrypoint-initdb.d
5.2 监控配置
使用SpringBoot Actuator+Prometheus构建监控体系:
properties复制# application.properties
management.endpoints.web.exposure.include=*
management.metrics.export.prometheus.enabled=true
关键监控指标:
- 药材查询平均耗时
- 订单创建成功率
- 库存同步延迟时间
6. 项目扩展建议
在实际运营中,可以考虑以下扩展方向:
-
智能推荐系统
- 基于用药历史的协同过滤
- 症状-药材关联规则挖掘
-
区块链溯源
- 药材种植→流通全流程上链
- 使用Hyperledger Fabric构建联盟链
-
小程序端优化
- 实现扫码辨药功能
- 集成微信支付分账系统
这个项目让我深刻体会到,中医药电商系统不同于普通电商平台,需要在业务合规性(如处方审核)、专业术语处理(如药材别名)等方面做特殊设计。建议后续开发者重点参考《药品经营质量管理规范》和《中华人民共和国药典》等技术标准。
