基于SSM框架的在线饰品销售商城系统 - 源码深度解析

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-03-244 浏览

文章摘要

本系统是一款基于SSM(Spring+SpringMVC+MyBatis)框架构建的在线饰品销售平台,旨在为消费者提供便捷、安全的一站式饰品购物体验。其核心业务价值在于解决了传统实体饰品店在地域、时间和展示方式上的局限性,通过数字化的商品陈列、交易流程和订单管理,显著降低了商家的运营成本,并帮助消费...

在数字化消费浪潮的推动下,饰品行业的线上转型已成为必然趋势。传统实体店受限于物理空间、营业时间和地域因素,难以充分展示商品多样性和满足消费者即时性需求。针对这一市场痛点,我们设计并实现了一套名为“晶饰坊”的在线销售管理系统。该系统基于成熟的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开发的最佳实践,具备良好的可读性和可维护性。

本文关键词
SSM框架在线饰品销售商城系统源码解析电子商务解决方案

上下篇

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