基于JSP+Servlet的药店药品商城管理系统 - 源码深度解析

JavaJavaScriptHTMLCSSMySQLJSP+Servlet
2026-03-184 浏览

文章摘要

本项目是一款基于JSP+Servlet技术栈构建的药店药品商城管理系统,旨在为中小型药店或连锁药房提供一体化的药品信息管理与在线销售解决方案。系统核心解决了传统药店手工记录效率低、库存更新不及时、销售渠道单一等痛点,通过数字化管理提升药品进销存效率与客户服务体验。 在技术实现上,系统采用经典的...

在医药零售行业数字化转型的浪潮中,传统的手工记录和库存管理方式已难以满足现代药店高效运营的需求。药品信息更新滞后、库存盘点繁琐、销售渠道单一等问题,制约了中小型药店的业务拓展和服务质量提升。针对这一市场痛点,我们设计并实现了一套基于JSP+Servlet技术的药店药品商城管理系统,内部代号“医链通”。

该系统采用经典的MVC架构模式,实现了前后端分离的业务逻辑处理。前端使用JSP进行动态页面渲染,结合JSTL标签库简化页面逻辑;Servlet作为控制器层负责请求分发和业务调度;Java Bean封装核心业务模型;JDBC实现与MySQL数据库的持久化交互。这种分层架构确保了系统的高内聚、低耦合,为后续功能扩展和维护提供了良好的基础。

管理员登录界面

数据库架构设计深度解析

系统的数据模型设计充分考虑了药品管理的业务特性,通过6张核心表构建了完整的数据关系网络。其中,药品表medicine的设计尤为关键:

CREATE TABLE medicine (
    medicine_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    description TEXT,
    price DECIMAL(10,2) NOT NULL,
    stock_quantity INT NOT NULL DEFAULT 0,
    category_id INT,
    manufacturer VARCHAR(100),
    prescription_required BOOLEAN DEFAULT FALSE,
    image_url VARCHAR(200),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES category(category_id)
);

该表结构体现了多个设计亮点:使用DECIMAL(10,2)类型确保药品价格的精确计算;prescription_required布尔字段明确区分处方药与非处方药,符合医药行业监管要求;stock_quantity字段实时跟踪库存变化,为库存预警提供数据支持;外键约束保证了药品分类的数据一致性。

订单表orders的设计则体现了交易业务的复杂性:

CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    total_amount DECIMAL(10,2) NOT NULL,
    status ENUM('pending', 'confirmed', 'shipped', 'delivered', 'cancelled'),
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    shipping_address TEXT,
    payment_method VARCHAR(50),
    FOREIGN KEY (user_id) REFERENCES user(user_id)
);

状态字段采用ENUM类型限定订单生命周期,确保业务逻辑的严谨性。总金额字段与订单明细表形成关联,支持复杂的价格计算策略。

核心业务逻辑实现

用户认证模块采用Session机制管理登录状态,以下为登录验证的核心Servlet代码:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String role = request.getParameter("role");
        
        UserService userService = new UserService();
        User user = userService.authenticate(username, password, role);
        
        if (user != null) {
            HttpSession session = request.getSession();
            session.setAttribute("currentUser", user);
            session.setMaxInactiveInterval(30 * 60); // 30分钟超时
            
            if ("admin".equals(role)) {
                response.sendRedirect("admin/dashboard.jsp");
            } else {
                response.sendRedirect("user/home.jsp");
            }
        } else {
            request.setAttribute("errorMessage", "用户名或密码错误");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }
}

购物车功能通过Session临时存储用户选购商品,业务逻辑层实现库存验证:

public class ShoppingCartService {
    public void addToCart(HttpSession session, int medicineId, int quantity) {
        MedicineDAO medicineDAO = new MedicineDAO();
        Medicine medicine = medicineDAO.getMedicineById(medicineId);
        
        if (medicine.getStockQuantity() < quantity) {
            throw new RuntimeException("库存不足");
        }
        
        Map<Integer, CartItem> cart = getCartFromSession(session);
        CartItem item = cart.get(medicineId);
        if (item != null) {
            item.setQuantity(item.getQuantity() + quantity);
        } else {
            cart.put(medicineId, new CartItem(medicine, quantity));
        }
    }
    
    private Map<Integer, CartItem> getCartFromSession(HttpSession session) {
        Map<Integer, CartItem> cart = (Map<Integer, CartItem>) session.getAttribute("cart");
        if (cart == null) {
            cart = new HashMap<>();
            session.setAttribute("cart", cart);
        }
        return cart;
    }
}

购物车界面

药品库存管理采用乐观锁机制防止超卖,DAO层实现如下:

public class MedicineDAO {
    public boolean updateStock(int medicineId, int quantity) {
        String sql = "UPDATE medicine SET stock_quantity = stock_quantity - ? WHERE medicine_id = ? AND stock_quantity >= ?";
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setInt(1, quantity);
            stmt.setInt(2, medicineId);
            stmt.setInt(3, quantity);
            return stmt.executeUpdate() > 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
}

订单处理流程包含完整的事务管理,确保数据一致性:

public class OrderService {
    public boolean createOrder(Order order, List<OrderItem> items) {
        Connection conn = null;
        try {
            conn = DBUtil.getConnection();
            conn.setAutoCommit(false);
            
            OrderDAO orderDAO = new OrderDAO(conn);
            int orderId = orderDAO.createOrder(order);
            
            OrderItemDAO itemDAO = new OrderItemDAO(conn);
            MedicineDAO medicineDAO = new MedicineDAO(conn);
            
            for (OrderItem item : items) {
                item.setOrderId(orderId);
                itemDAO.addOrderItem(item);
                
                if (!medicineDAO.updateStock(item.getMedicineId(), item.getQuantity())) {
                    throw new RuntimeException("库存更新失败");
                }
            }
            
            conn.commit();
            return true;
        } catch (Exception e) {
            if (conn != null) {
                try { conn.rollback(); } catch (SQLException ex) {}
            }
            return false;
        } finally {
            DBUtil.closeConnection(conn);
        }
    }
}

订单管理界面

实体模型与业务关系

系统核心实体模型通过精细的关联设计支持复杂业务场景。用户实体区分管理员和普通用户角色,支持权限分级控制。药品实体包含完整的医药属性,支持基于分类、厂家、处方要求的多维度检索。订单实体通过状态机模式管理订单生命周期,与订单明细实体形成一对多关系,支持复杂的促销策略和价格计算。

前端页面采用响应式设计,使用JSTL标签库实现数据展示逻辑:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<div class="medicine-list">
    <c:forEach var="medicine" items="${medicineList}">
        <div class="medicine-item">
            <img src="${medicine.imageUrl}" alt="${medicine.name}">
            <h3>${medicine.name}</h3>
            <p class="price">¥${medicine.price}</p>
            <c:if test="${medicine.prescriptionRequired}">
                <span class="prescription-label">处方药</span>
            </c:if>
            <button onclick="addToCart(${medicine.medicineId})">加入购物车</button>
        </div>
    </c:forEach>
</div>

药品详情页

系统优化与功能扩展方向

基于当前系统架构,未来可从以下几个方向进行深度优化:

  1. 缓存机制引入:使用Redis实现药品信息缓存和会话共享,减少数据库访问压力。可实现二级缓存策略,将热点药品数据缓存至Redis,提升系统响应速度。

  2. 搜索引擎集成:引入Elasticsearch实现药品智能搜索,支持拼音搜索、同义词扩展和搜索权重调整。通过IK分词器优化中文检索体验,提升商品发现效率。

  3. 微服务架构改造:将单体应用拆分为用户服务、商品服务、订单服务等独立微服务。使用Spring Cloud框架实现服务注册发现、配置中心和API网关,提升系统可扩展性。

  4. 移动端适配:开发基于Vue.js的移动端Web应用,实现响应式布局和PWA特性。通过Service Worker实现离线缓存,提升移动用户体验。

  5. 数据分析平台:构建基于Hadoop的数据分析平台,对销售数据、用户行为进行深度挖掘。通过Kylin实现OLAP分析,为经营决策提供数据支持。

  6. 安全机制强化:增加SQL注入防护、XSS攻击防范等安全措施。引入Spring Security框架实现细粒度权限控制,支持OAuth 2.0第三方登录。

用户个人中心

该系统通过严谨的技术架构和业务模型设计,为中小型药店提供了完整的数字化解决方案。基于JSP+Servlet的技术栈选择确保了系统的稳定性和可维护性,分层架构设计为后续功能扩展奠定了坚实基础。随着医药电商行业的快速发展,该系统具备持续演进的技术潜力,能够有效支撑药店的数字化转型需求。

本文关键词
JSPServlet药店管理系统药品商城源码解析

上下篇

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