在饮品零售行业数字化转型的浪潮中,线上销售系统已成为提升运营效率和顾客体验的关键工具。维他茶饮在线销售平台采用经典的J2EE MVC架构,通过JSP+Servlet技术栈实现了完整的B2C电子商务解决方案。该系统专为中小型茶饮商家设计,有效解决了传统门店手工记录订单易出错、高峰期排队体验差、销售数据统计困难等核心痛点。
系统采用分层架构设计,表现层由JSP动态页面构成,控制层通过Servlet处理业务逻辑,模型层使用JavaBean封装实体对象。数据持久化通过JDBC直接连接MySQL数据库实现,整个系统包含8个核心数据表,覆盖用户管理、商品展示、购物车、订单处理等完整业务流程。
技术架构深度解析
系统采用三层架构模式,严格遵循MVC设计原则。Servlet作为控制器承担请求分发重任,每个业务模块都有对应的Servlet处理类。例如OrderServlet专门处理订单相关请求,通过doGet和doPost方法分别处理不同类型的HTTP请求。
public class OrderServlet extends HttpServlet {
private OrderService orderService = new OrderService();
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
switch(action) {
case "create":
createOrder(request, response);
break;
case "update":
updateOrderStatus(request, response);
break;
}
}
private void createOrder(HttpServletRequest request, HttpServletResponse response) {
// 获取购物车数据
HttpSession session = request.getSession();
ShoppingCart cart = (ShoppingCart) session.getAttribute("cart");
// 订单数据验证
if(cart == null || cart.isEmpty()) {
request.setAttribute("error", "购物车为空");
return;
}
// 创建订单逻辑
Order order = orderService.createOrder(cart, getCurrentUser(request));
session.setAttribute("currentOrder", order);
}
}
Session机制在系统中扮演重要角色,用于维护用户登录状态和购物车数据。用户添加商品到购物车时,系统会将商品信息存储在Session中,确保在用户浏览过程中购物车数据的完整性。
数据库设计精要
系统数据库设计体现了良好的规范化程度,核心表之间通过外键建立关联。用户表采用密码加密存储,订单表包含完整的状态跟踪机制。
用户表设计注重安全性和扩展性:
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
phone VARCHAR(20),
address TEXT,
user_type ENUM('customer', 'admin') DEFAULT 'customer',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
last_login TIMESTAMP NULL
);
订单表设计支持复杂的业务流程:
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_number VARCHAR(50) UNIQUE NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
status ENUM('pending', 'confirmed', 'preparing', 'ready', 'completed', 'cancelled') DEFAULT 'pending',
shipping_address TEXT NOT NULL,
customer_notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
商品分类表采用树形结构设计,支持多级分类:
CREATE TABLE categories (
category_id INT PRIMARY KEY AUTO_INCREMENT,
category_name VARCHAR(100) NOT NULL,
parent_id INT DEFAULT NULL,
sort_order INT DEFAULT 0,
is_active BOOLEAN DEFAULT true,
FOREIGN KEY (parent_id) REFERENCES categories(category_id)
);
购物车功能实现
购物车模块采用Session和数据库双存储策略。用户未登录时使用Session临时存储,登录后自动同步到数据库。这种设计既保证了用户体验的连贯性,又确保了数据的持久化。

购物车业务逻辑实现:
public class ShoppingCart {
private Map<Integer, CartItem> items = new HashMap<>();
public void addItem(Product product, int quantity) {
CartItem item = items.get(product.getProductId());
if(item != null) {
item.setQuantity(item.getQuantity() + quantity);
} else {
item = new CartItem(product, quantity);
items.put(product.getProductId(), item);
}
}
public void updateQuantity(int productId, int quantity) {
CartItem item = items.get(productId);
if(item != null) {
if(quantity <= 0) {
items.remove(productId);
} else {
item.setQuantity(quantity);
}
}
}
public BigDecimal getTotalAmount() {
return items.values().stream()
.map(item -> item.getProduct().getPrice().multiply(
BigDecimal.valueOf(item.getQuantity())))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
商品管理系统
后台商品管理模块提供完整的CRUD操作,支持商品上架、下架、库存管理等功能。管理员可以设置商品分类、价格、促销信息等属性。

商品数据访问层实现:
public class ProductDAO {
public List<Product> getProductsByCategory(int categoryId, int page, int pageSize) {
String sql = "SELECT * FROM products WHERE category_id = ? AND is_available = true "
+ "ORDER BY created_at DESC LIMIT ? OFFSET ?";
try(Connection conn = DataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, categoryId);
stmt.setInt(2, pageSize);
stmt.setInt(3, (page - 1) * pageSize);
ResultSet rs = stmt.executeQuery();
List<Product> products = new ArrayList<>();
while(rs.next()) {
products.add(mapResultSetToProduct(rs));
}
return products;
} catch(SQLException e) {
throw new RuntimeException("数据库查询失败", e);
}
}
public boolean updateProductStock(int productId, int newStock) {
String sql = "UPDATE products SET stock_quantity = ? WHERE product_id = ?";
try(Connection conn = DataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, newStock);
stmt.setInt(2, productId);
return stmt.executeUpdate() > 0;
} catch(SQLException e) {
throw new RuntimeException("库存更新失败", e);
}
}
}
订单处理流程
订单系统实现了完整的状态机模式,从下单到完成包含多个状态转换。系统通过订单状态跟踪确保业务流程的透明性。

订单状态管理实现:
public class OrderService {
public Order createOrder(ShoppingCart cart, User user) {
Order order = new Order();
order.setOrderNumber(generateOrderNumber());
order.setUserId(user.getUserId());
order.setTotalAmount(cart.getTotalAmount());
order.setStatus(OrderStatus.PENDING);
// 事务处理订单创建
Connection conn = null;
try {
conn = DataSource.getConnection();
conn.setAutoCommit(false);
// 保存订单主信息
int orderId = saveOrder(conn, order);
order.setOrderId(orderId);
// 保存订单明细
for(CartItem item : cart.getItems().values()) {
saveOrderItem(conn, orderId, item);
}
conn.commit();
return order;
} catch(SQLException e) {
if(conn != null) {
try { conn.rollback(); } catch(SQLException ex) {}
}
throw new RuntimeException("订单创建失败", e);
}
}
private String generateOrderNumber() {
return "VT" + System.currentTimeMillis() +
String.format("%04d", new Random().nextInt(10000));
}
}
用户权限管理
系统采用基于角色的访问控制模型,区分普通用户和管理员权限。用户登录后,系统根据角色类型跳转到对应的功能界面。

认证过滤器实现:
@WebFilter("/*")
public class AuthenticationFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String path = httpRequest.getRequestURI().substring(
httpRequest.getContextPath().length());
// 公开访问路径
if(path.startsWith("/public/") || path.equals("/login") ||
path.equals("/register")) {
chain.doFilter(request, response);
return;
}
HttpSession session = httpRequest.getSession(false);
if(session == null || session.getAttribute("user") == null) {
httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
return;
}
// 管理员权限检查
if(path.startsWith("/admin/")) {
User user = (User) session.getAttribute("user");
if(!user.isAdmin()) {
httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN);
return;
}
}
chain.doFilter(request, response);
}
}
系统优化与扩展建议
缓存机制引入:商品分类、热门商品等静态数据可引入Redis缓存,减少数据库查询压力。实现二级缓存策略,首先查询缓存,未命中时查询数据库并更新缓存。
支付集成扩展:当前系统支持基础的在线支付,可扩展微信支付、支付宝等多种支付方式。通过策略模式设计支付接口,便于新增支付渠道。
搜索引擎优化:实现商品全文检索功能,集成Elasticsearch提供更精准的商品搜索体验。建立商品索引,支持多字段组合查询和排序。
微服务架构改造:随着业务规模扩大,可将单体应用拆分为用户服务、商品服务、订单服务等微服务。使用Spring Cloud框架实现服务治理和分布式事务。
移动端适配:开发响应式前端界面或独立的移动App,提升移动端用户体验。采用Vue.js或React框架重构前端,实现前后端分离架构。
该系统为茶饮行业提供了稳定可靠的线上销售解决方案,其模块化设计和清晰的代码结构为后续功能扩展奠定了坚实基础。通过持续的技术优化和功能迭代,能够更好地满足茶饮商家数字化转型的需求。