SpringBoot+Vue家庭药品管理系统开发实践 📅 发布时间:2026/9/18 7:32:01 👁 浏览次数: 1. 项目概述药知道家庭药事管理平台是一款基于SpringBoot框架开发的药品管理与服务系统旨在为家庭用户提供一站式的药品信息查询、购买和管理服务。作为一个完整的毕业设计项目它涵盖了从药品展示、购买到后台管理的全流程功能实现。这个平台最核心的价值在于解决了家庭药品管理的三大痛点药品信息分散难查询家庭药品库存管理混乱药品购买渠道不透明我在开发过程中特别注重系统的易用性和安全性采用了前后端分离的架构设计后端使用SpringBootMyBatis前端采用Vue.js数据库选用MySQL确保系统既具备良好的性能表现又能满足高并发的业务需求。2. 技术选型与架构设计2.1 后端技术栈SpringBoot 2.7.0作为基础框架主要基于以下考虑自动配置特性大幅减少了XML配置内嵌Tomcat服务器简化部署流程完善的Starter机制方便集成各种组件活跃的社区和丰富的文档资源数据库访问层采用MyBatis 3.5.6相比HibernateSQL编写更灵活可控性能优化空间更大更适合复杂的业务查询场景实际开发中发现MyBatis的注解方式虽然简洁但对于复杂SQL还是XML映射文件更易维护。建议在项目中统一使用XML配置方式。2.2 前端技术方案Vue 2.6 Element UI构建管理后台主要优势组件化开发提高代码复用率响应式数据绑定简化DOM操作丰富的UI组件库加速开发进程完善的DevTools方便调试移动端采用Uniapp框架实现一套代码多端发布兼容微信小程序和H5接近原生应用的体验丰富的插件市场2.3 系统架构设计整体采用分层架构分为表现层Vue/Uniapp实现用户界面业务逻辑层SpringBoot处理核心业务数据访问层MyBatis操作数据库数据存储层MySQL持久化数据这种架构的优点是各层职责明确便于维护组件松耦合可独立扩展适合团队协作开发3. 核心功能实现3.1 药品管理模块3.1.1 药品基础信息管理采用树形分类结构设计药品类别表Entity Table(name drug_category) public class DrugCategory { Id GeneratedValue(strategy GenerationType.IDENTITY) private Integer id; private String name; private Integer parentId; private Integer sort; // 其他字段... }药品信息表设计考虑因素药品通用名和商品名分开存储规格字段支持多种单位药品图片存储相对路径设置库存预警阈值3.1.2 库存管理实现库存变更采用事务处理Transactional public void updateStock(Long drugId, Integer quantity) { // 1. 检查库存是否充足 Drug drug drugMapper.selectById(drugId); if(drug.getStock() quantity) { throw new RuntimeException(库存不足); } // 2. 更新库存 drugMapper.updateStock(drugId, quantity); // 3. 记录库存变更日志 StockLog log new StockLog(drugId, quantity, 销售出库); stockLogMapper.insert(log); }3.2 订单交易模块3.2.1 购物车设计购物车数据结构{ userId: 123, items: [ { drugId: 456, quantity: 2, selected: true } ], totalPrice: 58.00 }3.2.2 订单状态机订单状态流转设计待支付 → 已支付 → 已发货 → 已完成 ↘ 已取消使用状态模式实现public interface OrderState { void pay(Order order); void cancel(Order order); void ship(Order order); void complete(Order order); } Component Scope(prototype) public class PaidState implements OrderState { // 实现各状态方法 }3.3 用户权限系统3.3.1 RBAC模型设计四张核心表用户表(user)角色表(role)权限表(permission)用户角色关联表(user_role)角色权限关联表(role_permission)3.3.2 权限拦截实现自定义注解进行权限控制Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface RequiresPermissions { String[] value(); } Aspect Component public class PermissionAspect { Before(annotation(requiresPermissions)) public void checkPermission(RequiresPermissions requiresPermissions) { // 权限校验逻辑 } }4. 关键问题与解决方案4.1 药品搜索性能优化问题药品名称模糊查询性能差解决方案添加药品名称前缀索引ALTER TABLE drug ADD INDEX idx_name_prefix (name(10));使用Elasticsearch实现全文检索引入缓存减轻数据库压力4.2 高并发下单问题问题秒杀场景下超卖解决方案乐观锁实现UPDATE drug SET stock stock - 1 WHERE id ? AND stock 1Redis分布式锁public boolean tryLock(String key, long expire) { return redisTemplate.opsForValue() .setIfAbsent(key, 1, expire, TimeUnit.SECONDS); }消息队列削峰填谷4.3 安全性设计SQL注入防护使用MyBatis参数绑定禁止拼接SQL语句XSS防护前端使用vue-sanitize过滤后端统一转义存储CSRF防护启用Spring Security的CSRF保护重要操作增加二次确认5. 部署与运维5.1 服务器环境推荐配置2核4G云服务器CentOS 7.6JDK 1.8MySQL 5.7Nginx 1.185.2 部署脚本使用Shell脚本自动化部署#!/bin/bash # 停止现有服务 ps -ef | grep java | grep drug | awk {print $2} | xargs kill -9 # 备份旧版本 mv /app/drug.jar /app/backup/drug_$(date %Y%m%d).jar # 部署新版本 cp target/drug-1.0.0.jar /app/drug.jar nohup java -jar /app/drug.jar --spring.profiles.activeprod /app/logs/drug.log 21 5.3 监控方案Spring Boot Actuator健康检查Prometheus Grafana监控ELK日志分析系统6. 项目扩展方向药品过期提醒功能Scheduled(cron 0 0 9 * * ?) public void checkExpiredDrugs() { // 查询临近过期药品 // 发送提醒通知 }用药提醒服务药品知识图谱构建对接医保支付系统7. 开发心得数据库设计要预留扩展字段比如在各表中添加extra_json字段接口版本控制很重要建议从v1开始/api/v1/drugs /api/v2/drugs日志规范建议使用SLF4JLogback区分access log和business log重要操作记录操作日志测试建议单元测试覆盖率不低于70%使用Postman进行接口测试压力测试使用JMeter这个项目从技术选型到最终上线历时3个月期间遇到了不少挑战特别是库存并发控制和药品搜索性能优化方面。通过这个项目我深刻体会到良好的架构设计对系统可维护性的重要性也掌握了SpringBootVue全栈开发的核心技能。