这次我们来看一个基于SpringBoot的药店管理系统,这是一个典型的Java计算机毕业设计项目。对于正在寻找毕设选题、需要完整可运行源码、或者希望学习SpringBoot实战开发的同学来说,这类项目非常实用。它不是一个概念演示,而是一个包含了前后端、数据库、业务逻辑的完整系统,核心价值在于“开箱即用”和“代码可学”。
这个项目的重点不是技术多前沿,而是能否在你的电脑上快速跑起来,代码结构是否清晰,业务模块是否完整,以及能否根据你的毕设要求进行二次开发。本文将围绕“源码获取、环境搭建、系统启动、功能验证、代码导读”这条主线,带你从零开始,把这个药店管理系统部署起来并理解其核心实现。无论你是想直接用作毕设,还是作为SpringBoot+MyBatis+Thymeleaf的技术学习案例,这篇文章都能提供直接的帮助。
1. 核心能力速览
在深入细节之前,我们先通过一个表格快速了解这个药店管理系统项目的基本情况,让你判断它是否符合你的需求。
| 能力项 | 说明 |
|---|---|
| 项目类型 | Java Web 应用,B/S架构,适合作为计算机专业毕业设计 |
| 技术栈 | 后端:SpringBoot, MyBatis, MySQL 前端:Thymeleaf, HTML, CSS, JavaScript, Bootstrap |
| 主要功能 | 药品信息管理、库存管理、会员管理、销售管理、采购管理、报表统计等药店核心业务流程 |
| 部署方式 | 本地部署,需配置Java、Maven、MySQL环境 |
| 启动方式 | 通过IDE(如IDEA)运行SpringBoot主类,或使用Maven命令打包后运行Jar包 |
| 接口能力 | 提供RESTful API接口供前端页面调用,业务逻辑封装在Controller层 |
| 数据库 | 使用MySQL,需提前执行提供的SQL脚本创建数据库和表结构 |
| 适合场景 | 1. 计算机专业毕业设计/课程设计 2. SpringBoot初学者实战练习 3. 小型药店管理原型系统参考 |
2. 适用场景与使用边界
适合谁?
- 计算机相关专业毕业生:正在为毕设选题发愁,需要一个功能完整、技术栈主流、有源码和文档的现成项目。
- Java/SpringBoot学习者:已经学完基础,想通过一个完整的项目来串联SpringBoot、MyBatis、Thymeleaf等技术,理解MVC架构和业务开发流程。
- 需要快速原型演示者:例如需要向客户展示一个药店管理系统的初步概念和界面。
能解决什么问题?
- 毕设选题与实现:提供一个可直接使用的、符合要求的毕设项目基础,节省从零搭建框架的时间。
- 技术学习与整合:展示如何将SpringBoot、MyBatis、数据库连接池、日志、事务管理等技术整合到一个实际业务系统中。
- 业务流程理解:通过药品的进、销、存、会员管理等模块,理解传统零售行业软件的基本业务逻辑。
不适合什么场景?
- 高并发生产环境:该项目作为教学和毕设用途,未经过大规模并发、分布式、高可用性设计,不适合直接用于线上真实药店。
- 复杂业务定制:如果药店有非常特殊的业务流程(如处方药严格管理、医保对接等),需要在此源码基础上进行大量二次开发。
- 无Java基础者:虽然可以按照步骤运行,但若完全不懂Java和SpringBoot,理解和修改代码会非常困难。
版权与合规提醒:
- 本项目源码应仅用于个人学习、毕业设计及学术研究。
- 若需用于任何商业用途或公开发布,请务必确认源码的授权协议,尊重原作者的劳动成果,必要时进行重构或购买授权。
- 系统中管理的“药品信息”等数据均为模拟数据,不可作为真实用药依据。
3. 环境准备与前置条件
要让这个SpringBoot项目跑起来,你的电脑需要满足以下基础环境。请务必在开始前完成检查和安装。
1. 操作系统
- Windows 10/11, macOS, 或 Linux (如Ubuntu)均可。本文演示以Windows环境为主。
2. Java开发环境 (JDK)
- 版本要求:JDK 8 或 JDK 11(推荐)。SpringBoot 2.x 对这两个版本支持最好。
- 如何检查:打开命令行,输入
java -version。 - 安装指引:若未安装,请前往Oracle官网或AdoptOpenJDK等开源站点下载安装包,并配置
JAVA_HOME环境变量。
3. 项目管理与构建工具 (Maven)
- 版本要求:Maven 3.6.x 及以上。
- 如何检查:命令行输入
mvn -v。 - 安装指引:从Apache官网下载,解压并配置
MAVEN_HOME及Path环境变量。IDEA等IDE通常也内置了Maven。
4. 数据库 (MySQL)
- 版本要求:MySQL 5.7 或 MySQL 8.0。
- 如何检查:命令行输入
mysql --version或通过MySQL客户端工具连接。 - 安装指引:从MySQL官网下载社区版安装包。安装过程中请记住设置的
root用户密码。 - 额外工具:推荐安装Navicat、DBeaver或MySQL Workbench等图形化数据库管理工具,方便执行SQL脚本和查看数据。
5. 集成开发环境 (IDE) - 强烈推荐
- IntelliJ IDEA Ultimate/Community版:对SpringBoot支持极佳,能自动识别Maven项目并下载依赖。
- Eclipse with STS插件:也可用于SpringBoot开发。
- 使用IDE能极大简化项目导入、依赖下载和启动过程。
6. 浏览器
- 任何现代浏览器均可,如Chrome, Firefox, Edge,用于访问系统Web界面。
环境自查清单:
- [ ] JDK已安装且版本正确
- [ ] Maven已安装且能正常执行
mvn命令 - [ ] MySQL服务已启动,并能用root账号登录
- [ ] IDE(如IDEA)已安装
- [ ] 网络通畅,能连接Maven中央仓库下载依赖
4. 安装部署与启动方式
假设你已经从提供的渠道获得了“药店管理系统”的源码压缩包。接下来,我们分步完成部署。
4.1 获取与解压源码
- 将下载的源码压缩包(例如
pharmacy-management-system.zip)解压到一个没有中文和空格的目录下,例如D:\Projects\。 - 解压后,目录结构应类似于:
pharmacy-management-system/ ├── src/ # 源代码目录 ├── pom.xml # Maven项目配置文件 ├── sql/ # 数据库脚本目录(通常在这里) └── README.md # 项目说明文件
4.2 导入项目到IDE (以IntelliJ IDEA为例)
- 打开IntelliJ IDEA,选择
File->Open...。 - 浏览并选中解压后的项目根目录(包含
pom.xml的文件夹),点击OK。 - IDEA会自动识别为Maven项目,并开始下载依赖包。这个过程取决于网速,请耐心等待右下角的进度条完成。首次导入可能会花费几分钟。
4.3 初始化数据库
这是关键一步,系统运行依赖数据库中的数据表。
- 打开MySQL客户端(命令行或图形化工具),使用root用户登录。
- 创建一个新的数据库,专门用于本项目,例如:
CREATE DATABASE `pharmacy_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE `pharmacy_db`; - 在项目源码的
sql/目录下(或根据README提示),找到数据库初始化脚本(通常名为init.sql或schema.sql)。 - 在MySQL客户端中,执行这个SQL脚本。在图形化工具中,通常有“执行SQL文件”的选项;在命令行中,可以使用
source命令。# 命令行示例 (在MySQL命令行内) mysql> source D:\Projects\pharmacy-management-system\sql\init.sql; - 执行成功后,查看数据库,应能看到创建好的表,如
drug(药品表)、member(会员表)、sale_order(销售订单表)等。
4.4 配置数据库连接
SpringBoot的数据库配置通常在src/main/resources/application.properties或application.yml文件中。
- 在IDEA的项目中找到这个配置文件。
- 修改其中的数据库连接信息,确保与你在上一步创建的数据库匹配。
注意:# application.properties 示例 spring.datasource.url=jdbc:mysql://localhost:3306/pharmacy_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=your_password_here # 替换为你的MySQL root密码 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driveryour_password_here必须替换为你安装MySQL时设置的root密码。如果端口不是默认的3306,也需相应修改。
4.5 启动项目
配置完成后,就可以启动SpringBoot应用了。方式一:通过IDEA直接运行(推荐用于开发调试)
- 在IDEA中,找到SpringBoot的主启动类。它通常位于
src/main/java/com/xxx/pharmacy/目录下,类名类似PharmacyApplication或Application,并且类上带有@SpringBootApplication注解。 - 右键点击这个类,选择
Run ‘PharmacyApplication‘。 - 观察IDEA下方的
Run或Console窗口,如果看到类似以下的日志,说明启动成功:
这表示内嵌的Tomcat服务器已在Started PharmacyApplication in 5.832 seconds (JVM running for 6.521) Tomcat started on port(s): 8080 (http) with context path ''8080端口启动。
方式二:通过Maven命令打包后运行(更接近部署)
- 在项目根目录(有pom.xml的目录)打开命令行。
- 执行打包命令:
mvn clean package -DskipTests - 打包成功后,在
target/目录下会生成一个pharmacy-management-system-0.0.1-SNAPSHOT.jar文件(名称可能略有不同)。 - 在命令行中运行这个Jar包:
java -jar target/pharmacy-management-system-0.0.1-SNAPSHOT.jar - 同样,观察控制台输出,确认启动成功。
4.6 访问系统
启动成功后,打开你的浏览器,访问以下地址:
http://localhost:8080或者
http://127.0.0.1:8080如果一切正常,你应该能看到系统的登录页面。默认的登录账号和密码通常在项目的README.md文件或数据库初始化脚本中提供,常见组合如admin/admin或admin/123456。
5. 功能测试与效果验证
成功登录系统后,我们需要对核心功能进行测试,以验证项目运行正常,并理解其业务模块。
5.1 药品信息管理测试
测试目的:验证系统对药品基础信息(增、删、改、查)的支持。
- 进入模块:在系统菜单中找到“药品管理”或类似入口。
- 查询药品:页面加载后,应显示药品列表。尝试使用搜索框,按药品名称、编号或类别进行查询。
- 新增药品:点击“新增”按钮,填写表单信息,如药品编号、名称、规格、生产厂家、进价、售价、库存预警值等,然后提交。
- 预期结果:页面刷新,新药品出现在列表中。
- 验证方法:在数据库
drug表中,也应能找到这条新记录。
- 修改药品:在药品列表中找到一条记录,点击“编辑”,修改某个字段(如售价),然后保存。
- 预期结果:列表中和数据库中的对应字段被更新。
- 删除药品:尝试删除一条测试用的药品记录(注意不要删除关键数据)。
- 预期结果:该记录从列表和数据库中消失。
5.2 库存管理测试
测试目的:验证库存数量的变动逻辑,通常与采购入库和销售出库联动。
- 查看库存:进入“库存管理”或“库存查询”页面,查看所有药品的当前库存量。
- 模拟采购入库:
- 进入“采购管理” -> “新建采购单”。
- 选择供应商(可能需要先在“供应商管理”中添加),添加药品,输入采购数量和单价。
- 提交采购单,并完成“入库”操作。
- 验证:返回“库存管理”页面,查看对应药品的库存量是否增加。
- 模拟销售出库:
- 进入“销售管理” -> “新建销售单”。
- 选择会员(或非会员),添加药品,输入销售数量。
- 提交销售单,并完成“出库”或“收款”操作。
- 验证:对应药品的库存量应减少。同时,检查库存量是否低于预设的“库存预警值”,系统是否有预警提示(如列表高亮显示)。
5.3 会员管理测试
测试目的:验证会员体系的完整性。
- 新增会员:在“会员管理”中,添加一个新会员,填写手机号、姓名、积分等信息。
- 会员消费:使用该会员账号进行上述的销售操作。
- 积分变动验证:销售完成后,查看该会员的积分是否根据规则(如消费金额按比例)增加。
- 会员查询:尝试根据手机号或姓名搜索该会员,确认信息可查。
5.4 销售与报表统计测试
测试目的:验证核心业务流程闭环和数据统计功能。
- 完成一笔完整销售:从新建销售单、选择会员/药品、出库、收款,完成整个流程。
- 查看销售记录:在“销售查询”或“订单管理”中,应能查到刚创建的销售单,包括明细。
- 报表统计:进入“销售统计”或“报表中心”。
- 尝试按“今日”、“本周”、“本月”查看销售总额、毛利。
- 尝试查看“药品销售排行”报表。
- 验证:报表数据应与实际发生的销售记录吻合。
测试成功标准:
- 所有页面加载正常,无404或500错误。
- 数据库的增删改查操作能正确反映到页面上。
- 业务逻辑正确,如库存扣减、积分增加。
- 报表数据计算准确。
6. 接口API与代码结构导读
对于毕业设计答辩和学习而言,理解代码结构和关键API比仅仅运行系统更重要。本系统采用经典的三层架构。
6.1 项目代码结构分析
在IDEA中展开src/main/java目录,典型的包结构如下:
com.xxx.pharmacy ├── PharmacyApplication.java # SpringBoot主启动类 ├── config/ # 配置类(如WebMvc配置) ├── controller/ # 控制层,接收请求,调用Service │ ├── DrugController.java # 药品相关请求处理 │ ├── SaleController.java # 销售相关请求处理 │ └── ... ├── service/ # 业务逻辑层接口 │ ├── DrugService.java │ └── ... ├── service/impl/ # 业务逻辑层实现 │ ├── DrugServiceImpl.java │ └── ... ├── mapper/ # 数据持久层接口 (MyBatis Mapper) │ ├── DrugMapper.java │ └── ... ├── entity/ # 实体类,与数据库表对应 │ ├── Drug.java │ └── ... └── dto/ 或 vo/ # 数据传输对象或视图对象 └── ...src/main/resources/下:
mapper/:存放MyBatis的XML映射文件(如果使用XML方式)。static/:存放静态资源(CSS, JS, 图片)。templates/:存放Thymeleaf模板页面(.html)。
6.2 核心API接口示例
以“根据ID查询药品”这个功能为例,跟踪其API调用链:
- 前端请求:浏览器访问
http://localhost:8080/drug/detail?id=1。 - Controller层 (
DrugController.java):@Controller @RequestMapping("/drug") public class DrugController { @Autowired private DrugService drugService; @GetMapping("/detail") public String getDrugDetail(@RequestParam("id") Integer id, Model model) { Drug drug = drugService.getDrugById(id); model.addAttribute("drug", drug); return "drug/detail"; // 返回视图名称,对应 templates/drug/detail.html } } - Service层 (
DrugServiceImpl.java):@Service public class DrugServiceImpl implements DrugService { @Autowired private DrugMapper drugMapper; @Override public Drug getDrugById(Integer id) { // 这里可以加入业务逻辑,如权限校验、日志记录等 return drugMapper.selectByPrimaryKey(id); } } - Mapper层 (
DrugMapper.java):@Mapper // MyBatis注解 public interface DrugMapper { Drug selectByPrimaryKey(Integer id); } - SQL映射 (
DrugMapper.xml):在resources/mapper/下找到对应的XML文件,里面定义了具体的SQL。<select id="selectByPrimaryKey" resultType="com.xxx.pharmacy.entity.Drug"> SELECT * FROM drug WHERE id = #{id} </select> - 实体类 (
Drug.java):字段与drug表列对应。 - 视图层 (
detail.html):Thymeleaf模板接收model传来的drug对象,渲染页面。
RESTful API示例:部分现代项目可能采用前后端分离,Controller会返回JSON。
@RestController // 注意是RestController,不是Controller @RequestMapping("/api/drug") public class DrugApiController { @Autowired private DrugService drugService; @GetMapping("/{id}") public Result<Drug> getDrug(@PathVariable Integer id) { Drug drug = drugService.getDrugById(id); return Result.success(drug); // Result是自定义的统一响应封装类 } }访问GET http://localhost:8080/api/drug/1将返回JSON数据。
6.3 如何基于此项目进行二次开发
- 修改页面:在
templates/下找到对应的.html文件,使用HTML/Thymeleaf语法修改。 - 增加字段:
- 在数据库表中添加列。
- 在对应的
Entity类中添加属性及Getter/Setter。 - 在
Mapper.xml的SQL中增加该字段。 - 在Service和Controller中处理该字段的逻辑。
- 在前端表单和展示页面中增加该字段。
- 增加新模块:
- 在
entity/下创建新实体类。 - 在
mapper/下创建Mapper接口和XML文件。 - 在
service/和service/impl/下创建业务接口和实现。 - 在
controller/下创建控制器。 - 在
templates/下创建视图页面。 - 在菜单配置处(可能是一个HTML片段或数据库配置)添加新菜单项。
- 在
7. 资源占用与性能观察
作为一个SpringBoot单体应用,其资源消耗主要取决于访问量和数据量,在本地开发和学习阶段通常不是问题。
内存占用:
- 启动后,在任务管理器(Windows)或活动监视器(Mac)中查看Java进程(
java.exe或javaw)。 - 典型的内存占用在300MB - 800MB之间,具体取决于JVM堆内存设置(在
pom.xml或启动命令中通过-Xmx参数配置)。 - 观察方法:启动时可以在IDEA的
Run/Debug Configurations的VM options中添加-Xmx512m来限制最大堆内存为512MB。
- 启动后,在任务管理器(Windows)或活动监视器(Mac)中查看Java进程(
CPU占用:
- 在无用户访问的空闲状态下,CPU占用率极低(接近0%)。
- 在执行复杂查询、报表统计或批量导入数据时,CPU占用会有一个短暂的峰值。
数据库连接:
- SpringBoot默认使用HikariCP连接池。连接数配置在
application.properties中(如spring.datasource.hikari.maximum-pool-size=10)。 - 在低并发下,活跃连接数通常为1-2个。可以通过MySQL命令
SHOW PROCESSLIST;查看。
- SpringBoot默认使用HikariCP连接池。连接数配置在
启动时间:
- 在开发机(SSD硬盘)上,首次冷启动(依赖已下载)通常在5-15秒内。
- 热启动(代码改动后)通过Spring Boot DevTools可以实现秒级重启。
性能优化提示(针对毕设答辩或深入学习):
- 慢SQL监控:在
application.properties中开启MyBatis SQL日志,观察哪些查询耗时较长。logging.level.com.xxx.pharmacy.mapper=DEBUG - 接口响应时间:使用浏览器开发者工具的
Network面板,查看每个页面或API请求的响应时间。 - JVM监控:可以使用JDK自带的
jconsole或VisualVM工具连接到本地Java进程,监控堆内存、线程、CPU使用情况。
8. 常见问题与排查方法
在部署和运行过程中,你可能会遇到以下问题。这里提供排查思路。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
启动时报错:Failed to configure a DataSource | 数据库连接配置错误或数据库服务未启动。 | 1. 检查application.properties中的url,username,password。2. 检查MySQL服务是否运行( services.msc或systemctl status mysql)。3. 检查数据库名 pharmacy_db是否存在。 | 1. 修正配置信息。 2. 启动MySQL服务。 3. 执行SQL脚本创建数据库。 |
启动时报错:java.net.ConnectException: Connection refused | 数据库地址或端口错误。 | 确认spring.datasource.url中的localhost:3306是否是你的MySQL实际地址和端口。 | 修改为正确的地址和端口。 |
启动时报错:Access denied for user ‘root‘@‘localhost‘ | 数据库用户名或密码错误。 | 确认配置的密码与MySQL的root密码一致。 | 使用正确的密码,或创建一个新的数据库用户专门用于本项目。 |
页面访问localhost:8080报 404 | 1. 项目未成功启动。 2. 上下文路径(server.servlet.context-path)配置了其他路径。 | 1. 查看控制台日志,确认Tomcat是否在8080端口启动成功。 2. 检查 application.properties是否有server.servlet.context-path=/xxx配置。 | 1. 解决启动错误。 2. 访问 localhost:8080/xxx或删除该配置。 |
| 页面能打开,但样式(CSS/JS)丢失 | 静态资源路径错误或被拦截。 | 1. 检查浏览器开发者工具Console和Network标签,看CSS/JS文件是否404。2. 检查 static目录下的文件路径是否正确。 | 1. 确保Thymeleaf模板中引用静态资源的路径正确,如@{/css/style.css}。2. 检查Spring Security等安全配置是否放行了静态资源。 |
| 新增/修改数据后,页面没变化 | 1. 事务未提交。 2. 浏览器缓存。 3. 代码逻辑错误未真正操作数据库。 | 1. 直接查询数据库,看数据是否已存入。 2. 使用浏览器无痕模式测试。 3. 在Service方法中打日志或调试,看SQL是否执行。 | 1. 确保Service方法添加了@Transactional注解(如果需要)。2. 清除浏览器缓存。 3. 检查Mapper的SQL和参数绑定是否正确。 |
| 打包成Jar后运行,找不到模板页面 | Thymeleaf模板文件未正确打包进Jar。 | 使用jar tf target/xxx.jar查看Jar包内部结构,确认templates/和static/目录是否存在。 | 检查pom.xml中maven-resources-plugin的配置,确保src/main/resources下的资源文件被包含。 |
| 端口8080被占用 | 本机有其他程序(如另一个Tomcat、Skype等)占用了8080端口。 | 命令行运行 `netstat -ano | findstr :8080(Windows) 或lsof -i:8080` (Mac/Linux) 查找占用进程。 |
9. 最佳实践与使用建议
为了让你更好地利用这个项目完成毕设或学习,这里有一些实践建议。
- 代码阅读与理解优先:在运行系统后,不要停留在点击页面上。对照第6节的代码导读,选择一个核心模块(如“药品管理”),从Controller到Mapper,完整地跟踪一遍代码执行流程。这是理解SpringBoot项目架构最快的方式。
- 数据库设计文档化:打开数据库,仔细查看每张表的字段、类型、主键、外键。尝试画出简单的ER图。理解表关系(如销售单
sale_order和销售明细sale_item的一对多关系)对答辩和后续修改至关重要。 - 创建你自己的测试数据:不要一直用初始化的数据。通过系统界面或直接执行SQL,创建一套属于你自己的测试数据(药品、会员、销售记录等)。这能帮你更深入地测试功能,并在答辩时展示你对数据的掌控力。
- 进行简单的二次开发:这是毕设获得高分的关键。不要只满足于运行原项目。尝试:
- 增加一个字段:在药品表中增加“保质期”字段,并在所有相关页面(新增、编辑、列表、详情)中实现其展示和编辑功能。
- 增加一个简单模块:例如“供应商管理”,包含供应商的增删改查。
- 修改一个业务逻辑:例如修改会员积分规则,消费1元积2分。
- 增加一个报表:例如“月度利润统计报表”。
- 版本管理:使用Git进行版本控制。在开始二次开发前,先建立一个初始的提交。每完成一个功能或修复一个Bug,都做一次提交并写好注释。这不仅是好习惯,也能在答辩时展示你的工程能力。
- 准备部署演示:学习如何将项目打包成可独立运行的Jar文件,并在一个干净的机器上(或使用Docker)部署。这能体现项目的可交付性。
- 撰写项目文档:即使源码提供了README,你也应该为自己写一份文档,内容包括:项目简介、技术栈、部署步骤、模块说明、你的二次开发内容、遇到的问题及解决方案。这份文档将是毕设论文和答辩PPT的重要素材。
- 合规与安全思考:在毕设论文中,可以讨论此系统的局限性,例如:密码是否明文存储?(应使用BCrypt加密);是否有权限控制?(通常教学项目只有登录控制,可讨论增加基于角色的访问控制RBAC);数据备份机制如何?这些思考能提升论文深度。
这个基于SpringBoot的药店管理系统项目,其最大价值在于提供了一个真实、完整、可运行的Java Web开发范本。它帮你跳过了最枯燥的基础框架搭建,让你能直接聚焦于业务逻辑、代码组织和功能实现。对于毕业设计,它是一个优秀的起点;对于技能学习,它是一个绝佳的沙箱。建议你按照“部署运行 -> 功能验证 -> 代码精读 -> 动手修改”的路径深入下去,把里面的技术点真正转化为自己的开发能力。如果在操作中遇到本文未覆盖的问题,多查看控制台日志、善用搜索引擎、并仔细检查每一步的配置,大部分问题都能迎刃而解。