资讯动态

数据库课设实战:医药信息管理系统从建表到报表全流程

发布时间:2026/10/13 16:04:51 来源:尧图企业网站定制
简介这份数据库课设资源面向高校计算机相关专业学生与需要完成课程设计的开发者围绕医药信息管理系统这一典型业务场景提供了一套可运行、可参考的完整项目方案。系统覆盖基本信息管理、进货管理、库房管理、销售管理与财务统计五大模块涉及药品、员工、客户、供应商等数据的录入查询以及入库登记、库存盘点、退货处理、销售报表和当日当月财务统计等业务逻辑适合作为数据库课程设计、毕业设计选题或Java Web入门练手项目。资源包共335个文件约4.05MB以150个gif界面素材、54个java源码、44个js脚本、38个html页面和12个css样式为主另含sql建表脚本、pom.xml依赖配置及Maven构建脚本项目结构完整便于快速导入IDE运行调试。目前已有72人学习下载可帮助读者理解数据库表结构设计、前后端交互流程与报表统计实现思路节省从零搭建的时间成本。1. 数据库课设选医药信息管理系统从建表到报表的完整落地路径如果你正在为数据库课设发愁又不想做一个烂大街的学生成绩管理或者图书借阅系统医药信息管理系统是个性价比很高的选题。它天然覆盖了数据库课程要求的核心考点多表关联、事务处理、增删改查、视图与报表统计而且业务逻辑足够复杂能撑起一份像样的课设报告。这个项目基于 Maven 构建前端用的是 Layui 这套经典的后台管理 UI 框架数据库层对接 MySQL源码目录里包含了完整的src结构、pom.xml依赖配置以及mvnw.cmd和mvnw两个 Maven Wrapper 脚本。换句话说你拿到手之后不需要本地预装 Maven直接用 wrapper 就能拉依赖、编译、跑起来。它适合两类人一类是正在做数据库课设、需要一份能跑通、能改、能写进报告的项目参考另一类是想练手 Java Web 加 MySQL 完整链路的初学者。接下来的内容会从环境搭建一路讲到报表统计的实现细节和常见翻车点尽量让你少走弯路。2. 环境搭建与数据库初始化把项目跑起来的第一步2.1 技术栈确认与本地环境准备在动手之前先把项目依赖的技术栈理清楚。从pom.xml和文件结构来看这是一个标准的 Java Web 项目构建工具是 Maven前端 UI 框架是 Layui包含layui.css、layui.mobile.css、laydate.css、layer.css等样式文件数据库使用 MySQL。你需要准备的本地环境包括JDK 8 或以上版本、MySQL 5.7 或 8.0、以及一个趁手的 IDEIntelliJ IDEA 或 Eclipse 都行项目里有drug.iml文件说明原作者用的是 IDEA。这里有个容易被忽略的点项目自带mvnw.cmdWindows 批处理和mvnwLinux/Mac Shell 脚本这是 Maven Wrapper。它的好处是你不需要单独安装 Maven直接在项目根目录执行 wrapper 命令就能完成构建。很多同学在课设环境里没有配置 Maven 环境变量用 wrapper 可以省掉这一步。先确认 JDK 和 MySQL 是否就绪java -version mysql --version如果 Java 版本低于 8后面编译会报不支持的类版本错误。MySQL 版本建议 5.7 以上因为建表语句里可能用到utf8mb4字符集来支持中文和特殊符号。2.2 数据库建表与初始数据导入医药信息管理系统的核心表围绕五个模块展开药品信息、员工信息、客户信息、供应商信息以及进货、库存、销售、财务相关的业务表。常见做法是建一张drug_info表存药品基础信息一张employee表存员工一张customer表存客户一张supplier表存供应商然后stock_in入库、stock_out出库/销售、inventory库存等表通过外键关联。下面给出核心表的建表示例你可以根据项目src目录下的实体类字段做对应调整-- 药品信息表 CREATE TABLE drug_info ( drug_id INT PRIMARY KEY AUTO_INCREMENT, drug_name VARCHAR(100) NOT NULL COMMENT 药品名称, category VARCHAR(50) COMMENT 药品类别, price DECIMAL(10,2) COMMENT 单价, dosage VARCHAR(50) COMMENT 剂量规格, instruction TEXT COMMENT 使用说明, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 供应商表 CREATE TABLE supplier ( supplier_id INT PRIMARY KEY AUTO_INCREMENT, supplier_name VARCHAR(100) NOT NULL, contact VARCHAR(50), phone VARCHAR(20), supply_category VARCHAR(50) COMMENT 供货品类 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 入库记录表 CREATE TABLE stock_in ( in_id INT PRIMARY KEY AUTO_INCREMENT, drug_id INT, supplier_id INT, quantity INT NOT NULL, purchase_price DECIMAL(10,2), in_date DATE, FOREIGN KEY (drug_id) REFERENCES drug_info(drug_id), FOREIGN KEY (supplier_id) REFERENCES supplier(supplier_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;建表时几个参数需要留意ENGINEInnoDB是必须的因为后面做库存扣减和财务统计时会用到事务CHARSETutf8mb4保证中文药品名和说明不会乱码DECIMAL(10,2)用于金额字段比FLOAT精确避免财务报表出现0.30000000000000004这种玄学数字。导入初始数据时建议先插药品和供应商再插入库记录否则外键约束会直接拒绝插入。如果你用 Navicat 或者命令行source导入 SQL 文件注意先USE目标数据库。2.3 用 Maven Wrapper 构建并启动项目数据库准备好之后回到项目根目录。Windows 下执行mvnw.cmd clean install -DskipTestsLinux 或 Mac 下执行./mvnw clean install -DskipTestsclean清掉之前的编译产物install把项目打包并安装到本地仓库-DskipTests跳过测试用例课设项目一般没有完整测试跳过能省时间。如果依赖下载慢可以在pom.xml里配置国内镜像仓库或者手动在 Maven 的settings.xml里加 mirror。构建成功后根据项目类型启动。如果是 Spring Boot 项目直接运行主类如果是传统 Servlet 项目需要配置 Tomcat 后部署。项目里的src目录结构会告诉你具体是哪种看有没有Application入口类或者web.xml。提示第一次跑mvnw会下载 Maven 本体和所有依赖耗时可能比较长。如果卡在某个依赖上不动检查网络或者换镜像源不要反复 CtrlC容易留下损坏的.lastUpdated文件。3. 五大功能模块的数据库设计与核心 SQL 实现3.1 基本信息管理多表 CRUD 与外键约束处理基本信息管理模块覆盖药品、员工、客户、供应商四类数据的增删改查。这部分看起来简单但实际写起来最容易在外键约束上翻车。比如你试图删除一个已经被入库记录引用的供应商数据库会直接报Cannot delete or update a parent row。常见做法是先用LEFT JOIN查一下该供应商有没有关联记录有的话给用户提示“该供应商存在关联入库记录无法删除”而不是直接把数据库错误抛到前端。查询药品信息的 SQL 一般会带条件筛选比如按类别或名称模糊搜索SELECT d.drug_id, d.drug_name, d.category, d.price, d.dosage, s.supplier_name FROM drug_info d LEFT JOIN supplier s ON d.supplier_id s.supplier_id WHERE d.drug_name LIKE CONCAT(%, #{keyword}, %) AND d.category #{category} ORDER BY d.create_time DESC LIMIT #{offset}, #{pageSize};这里用LEFT JOIN而不是INNER JOIN是因为有些药品可能还没指定供应商用INNER JOIN会把它们过滤掉。CONCAT(%, #{keyword}, %)是 MySQL 里做模糊查询的常见写法注意用参数化查询而不是字符串拼接否则会有 SQL 注入风险。LIMIT配合offset和pageSize实现分页Layui 的表格组件默认就是分页加载的。更新操作要注意乐观锁或者版本控制的问题。课设级别一般不做并发控制但如果你在库存盘点时同时有人在做销售出库就可能出现库存数据不一致。简单做法是在inventory表加一个version字段每次更新时version version 1更新语句带上WHERE version #{oldVersion}。3.2 进货与库房管理入库登记、库存扣减与事务控制进货管理和库房管理是这套系统里业务逻辑最重的部分。入库登记不是简单插一条记录就完事它至少涉及两个操作往stock_in表插入入库记录同时更新inventory表的库存数量。这两个操作必须在一个事务里完成否则插入成功但库存没更新数据就废了。Transactional(rollbackFor Exception.class) public void addStockIn(StockInDTO dto) { // 1. 插入入库记录 stockInMapper.insert(dto.toEntity()); // 2. 更新库存存在则累加不存在则新建 Inventory inv inventoryMapper.selectByDrugId(dto.getDrugId()); if (inv null) { inventoryMapper.insertNew(dto.getDrugId(), dto.getQuantity()); } else { inventoryMapper.addQuantity(dto.getDrugId(), dto.getQuantity()); } }Transactional(rollbackFor Exception.class)的意思是任何异常都触发回滚不加这个参数的话默认只回滚RuntimeException检查型异常不会回滚这是个经典坑。库存更新用UPDATE inventory SET quantity quantity #{qty} WHERE drug_id #{drugId}这种原子操作比先查再算再写要安全。库存盘点功能需要对比系统记录和实际数量。常见做法是建一张inventory_check表记录盘点批次、药品、系统数量、实际数量、差异。盘点完成后根据差异调整inventory表。退货处理则相当于反向入库往stock_in插一条负数记录或者单独建退货表同时扣减库存。库存报表一般用GROUP BY加聚合函数实现SELECT d.category, COUNT(DISTINCT d.drug_id) AS drug_count, SUM(i.quantity) AS total_stock, SUM(i.quantity * d.price) AS stock_value FROM inventory i JOIN drug_info d ON i.drug_id d.drug_id GROUP BY d.category ORDER BY stock_value DESC;这条 SQL 按药品类别统计库存品种数、总库存量和库存总值适合放在库房管理的报表页面。SUM(i.quantity * d.price)算的是按售价估算的库存价值如果要按进价算需要关联入库记录取最近一次进价。3.3 销售管理与财务统计报表 SQL 与日期维度聚合销售管理模块的核心是销售登记和销售报表。销售登记需要记录客户买了什么药、数量多少、单价多少、总价多少、什么时候买的。这里有个业务细节销售单价应该从drug_info表读取当前售价而不是让前端传过来否则容易被篡改。销售退货则是反向操作往销售表插负数或者单独建退货表同时把库存加回去。财务统计模块的当日统计和当月统计本质上是按日期维度做聚合查询。MySQL 里用DATE()函数提取日期部分-- 当日统计 SELECT COUNT(*) AS order_count, SUM(total_amount) AS revenue, SUM(quantity * cost_price) AS cost, SUM(total_amount) - SUM(quantity * cost_price) AS profit FROM sale_record WHERE DATE(sale_time) CURDATE(); -- 当月统计 SELECT DATE_FORMAT(sale_time, %Y-%m) AS month, SUM(total_amount) AS revenue, COUNT(*) AS order_count FROM sale_record WHERE DATE_FORMAT(sale_time, %Y-%m) DATE_FORMAT(CURDATE(), %Y-%m) GROUP BY DATE_FORMAT(sale_time, %Y-%m);CURDATE()返回当前日期DATE_FORMAT用来格式化日期。注意WHERE DATE(sale_time) CURDATE()这种写法不会走索引如果数据量大需要改成sale_time CURDATE() AND sale_time CURDATE() INTERVAL 1 DAY。课设数据量小无所谓但写报告的时候可以提一句索引优化的思路加分。销售报表还需要支持按药品、按客户、按时间段等维度查询。常见做法是写一个动态 SQL用 MyBatis 的if标签根据传入参数拼接条件。这里不展开 XML 配置核心思路是能走索引的字段放前面LIKE模糊查询放最后避免全表扫描。4. 避坑与排查课设项目最容易翻车的五个地方4.1 中文乱码从数据库到前端的一条龙排查现象药品名称在数据库里看是正常的但在页面上显示成???或者乱码方块。原因字符集不一致。可能是数据库建表时用了latin1也可能是 JDBC 连接 URL 没指定characterEncodingutf8还可能是前端页面没声明UTF-8。解决三步走。第一步确认数据库和表的字符集是utf8mb4用SHOW CREATE TABLE drug_info;查看。第二步JDBC URL 加上?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai。第三步检查 Layui 页面头部的meta charsetutf-8是否存在。三处都对齐之后乱码问题基本消失。4.2 外键约束导致删除失败现象在供应商管理页面点删除后台报foreign key constraint fails。原因该供应商在stock_in表里有引用记录数据库不允许删除被引用的父表行。解决两种方案。方案一是先删子表记录再删父表但这样会丢失历史入库数据不推荐。方案二是做逻辑删除在supplier表加is_deleted字段删除时只更新标记查询时过滤is_deleted 0。课设里用方案二更稳妥也显得考虑更周全。4.3 Maven Wrapper 执行权限问题现象Linux 或 Mac 下执行./mvnw报Permission denied。原因mvnw脚本文件没有可执行权限。从 Windows 拷贝到 Linux 或者从压缩包解压时权限可能丢失。解决执行chmod x mvnw赋予可执行权限然后再跑./mvnw clean install。Windows 下用mvnw.cmd一般不会有这个问题但如果路径里有空格或中文可能会报找不到命令把项目放到纯英文无空格路径下即可。4.4 库存扣减出现负数现象销售出库后库存数量变成负数。原因出库时没有校验当前库存是否足够或者并发情况下两个请求同时读到相同的库存值各自扣减后超卖。解决在扣减库存的 SQL 里加条件WHERE drug_id #{drugId} AND quantity #{qty}根据affectedRows判断是否扣减成功。如果返回 0说明库存不足抛异常回滚事务。这是最轻量的防超卖方案课设里够用了。4.5 日期格式前后端不一致现象前端传2025-01-15后端接收报日期解析异常或者数据库存的是2025-01-15 00:00:00前端显示多了一截时间。原因前后端日期格式不统一或者实体类字段类型和数据库字段类型不匹配。解决统一用yyyy-MM-dd格式传输日期实体类用java.util.Date或LocalDate在 Controller 层加DateTimeFormat(pattern yyyy-MM-dd)注解。如果数据库字段是DATETIME查询时用DATE()函数截取日期部分返回给前端。5. 进阶技巧用视图和存储过程把报表查询做优雅课设做到基本功能跑通只是及格线想让报告有亮点可以在报表查询上做文章。我一般会建议把复杂的统计 SQL 封装成数据库视图这样 Java 代码里直接SELECT * FROM v_monthly_report就行不用在代码里拼一长串 SQL。比如创建一个当月销售汇总视图CREATE VIEW v_monthly_sales AS SELECT DATE_FORMAT(s.sale_time, %Y-%m) AS sale_month, d.drug_name, d.category, SUM(s.quantity) AS total_qty, SUM(s.total_amount) AS total_revenue, SUM(s.quantity * d.cost_price) AS total_cost, SUM(s.total_amount) - SUM(s.quantity * d.cost_price) AS gross_profit FROM sale_record s JOIN drug_info d ON s.drug_id d.drug_id GROUP BY DATE_FORMAT(s.sale_time, %Y-%m), d.drug_id;视图的好处是把业务逻辑收在数据库层Java 代码只负责调用和展示。缺点是视图不存储数据每次查询都实时计算数据量大了会慢。课设数据量小完全没问题。另一个进阶玩法是用存储过程做库存盘点。传入盘点批次号和实际数量列表存储过程内部逐条对比系统库存和实际库存自动生成差异记录并调整库存。这样前端只需要调一次存储过程不用在 Java 里写循环和多次数据库交互。存储过程的调试比 Java 麻烦但写进课设报告里能体现你对数据库编程的掌握。验证报表数据是否正确有个笨但有效的办法手动在数据库里跑一遍明细查询把结果导出到 Excel 里做透视表和系统报表页面的数字对一遍。对不上就逐条排查通常是JOIN条件漏了或者WHERE过滤条件写错了。从那以后我每次做完报表功能都会拿三五个样本数据手工验算一遍确认聚合逻辑没问题再交给前端。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑