在数字化消费浪潮的推动下,饰品行业的线上转型已成为必然趋势。传统实体店受限于物理空间、营业时间和地域因素,难以充分展示商品多样性和满足消费者即时性需求。针对这一市场痛点,我们设计并实现了一套名为“晶饰坊”的在线销售管理系统。该系统基于成熟的SSM技术栈构建,为中小型饰品商家提供了一个功能完备、稳定可靠的电子商务解决方案。
系统采用典型的三层架构模式,实现了业务逻辑的清晰分离和高内聚低耦合的设计目标。表现层使用JSP动态页面技术,结合JSTL标签库和JavaScript,负责用户交互界面渲染和数据验证。业务逻辑层由Spring框架统一管理,通过依赖注入机制协调各服务组件,并利用AOP面向切面编程处理事务管理、日志记录等横切关注点。数据持久层采用MyBatis框架,通过灵活的XML配置实现对象关系映射,有效降低了数据库操作的复杂度。
在数据库设计方面,系统采用MySQL关系型数据库,共设计11张数据表来支撑业务运转。其中商品分类表采用两级树形结构设计,支持灵活的品类管理。商品信息表包含材质、风格、价格等关键属性,并预留扩展字段以适应业务发展。订单表采用主从表结构,有效解决了数据冗余问题。用户表通过密码加密存储和权限分级,保障了系统安全。

用户管理模块实现了完整的注册登录流程。以下是用户实体类的核心定义:
@Entity
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "email")
private String email;
@Column(name = "phone")
private String phone;
@Column(name = "user_type")
private Integer userType; // 0-普通用户 1-管理员
@Column(name = "create_time")
private Date createTime;
// 省略getter/setter方法
}
用户登录验证采用Spring MVC拦截器实现,确保敏感操作需要身份认证:
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("currentUser");
if (user == null) {
response.sendRedirect(request.getContextPath() + "/user/login");
return false;
}
return true;
}
}
商品管理是系统的核心功能之一。商品表设计充分考虑了饰品类目的特性:
CREATE TABLE t_product (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL COMMENT '商品名称',
category_id INT NOT NULL COMMENT '分类ID',
price DECIMAL(10,2) NOT NULL COMMENT '销售价格',
original_price DECIMAL(10,2) COMMENT '原价',
stock INT NOT NULL DEFAULT 0 COMMENT '库存数量',
material VARCHAR(50) COMMENT '材质',
style VARCHAR(50) COMMENT '风格',
main_image VARCHAR(200) COMMENT '主图URL',
detail_images TEXT COMMENT '详情图片URL集合',
description TEXT COMMENT '商品描述',
status TINYINT DEFAULT 1 COMMENT '状态:0-下架 1-上架',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES t_category(id)
);
商品搜索功能支持多条件组合查询,MyBatis的动态SQL特性在此发挥重要作用:
<select id="selectByCondition" parameterType="map" resultMap="ProductResultMap">
SELECT * FROM t_product
<where>
<if test="categoryId != null">
AND category_id = #{categoryId}
</if>
<if test="minPrice != null">
AND price >= #{minPrice}
</if>
<if test="maxPrice != null">
AND price <= #{maxPrice}
</if>
<if test="material != null and material != ''">
AND material LIKE CONCAT('%', #{material}, '%')
</if>
<if test="style != null and style != ''">
AND style LIKE CONCAT('%', #{style}, '%')
</if>
<if test="status != null">
AND status = #{status}
</if>
</where>
ORDER BY create_time DESC
LIMIT #{start}, #{pageSize}
</select>

购物车模块采用Session与数据库相结合的方式存储数据,确保用户数据的持久化和一致性:
@Service
public class CartService {
@Autowired
private CartItemMapper cartItemMapper;
public void addToCart(Integer userId, Integer productId, Integer quantity) {
CartItem existingItem = cartItemMapper.selectByUserAndProduct(userId, productId);
if (existingItem != null) {
existingItem.setQuantity(existingItem.getQuantity() + quantity);
cartItemMapper.updateQuantity(existingItem);
} else {
CartItem newItem = new CartItem();
newItem.setUserId(userId);
newItem.setProductId(productId);
newItem.setQuantity(quantity);
newItem.setCreateTime(new Date());
cartItemMapper.insert(newItem);
}
}
public List<CartVO> getCartDetails(Integer userId) {
return cartItemMapper.selectCartDetailsByUserId(userId);
}
}
订单处理流程涉及复杂的事务管理,Spring的声明式事务确保数据一致性:
@Service
@Transactional
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private ProductMapper productMapper;
public String createOrder(OrderDTO orderDTO) {
// 1. 验证库存
for (OrderItemDTO item : orderDTO.getItems()) {
Product product = productMapper.selectById(item.getProductId());
if (product.getStock() < item.getQuantity()) {
throw new BusinessException("商品库存不足");
}
}
// 2. 生成订单号
String orderNo = generateOrderNo();
// 3. 创建订单主表记录
Order order = new Order();
order.setOrderNo(orderNo);
order.setUserId(orderDTO.getUserId());
order.setTotalAmount(orderDTO.getTotalAmount());
order.setStatus(OrderStatus.UNPAID.getCode());
orderMapper.insert(order);
// 4. 创建订单明细
for (OrderItemDTO itemDTO : orderDTO.getItems()) {
OrderItem item = new OrderItem();
item.setOrderId(order.getId());
item.setProductId(itemDTO.getProductId());
item.setQuantity(itemDTO.getQuantity());
item.setPrice(itemDTO.getPrice());
orderItemMapper.insert(item);
// 5. 扣减库存
productMapper.decreaseStock(itemDTO.getProductId(), itemDTO.getQuantity());
}
return orderNo;
}
}

订单表采用主从表结构设计,有效管理订单的复杂信息:
CREATE TABLE t_order (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单编号',
user_id INT NOT NULL COMMENT '用户ID',
total_amount DECIMAL(10,2) NOT NULL COMMENT '订单总金额',
status TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态',
payment_time DATETIME COMMENT '支付时间',
delivery_time DATETIME COMMENT '发货时间',
receive_time DATETIME COMMENT '收货时间',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES t_user(id)
);
CREATE TABLE t_order_item (
id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL COMMENT '订单ID',
product_id INT NOT NULL COMMENT '商品ID',
quantity INT NOT NULL COMMENT '购买数量',
price DECIMAL(10,2) NOT NULL COMMENT '成交单价',
FOREIGN KEY (order_id) REFERENCES t_order(id),
FOREIGN KEY (product_id) REFERENCES t_product(id)
);
后台管理系统提供了完善的商品、订单、用户管理功能。管理员可以通过直观的界面进行各项操作:
@Controller
@RequestMapping("/admin")
public class AdminController {
@Autowired
private ProductService productService;
@Autowired
private OrderService orderService;
@GetMapping("/products")
public String productList(Model model,
@RequestParam(defaultValue = "1") Integer page) {
PageInfo<Product> pageInfo = productService.getProductList(page, 10);
model.addAttribute("pageInfo", pageInfo);
return "admin/product-list";
}
@PostMapping("/product/status")
@ResponseBody
public Result updateProductStatus(Integer productId, Integer status) {
productService.updateStatus(productId, status);
return Result.success();
}
@GetMapping("/orders")
public String orderList(Model model, OrderQuery query) {
PageInfo<OrderVO> pageInfo = orderService.getOrderList(query);
model.addAttribute("pageInfo", pageInfo);
return "admin/order-list";
}
}

系统还实现了站内留言功能,增强了用户与商家的互动:
@Service
public class MessageService {
@Autowired
private MessageMapper messageMapper;
public void addMessage(Message message) {
message.setCreateTime(new Date());
message.setStatus(MessageStatus.UNREAD.getCode());
messageMapper.insert(message);
}
public PageInfo<MessageVO> getMessageList(Integer page, Integer size) {
PageHelper.startPage(page, size);
List<MessageVO> list = messageMapper.selectMessageList();
return new PageInfo<>(list);
}
public void replyMessage(Integer messageId, String replyContent) {
Message message = new Message();
message.setId(messageId);
message.setReplyContent(replyContent);
message.setReplyTime(new Date());
message.setStatus(MessageStatus.REPLIED.getCode());
messageMapper.updateReply(message);
}
}

在系统配置方面,Spring的配置类统一管理Bean的创建和依赖关系:
@Configuration
@EnableWebMvc
@ComponentScan("com.jewelry.mall")
@PropertySource("classpath:application.properties")
public class AppConfig {
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driver"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.username"));
dataSource.setPassword(env.getProperty("jdbc.password"));
return dataSource;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/*.xml"));
return sessionFactory;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer scanner = new MapperScannerConfigurer();
scanner.setBasePackage("com.jewelry.mall.dao");
return scanner;
}
}
针对系统的未来发展方向,可以考虑以下几个优化方向:
首先,引入Redis缓存层提升系统性能。商品信息、分类数据等读多写少的数据适合缓存,可以显著减少数据库压力。实现方案包括使用Spring Cache抽象层,通过注解方式实现方法级缓存。
其次,集成第三方支付接口如支付宝、微信支付,完善支付流程。需要设计支付回调处理机制,确保支付状态同步的可靠性。
第三,实现商品推荐功能,基于用户行为数据构建推荐算法。可以采用协同过滤或基于内容的推荐策略,提升用户体验和转化率。
第四,开发移动端APP或微信小程序,拓展用户访问渠道。可以采用前后端分离架构,后端提供RESTful API接口。
第五,引入Elasticsearch实现更强大的商品搜索功能,支持分词、拼音搜索、相关性排序等高级特性。
系统在数据库设计上体现了良好的规范化程度,通过外键约束确保数据完整性,合理的索引设计优化查询性能。在业务逻辑实现上,采用面向对象的设计原则,代码结构清晰,易于维护和扩展。
技术架构的选择充分考虑了项目的实际需求,SSM框架的组合提供了足够的灵活性和稳定性。前端页面采用响应式设计,适配不同设备屏幕,提升了用户体验。系统的模块化设计使得功能扩展和维护更加便捷,为后续的功能迭代奠定了良好基础。
通过实际运行测试,系统各项功能运行稳定,性能表现良好,能够满足中小型饰品商家的线上销售需求。代码质量较高,遵循了Java开发的最佳实践,具备良好的可读性和可维护性。