ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

药店管理系统毕设实战:SpringBoot源码解析与避坑指南

药店管理系统毕设实战:SpringBoot源码解析与避坑指南 简介这份资源是面向课程设计与毕业设计场景的SpringBoot药店管理系统完整项目包适合正在学习Java Web开发、需要一套可运行实战案例的在校学生与初级开发者。项目以SpringBoot为核心框架覆盖用户管理、药品管理、订单管理、库存管理及数据库设计等典型业务模块并配套论文、开题报告、数据库脚本与说明文档便于理解从需求分析到系统实现的完整流程。压缩包整体约15.96MB内含源码、文档与数据库脚本等文件其中源码对应控制器、服务、模型与视图等分层组件文档则记录运行配置与开发说明db.sql可用于快速初始化数据库环境。目前已有68人学习关注。读者可借助该项目掌握SpringBoot自动配置、Spring MVC控制器处理、JPA或MyBatis数据映射以及事务管理等实践要点同时参考论文与开题报告梳理系统架构、功能模块与设计思路适合作为课设毕设模板或自学练手项目。1. 药店管理系统毕设怎么选从一份可运行的 SpringBoot 源码说起每年到课设和毕设选题那阵子后台总有人问我同一个问题想做一个带业务闭环、能写进论文、答辩时还能当场跑起来的系统到底选什么题目不容易翻车。我的答案通常很直接——药店管理系统。它比图书管理、学生管理这类烂大街的题目多一点业务纵深又不像电商那样复杂到一个人扛不住。药品有批号、有效期、库存上下限、处方药和非处方药的区分这些天然就是论文里能写出「设计与实现」四个字的素材。这次拆的这份资源是一套基于 Java web 和 SpringBoot 的药店管理系统带 LW论文和可运行源码属于典型的课设毕设一体化交付物。它解决的核心问题就一个让你不用从零搭架子把精力放在业务理解和论文写作上。适合谁正在赶课设 deadline 的本科生、需要一份能跑通全流程参考项目的自学者以及想拿它当 SpringBoot 练手模板的转行选手。下面我按「这是什么 → 怎么跑起来 → 坑在哪 → 怎么改出自己东西」的顺序把这份源码拆开讲。2. 先看骨架SpringBoot MyBatis 的分层结构与依赖怎么读拿到一份陌生源码我一般不会急着点运行而是先花十分钟把骨架摸清楚。骨架不清就动手后面报错你连是配置问题还是代码问题都分不清纯属给自己找罪受。2.1 目录结构与技术栈定位这套项目是标准的 Maven 单模块 SpringBoot 工程典型目录长这样pharmacy-management/ ├── src/main/java/com/xxx/pharmacy/ │ ├── controller/ 接口层接收前端请求 │ ├── service/ 业务层处理药品、订单、库存逻辑 │ ├── mapper/ 持久层接口对应 MyBatis XML │ ├── entity/ 实体类和数据库表一一对应 │ └── PharmacyApplication.java 启动类 ├── src/main/resources/ │ ├── application.yml 核心配置 │ ├── mapper/ MyBatis 映射 XML │ └── static/ 前端静态资源 └── pom.xml 依赖清单技术栈是 SpringBoot MyBatis MySQL Thymeleaf或前后端分离的 Vue看具体版本。为什么这类毕设普遍用 MyBatis 而不是 JPA因为药品查询经常要写多条件动态 SQL——按名称模糊查、按分类筛、按库存区间过滤MyBatis 的 XML 里if标签拼条件比 JPA 的 Criteria 直观得多答辩时也更好讲。2.2 依赖清单与版本确认打开pom.xml重点看这几块。SpringBoot 的 parent 版本决定了你能用哪些特性常见的是 2.7.x 或 3.x。这里有个高频坑SpringBoot 3.x 要求 JDK 17 起步而很多学校机房还装着 JDK 8。如果你本地是 JDK 8就得把 parent 降到 2.7.x否则启动直接报Unsupported class file major version。parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.6/version !-- JDK8 用 2.7.xJDK17 才考虑 3.x -- /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.3.0/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency /dependencies逻辑说明spring-boot-starter-web提供内嵌 Tomcat 和 MVC 能力mybatis-spring-boot-starter负责把 Mapper 接口自动扫描成 Bean。参数上MyBatis starter 的版本要和 SpringBoot 版本匹配2.3.x 对应 SpringBoot 2.7配错了会出现 Mapper 注入失败。MySQL 驱动用runtime作用域编译期不需要运行期才加载。2.3 配置文件里的三个关键参数application.yml是启动成败的关键重点盯三处server: port: 8080 # 端口冲突就改这里 spring: datasource: url: jdbc:mysql://localhost:3306/pharmacy?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.xxx.pharmacy.entityserverTimezoneAsia/Shanghai不加插入时间字段会差 8 小时这是血泪经验。characterEncodingutf8不加药品中文名可能变问号。mapper-locations路径写错启动时报Invalid bound statement本质是 XML 没被加载。这三个参数我每次接手新项目都会先核对一遍。3. 跑起来才算数数据库导入、启动与接口自测骨架看完接下来是让它真正跑起来。这一步的目标很明确浏览器能打开登录页能查到药品列表就算成功一半。3.1 数据库建库与数据导入源码包里一般有个sql文件夹里面是建表和数据脚本。常见做法是先建库再导脚本# 登录 MySQL mysql -u root -p # 建库字符集必须指定否则中文乱码 CREATE DATABASE pharmacy DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 退出后用命令行导入避免图形工具编码问题 mysql -u root -p pharmacy pharmacy.sql逻辑说明utf8mb4比utf8多支持 emoji 和部分生僻字药品名里偶尔有特殊字符用 utf8mb4 更稳。导入命令用重定向而不是复制粘贴是因为脚本里可能有几千行初始数据粘贴容易截断。导入完执行SHOW TABLES;确认表数量一般有用户表、药品表、分类表、库存记录表、订单表这几张。3.2 启动项目与常见启动报错IDEA 里找到启动类右键 Run。第一次启动大概率会遇到下面几类报错我按出现频率排一下报错信息原因解决Access denied for user数据库密码不对改 yml 里的 passwordUnknown database pharmacy库没建或名字不一致核对 url 里的库名Port 8080 was already in use端口被占改 server.port 或杀掉占用进程Invalid bound statementMapper XML 没加载检查 mapper-locations 路径Unsupported class file major versionJDK 版本不匹配降 SpringBoot 版本或升 JDK启动成功后控制台会打印Started PharmacyApplication in x.xxx seconds看到这行才算过关。3.3 接口自测别只点页面很多人跑起来点两下页面就觉得成了其实页面能开不代表接口都对。我习惯用 curl 或 Postman 直接打接口把核心业务链路走一遍# 查药品列表确认数据库连通 curl http://localhost:8080/drug/list # 按名称模糊查验证动态 SQL curl http://localhost:8080/drug/search?name阿莫西林 # 新增一条药品验证写库 curl -X POST http://localhost:8080/drug/add \ -H Content-Type: application/json \ -d {name:测试药品,stock:100,price:12.5}逻辑说明第一个请求验证读链路第二个验证 MyBatis 动态 SQL 的if拼接是否生效第三个验证事务和写库。参数上注意 POST 请求的Content-Type必须是application/json否则后端RequestBody接不到数据会报 415。三个都通了说明这套系统的核心链路是健康的。4. 避坑与排查这份源码最容易翻车的五个地方跑通之后别急着改代码先把下面这几个坑过一遍。这些是我拆同类项目时反复遇到的提前知道能省你大半天。4.1 中文乱码从数据库到页面的全链路现象药品名在数据库里正常页面上显示成问号或方块。原因字符集在某一环断了可能是建库时用了 latin1也可能是连接串没带characterEncodingutf8还可能是 Tomcat 的 URI 编码没配。解决按「建库 utf8mb4 → 连接串加 characterEncoding → 页面 meta 声明 UTF-8」三层逐一核对缺一层都会乱。4.2 时间差 8 小时时区配置漏了现象新增药品后创建时间比实际早或晚 8 小时。原因MySQL 驱动默认用 UTC 时区而你的系统在东八区。解决连接串加serverTimezoneAsia/Shanghai或者数据库全局设default-time-zone08:00。这个坑不影响功能但答辩时被老师看到时间不对很尴尬。4.3 Mapper 注入失败扫描路径没配对现象启动时报Consider defining a bean of type xxxMapper。原因启动类上没加MapperScan或者包路径写错。解决在启动类加MapperScan(com.xxx.pharmacy.mapper)路径要精确到 mapper 包。如果每个 Mapper 接口上都加了Mapper注解也可以不加MapperScan但两种方式别混用。4.4 库存扣减并发问题毕设里最容易被追问的点现象两个订单同时买同一批药库存扣成了负数。原因update stock stock - 1这种写法在并发下不安全。解决改成update drug set stock stock - #{num} where id #{id} and stock #{num}用数据库行锁保证不超卖。答辩时老师很爱问这个提前改好能加分。4.5 前端静态资源 404路径和拦截器双重坑现象页面样式全丢控制台一堆 404。原因一是静态资源放错目录二是拦截器把/static/**也拦了。解决静态资源放resources/static下拦截器里放行/static/**、/css/**、/js/**。如果用了 Thymeleaf还要确认模板放在resources/templates下。5. 改出你自己的东西从能跑到能答辩的进阶技巧源码能跑只是起点真正决定你答辩分数的是你有没有在它基础上做出自己的东西。我一般会从三个方向下手按投入产出比排序。第一个方向是加一个论文里能展开的业务点。药店系统里最现成的就是「近效期药品预警」。加一个定时任务每天扫描有效期在 30 天内的药品往预警表里插记录前端加个红色标记。这个功能代码量不大但论文里能写「基于定时任务的库存预警机制设计」比单纯增删改查有分量。Component public class ExpiryWarningTask { Autowired private DrugMapper drugMapper; // 每天凌晨 1 点执行cron 表达式按需调整 Scheduled(cron 0 0 1 * * ?) public void scanExpiry() { // 查出 30 天内到期的药品 ListDrug list drugMapper.selectExpiringSoon(30); for (Drug d : list) { // 写入预警记录前端据此标红 drugMapper.insertWarning(d.getId(), d.getExpiryDate()); } } }逻辑说明Scheduled是 SpringBoot 自带的定时能力启动类上要加EnableScheduling才生效。cron表达式0 0 1 * * ?表示每天 1 点整。参数 30 是预警天数可以做成配置项放到 yml 里方便论文里讲「可配置化设计」。第二个方向是补一层权限控制。原项目如果只有登录没有角色区分你可以加个简单的角色字段管理员能改药品普通员工只能查。用拦截器或 Spring Security 都行毕设级别用拦截器足够代码少好讲。第三个方向是优化查询。药品列表如果数据量大加个分页。MyBatis 配合 PageHelper 插件几行代码就能搞定论文里还能写「基于分页的查询性能优化」。验证改动是否成功我有个固定习惯改完必走一遍「新增 → 查询 → 修改 → 删除」全链路再故意输错参数看异常处理。从那以后我每次交付前都强制走一遍这个流程翻车次数少了一大半。希望这份拆解能帮你把这份源码真正用起来而不是躺在硬盘里吃灰。本文还有配套的精品资源点击获取
返回列表