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

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-03-144 浏览

文章摘要

本项目是基于SSM(Spring + Spring MVC + MyBatis)框架构建的在线糖果销售商城系统,旨在为糖果商家提供一个功能完整、稳定可靠的线上销售与管理平台。系统的核心业务价值在于解决了传统实体糖果店在销售渠道、库存管理及客户触达方面的局限性,通过一体化的在线商城,帮助商家有效拓展市...

随着电子商务的快速发展,传统糖果行业面临着销售渠道单一、库存管理效率低下、客户触达范围有限等挑战。针对这些痛点,基于SSM(Spring + Spring MVC + MyBatis)框架的在线糖果销售商城系统应运而生,该系统为糖果商家提供了一个功能完整、稳定可靠的线上销售与管理平台。

系统采用经典的三层架构设计,表现层使用Spring MVC框架处理用户请求与页面跳转,通过控制器(Controller)接收前端参数并调用业务逻辑;业务层基于Spring框架的IoC容器管理服务组件(Service),利用声明式事务管理确保订单、库存等核心操作的数据一致性;数据持久层则依托MyBatis框架,通过XML映射文件灵活配置SQL语句,实现商品信息、用户数据、订单记录的高效CRUD操作。

数据库设计方面,系统采用MySQL进行结构化存储,共包含13张核心数据表。其中商品表(product)的设计充分考虑了糖果商品的特殊性:

CREATE TABLE product (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    product_name VARCHAR(100) NOT NULL,
    category_id INT NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    stock_quantity INT DEFAULT 0,
    description TEXT,
    image_url VARCHAR(200),
    weight DECIMAL(8,2),
    shelf_life INT,
    is_active TINYINT(1) DEFAULT 1,
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES category(category_id)
);

该表设计了重量(weight)、保质期(shelf_life)等糖果特有的属性字段,并通过is_active字段控制商品上下架状态,体现了对糖果商品管理的专业考量。

订单表(order)的设计采用了主从表结构,确保数据的一致性和完整性:

CREATE TABLE orders (
    order_id VARCHAR(32) PRIMARY KEY,
    user_id INT NOT NULL,
    total_amount DECIMAL(10,2) NOT NULL,
    order_status ENUM('pending','paid','shipped','completed','cancelled'),
    payment_method VARCHAR(20),
    shipping_address TEXT,
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    paid_time DATETIME,
    FOREIGN KEY (user_id) REFERENCES user(user_id)
);

订单状态采用枚举类型确保数据有效性,同时记录关键时间节点,为订单流程追踪提供支持。

用户购物车功能的实现展示了系统的核心业务逻辑。购物车控制器负责处理商品的添加、删除和数量更新操作:

@Controller
@RequestMapping("/cart")
public class CartController {
    
    @Autowired
    private CartService cartService;
    
    @PostMapping("/add")
    @ResponseBody
    public ResponseEntity<String> addToCart(@RequestParam Integer productId,
                                          @RequestParam Integer quantity,
                                          HttpSession session) {
        User user = (User) session.getAttribute("currentUser");
        if (user == null) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("请先登录");
        }
        
        try {
            cartService.addToCart(user.getUserId(), productId, quantity);
            return ResponseEntity.ok("添加成功");
        } catch (BusinessException e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }
}

购物车页面

购物车服务层实现了库存检查和业务逻辑处理:

@Service
@Transactional
public class CartServiceImpl implements CartService {
    
    @Autowired
    private CartMapper cartMapper;
    
    @Autowired
    private ProductMapper productMapper;
    
    @Override
    public void addToCart(Integer userId, Integer productId, Integer quantity) {
        // 检查商品库存
        Product product = productMapper.selectById(productId);
        if (product == null || !product.getIsActive()) {
            throw new BusinessException("商品不存在或已下架");
        }
        if (product.getStockQuantity() < quantity) {
            throw new BusinessException("库存不足");
        }
        
        // 检查购物车中是否已存在该商品
        CartItem existingItem = cartMapper.selectByUserAndProduct(userId, productId);
        if (existingItem != null) {
            // 更新数量
            cartMapper.updateQuantity(existingItem.getItemId(), 
                                    existingItem.getQuantity() + quantity);
        } else {
            // 新增购物车项
            CartItem newItem = new CartItem();
            newItem.setUserId(userId);
            newItem.setProductId(productId);
            newItem.setQuantity(quantity);
            newItem.setUnitPrice(product.getPrice());
            cartMapper.insert(newItem);
        }
    }
}

订单管理模块提供了完整的订单处理流程。订单服务类实现了订单创建、支付状态更新等核心功能:

@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private OrderMapper orderMapper;
    
    @Autowired
    private OrderItemMapper orderItemMapper;
    
    @Autowired
    private ProductMapper productMapper;
    
    @Override
    public String createOrder(OrderDTO orderDTO) {
        // 生成订单号
        String orderId = generateOrderId();
        
        // 创建订单主记录
        Order order = new Order();
        order.setOrderId(orderId);
        order.setUserId(orderDTO.getUserId());
        order.setTotalAmount(orderDTO.getTotalAmount());
        order.setOrderStatus("pending");
        order.setShippingAddress(orderDTO.getShippingAddress());
        orderMapper.insert(order);
        
        // 创建订单明细
        for (OrderItemDTO itemDTO : orderDTO.getItems()) {
            OrderItem item = new OrderItem();
            item.setOrderId(orderId);
            item.setProductId(itemDTO.getProductId());
            item.setQuantity(itemDTO.getQuantity());
            item.setUnitPrice(itemDTO.getUnitPrice());
            orderItemMapper.insert(item);
            
            // 扣减库存
            productMapper.decreaseStock(itemDTO.getProductId(), itemDTO.getQuantity());
        }
        
        return orderId;
    }
    
    private String generateOrderId() {
        return "ORD" + System.currentTimeMillis() + 
               String.format("%04d", new Random().nextInt(10000));
    }
}

订单确认页面

商品搜索功能通过MyBatis的动态SQL实现了多条件查询:

<!-- ProductMapper.xml -->
<select id="selectByCondition" parameterType="map" resultType="Product">
    SELECT * FROM product 
    WHERE is_active = 1
    <if test="categoryId != null">
        AND category_id = #{categoryId}
    </if>
    <if test="keyword != null and keyword != ''">
        AND (product_name LIKE CONCAT('%', #{keyword}, '%') 
             OR description LIKE CONCAT('%', #{keyword}, '%'))
    </if>
    <if test="minPrice != null">
        AND price >= #{minPrice}
    </if>
    <if test="maxPrice != null">
        AND price <= #{maxPrice}
    </if>
    ORDER BY 
    <choose>
        <when test="sortBy == 'price_asc'">price ASC</when>
        <when test="sortBy == 'price_desc'">price DESC</when>
        <when test="sortBy == 'newest'">created_time DESC</when>
        <otherwise>product_name ASC</otherwise>
    </choose>
    LIMIT #{offset}, #{pageSize}
</select>

系统后台管理模块提供了完善的数据分析功能。图表管理控制器负责生成销售统计报表:

@RestController
@RequestMapping("/admin/chart")
public class ChartController {
    
    @Autowired
    private ChartService chartService;
    
    @GetMapping("/sales")
    public ResponseEntity<SalesChartDTO> getSalesChartData(
            @RequestParam String period, 
            @RequestParam(required = false) String startDate,
            @RequestParam(required = false) String endDate) {
        
        SalesChartDTO chartData = chartService.getSalesData(period, startDate, endDate);
        return ResponseEntity.ok(chartData);
    }
}

销售图表管理

用户实体类设计了完整的属性映射和数据验证:

public class User {
    private Integer userId;
    
    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度3-20字符")
    private String username;
    
    @NotBlank(message = "密码不能为空")
    @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{6,}$", 
             message = "密码至少6位,包含字母和数字")
    private String password;
    
    @Email(message = "邮箱格式不正确")
    private String email;
    
    private String phone;
    private String address;
    private UserRole role; // ADMIN, CUSTOMER
    private Date registerTime;
    private Boolean isActive;
    
    // 省略getter/setter方法
}

用户信息管理

在事务管理方面,系统通过Spring的声明式事务确保数据一致性:

@Service
@Transactional(readOnly = true)
public class PaymentServiceImpl implements PaymentService {
    
    @Autowired
    private OrderMapper orderMapper;
    
    @Autowired
    private PaymentRecordMapper paymentRecordMapper;
    
    @Override
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    public boolean processPayment(PaymentRequest request) {
        // 验证订单状态
        Order order = orderMapper.selectById(request.getOrderId());
        if (!"pending".equals(order.getOrderStatus())) {
            throw new BusinessException("订单状态异常");
        }
        
        // 创建支付记录
        PaymentRecord record = new PaymentRecord();
        record.setOrderId(request.getOrderId());
        record.setAmount(request.getAmount());
        record.setPaymentMethod(request.getPaymentMethod());
        record.setPaymentTime(new Date());
        paymentRecordMapper.insert(record);
        
        // 更新订单状态
        orderMapper.updateStatus(request.getOrderId(), "paid", new Date());
        
        return true;
    }
}

支付提交页面

针对未来发展方向,系统可在以下方面进行优化升级:

  1. 智能推荐系统:基于用户浏览历史和购买记录,使用协同过滤算法实现个性化商品推荐。可通过Redis缓存用户行为数据,提升推荐实时性。

  2. 多店铺支持:扩展系统架构,支持多个糖果商家独立入驻,实现平台化运营。需要新增店铺管理模块和商家后台系统。

  3. 移动端适配:开发响应式前端或独立的移动APP,提升移动端用户体验。可采用Vue.js或React重构前端界面。

  4. 供应链集成:对接物流API实现订单跟踪,集成库存预警系统自动生成采购建议,提升供应链管理效率。

  5. 数据分析增强:引入ELK栈(Elasticsearch、Logstash、Kibana)实现用户行为分析,为营销决策提供数据支持。

该系统通过严谨的架构设计和完善的功能实现,为糖果行业提供了专业的电商解决方案。三层架构确保了系统的可维护性和扩展性,精细化的数据库设计保障了数据一致性,而完整的业务流程覆盖了从商品展示到订单处理的各个环节。随着后续功能的持续优化,该系统有望成为糖果行业数字化转型的重要工具。

本文关键词
SSM框架在线糖果销售商城系统源码解析电子商务

上下篇

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