这次我们来看一个基于SpringBoot的药店管理系统。这是一个典型的Java计算机毕业设计项目,提供了完整的源码、安装调试指南和代码讲解。对于正在寻找毕设选题、需要快速搭建一个具备实际业务功能的Java Web项目,或者希望学习SpringBoot整合主流技术栈的同学来说,这个项目是一个可以直接上手、拿来即用的参考方案。
项目的核心是构建一个功能完整的药店业务管理后台,涵盖了药品信息管理、库存管理、销售管理、会员管理、供应商管理等核心模块。它不是一个简单的CRUD演示,而是模拟了真实药店运营中的关键业务流程。本文不会空谈概念,而是直接带你从零开始,完成环境准备、项目导入、数据库配置、服务启动、功能测试的全过程,并深入讲解关键模块的代码实现逻辑。无论你是想直接使用这个项目作为毕设,还是想学习其中的技术实现,都能找到清晰的路径。
1. 核心能力速览
在深入细节之前,我们先通过一个表格快速了解这个项目的核心规格和特点,帮助你判断它是否符合你的需求。
| 能力项 | 说明 |
|---|---|
| 项目类型 | Java Web 应用,基于 SpringBoot 的单体架构 |
| 技术栈 | SpringBoot, MyBatis/MyBatis-Plus, MySQL, Thymeleaf/Bootstrap (典型组合) |
| 主要功能 | 药品管理、库存盘点、销售收银、会员管理、供应商管理、报表统计 |
| 部署方式 | 本地 Jar 包运行 或 IDE 直接启动,支持 Docker 容器化部署(需自行配置) |
| 硬件门槛 | 极低。普通开发机即可,无需GPU。主要依赖Java运行环境和MySQL数据库。 |
| 启动方式 | 命令行java -jar或 IDE (如 IntelliJ IDEA/Eclipse) 运行Application主类 |
| 接口能力 | 提供标准的 RESTful API 接口,供前后端分离调用(通常项目自带管理界面) |
| 批量任务 | 支持药品信息Excel导入导出、库存批量盘点等 |
| 适合场景 | 计算机专业毕业设计、Java/SpringBoot 初学者练手项目、小型药店管理原型系统 |
从表格可以看出,这是一个技术栈经典、功能务实、部署简单的项目。它的价值不在于使用了多前沿的技术,而在于提供了一个业务逻辑完整、代码结构清晰、可二次开发的实战样本。
2. 适用场景与使用边界
在开始部署之前,明确项目的适用场景和边界非常重要,这能帮助你更好地利用它,并避免误用。
这个项目最适合谁?
- 计算机相关专业的毕业生:正在为毕设选题发愁,需要一个功能完整、有文档、能跑通的Java项目作为基础。
- Java/SpringBoot 初学者:已经学完基础语法和框架,但缺乏一个完整的项目将知识点串联起来,进行实战练习。
- 需要快速搭建管理后台原型的开发者:虽然项目主题是药店,但其用户、角色、权限、CRUD、报表等模块的设计模式,可以快速迁移到其他行业的管理系统中。
它能解决什么问题?
- 毕设核心功能实现:提供一个可直接演示的、包含增删改查、业务流程、数据可视化的完整系统。
- 技术栈整合学习:展示SpringBoot如何整合MyBatis、连接MySQL、使用模板引擎渲染页面、处理文件上传下载、实现登录拦截等常见开发任务。
- 业务逻辑理解:通过药品的进销存管理,理解库存扣减、销售流水、会员积分等基础业务逻辑的代码实现。
它不适合什么场景?
- 高并发生产环境:作为教学和毕设项目,其架构和代码未针对高并发、大数据量做深度优化,不建议直接用于线上真实药店。
- 复杂微服务架构学习:本项目是单体应用,如果你想学习Spring Cloud、服务网关、分布式配置等微服务生态,需要寻找其他项目。
- 前沿技术探索:项目技术栈以稳定、经典为主,不涉及响应式编程、云原生、AI集成等较新领域。
使用边界与合规提醒:
- 数据合规:如果用于演示或学习,请使用模拟数据,切勿导入真实药店的患者隐私信息和药品销售数据。
- 版权与用途:项目源码通常遵循开源协议(如MIT、GPL),使用时请遵守对应协议,尊重原作者版权。用于毕设时,应在理解的基础上进行修改和扩充,避免直接抄袭。
- 安全边界:项目自带的登录和权限控制可能较为基础,若计划对外提供访问,务必评估并加强安全措施,如防止SQL注入、XSS攻击、会话固定等。
3. 环境准备与前置条件
要成功运行这个项目,你的开发环境需要满足以下最低要求。请逐项检查,这是后续所有步骤的基础。
- 操作系统:Windows 10/11, macOS, 或主流Linux发行版(如Ubuntu 20.04+)。本项目对系统无特殊依赖。
- Java开发工具包 (JDK):JDK 8 或 JDK 11。这是SpringBoot 2.x 版本最兼容的JDK版本。推荐使用JDK 11。
- 检查命令:打开终端或命令提示符,输入
java -version和javac -version,确认版本号。 - 环境变量:确保
JAVA_HOME环境变量已正确设置,并且%JAVA_HOME%\bin(Windows) 或$JAVA_HOME/bin(Linux/macOS) 已加入系统PATH。
- 检查命令:打开终端或命令提示符,输入
- 项目管理与构建工具:Apache Maven 3.6+。项目通常使用Maven进行依赖管理和构建。
- 检查命令:在终端输入
mvn -v,确认Maven已安装且版本符合要求。
- 检查命令:在终端输入
- 集成开发环境 (IDE,强烈推荐):IntelliJ IDEA Ultimate/Community Edition或Eclipse with STS插件。IDEA对SpringBoot的支持更友好,能极大提升开发效率。
- 数据库:MySQL 5.7 或 8.0。这是最常用的数据库。
- 安装MySQL:从官网下载安装包并完成安装。
- 启动服务:确保MySQL服务正在运行。
- 客户端工具:准备一个数据库客户端,如MySQL Workbench,Navicat, 或 IDEA 自带的 Database 工具。
- 版本控制 (可选但推荐):Git。用于克隆项目源码。
- 网络:需要稳定的网络连接,以便Maven从中央仓库下载项目依赖的jar包。
环境验证清单:
- [ ] JDK 版本为 8 或 11
- [ ] Maven 版本为 3.6+
- [ ] MySQL 服务已启动,并知道 root 用户密码
- [ ] IDE (IDEA/Eclipse) 已安装并可以正常打开
4. 安装部署与启动方式
假设你已经从提供的渠道(如Git仓库、压缩包)获得了项目源码。接下来,我们分步完成项目的导入、配置和启动。
4.1 获取与导入项目
- 获取源码:将项目压缩包解压到一个没有中文和空格的目录,例如
D:\Projects\pharmacy-system。或者使用Git克隆命令(如果提供了Git地址)。 - 使用IDEA打开项目:
- 启动 IntelliJ IDEA。
- 选择
File->Open...,然后导航到你解压的项目根目录(该目录下应包含pom.xml文件)。 - 点击
OK,IDEA会将其识别为一个Maven项目并开始导入。
4.2 配置数据库
这是最关键的一步,大部分启动失败都源于数据库配置错误。
- 创建数据库:使用你的MySQL客户端(如MySQL Workbench),连接上你的MySQL服务,然后执行以下SQL语句创建一个新的数据库(假设数据库名为
pharmacy_db,字符集使用utf8mb4以支持中文)。CREATE DATABASE IF NOT EXISTS `pharmacy_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 导入初始数据(如果提供):检查项目源码中是否包含SQL脚本文件(通常位于
src/main/resources目录下,或根目录的sql文件夹中,文件可能叫init.sql或schema.sql)。如果有,在MySQL客户端中选中刚创建的pharmacy_db数据库,然后运行这个SQL脚本,它会创建所有必要的表并可能插入一些测试数据。 - 修改项目配置文件:在项目中找到SpringBoot的配置文件,通常是
src/main/resources/application.yml或application.properties。- 打开这个文件,找到关于数据库连接的部分。
- 将其中的
url,username,password修改为你本地MySQL的实际信息。
# application.yml 示例配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/pharmacy_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root # 改为你的MySQL用户名 password: your_password # 改为你的MySQL密码# application.properties 示例配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 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
4.3 解决依赖与构建项目
IDEA导入项目后,会自动检测pom.xml并开始下载依赖(右下角有进度条)。如果网络较慢或失败,可以尝试:
- 检查IDEA的Maven设置:
File->Settings->Build, Execution, Deployment->Build Tools->Maven,确认Maven home path、User settings file、Local repository路径正确。 - 使用阿里云镜像加速:在
settings.xml(通常位于Maven的conf目录或用户目录的.m2下)的<mirrors>部分添加阿里云镜像。 - 手动触发下载:在IDEA右侧的Maven工具栏中,点击刷新按钮(Reimport All Maven Projects)。
等待所有依赖下载完成,项目结构不再报红。
4.4 启动项目
有几种方式可以启动SpringBoot应用:
方式一:通过IDEA直接运行(推荐用于开发调试)
- 在IDEA的项目结构中,找到主启动类。它通常被
@SpringBootApplication注解修饰,名字类似PharmacyApplication、Application或XXXApplication,位于src/main/java下的某个包内(如com.example.pharmacy)。 - 右键点击这个类,选择
Run ‘XXXApplication.main()‘。 - 观察IDEA下方的
Run或Console窗口。如果启动成功,你将看到SpringBoot的横幅(banner)和一系列日志,最后一行通常是类似Started XXXApplication in 5.123 seconds (JVM running for 6.456)的信息。
方式二:通过Maven命令打包后运行(用于测试或部署)
- 在项目根目录打开终端(或IDEA的Terminal)。
- 执行打包命令:
mvn clean package -DskipTests。这会在target目录下生成一个可执行的Jar文件(如pharmacy-system-0.0.1-SNAPSHOT.jar)。 - 运行Jar包:
java -jar target/pharmacy-system-0.0.1-SNAPSHOT.jar。
方式三:使用SpringBoot Maven插件运行在终端中,项目根目录下执行:mvn spring-boot:run。
4.5 访问系统
项目启动成功后,默认情况下,SpringBoot应用会监听8080端口。打开你的浏览器,访问http://localhost:8080或http://127.0.0.1:8080。
你应该能看到系统的登录页面。常见的默认登录账号密码可能是admin/admin或admin/123456,具体请查阅项目附带的说明文档(如README.md)。
如果页面无法访问,请继续查看下一节的常见问题排查。
5. 功能测试与效果验证
成功登录系统后,我们需要对核心功能进行测试,以验证项目运行正常,并理解其业务逻辑。
5.1 药品信息管理测试
测试目的:验证基础的CRUD(增删改查)功能是否正常,这是整个系统的基础。
- 进入模块:在系统菜单中找到“药品管理”、“药品信息”或类似入口。
- 查询列表:页面应默认加载所有药品列表,包含药品编号、名称、规格、生产厂家、库存数量、进价、售价等信息。
- 新增药品:点击“新增”或“添加”按钮,弹出一个表单。填写必填信息,如药品名称、分类、规格、单位、生产厂家、进价、售价、库存预警上下限等,然后提交。
- 预期结果:提交后,页面刷新或给出成功提示,新增的药品出现在列表末尾或通过查询可以找到。
- 验证点:数据是否成功写入数据库?页面是否无错误?
- 修改药品:在药品列表的操作列,点击某条记录的“编辑”或“修改”按钮。修改某个字段(如售价),然后保存。
- 预期结果:保存后,列表中对应该药品的信息已更新。
- 删除药品:点击某条记录的“删除”按钮(通常会有二次确认弹窗)。
- 预期结果:该药品从列表中消失。
- 注意:检查是否有外键约束。如果该药品已有销售记录,直接删除可能会失败,系统应给出友好提示。这是业务逻辑完整性的体现。
5.2 库存管理测试
测试目的:验证库存的动态变化逻辑,这是进销存系统的核心。
- 库存查询与盘点:进入“库存管理”或“库存查询”页面。可以按药品名称、批次等进行筛选。尝试进行“盘点”操作,手动修正库存数量。
- 入库操作:进入“采购入库”或“药品入库”模块。模拟一次采购:
- 选择供应商(需先在“供应商管理”中添加)。
- 选择药品、输入入库数量、进价、批号、生产日期、有效期至。
- 提交入库单。
- 预期结果:提交后,对应药品的库存数量应增加。同时,在“入库记录”查询中应能看到刚创建的记录。
- 出库/销售操作:进入“销售管理”或“收银台”模块。这是最复杂的业务点。
- 扫码/选择药品:模拟顾客购买,添加多种药品到购物车。
- 修改数量:尝试修改购物车中药品的数量。
- 会员折扣:如果系统支持会员,输入会员卡号,查看是否自动计算折扣。
- 结算:点击结算,选择支付方式(现金、微信、支付宝等模拟)。
- 预期结果:
- 生成一张销售单据,包含明细和总额。
- 对应药品的库存数量应实时减少。
- 如果使用了会员,会员积分应增加。
- 在“销售流水”或“收银记录”中能查到这笔交易。
5.3 会员管理测试
测试目的:验证用户体系与积分系统的联动。
- 会员注册/添加:在“会员管理”中,添加一个新会员,填写姓名、电话、积分等信息。
- 会员消费:重复5.2节的销售操作,在结算时输入该会员的电话或卡号。
- 积分查询:销售完成后,再次查看该会员的信息,确认积分是否按规则增加。
- 积分兑换:如果系统有积分兑换功能,测试用积分抵扣部分金额。
5.4 报表统计测试
测试目的:验证系统数据汇总和分析能力。
- 销售报表:进入“销售统计”或“报表中心”,选择今日、本周、本月的销售数据报表。查看图表(如柱状图、饼图)是否能正常显示。
- 库存报表:查看“库存预警报表”,列出库存低于下限或高于上限的药品。
- 毛利分析:查看“毛利分析”报表,了解不同药品或时间段的销售毛利情况。
功能测试成功标准:
- 所有页面加载正常,无JS错误或404。
- 所有增删改查操作能正确与数据库交互,页面反馈及时。
- 核心业务流程(采购->入库->销售->扣库存->积分)数据链路贯通,无逻辑错误。
- 报表数据与基础业务数据能对应上。
6. 接口 API 与批量任务
虽然这是一个自带管理界面的项目,但其后端是基于SpringBoot的,必然提供了RESTful API。理解这些API对于前后端分离开发或二次集成至关重要。同时,系统通常也支持一些批量操作。
6.1 接口API调用示例
项目启动后,除了Web页面,其提供的API接口也可以通过工具(如Postman、curl)直接调用。首先,你需要找到API文档或通过查看代码来了解接口。
常见接口列表(需根据实际项目代码确认):
GET /api/drugs- 获取药品列表GET /api/drugs/{id}- 获取单个药品详情POST /api/drugs- 新增药品PUT /api/drugs/{id}- 修改药品DELETE /api/drugs/{id}- 删除药品POST /api/login- 用户登录GET /api/sales/daily- 获取日销售报表
使用Postman测试登录接口示例: 假设登录接口为POST http://localhost:8080/api/login,请求体为JSON格式。
- 打开Postman,新建一个
POST请求。 - 地址栏输入
http://localhost:8080/api/login。 - 选择
Body->raw->JSON。 - 输入JSON内容:
{ "username": "admin", "password": "admin" } - 点击
Send。 - 预期响应:如果成功,应返回一个包含
token或session信息的JSON对象,状态码为200。例如:
后续调用需要权限的API时,需要在请求头中带上这个Token(如{ "code": 200, "message": "登录成功", "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "user": { "id": 1, "username": "admin", "role": "管理员" } } }Authorization: Bearer eyJhbGci...)。
使用Java代码调用API示例:
import org.springframework.http.*; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; public class ApiClient { public static void main(String[] args) { RestTemplate restTemplate = new RestTemplate(); String loginUrl = "http://localhost:8080/api/login"; // 1. 登录获取Token Map<String, String> loginRequest = new HashMap<>(); loginRequest.put("username", "admin"); loginRequest.put("password", "admin"); ResponseEntity<Map> loginResponse = restTemplate.postForEntity(loginUrl, loginRequest, Map.class); String token = (String) ((Map)loginResponse.getBody().get("data")).get("token"); System.out.println("获取到的Token: " + token); // 2. 使用Token调用受保护的接口,例如获取药品列表 String drugsUrl = "http://localhost:8080/api/drugs"; HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "Bearer " + token); // 设置认证头 HttpEntity<String> entity = new HttpEntity<>(headers); ResponseEntity<String> response = restTemplate.exchange(drugsUrl, HttpMethod.GET, entity, String.class); System.out.println("药品列表响应: " + response.getBody()); } }6.2 批量任务处理
药店管理系统中常见的批量任务包括:
- 药品信息批量导入:通过上传Excel文件,一次性添加多条药品记录。
- 库存批量盘点:导出当前库存列表为Excel,线下盘点后,修改Excel再导入更新。
- 销售数据批量导出:将指定时间段的销售明细导出为Excel或PDF。
实现思路(代码层面):
- 文件上传:SpringBoot使用
MultipartFile接收上传的文件。@PostMapping("/import/drugs") public Result importDrugs(@RequestParam("file") MultipartFile file) { // 1. 校验文件类型(如.xlsx) // 2. 使用Apache POI或EasyExcel读取Excel数据 // 3. 遍历数据行,转换为Drug对象 // 4. 批量插入数据库(可使用MyBatis的批量插入) // 5. 返回导入结果(成功/失败条数) } - 数据读取与校验:使用Apache POI或更高效的EasyExcel库解析Excel,并在插入前进行数据有效性校验(如药品名非空、价格大于0)。
- 数据库批量操作:在MyBatis中,可以使用
<foreach>标签实现批量插入,或使用MyBatis-Plus的saveBatch方法。 - 文件下载:使用
HttpServletResponse设置响应头,将数据写入输出流,实现文件下载。@GetMapping("/export/sales") public void exportSales(HttpServletResponse response, @RequestParam String startDate, @RequestParam String endDate) { // 1. 查询数据 List<SaleDTO> list = saleService.getSalesBetween(startDate, endDate); // 2. 设置响应头 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment;filename=sales_report.xlsx"); // 3. 使用EasyExcel写入数据到response的输出流 EasyExcel.write(response.getOutputStream(), SaleDTO.class).sheet("销售报表").doWrite(list); }
7. 资源占用与性能观察
作为本地运行的Java Web应用,其资源占用主要关注内存和CPU。
如何观察资源占用?
- JVM内存:SpringBoot启动时,默认会分配一定的堆内存。你可以在启动命令中指定JVM参数,例如
java -Xms512m -Xmx1024m -jar your-app.jar设置初始堆512M,最大堆1024M。使用jconsole、jvisualvm(JDK自带)或Arthas等工具可以监控堆内存使用情况、线程数和GC活动。 - CPU使用率:在任务管理器(Windows)或
top命令(Linux/macOS)中查看Java进程的CPU占用。在无用户访问的空闲期,CPU占用应接近0%。执行复杂查询或报表生成时,CPU占用会短暂升高。 - 数据库连接池:SpringBoot默认使用HikariCP连接池。在
application.yml中可以配置其参数,如最大连接数。如果并发请求多,连接数不足会导致性能瓶颈。监控日志中是否有连接超时的警告。spring: datasource: hikari: maximum-pool-size: 10 # 根据实际需求调整 connection-timeout: 30000 - 响应时间:这是最直观的性能指标。在浏览器开发者工具的Network面板中,查看每个请求的响应时间(Time)。首页加载、列表查询应在几百毫秒内完成,复杂报表生成可能在1-3秒。
影响性能的关键因素:
- 数据库查询:没有索引的大表全表扫描是性能杀手。检查药品表、销售流水表是否在经常查询的字段(如药品名、销售时间)上建立了索引。
- 业务逻辑复杂度:一次销售操作可能涉及多个表的更新(库存表、销售主表、销售明细表、会员积分表),要确保这些操作在一个事务内完成,并且事务范围合理,避免长事务。
- 前端资源:如果管理界面使用了较多大型的JS库(如ECharts用于报表)或高分辨率图片,会影响首页加载速度。可以考虑使用CDN或对静态资源进行压缩。
优化建议:
- 对于毕设演示,通常不需要优化。但如果数据量增大后感觉变慢,可以:
- 为常用查询字段添加数据库索引。
- 对复杂的统计报表,考虑使用定时任务预先计算并缓存结果。
- 检查并优化复杂的Java循环和数据库N+1查询问题。
8. 常见问题与排查方法
在部署和运行过程中,你可能会遇到以下问题。这里提供了系统的排查思路。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动失败,端口被占用 | 8080端口已被其他程序(如另一个SpringBoot应用、Tomcat)使用。 | 1. 查看启动日志,是否有Web server failed to start. Port 8080 was already in use.错误。2. 命令行执行 netstat -ano | findstr :8080(Win) 或lsof -i:8080(Mac/Linux) 查看占用进程。 | 1.终止占用进程。 2.修改应用端口:在 application.yml中添加server.port: 8081。 |
| 启动失败,数据库连接错误 | 1. MySQL服务未启动。 2. 数据库名、用户名、密码错误。 3. 数据库驱动版本不匹配。 4. 时区设置问题。 | 查看启动日志,错误信息会明确指出连接失败。 | 1. 启动MySQL服务。 2. 仔细核对 application.yml中的数据库配置。3. 确认 pom.xml中MySQL驱动版本与安装的MySQL版本兼容(5.7用mysql-connector-java,8.0用mysql-connector-j)。4. 在JDBC URL中加上 &serverTimezone=Asia/Shanghai。 |
| 页面访问404 | 1. 服务未成功启动。 2. 访问的URL路径错误。 3. 静态资源路径不对。 | 1. 确认控制台有Started ...日志。2. 确认浏览器访问的端口号正确。 3. 查看浏览器控制台(F12)的Network标签,看具体哪个资源请求404。 | 1. 根据启动日志解决启动问题。 2. 尝试访问 http://localhost:8080/或http://localhost:8080/index或http://localhost:8080/login。3. 检查Controller中的 @RequestMapping注解路径。 |
| 页面样式丢失(CSS/JS加载失败) | 静态资源未被正确映射。SpringBoot默认将static、public等目录下的资源映射为静态资源。 | 1. 浏览器F12查看Network,确认CSS/JS文件的请求状态是否为404。 2. 检查这些文件是否在 src/main/resources/static目录下。 | 1. 确保静态资源文件位于正确目录。 2. 如果使用了模板引擎(如Thymeleaf),检查页面中引用资源的路径是否正确,应使用 th:href="@{/css/style.css}"语法。 |
| 登录失败,提示用户名密码错误 | 1. 数据库中没有初始用户数据。 2. 密码加密方式不匹配。 | 1. 检查是否执行了初始化的SQL脚本。 2. 查看代码中用户登录的Service层,看密码是如何比对的(可能是明文,也可能是MD5/Bcrypt加密后比对)。 | 1. 运行项目提供的初始化SQL脚本。 2. 如果知道加密方式,可以手动在数据库中插入一个加密后的密码记录,或者修改代码临时取消加密进行测试。 |
| 新增/修改数据后,页面不显示或报错 | 1. 数据库字段约束不满足(如非空字段为空)。 2. 前后端数据格式不一致(如日期格式)。 3. 服务器端代码有未处理的异常。 | 1.查看浏览器控制台(F12),看前端JS是否有报错。 2.查看IDEA或终端中的服务端日志,这是最重要的排错信息,会打印出详细的异常堆栈。 | 1. 根据服务端日志的异常信息修改代码或数据。 2. 检查实体类(Entity)与数据库表字段是否映射正确。 3. 使用Postman直接调用后端API,隔离前端问题。 |
| 打包成Jar后运行,找不到模板页面或静态资源 | SpringBoot打包后,模板文件(如.html)需要放在classpath:/templates/,静态资源在classpath:/static/。如果路径不对,运行Jar时会找不到。 | 检查src/main/resources目录结构是否正确。 | 确保资源文件放在src/main/resources下的正确子目录中。标准的SpringBoot项目结构会自动处理。 |
通用排错流程:
- 看日志:永远第一时间查看应用启动和运行时的控制台日志,错误信息通常非常明确。
- 隔离问题:是前端问题(浏览器F12报错)还是后端问题(服务端日志报错)?是数据库问题还是业务代码问题?
- 简化复现:尝试用最简单的方式(如Postman调用一个纯GET接口)复现问题。
- 搜索错误:将日志中的关键错误信息复制到搜索引擎中,很大概率能找到解决方案。
9. 最佳实践与使用建议
为了让这个项目更好地服务于你的毕设或学习,这里提供一些工程化和合规性上的建议。
代码理解优先于直接使用:不要仅仅满足于让项目跑起来。花时间阅读关键业务的代码,例如:
DrugController.java:如何接收请求、调用Service、返回响应。DrugServiceImpl.java:销售药品时,如何保证库存减少和销售记录增加在一个事务里(@Transactional)。DrugMapper.xml:复杂的多表关联查询是如何写的。SecurityConfig.java或拦截器:登录验证和权限控制是如何实现的。
进行定制化修改:这是毕设获得高分的关键。在理解原有代码的基础上,尝试:
- 增加新模块:例如,增加一个“药品有效期预警”模块,自动列出即将过期的药品。
- 优化现有功能:为销售报表增加更丰富的图表类型(如折线图显示销售趋势)。
- 改善用户体验:为药品列表增加模糊搜索、组合条件查询。
规范你的开发:
- 版本控制:立即使用Git管理你的代码。每次实现一个功能或修复一个Bug,都进行一次清晰的提交(Commit)。
- 代码注释:在你修改或新增的代码处,添加清晰的注释,说明意图和逻辑。
- 数据库备份:在对数据库结构进行重大修改前,备份你的数据库。
准备演示数据:为了毕设答辩演示流畅,提前在数据库中准备一套“漂亮”的演示数据。包括:
- 多个分类的药品。
- 一些供应商和会员。
- 近一个月的销售流水数据,这样报表看起来才充实。
关注安全与合规(对毕设尤为重要):
- 密码存储:检查项目中用户密码是否加密存储(如使用BCrypt)。如果没有,这是一个重要的改进点。
- 输入验证:确保所有用户输入(如表单)在后端都进行了有效性验证和防SQL注入处理。
- 权限控制:理解现有的权限模型(如基于角色的访问控制RBAC)。思考是否完善,例如收银员不应该有药品采购的权限。
- 数据脱敏:在演示和论文中,如果涉及数据截图,确保手机号、身份证号等敏感信息已做脱敏处理(如显示为
138****5678)。
文档与部署:
- 更新README:根据你的修改,更新项目的
README.md,写明项目简介、技术栈、部署步骤、你的新增功能等。 - 准备部署脚本:可以编写一个简单的Shell脚本或Dockerfile,让答辩老师能一键启动你的项目,这会是非常大的加分项。
- 更新README:根据你的修改,更新项目的
这个基于SpringBoot的药店管理系统项目,为你提供了一个绝佳的Java Web实战起点。它的价值不仅在于一套可运行的代码,更在于其展现了一个完整业务系统的骨架。从环境搭建、配置调试到功能测试和代码研读,整个过程本身就是一次宝贵的学习。建议你按照本文的步骤,亲手将它运行起来,然后选择一个你最感兴趣的功能模块,深入其代码,尝试进行修改和扩展。当你能够清晰地解释其中某个业务流程的代码实现时,你对SpringBoot和业务开发的理解将会上升一个坚实的台阶。建议收藏本文,在部署和开发过程中遇到问题时,随时回来查阅排查思路。