
这次我们来看一个专门为诊所、药房、小型医疗机构设计的药品库存管理系统。项目基于 Spring Boot 和 MySQL 构建核心目标就是解决药品管理中最头疼的库存混乱问题。无论是药品档案信息不全、供应商管理混乱还是采购入库和销售出库记录不清、过期药品无法及时预警这个系统都提供了完整的前后台解决方案并且通过可视化统计报表让管理者对库存情况一目了然。对于诊所经营者或药房管理者来说手动记账或使用简单的表格管理药品极易导致库存不准、药品过期、成本核算困难。这个系统将药品档案、供应商、采购、销售、库存、过期预警和统计分析等核心业务流程全部线上化、规范化。它不是一个复杂的 ERP而是针对小型医疗场景高度定制上手快功能聚焦。本文将带你从零开始了解这个系统的核心能力、部署环境要求并完成一个完整的本地演示。你会看到如何启动服务、初始化数据、进行药品的采购入库与销售出库操作以及如何查看那些直观的统计图表。无论你是想学习 Spring Boot 项目实战还是为你的诊所寻找一个可落地的管理工具这篇文章都能提供清晰的路径。1. 核心能力速览在深入部署和操作之前我们先通过一个表格快速了解这个诊所药物库管理系统的核心规格和功能边界这有助于你判断它是否适合你的需求。能力项说明项目类型基于 Spring Boot 的 Web 管理系统技术栈Spring Boot, MyBatis/MyBatis-Plus, MySQL, Thymeleaf/Bootstrap (典型前后端不分离架构)核心功能药品档案管理、供应商管理、采购入库、销售出库、库存管理、过期药品预警、可视化统计部署方式本地 Jar 包运行 或 War 包部署至 Tomcat数据库MySQL 5.7 或 8.0硬件门槛极低。普通 PC 或服务器即可无需 GPU。内存建议 2GB 以上。启动方式命令行java -jar一键启动或 IDE 直接运行。是否支持 API通常以页面操作为主后端提供 RESTful 接口供前端调用可间接用于集成。是否支持批量任务支持批量导入药品档案、批量采购入库/销售出库通过前端操作实现。适合场景个体诊所、社区医院、药房、小型医疗机构的药品进销存管理Spring Boot 初学者项目学习。2. 适用场景与使用边界这个系统设计得非常务实它清楚地知道自己要解决什么问题以及不适合哪些场景。适合谁用小型医疗机构管理者个体诊所、口腔诊所、中医馆、宠物医院的负责人需要一套简单易用的系统来管好药品避免库存积压或短缺清晰掌握成本和利润。药房经营者小型零售药房用于管理药品的进货、销售和效期。医疗信息化初学者计算机、软件工程等相关专业的学生或刚入行的 Java 开发者。这是一个非常典型的 Spring Boot 实战项目涵盖了 CRUD、权限、报表、事务等核心企业应用开发知识点代码结构清晰适合学习和二次开发。能解决什么问题药品档案混乱统一维护药品的通用名、商品名、规格、单位、生产厂家、批准文号、分类等信息形成标准化档案。库存不准通过严格的采购入库和销售出库流程确保每一次库存变动都有据可查系统自动计算实时库存。供应商管理缺失记录供应商信息关联采购记录便于询价和追溯。药品过期损耗系统自动监控药品有效期提供过期预警和近效期药品查询避免经济损失和用药安全风险。经营情况不清通过可视化的统计图表如药品销量排行、库存预警、采购/销售趋势直观展示经营状况辅助决策。不适合什么场景大型医院或连锁药店这类场景需要与 HIS医院信息系统、医保系统等深度对接流程复杂权限体系庞大本系统无法满足。需要复杂财务管理本系统核心是库存管理虽涉及金额但并非专业的财务系统不包含复杂的会计科目、凭证、报表等功能。严格的 GSP 认证要求对于需要符合《药品经营质量管理规范》GSP的药品批发企业本系统在流程记录、质量控制环节的记录深度上可能不足。合规与安全边界数据安全系统涉及药品信息、供应商信息、销售记录等敏感数据。在部署时务必确保数据库访问安全设置强密码并定期备份。业务合规系统是管理工具不替代专业的医疗建议或药品审核流程。所有药品的采购、销售必须符合国家相关法律法规。授权使用确保你拥有使用该系统及其代码的合法授权。如果用于商业用途请确认开源协议允许。3. 环境准备与前置条件在启动项目之前需要准备好以下基础环境。整个过程不涉及复杂的 AI 模型或显卡门槛很低。操作系统Windows 10/11, macOS, 或 Linux (如 Ubuntu/CentOS)。推荐 Windows 用于本地演示Linux 用于服务器部署。Java 开发环境JDK版本 1.8 或 11推荐 1.8兼容性最好。确保JAVA_HOME环境变量配置正确。验证命令java -version数据库MySQL版本 5.7 或 8.0。你需要一个可用的 MySQL 服务。确保你有创建数据库和用户的权限。构建工具Maven版本 3.6 或以上。用于从源码编译打包项目。验证命令mvn -v代码编辑器或 IDE可选用于查看和修改源码IntelliJ IDEA (推荐)EclipseVS Code (需安装 Java 插件)项目资源获取项目源码通常是一个压缩包或 Git 仓库地址。准备数据库初始化 SQL 脚本通常包含在源码的sql或doc目录下。网络与端口确保本地8080端口或其他项目指定端口未被占用。如果部署在服务器需配置防火墙或安全组开放相应端口。4. 安装部署与启动方式假设你已经拿到了项目的源码包例如clinic-drug-manage.zip。我们按照最常见的流程进行部署。4.1 数据库初始化这是第一步也是关键一步。系统运行依赖数据库中的表结构和初始数据。登录 MySQL使用命令行或 MySQL 客户端如 Navicat, MySQL Workbench登录。创建数据库CREATE DATABASE clinic_drug_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;注意数据库名clinic_drug_db可能需要根据项目配置文件调整。执行 SQL 脚本找到项目中的 SQL 文件如clinic_drug_db.sql在刚才创建的数据库中执行它。这个脚本会创建所有必要的表如drug、supplier、purchase、sale、stock、user等并可能插入一些测试数据。# 假设在 SQL 文件所在目录 mysql -u root -p clinic_drug_db clinic_drug_db.sql4.2 项目配置修改在运行项目前需要让项目知道如何连接你的数据库。定位配置文件在项目源码的src/main/resources/目录下找到application.properties或application.yml文件。修改数据库连接信息主要修改以下几项# application.properties 示例 spring.datasource.urljdbc:mysql://localhost:3306/clinic_drug_db?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.passwordyour_password_here # 替换为你的数据库密码 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driverlocalhost:3306如果你的 MySQL 不在本机或端口不同请修改。clinic_drug_db确保与上一步创建的数据库名一致。your_password_here务必替换成你数据库的真实密码。4.3 编译与打包如果你有 Maven 环境可以在项目根目录包含pom.xml的目录执行打包命令。# 进入项目根目录 cd /path/to/clinic-drug-manage # 执行 Maven 打包命令跳过测试 mvn clean package -Dmaven.test.skiptrue打包成功后会在target目录下生成一个可执行的 Jar 文件例如clinic-drug-manage-0.0.1-SNAPSHOT.jar。4.4 启动服务拿到 Jar 包后启动就非常简单了。方式一命令行启动推荐# 在 Jar 包所在目录执行 java -jar clinic-drug-manage-0.0.1-SNAPSHOT.jar启动后控制台会输出 Spring Boot 的启动日志看到类似Tomcat started on port(s): 8080的信息说明服务已成功启动。方式二IDE 中运行如果你使用 IntelliJ IDEA可以直接打开项目找到包含SpringBootApplication注解的主类通常是Application.java或*Application.java右键点击Run即可。4.5 访问系统服务启动后打开浏览器访问默认地址http://localhost:8080或http://127.0.0.1:8080如果端口被占用你可以在启动命令中指定其他端口java -jar clinic-drug-manage-0.0.1-SNAPSHOT.jar --server.port8081然后访问http://localhost:8081。首次访问通常会跳转到登录页面。使用 SQL 脚本中初始化的账号密码登录常见如 admin/admin 或 admin/123456请查看项目文档或 SQL 脚本确认。5. 功能测试与效果验证登录系统后我们按照核心业务流程逐一测试关键功能验证系统是否运行正常。5.1 药品档案管理测试这是所有业务的基础。测试目的验证药品基础信息的增、删、改、查CRUD功能是否正常。操作步骤在侧边栏或顶部菜单找到“药品档案”、“药品管理”或类似入口。点击“新增”按钮填写一份完整的药品信息例如药品名称阿莫西林胶囊通用名阿莫西林规格0.25g*24粒/盒单位盒生产厂家XX制药有限公司批准文号国药准字HXXXXXXX分类抗生素类零售价15.00库存上限100库存下限10点击“保存”。页面应刷新并在药品列表中看到刚添加的“阿莫西林胶囊”。尝试点击该记录的“编辑”修改某个信息如零售价保存。尝试点击“删除”系统可能要求确认看是否能成功删除注意如果该药品已有库存或业务记录系统应提示无法删除这是正确的业务约束。预期结果能够流畅地完成新增、查询、编辑操作。删除操作符合业务逻辑约束。判断成功列表数据能即时刷新修改后的信息能正确显示。5.2 供应商管理测试管理药品的来源。测试目的验证供应商信息的维护功能。操作步骤进入“供应商管理”模块。新增一个供应商填写名称、联系人、电话、地址等信息。保存后在后续的采购入库中应能选择到这个供应商。预期结果供应商信息可维护并能被采购模块关联引用。5.3 采购入库流程测试这是增加库存的核心操作。测试目的验证完整的采购业务流程并观察库存数量的变化。操作步骤进入“采购管理”或“采购入库”模块。点击“新建采购单”。选择上一步创建的供应商。在明细中添加药品选择“阿莫西林胶囊”输入采购数量如 50、采购单价如 12.00。填写其他信息如入库仓库如果有多个、采购员、备注等。点击“提交”或“入库”。系统可能会生成一个采购单号。预期结果采购单创建成功状态为“已入库”。在“库存查询”或“药品档案”中查看“阿莫西林胶囊”的当前库存应比之前增加50。在“采购流水”或“报表”中应能查到这条记录。判断成功库存数量准确增加财务金额计算正确。5.4 销售出库流程测试这是减少库存的核心操作通常关联收费。测试目的验证销售业务如何扣减库存并生成销售记录。前置条件确保“阿莫西林胶囊”有足够库存例如经过上一步采购后有50盒。操作步骤进入“销售管理”或“门诊发药”模块。点击“新建销售单”或“快速发药”。选择患者或输入一个测试患者姓名。在明细中添加药品选择“阿莫西林胶囊”输入销售数量如 2。系统应自动带出零售价15.00并计算总金额30.00。可能支持修改实际售价如会员折扣。点击“收费”或“出库”。预期结果销售单创建成功。“阿莫西林胶囊”的库存减少2盒变为48盒。生成销售流水记录销售额、成本、利润如果系统支持成本价计算。判断成功库存准确扣减销售记录完整。5.5 库存管理与预警测试检验系统的实时监控能力。测试目的验证库存查询、低库存预警、过期预警功能。操作步骤进入“库存查询”模块。查看所有药品的当前库存、库存金额。筛选查看库存量低于“库存下限”我们之前设为10的药品。进入“效期管理”或“过期预警”模块。系统应列出所有临近有效期如3个月内的药品。你可以通过修改某个药品档案中的“有效期至”为一个过去的日期来测试过期药品的显示。预期结果预警信息能正确显示帮助管理者及时补货或处理临期品。判断成功预警列表能根据预设规则动态更新。5.6 可视化统计报表测试这是系统的亮点让数据说话。测试目的验证图表展示数据的准确性和直观性。操作步骤进入“数据统计”、“报表中心”或“首页看板”。查看常见的图表例如药品销量 Top 10柱状图或饼图显示最近一段时间销量最高的药品。库存预警图显示库存过低、正常、过高的药品数量分布。采购/销售趋势图折线图显示近期采购额和销售额的变化趋势。利润分析显示毛利、毛利率等。预期结果图表能正常加载数据与之前进行的采购、销售操作吻合。判断成功图表无错误数据直观点击或悬停有交互效果。6. 接口 API 与批量任务虽然这是一个前后端耦合的项目主要操作通过页面完成但其后端仍然是基于 Spring Boot 的 RESTful 设计。了解其 API 结构有助于二次开发或与其他系统集成。6.1 API 接口概览启动服务后可以通过以下方式探查或使用其 APISpring Boot Actuator如果项目引入了spring-boot-starter-actuator可以访问http://localhost:8080/actuator查看端点信息。查看源码 Controller在 IDE 中查看controller包下的类每个RequestMapping或GetMapping/PostMapping注解都定义了一个 API 端点。使用 Swagger/OpenAPI如果项目集成了 Swagger访问http://localhost:8080/swagger-ui.html或http://localhost:8080/doc.html可以获得完整的交互式 API 文档。典型的 API 接口可能包括GET /api/drug/list获取药品列表POST /api/drug/save新增或更新药品GET /api/purchase/list获取采购单列表POST /api/purchase/submit提交采购单GET /api/stock/warning获取库存预警列表GET /api/report/salesTop10获取销量 Top10 数据6.2 调用 API 示例假设我们想通过程序调用“获取药品列表”的接口可以使用curl命令或编写简单的 Python/Java 代码。使用 curl 测试# 假设登录后session 或 token 已保存在浏览器中。对于简单的测试接口可能无需认证。 # 先获取一个有效的认证 token如果接口需要这通常通过登录接口获得。 # 这里以调用一个无需深度权限的列表接口为例实际情况需看项目安全配置 curl -X GET http://localhost:8080/api/drug/list?pageNum1pageSize10 -H Content-Type: application/json使用 Python requests 库调用import requests import json # 1. 首先登录获取 token (如果接口需要) login_url http://localhost:8080/api/login login_data { username: admin, password: admin } session requests.Session() login_response session.post(login_url, jsonlogin_data) print(Login Status:, login_response.status_code) # 通常 token 会在 response 的 header 或 body 里具体看项目实现 # 这里假设登录后 session 保持了 cookie # 2. 调用药品列表接口 drug_list_url http://localhost:8080/api/drug/list params { pageNum: 1, pageSize: 10, drugName: # 可选搜索条件 } response session.get(drug_list_url, paramsparams) if response.status_code 200: drug_list response.json() print(json.dumps(drug_list, indent2, ensure_asciiFalse)) else: print(Failed to get drug list:, response.status_code, response.text)6.3 批量任务处理系统本身可能不提供独立的批量任务队列服务但批量操作通常通过以下方式实现前端批量操作在药品档案、采购入库等列表页面提供“批量删除”、“批量导出”、“导入模板”等功能。用户下载 Excel 模板填写数据后上传系统后端解析并批量插入数据库。数据库直接操作对于数据迁移或初始化可以直接执行 SQL 脚本进行批量插入。自定义脚本你可以编写一个简单的 Java 或 Python 脚本循环调用上述的POST /api/drug/save接口来实现批量添加药品档案。批量导入注意事项数据校验在批量导入时务必在服务端对每一条数据进行格式和业务规则校验如药品名称不能为空、规格格式正确。事务管理确保批量操作在一个数据库事务中要么全部成功要么全部回滚避免产生脏数据。性能与反馈如果数据量很大应考虑分批次处理并提供导入进度和错误报告给用户。7. 资源占用与性能观察对于这样一个 Spring Boot MySQL 的管理系统性能瓶颈通常出现在数据库和并发访问上本地演示资源占用很低。内存占用启动后Java 进程JVM的内存占用通常在 300MB ~ 800MB 之间具体取决于堆内存设置-Xmx和加载的数据量。对于小型诊所的数据量这个占用完全在可接受范围内。CPU 占用在空闲状态下 CPU 占用几乎为 0。在进行复杂查询如多表关联报表或批量导入数据时CPU 会有短暂峰值。数据库性能索引是关键确保药品表drug的name、code字段库存表stock的drug_id字段以及流水表purchase/sale的create_time字段建立了索引能极大提升查询速度。连接池Spring Boot 默认使用 HikariCP 连接池配置合理的maximum-pool-size如 10可以应对小型场景的并发。如何观察JVM 内存可以使用jconsole、jvisualvmJDK 自带或Arthas等工具连接到 Java 进程进行监控。数据库监控在 MySQL 中执行SHOW PROCESSLIST;查看当前连接和慢查询。启用慢查询日志slow_query_log来定位性能瓶颈。优化建议对于报表查询如果数据量大且实时性要求不高可以考虑使用定时任务将统计结果计算好存入缓存或汇总表避免每次查询都进行大量聚合计算。定期清理早期的业务流水数据可以将其归档到历史表保证主表的查询效率。8. 常见问题与排查方法在部署和运行过程中你可能会遇到以下问题。这里提供通用的排查思路。问题现象可能原因排查方式解决方案启动失败提示端口占用8080 端口被其他程序如另一个 Tomcat、其他服务占用。1. 命令行执行netstat -ano | findstr :8080(Windows) 或lsof -i:8080(Linux/macOS) 查看占用进程。2. 修改项目端口。1. 终止占用端口的进程。2. 在application.properties中增加server.port8081或启动时加参数--server.port8081。启动失败提示数据库连接错误1. 数据库服务未启动。2. 数据库连接信息URL、用户名、密码配置错误。3. 数据库驱动版本不匹配。1. 检查 MySQL 服务是否运行 (systemctl status mysql或服务列表)。2. 使用客户端工具如 Navicat测试连接。3. 查看启动日志的详细错误信息。1. 启动 MySQL 服务。2. 核对application.properties中的配置确保数据库名、密码正确。3. 检查pom.xml中的mysql-connector-java版本与 MySQL 服务器版本匹配。访问登录页输入账号密码后提示错误1. 数据库中没有对应的用户数据。2. 密码加密方式不匹配。3. 用户状态被禁用。1. 检查数据库user表确认账号密码存在且正确。2. 查看项目源码中密码是如何加密的如 MD5, BCrypt确认插入数据库的密码是加密后的字符串。1. 直接通过 SQL 在user表中插入一个已知密码加密后的用户记录。2. 修改代码中的密码加密逻辑或比较逻辑仅用于测试。页面可以访问但所有数据为空或报错1. 数据库表未成功创建。2. 数据库连接到了错误的库。3. 初始数据未导入。1. 登录 MySQL检查clinic_drug_db库下是否存在drug,user等表。2. 检查控制台启动日志看是否有 SQL 执行错误。1. 重新执行提供的 SQL 初始化脚本。2. 确认application.properties中的数据库名是否正确。进行采购或销售操作后库存数量没变1. 业务逻辑代码有 Bug未更新库存。2. 数据库事务未提交。3. 操作后未刷新页面前端显示的是旧数据。1. 直接查询数据库stock表看数据是否变化。2. 查看后端控制台日志看是否有 SQL 异常。3. 打开浏览器开发者工具F12的 Network 标签查看操作请求是否成功返回 200。1. 如果数据库没变检查后端PurchaseService或SaleService中更新库存的代码逻辑。2. 确保操作后前端重新调用了库存查询接口。图表不显示或显示错误1. 图表依赖的统计接口返回错误或为空。2. 前端图表库如 ECharts资源未加载。3. 浏览器控制台有 JavaScript 错误。1. 在浏览器开发者工具的 Network 标签中找到图表数据请求的接口查看其返回的 JSON 数据是否正确。2. 检查 Console 标签是否有 JS 错误。1. 修复后端统计接口的 SQL 或逻辑。2. 检查前端页面是否成功引入了 ECharts 等库的 JS 文件。系统运行一段时间后变慢1. 数据库连接未释放连接池耗尽。2. 数据量增大查询未走索引。3. JVM 内存不足频繁 Full GC。1. 监控数据库连接数。2. 分析慢查询日志。3. 使用 JVM 监控工具观察内存和 GC 情况。1. 检查代码中是否有数据库连接或 ResultSet 未关闭的情况。2. 为常用查询条件字段添加索引。3. 调整 JVM 启动参数增加堆内存如-Xmx1024m。9. 最佳实践与使用建议为了让系统更稳定、安全地运行遵循以下实践会大有裨益。部署前彻底测试在生产环境使用前务必在测试环境完整跑通所有核心业务流程档案管理、采购、销售、库存盘点、报表查看。用接近真实的数据量进行压力测试。数据备份常态化定期备份 MySQL 数据库。可以使用mysqldump命令或工具进行自动备份。备份文件应存储在异地。# 简单备份示例 mysqldump -u root -p clinic_drug_db backup_$(date %Y%m%d).sql修改默认配置修改默认密码立即修改默认的管理员密码admin/123456等。更改默认端口如果部署在公网可访问的服务器上将server.port改为非 8080 的非常见端口。配置数据库远程访问如果应用和数据库分离部署需配置 MySQL 允许远程连接并设置强密码。日志与监控配置application.properties中的日志级别如logging.level.rootINFO,logging.level.com.yourpackageDEBUG便于排查问题。对于服务器部署考虑使用journalctl(Linux) 或日志文件轮转工具来管理日志。权限最小化为数据库用户分配最小必要权限。通常只需要对clinic_drug_db库的增删改查权限不需要GRANT ALL。前端优化如果用户反映页面加载慢可以考虑开启 Spring Boot 的 Gzip 压缩。将静态资源JS, CSS, 图片放到 CDN 或 Nginx 后面。对于复杂报表提供“导出为 Excel”功能替代在页面渲染大量数据。业务数据清理策略与业务方确定数据保留策略。例如3年前的采购/销售明细可以归档到历史表核心统计报表所需的数据可以转移到汇总表以保持主业务表的轻量。合规性检查确保系统记录的操作日志谁、在何时、做了什么满足可能的审计要求。检查药品分类、批准文号等字段是否符合行业规范。这个 Spring Boot 诊所药物库管理系统其价值在于将琐碎、易错的线下药品管理流程转化为一个清晰、可追溯、可分析的线上系统。它可能没有大型 ERP 那么强大的功能但正因如此它更聚焦、更轻量、更容易上手。对于诊所管理者最应该先验证的就是“采购入库”和“销售出库”这两个核心闭环只要库存能随着业务准确变动系统的基础价值就成立了。随后利用“过期预警”和“可视化统计”功能才能真正发挥数据辅助决策的作用。对于开发者这是一个学习 Spring Boot 整合 MyBatis、事务管理、权限控制、报表生成的优秀范例。你可以尝试在此基础上增加短信库存提醒、药品图片上传、与电子病历简单对接等功能。最容易踩的坑往往在第一步数据库配置和初始化。务必仔细核对连接信息确保 SQL 脚本成功执行。如果在操作中遇到库存不准第一时间去查数据库流水表和数据表而不是只看页面这能帮你快速定位是前端展示问题还是后端逻辑问题。建议将本文作为部署和测试的路线图收藏备用。从环境准备到功能验证再到问题排查按照这个流程走一遍你就能快速掌握这个系统的全貌并让它为你所用。