在传统烘焙行业数字化转型的浪潮中,中小型蛋糕店面临着实体经营模式固有的局限性:营业时间与空间受限,客户覆盖面窄,订单处理效率低下。针对这一市场痛点,我们设计并实现了一个轻量级、高可用的B2C在线蛋糕销售平台。该系统采用经典的J2EE Model 1架构,通过JSP与Servlet技术栈的有机结合,为烘焙商家提供了一个功能完备的线上商城解决方案,实现了从商品展示、在线订购到订单管理的全流程数字化运营。
系统架构与技术栈
平台采用分层架构设计,严格遵循MVC模式进行功能解耦。表现层使用JSP动态页面结合JSTL标签库进行数据渲染,有效分离了业务逻辑与展示逻辑。控制层由Servlet组件承担,负责接收用户请求、调用业务处理并转发响应。模型层通过JavaBean封装核心业务实体和数据访问逻辑。数据持久化基于JDBC直接连接MySQL数据库,确保了数据操作的高效性和稳定性。
技术选型方面,前端采用HTML5、CSS3和JavaScript构建响应式用户界面,后端基于Java EE标准的Servlet 3.0规范,服务器运行环境支持Tomcat 8.0及以上版本。这种技术组合既保证了系统的稳定运行,又降低了部署和维护成本,特别适合技术资源有限的中小企业。
数据库设计亮点
系统的数据模型设计充分体现了电商业务的复杂性和规范性。以下是几个核心表的深度分析:
商品分类表(s_catalog)的设计体现了良好的可扩展性:
CREATE TABLE `s_catalog` (
`catalogId` int(11) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
`catalogName` varchar(20) NOT NULL COMMENT '分类名称',
PRIMARY KEY (`catalogId`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='分类表'
该表采用自增主键设计,确保分类ID的唯一性和连续性。varchar(20)的字段长度既满足了分类名称的存储需求,又避免了空间浪费。InnoDB存储引擎的支持保证了事务安全和外键约束的完整性。
订单-商品关联表(s_orderitem)的设计展现了复杂业务关系的优雅处理:
CREATE TABLE `s_orderitem` (
`itemId` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单项ID',
`cakeId` int(11) NOT NULL COMMENT '蛋糕ID',
`orderId` int(11) NOT NULL DEFAULT 0 COMMENT '订单ID',
`quantity` int(11) NOT NULL DEFAULT 0 COMMENT '数量',
PRIMARY KEY (`itemId`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='订单项表'
这种设计完美解决了电商系统中经典的多对多关系问题。通过独立的订单项表,系统能够准确记录每个订单中具体商品的购买数量,为库存管理、销售统计等功能提供了数据基础。默认值的设置(DEFAULT 0)增强了数据的完整性。
用户表(s_user)的字段设计考虑了实际业务需求:
CREATE TABLE `s_user` (
`userId` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`userName` varchar(20) NOT NULL COMMENT '用户名',
`userPassWord` varchar(20) NOT NULL COMMENT '密码',
`name` varchar(20) NOT NULL COMMENT '姓名',
`sex` varchar(2) NOT NULL COMMENT '性别',
`age` int(5) NOT NULL COMMENT '年龄',
`tell` varchar(20) NOT NULL COMMENT '电话',
`address` varchar(100) NOT NULL COMMENT '地址',
`enabled` varchar(1) NOT NULL COMMENT '是否启用',
PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户表'
地址字段预留了100字符的存储空间,充分考虑了国内详细地址的表述需求。enabled字段的设计支持用户账号的软删除功能,符合企业级应用的数据管理规范。
核心功能实现
1. 商品展示与分类浏览
系统首页采用卡片式布局展示热门商品,支持按分类筛选。前端通过AJAX技术实现无刷新加载,提升用户体验。
// 商品查询Servlet核心代码
public class ProductQueryServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String catalogId = request.getParameter("catalogId");
ProductDAO productDAO = new ProductDAO();
List<Product> products;
if (catalogId != null && !catalogId.isEmpty()) {
products = productDAO.getProductsByCatalog(Integer.parseInt(catalogId));
} else {
products = productDAO.getAllProducts();
}
request.setAttribute("products", products);
RequestDispatcher dispatcher = request.getRequestDispatcher("products.jsp");
dispatcher.forward(request, response);
}
}

2. 购物车管理
购物车功能采用Session技术实现,支持商品的添加、删除和数量修改。
// 购物车添加商品逻辑
public class AddToCartServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
ShoppingCart cart = (ShoppingCart) session.getAttribute("cart");
if (cart == null) {
cart = new ShoppingCart();
session.setAttribute("cart", cart);
}
int productId = Integer.parseInt(request.getParameter("productId"));
int quantity = Integer.parseInt(request.getParameter("quantity"));
Product product = productService.getProductById(productId);
cart.addItem(product, quantity);
response.sendRedirect("cart.jsp");
}
}

3. 订单生成与处理
订单系统采用事务处理机制,确保数据的一致性。订单编号生成规则结合时间戳和随机数,避免重复。
// 订单生成核心业务逻辑
public class OrderService {
public boolean createOrder(Order order, List<OrderItem> items) {
Connection conn = null;
try {
conn = DatabaseUtil.getConnection();
conn.setAutoCommit(false);
// 插入订单主表
String orderSQL = "INSERT INTO s_order (orderNum, userId, orderDate, money, orderStatus) VALUES (?, ?, ?, ?, ?)";
PreparedStatement orderStmt = conn.prepareStatement(orderSQL, Statement.RETURN_GENERATED_KEYS);
orderStmt.setString(1, generateOrderNumber());
orderStmt.setInt(2, order.getUserId());
orderStmt.setString(3, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
orderStmt.setDouble(4, order.getTotalAmount());
orderStmt.setInt(5, OrderStatus.PENDING.getCode());
int affectedRows = orderStmt.executeUpdate();
if (affectedRows == 0) {
throw new SQLException("创建订单失败");
}
// 获取生成的订单ID
Result generatedKeys = orderStmt.getGeneratedKeys();
int orderId;
if (generatedKeys.next()) {
orderId = generatedKeys.getInt(1);
// 插入订单明细
for (OrderItem item : items) {
String itemSQL = "INSERT INTO s_orderitem (cakeId, orderId, quantity) VALUES (?, ?, ?)";
PreparedStatement itemStmt = conn.prepareStatement(itemSQL);
itemStmt.setInt(1, item.getCakeId());
itemStmt.setInt(2, orderId);
itemStmt.setInt(3, item.getQuantity());
itemStmt.executeUpdate();
}
conn.commit();
return true;
}
} catch (SQLException e) {
if (conn != null) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
DatabaseUtil.closeConnection(conn);
}
return false;
}
}

4. 后台管理系统
管理员后台提供完整的商品管理、订单处理、用户管理等功能模块。
// 管理员登录验证
public class AdminLoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
AdminService adminService = new AdminService();
Admin admin = adminService.authenticate(username, password);
if (admin != null) {
HttpSession session = request.getSession();
session.setAttribute("admin", admin);
session.setMaxInactiveInterval(30 * 60); // 30分钟超时
response.sendRedirect("admin/dashboard.jsp");
} else {
request.setAttribute("error", "用户名或密码错误");
request.getRequestDispatcher("admin/login.jsp").forward(request, response);
}
}
}


实体模型设计
系统采用面向对象的设计思想,通过JavaBean封装业务实体。以下以管理员实体为例展示模型设计:
package bean;
import java.util.Date;
import java.util.Map;
public class Admin {
private Integer id; //用户编号
private String userName; //用户名
private String passWord; //用户密码
private String name; //用户姓名
private Date lastLoginTime; //最后登录时间
// 多种构造器支持不同的创建场景
public Admin() {}
public Admin(String userName, String passWord) {
this.userName = userName;
this.passWord = passWord;
}
public Admin(Integer id, String passWord, String name) {
super();
this.id = id;
this.passWord = passWord;
this.name = name;
}
public Admin(String userName, String passWord, String name) {
super();
this.userName = userName;
this.passWord = passWord;
this.name = name;
}
// 支持从Map直接构建对象的构造器
public Admin(Map<String,Object> map) {
this.id = (Integer) map.get("id");
this.userName = (String) map.get("userName");
this.passWord = (String) map.get("passWord");
this.name = (String) map.get("name");
this.lastLoginTime = (Date) map.get("lastLoginTime");
}
// Getter和Setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getLastLoginTime() {
return lastLoginTime;
}
public void setLastLoginTime(Date lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
}
功能展望与优化
基于当前系统架构,未来可以从以下几个方向进行功能扩展和性能优化:
引入Redis缓存层:针对商品目录、用户会话等高频访问数据,可以引入Redis作为缓存中间件,显著提升系统响应速度。实现思路:在DAO层添加缓存逻辑,先查询Redis,未命中再查询数据库。
分布式会话管理:当前基于Tomcat Session的架构在集群环境下存在局限性。可以将会话数据存储到Redis中,实现多节点间的会话共享。使用Spring Session框架可以平滑过渡。
微服务架构改造:将单体应用拆分为商品服务、订单服务、用户服务等独立微服务,提升系统的可扩展性和可维护性。使用Spring Cloud体系实现服务治理。
移动端适配优化:开发专门的移动端界面或渐进式Web应用(PWA),提升移动用户体验。可以采用Vue.js或React框架构建响应式前端。
智能推荐功能:基于用户行为数据构建推荐算法,实现个性化商品推荐。可以使用协同过滤或基于内容的推荐算法,提升转化率。
总结
该在线蛋糕销售平台通过严谨的架构设计和规范的技术实现,为传统烘焙行业提供了切实可行的数字化转型方案。系统在保证功能完整性的同时,兼顾了性能与可维护性,体现了J2EE技术在中小企业电商应用中的实用价值。清晰的代码结构、合理的数据模型设计以及完善的业务逻辑处理,为后续的功能扩展和技术升级奠定了坚实基础。
随着电商技术的不断发展,平台有望通过持续的技术迭代,演进为更加智能、高效的烘焙行业数字化解决方案,为更多中小型烘焙企业创造商业价值。