SpringBoot+Vue药品管理系统全栈开发实践 1. 药品管理系统技术架构解析这套药品管理系统的技术选型采用了当前主流的SpringBoot后端Vue前端MySQL数据库全栈方案这种组合在中小型企业管理系统中具有显著优势。后端使用SpringBoot 2.7.x版本构建RESTful API前端采用Vue 3组合式API开发数据库选用MySQL 8.0社区版三者通过axios进行数据交互。提示系统默认使用Java 11运行环境Node.js 16.x进行前端构建开发工具推荐IntelliJ IDEA VS Code组合1.1 后端技术栈深度剖析SpringBoot作为后端框架提供了完整的药品业务逻辑实现采用分层架构设计controller-service-dao集成Spring Security实现RBAC权限控制使用MyBatis-Plus 3.5.x进行数据库操作通过Hutool工具包处理药品编码生成采用Lombok减少样板代码药品管理的核心接口包括RestController RequestMapping(/api/drug) public class DrugController { Autowired private DrugService drugService; PostMapping(/add) public Result addDrug(Valid RequestBody DrugDTO dto) { return drugService.addDrug(dto); } GetMapping(/batch/{batchNo}) public Result getByBatch(PathVariable String batchNo) { return drugService.getByBatch(batchNo); } }1.2 前端技术方案详解Vue前端采用如下技术方案基于Vue 3 TypeScript开发使用Element Plus作为UI组件库通过Vue Router实现路由管理采用Pinia进行状态管理集成ECharts实现药品库存可视化药品入库表单的关键实现template el-form :modelform :rulesrules refformRef el-form-item label药品名称 propname el-input v-modelform.name / /el-form-item el-form-item label生产批号 propbatchNo el-input v-modelform.batchNo / /el-form-item /el-form /template script setup langts const form reactive({ name: , batchNo: }) const rules { name: [{ required: true, message: 请输入药品名称 }], batchNo: [{ pattern: /^[A-Z0-9]{8}$/, message: 批号格式不正确 }] } /script1.3 数据库设计要点MySQL数据库设计遵循药品管理业务特点CREATE TABLE drug ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键, code varchar(20) NOT NULL COMMENT 药品编码, name varchar(50) NOT NULL COMMENT 药品名称, spec varchar(30) NOT NULL COMMENT 规格, unit varchar(10) NOT NULL COMMENT 单位, batch_no varchar(20) NOT NULL COMMENT 生产批号, manufacturer varchar(100) NOT NULL COMMENT 生产厂家, price decimal(10,2) NOT NULL COMMENT 单价, stock int NOT NULL DEFAULT 0 COMMENT 库存数量, expire_date date NOT NULL COMMENT 有效期至, status tinyint NOT NULL DEFAULT 1 COMMENT 状态(1-正常 0-停用), PRIMARY KEY (id), UNIQUE KEY idx_code (code), KEY idx_batch (batch_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT药品信息表;2. 系统核心功能实现2.1 药品全生命周期管理系统实现了从采购到报废的完整药品管理流程采购入库支持Excel批量导入、扫码枪录入库存管理实时库存监控、效期预警提前30天处方发药与HIS系统对接的处方处理模块退药处理完整的退药审批流程报损报废药品损耗记录与原因分析库存预警的核心逻辑实现public ListDrug checkExpireWarning() { LocalDate warningDate LocalDate.now().plusDays(30); return drugMapper.selectList(new QueryWrapperDrug() .lt(expire_date, warningDate) .gt(stock, 0) .eq(status, 1)); }2.2 智能预警系统系统内置多种预警机制库存下限预警可配置阈值近效期药品预警药品配伍禁忌提醒处方用量超标提醒特殊药品双人审核提醒预警配置表示例CREATE TABLE warning_config ( id int NOT NULL AUTO_INCREMENT, type varchar(20) NOT NULL COMMENT 预警类型, threshold varchar(50) NOT NULL COMMENT 阈值, notify_type varchar(20) NOT NULL COMMENT 通知方式, is_active tinyint(1) NOT NULL DEFAULT 1, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;2.3 统计报表模块系统提供多维度的统计分析功能药品出入库统计日/月/季度/年处方药品使用排名供应商供货分析医师开药习惯分析药品效期分布图使用ECharts实现的库存统计前端代码async function initStockChart() { const res await getDrugStockStats() const chart echarts.init(document.getElementById(chart)) chart.setOption({ tooltip: { trigger: item }, series: [{ type: pie, data: res.data.map(item ({ value: item.stock, name: item.name })) }] }) }3. 系统部署与运行指南3.1 环境准备与配置后端环境要求JDK 11Maven 3.6MySQL 8.0Redis 6.x可选用于缓存前端环境要求Node.js 16.xnpm 8.x 或 yarn 1.22数据库配置示例application.ymlspring: datasource: url: jdbc:mysql://localhost:3306/drug_db?useSSLfalse username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true hibernate: ddl-auto: update3.2 项目启动流程后端启动步骤导入Maven依赖修改数据库配置执行SQL初始化脚本运行主类DrugApplication前端启动步骤# 安装依赖 npm install # 开发模式运行 npm run dev # 生产构建 npm run build3.3 常见部署问题解决MySQL连接失败检查MySQL服务是否启动验证用户名密码是否正确确认数据库drug_db已创建前端跨域问题// vue.config.js module.exports { devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }页面空白问题检查dist目录是否正确部署确认Nginx配置了正确的root路径查看浏览器控制台报错信息4. 系统二次开发指南4.1 代码结构与扩展点项目采用标准Maven多模块结构drug-system ├── drug-admin -- 后台管理模块 ├── drug-common -- 公共模块 ├── drug-generator -- 代码生成器 └── drug-web -- 前端模块核心扩展点设计自定义注解DrugLog实现操作日志全局异常处理器DrugExceptionHandler可插拔的药品验证接口DrugValidator可配置的审批流程引擎4.2 典型功能扩展示例添加新药品类型支持数据库添加type字段后端DTO和Entity添加对应属性前端表单增加类型选择器在药品服务中添加类型处理逻辑对接医保系统public interface MedicalInsuranceService { boolean checkReimbursement(String drugCode); BigDecimal getReimbursementRate(String drugCode); } Service public class MedicalInsuranceServiceImpl implements MedicalInsuranceService { Override public boolean checkReimbursement(String drugCode) { // 调用医保系统API } }4.3 性能优化建议数据库优化为高频查询字段添加索引使用连接池配置HikariCP推荐对大表进行分表分库前端优化启用组件懒加载使用keep-alive缓存常用组件对大数据表格进行虚拟滚动缓存策略Cacheable(value drug, key #code) public Drug getByCode(String code) { return drugMapper.selectByCode(code); } CacheEvict(value drug, key #drug.code) public void updateDrug(Drug drug) { drugMapper.updateById(drug); }5. 项目实战经验分享5.1 开发中的典型问题药品编码冲突解决方案采用类型前缀日期序列号的复合编码规则实现代码public String generateDrugCode(String type) { String date LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); long seq redisTemplate.opsForValue().increment(drug:seq: date); return type date String.format(%04d, seq); }效期计算误差发现直接使用new Date()存在时区问题修复统一使用LocalDate处理日期并发库存更新方案采用乐观锁机制Update(update drug set stock stock - #{qty}, version version 1 where code #{code} and version #{version}) int reduceStockWithLock(Param(code) String code, Param(qty) int qty, Param(version) int version);5.2 安全性最佳实践接口安全防护启用Spring Security配置CSRF防护实现接口限流数据安全措施敏感字段加密存储如价格操作日志完整记录定期数据备份权限控制实现PreAuthorize(hasRole(PHARMACIST) || hasRole(ADMIN)) PostMapping(/adjust) public Result adjustStock(RequestBody AdjustDTO dto) { return stockService.adjust(dto); }5.3 项目演进方向微服务化改造将库存、采购、处方拆分为独立服务采用Spring Cloud Alibaba体系引入Sentinel进行流量控制智能化升级集成药品图像识别添加智能补货预测开发移动端盘点功能生态对接扩展对接医保结算系统连接供应商ERP集成电子处方平台