手账文创产业近年来蓬勃发展,手账胶带作为核心配件,市场需求持续增长。传统线下销售模式存在品类有限、地域限制强、信息更新不及时等痛点。针对这些问题,设计并实现了一个专业的手账胶带电商平台"TapeHub",采用成熟的JSP+Servlet技术栈构建,为手账爱好者提供完整的在线购物体验。
系统架构与技术栈
平台采用经典的Java EE三层架构模式,严格遵循MVC设计规范。Servlet作为控制器层负责请求分发和业务逻辑协调,JSP页面专注于视图展示,JavaBean封装核心业务逻辑,JDBC实现数据持久化操作。
技术架构的核心组件包括:
- 前端展示层:JSP动态页面配合JSTL标签库和EL表达式,实现数据的高效渲染
- 控制层:Servlet统一处理HTTP请求,实现业务逻辑的路由转发
- 模型层:JavaBean实体类封装业务数据,Service类处理复杂业务逻辑
- 数据持久层:基于JDBC的DAO模式,直接操作MySQL数据库
- 前端技术:HTML5、CSS3、JavaScript构建响应式用户界面
// Servlet控制器示例
@WebServlet("/product")
public class ProductServlet extends HttpServlet {
private ProductService productService = new ProductServiceImpl();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
if("detail".equals(action)) {
String productId = request.getParameter("id");
Product product = productService.findById(Integer.parseInt(productId));
request.setAttribute("product", product);
request.getRequestDispatcher("/product-detail.jsp").forward(request, response);
}
}
}
数据库设计亮点
商品表设计优化
easybuy_product表的设计体现了电商系统的专业考量。采用自增主键id确保唯一性,name和description字段长度经过精心设计,平衡存储效率与内容展示需求。价格字段使用float类型,虽然存在精度问题,但对于胶带类商品的价格范围完全适用。
CREATE TABLE `easybuy_product` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) NOT NULL COMMENT '名称',
`description` varchar(1024) DEFAULT NULL COMMENT '描述',
`price` float NOT NULL COMMENT '价格',
`stock` int(10) NOT NULL COMMENT '库存',
`categoryLevel1Id` int(10) DEFAULT NULL COMMENT '分类1',
`categoryLevel2Id` int(10) DEFAULT NULL COMMENT '分类2',
`categoryLevel3Id` int(10) DEFAULT NULL COMMENT '分类3',
`fileName` varchar(200) DEFAULT NULL COMMENT '文件名称',
`isDelete` int(1) DEFAULT 0 COMMENT '是否删除(1:删除 0:未删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `PK__EASYBUY___94F6E55132E0915F` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=781 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='商品表'
设计亮点分析:
- 软删除机制:
isDelete字段实现逻辑删除,保留数据完整性 - 多级分类:三级分类设计支持精细化的商品管理
- 索引优化:主键索引确保查询效率,适合高并发场景
- 库存管理:
stock字段实时跟踪商品库存状态
订单详情表关系设计
easybuy_order_detail表采用与主订单表分离的设计,符合数据库范式规范。这种设计支持一个订单包含多个商品项,通过orderId外键关联确保数据一致性。
CREATE TABLE `easybuy_order_detail` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
`orderId` int(10) NOT NULL COMMENT '订单主键',
`productId` int(10) NOT NULL COMMENT '商品主键',
`quantity` int(10) NOT NULL COMMENT '数量',
`cost` float NOT NULL COMMENT '消费',
PRIMARY KEY (`id`),
UNIQUE KEY `PK__EASYBUY___66E1BD8E2F10007B` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单详情表'
核心功能实现
智能购物车系统
购物车功能采用面向对象设计,通过Cart和CartItem实体类实现完整的购物逻辑。系统支持商品添加、数量修改、自动价格计算等核心功能。

public class Cart {
private double totalMoney;
private List<CartItem> cartItems = new ArrayList<CartItem>();
/**
* 添加到购物车中
*/
public void addCart(Product product, String num) {
CartItem cartItem = getExistsItem(product.getId());
if(cartItem == null) { //购物车中暂无此胶带
cartItem = new CartItem();
cartItem.setGoNum(Integer.parseInt(num));
cartItem.setProduct(product);
cartItem.setCost(1 * product.getPrice());
cartItems.add(cartItem);
} else {
cartItem.setGoNum(cartItem.getGoNum() + Integer.parseInt(num));
cartItem.setCost(product.getPrice() * cartItem.getGoNum());
}
}
/**
* 判断商品是否存在于购物车中
*/
public CartItem getExistsItem(int productId) {
for (CartItem cartItem : cartItems) {
if(cartItem.getProduct().getId() == productId) {
return cartItem;
}
}
return null;
}
}
商品管理后台
管理员可以通过后台系统全面管理商品信息,包括上架、下架、库存调整、价格设置等操作。系统采用分层架构,业务逻辑清晰分离。

// 商品服务层实现
public class ProductServiceImpl implements ProductService {
private ProductDao productDao = new ProductDaoImpl();
public List<Product> findAll() throws SQLException {
return productDao.findAll();
}
public Product findById(int id) throws SQLException {
return productDao.findById(id);
}
public int update(Product product) throws SQLException {
return productDao.update(product);
}
public int delete(int id) throws SQLException {
return productDao.delete(id);
}
}
// 商品数据访问层
public class ProductDaoImpl implements ProductDao {
public Product findById(int id) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
String sql = "SELECT * FROM easybuy_product WHERE id=? AND isDelete=0";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
return resultSetToProduct(rs);
}
return null;
} finally {
DBUtil.close(conn, pstmt, rs);
}
}
}
订单处理流程
订单系统实现从购物车到订单生成的完整业务流程,包含库存验证、价格计算、订单状态跟踪等功能。

// 订单服务核心逻辑
public class OrderService {
public boolean createOrder(Order order, List<CartItem> cartItems) {
Connection conn = null;
try {
conn = DBUtil.getConnection();
conn.setAutoCommit(false);
// 1. 验证库存
for(CartItem item : cartItems) {
if(!checkStock(conn, item.getProduct().getId(), item.getGoNum())) {
conn.rollback();
return false;
}
}
// 2. 插入订单主表
int orderId = orderDao.insert(conn, order);
// 3. 插入订单详情
for(CartItem item : cartItems) {
OrderDetail detail = new OrderDetail();
detail.setOrderId(orderId);
detail.setProductId(item.getProduct().getId());
detail.setQuantity(item.getGoNum());
detail.setCost(item.getCost());
orderDetailDao.insert(conn, detail);
// 4. 更新库存
updateStock(conn, item.getProduct().getId(), item.getGoNum());
}
conn.commit();
return true;
} catch (SQLException e) {
if(conn != null) {
try { conn.rollback(); } catch (SQLException ex) {}
}
return false;
} finally {
DBUtil.close(conn);
}
}
}
用户权限管理
系统采用基于角色的权限控制,前台用户与后台管理员拥有不同的功能权限,通过type字段进行区分。

// 用户认证过滤器
@WebFilter("/*")
public class AuthFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String uri = req.getRequestURI();
// 排除静态资源和登录页面
if(uri.endsWith(".css") || uri.endsWith(".js") || uri.endsWith(".jpg") ||
uri.contains("login") || uri.contains("register")) {
chain.doFilter(request, response);
return;
}
HttpSession session = req.getSession();
User user = (User) session.getAttribute("user");
if(user == null) {
resp.sendRedirect(req.getContextPath() + "/login.jsp");
return;
}
// 管理员权限检查
if(uri.contains("/admin/") && user.getType() != 1) {
resp.sendError(403, "权限不足");
return;
}
chain.doFilter(request, response);
}
}
实体模型设计
系统采用面向对象的实体设计,每个核心业务概念都有对应的实体类,通过封装确保数据完整性和业务逻辑清晰性。
// 商品实体类
public class Product {
private int id;
private String name;
private String description;
private float price;
private int stock;
private int categoryLevel1Id;
private int categoryLevel2Id;
private int categoryLevel3Id;
private String fileName;
private int isDelete;
// Getter和Setter方法
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
// 其他getter/setter方法...
}
// 购物车项实体
public class CartItem {
private Product product;
private int goNum;
private double cost;
public Product getProduct() { return product; }
public void setProduct(Product product) {
this.product = product;
}
public int getGoNum() { return goNum; }
public void setGoNum(int goNum) {
this.goNum = goNum;
// 自动重新计算金额
if(product != null) {
this.cost = goNum * product.getPrice();
}
}
public double getCost() { return cost; }
public void setCost(double cost) { this.cost = cost; }
}
功能展望与优化
性能优化方向
引入Redis缓存层
- 商品详情、分类信息等热点数据缓存
- 会话信息分布式存储,支持集群部署
- 实现代码示例:
public class RedisProductService { private Jedis jedis = new Jedis("localhost"); private ProductDao productDao = new ProductDaoImpl(); public Product findById(int id) { String key = "product:" + id; String json = jedis.get(key); if(json != null) { return JSON.parseObject(json, Product.class); } else { Product product = productDao.findById(id); if(product != null) { jedis.setex(key, 3600, JSON.toJSONString(product)); } return product; } } }数据库读写分离
- 主数据库处理写操作,从数据库处理读操作
- 基于MyCat或ShardingSphere实现数据分片
功能扩展建议
智能推荐系统
- 基于用户浏览历史和购买记录实现协同过滤推荐
- 集成机器学习算法提供个性化商品推荐
移动端适配
- 开发响应式前端设计,支持移动设备访问
- 考虑开发独立的移动APP,使用React Native或Flutter技术
微服务架构改造
- 将单体应用拆分为用户服务、商品服务、订单服务等微服务
- 使用Spring Cloud实现服务治理和配置管理
技术架构升级
前后端分离重构
- 后端提供RESTful API接口
- 前端采用Vue.js或React框架
- 提升开发效率和系统可维护性
消息队列集成
- 使用RabbitMQ处理订单通知、库存同步等异步任务
- 提高系统吞吐量和响应速度
总结
该手账胶带电商平台基于成熟的JSP+Servlet技术栈,实现了完整的电子商务功能。系统架构清晰,代码规范,具有良好的可扩展性和维护性。数据库设计合理,业务逻辑封装完善,为用户提供了流畅的购物体验。通过持续的技术优化和功能扩展,平台有望成为手账文创领域的重要在线销售渠道。
系统的成功实施证明了传统Java Web技术在现代电商场景中的实用价值,同时也为后续的技术演进奠定了坚实基础。随着业务规模的扩大,通过引入缓存、微服务等现代技术手段,可以进一步提升系统的性能和可扩展性。