基于JSP+Servlet的在线药店销售与库存管理系统 - 源码深度解析

JavaJavaScriptHTMLCSSMySQLJSP+Servlet
2026-02-1049 浏览

文章摘要

本系统是一款基于JSP和Servlet技术栈构建的在线药店核心业务管理平台,旨在解决传统药店在药品销售与库存管理环节中普遍存在的信息孤岛、数据更新滞后及人工操作繁琐等核心痛点。系统通过将销售前端与库存后台深度整合,实现了业务流程的数字化闭环,其核心业务价值在于显著提升了药品流转效率、降低了因信息不透...

基于JSP+Servlet的在线药店销售与库存管理系统 - 源码深度解析

在医药零售行业数字化转型的浪潮中,传统药店面临着库存信息不透明、销售数据滞后、人工操作易出错等核心挑战。一款高效、可靠的业务管理平台成为提升运营效率的关键。本系统采用经典的JSP+Servlet技术栈,构建了一个集药品销售、库存管理、采购供应链于一体的综合解决方案,我们将其命名为“药易管”——一个旨在实现药店业务全流程数字化闭环的智能管理引擎。

系统严格遵循MVC设计模式,Servlet作为控制器层负责请求调度和业务逻辑处理,JSP页面专注于数据展示,JavaBean实体类封装业务数据,JDBC实现与MySQL数据库的持久化交互。这种分层架构确保了代码的高内聚低耦合,为系统的可维护性和扩展性奠定了坚实基础。

系统架构与技术栈深度解析

“药易管”采用经典的三层架构设计,每一层都承担着明确的职责:

表现层(Presentation Layer)

  • 使用JSP技术结合JSTL标签库和EL表达式
  • 实现了数据与视图的清晰分离
  • 避免了在页面中嵌入过多的Java代码脚本(Scriptlet)
  • 采用响应式设计确保多设备兼容性

业务逻辑层(Business Logic Layer)

  • 由Servlet构成,每个Servlet对应一个具体的业务模块
  • 负责接收前端请求、验证参数、调用服务层方法
  • 涵盖药品管理、订单处理、库存更新等核心业务
  • 实现事务管理和异常处理机制

数据访问层(Data Access Layer)

  • 通过封装JDBC操作,提供对数据库的安全、高效访问
  • 采用DAO设计模式,隔离业务逻辑与数据访问细节
  • 实现连接池管理,提升数据库访问性能

在技术选型上,系统选择了成熟稳定的技术组合:

  • Java EE技术:Servlet 3.0+和JSP 2.0+技术经过多年发展,拥有完善的生态系统
  • 数据库:MySQL 5.7+在事务处理和数据一致性方面表现出色
  • 前端技术:HTML5+CSS3+JavaScript组合,确保界面兼容性和用户体验
  • 服务器:Tomcat 8.0+作为Servlet容器,提供稳定的运行环境

数据库设计亮点与优化策略

药品表(drug)的核心设计

药品表作为系统的核心数据表,其设计体现了对业务需求的深刻理解:

CREATE TABLE `drug` (
  `did` varchar(22) NOT NULL COMMENT '药品ID',
  `dname` varchar(22) DEFAULT NULL COMMENT '药品名称',
  `dclass` varchar(22) DEFAULT NULL COMMENT '药品类别',
  `dprice` varchar(22) DEFAULT NULL COMMENT '售价',
  `prodate` date DEFAULT NULL COMMENT '生产日期',
  `exdate` date DEFAULT NULL COMMENT '过期日期',
  `requantity` int(11) DEFAULT NULL COMMENT '库存数量',
  `sname` varchar(33) NOT NULL COMMENT '生产商',
  `function` varchar(33) DEFAULT NULL COMMENT '功效',
  PRIMARY KEY (`did`),
  KEY `supplier` (`sname`),
  CONSTRAINT `drug_ibfk_1` FOREIGN KEY (`sname`) REFERENCES `supplier` (`sname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='药品表'

设计亮点分析:

  • 主键设计did字段采用varchar(22)类型作为主键,便于嵌入药品分类、批次等业务信息
  • 数据完整性:外键约束确保药品与供应商之间的引用完整性
  • 业务约束:在应用层实现库存数量非负校验,确保业务逻辑正确性
  • 索引优化:在供应商字段上建立索引,提升关联查询性能

订单表(ordered)的事务完整性设计

订单表的设计重点关注了销售业务的事务完整性:

CREATE TABLE `ordered` (
  `oid` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `did` varchar(22) DEFAULT NULL COMMENT '药品ID',
  `dname` varchar(22) DEFAULT NULL COMMENT '药品名称',
  `oquantity` int(11) DEFAULT NULL COMMENT '购买数量',
  `oprice` varchar(22) DEFAULT NULL COMMENT '总价',
  `cid` int(11) DEFAULT NULL COMMENT '购买人',
  `cname` varchar(22) DEFAULT NULL COMMENT '客户姓名',
  `odate` datetime DEFAULT NULL COMMENT '销售日期',
  PRIMARY KEY (`oid`),
  KEY `did` (`did`),
  KEY `cid` (`cid`),
  CONSTRAINT `ordered_ibfk_1` FOREIGN KEY (`did`) REFERENCES `drug` (`did`),
  CONSTRAINT `ordered_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `customer` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='订单表'

优化策略:

  • 反范式设计:存储药品名称减少联表查询,提升读取性能
  • 事务保障:通过数据库事务确保库存更新与订单创建的原子性
  • 索引设计:多字段索引优化复杂查询条件
  • 自增主键:确保订单ID的唯一性和连续性

采购表(purchase)的供应链追踪

采购表的设计体现了对药品供应链的完整追踪:

CREATE TABLE `purchase` (
  `pid` varchar(22) NOT NULL COMMENT '采购ID',
  `did` varchar(22) DEFAULT NULL COMMENT '药品ID',
  `pquantity` int(11) DEFAULT NULL COMMENT '采购数量',
  `purchaser` varchar(22) DEFAULT NULL COMMENT '采购人',
  `pprice` varchar(22) DEFAULT NULL COMMENT '采购价格',
  `pdate` date DEFAULT NULL COMMENT '采购日期',
  PRIMARY KEY (`pid`),
  KEY `did` (`did`),
  CONSTRAINT `purchase_ibfk_1` FOREIGN KEY (`did`) REFERENCES `drug` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='采购表'

供应链管理特性:

  • 批次追踪:采购ID支持嵌入批次信息,实现药品溯源
  • 成本控制:记录采购价格,为成本核算提供数据支持
  • 供应商评估:基于采购数据建立供应商绩效评估体系

核心功能实现详解

药品信息管理模块

药品管理是系统的核心功能之一,实现了完整的药品生命周期管理:

功能特性:

  • 药品信息的增删改查(CRUD)操作
  • 实时库存监控和预警机制
  • 药品过期自动提醒功能
  • 多条件组合查询和分页显示

药品管理界面

Servlet控制器实现:

@WebServlet("/drugQuery")
public class DrugQueryServlet extends HttpServlet {
    private DrugService drugService = new DrugService();
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String drugId = request.getParameter("drugId");
        String drugName = request.getParameter("drugName");
        String category = request.getParameter("category");
        
        try {
            List<Drug> drugList = drugService.queryDrugs(drugId, drugName, category);
            request.setAttribute("drugList", drugList);
            request.getRequestDispatcher("/drugManagement.jsp").forward(request, response);
        } catch (SQLException e) {
            e.printStackTrace();
            request.setAttribute("errorMsg", "查询失败:" + e.getMessage());
            request.getRequestDispatcher("/error.jsp").forward(request, response);
        }
    }
}

JSP视图层实现:

<table class="table table-striped">
    <thead>
        <tr>
            <th>药品ID</th>
            <th>药品名称</th>
            <th>类别</th>
            <th>售价</th>
            <th>库存数量</th>
            <th>生产日期</th>
            <th>过期日期</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach var="drug" items="${drugList}">
            <tr>
                <td>${drug.did}</td>
                <td>${drug.dname}</td>
                <td>${drug.dclass}</td>
                <td>${drug.dprice}</td>
                <td>${drug.requantity}</td>
                <td>${drug.prodate}</td>
                <td>${drug.exdate}</td>
                <td>
                    <a href="drugEdit?did=${drug.did}" class="btn btn-primary">编辑</a>
                    <a href="drugDelete?did=${drug.did}" class="btn btn-danger">删除</a>
                </td>
            </tr>
        </c:forEach>
    </tbody>
</table>

库存管理优化策略

系统实现了智能库存管理机制:

  1. 安全库存预警:设置最低库存阈值,自动触发补货提醒
  2. 先进先出(FIFO):基于生产日期自动推荐出库顺序
  3. 库存周转分析:统计药品周转率,优化采购策略
  4. 效期管理:提前预警近效期药品,减少损失

销售与采购协同

系统通过销售数据驱动采购决策:

  • 基于历史销售数据预测未来需求
  • 自动生成采购建议清单
  • 供应商绩效评估支持采购决策
  • 采购到货自动更新库存

技术实现亮点

事务管理机制

系统采用数据库事务确保业务操作的原子性,特别是在库存更新和订单创建等关键操作中:

public class OrderService {
    public boolean createOrder(Order order) throws SQLException {
        Connection conn = null;
        try {
            conn = DataSourceUtil.getConnection();
            conn.setAutoCommit(false);
            
            // 1. 创建订单记录
            orderDao.insertOrder(conn, order);
            
            // 2. 更新库存
            drugDao.updateStock(conn, order.getDid(), -order.getQuantity());
            
            conn.commit();
            return true;
        } catch (SQLException e) {
            if (conn != null) conn.rollback();
            throw e;
        } finally {
            if (conn != null) conn.close();
        }
    }
}

性能优化策略

  1. 数据库连接池:使用DBCP或HikariCP管理数据库连接
  2. 查询优化:合理使用索引,避免全表扫描
  3. 页面缓存:对静态资源实施缓存策略
  4. 异步处理:耗时的报表生成采用异步任务处理

总结与展望

本系统通过JSP+Servlet技术栈成功构建了一个功能完善的药店管理系统,体现了传统Java Web技术在企业级应用中的稳定性和可靠性。系统架构清晰,代码可维护性强,为中小型药店提供了完整的数字化解决方案。

未来扩展方向:

  • 引入Spring框架提升开发效率
  • 增加移动端支持
  • 集成第三方支付接口
  • 实现数据分析和BI报表功能
  • 扩展连锁药店多门店管理支持

该系统不仅解决了药店日常运营的核心痛点,更为后续的技术升级和功能扩展奠定了坚实基础。

本文关键词
JSPServlet在线药店库存管理系统源码解析

上下篇

上一篇
没有更多文章
下一篇
没有更多文章