1. 项目概述:SpringBoot+Vue药品管理系统全栈解决方案
这个药品管理系统是我去年为某医药连锁机构开发的实战项目,后来经过脱敏处理成为了高校计算机专业的热门毕设选题。系统采用SpringBoot 2.7 + Vue 3的组合架构,完整实现了药品进销存管理、供应商对接、处方审核等核心业务场景。相比市面上的教学Demo,这套方案最大的特点是:
- 采用RBAC动态权限模型,支持多级药房管理架构
- 集成阿里云OSS实现药品图片云端存储
- 使用ECharts实现近效期药品智能预警
- 完整的Swagger接口文档和Postman测试集合
提示:项目源码中的
pharmacy-core模块封装了所有药品批号管理的核心算法,这是医药行业系统的关键难点
2. 技术架构解析
2.1 后端技术栈设计
SpringBoot部分采用经典的三层架构:
code复制com.pharmacy
├── config # 安全配置/Redis配置
├── controller # 带@Validated参数校验
├── service # 事务管理(@Transactional)
├── dao # MyBatis-Plus + 动态SQL
└── entity # JPA注解+逻辑删除
数据库选用MySQL 8.0,几个关键表设计:
drug_info药品主表:包含批准文号、药品分类码等专业字段inventory库存表:实现批号、效期双维度管理prescription处方表:关联医保结算规则
java复制// 典型的事务处理示例
@Transactional(rollbackFor = Exception.class)
public void stockIn(DrugBatchDTO dto) {
// 1. 更新库存
inventoryMapper.updateStock(dto);
// 2. 记录入库流水
operationLogService.addLog(dto);
}
2.2 前端工程化实践
Vue3项目采用如下结构:
code复制src
├── api # Axios封装+接口定义
├── assets # 药品分类图标库
├── components # 可复用业务组件
│ ├── BatchSelector.vue # 批号选择器
│ └── ExpireWarning.vue # 效期预警组件
├── router # 动态路由配置
└── views # 业务页面
重点实现的交互功能:
- 药品图片拖拽上传(集成OSS SDK)
- 库存盘点时的批量扫码功能
- 基于WebSocket的库存变动实时通知
3. 核心业务模块实现
3.1 药品批次管理
医药行业对批次管理有严格要求,我们实现了:
- 效期预警算法(提前30/60/90天分级预警)
sql复制SELECT * FROM inventory
WHERE expiry_date BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 90 DAY)
ORDER BY expiry_date;
- 先进先出(FIFO)出库策略
java复制public List<Inventory> getFIFOInventory(Long drugId) {
return lambdaQuery()
.eq(Inventory::getDrugId, drugId)
.gt(Inventory::getStock, 0)
.orderByAsc(Inventory::getProductionDate)
.list();
}
3.2 处方审核流程
处方模块的特殊处理:
- 药品配伍禁忌检查(内置规则引擎)
- 医保控费校验(对接第三方API)
- 毒麻药品双人审核机制
vue复制<!-- 处方审核界面片段 -->
<template>
<el-dialog title="特殊药品审核" :visible.sync="showDialog">
<dual-confirm
:drug-type="controlledDrug"
@confirm="handleApproval"
/>
</el-dialog>
</template>
4. 项目部署与调优
4.1 生产环境配置
推荐部署方案:
yaml复制# application-prod.yml
spring:
datasource:
druid:
filters: stat,wall
max-active: 20
validation-query: SELECT 1 FROM DUAL
redis:
lettuce:
pool:
max-active: 16
4.2 常见问题排查
- 药品编码重复异常
- 原因:未正确处理国家药品编码(本位码)
- 解决:在DrugInfo实体类添加
@Table(uniqueConstraints = {...})
- 库存扣减超卖问题
- 方案:使用MySQL乐观锁+Redis分布式锁双重保障
java复制@Transactional
public boolean deductStock(Long inventoryId, int count) {
// 1. Redis加锁
String lockKey = "stock:" + inventoryId;
try {
if (!redisLock.tryLock(lockKey, 10, TimeUnit.SECONDS)) {
throw new BusinessException("系统繁忙");
}
// 2. 乐观锁更新
int updated = inventoryMapper.updateStockWithVersion(
inventoryId, count, version);
return updated > 0;
} finally {
redisLock.unlock(lockKey);
}
}
5. 毕设开发建议
- 快速启动技巧
- 使用
lombok插件减少getter/setter代码 - 前端Mock数据用
mockjs模拟接口 - 数据库初始化用Flyway管理SQL脚本
- 典型扩展方向
- 增加药品扫码入库功能(需集成ZXing)
- 实现采购计划智能生成(基于销售预测)
- 开发移动端盘点APP(Uniapp方案)
这个项目我在实际部署时发现,医药行业对数据追溯要求极高,所有关键操作都必须留有审计日志。建议在operation_log表中记录完整的操作前/后数据快照,这个经验来自某次药监检查的教训。
