随着电子商务的快速发展,传统糖果行业面临着销售渠道单一、库存管理效率低下、客户触达范围有限等挑战。针对这些痛点,基于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;
}
}

针对未来发展方向,系统可在以下方面进行优化升级:
智能推荐系统:基于用户浏览历史和购买记录,使用协同过滤算法实现个性化商品推荐。可通过Redis缓存用户行为数据,提升推荐实时性。
多店铺支持:扩展系统架构,支持多个糖果商家独立入驻,实现平台化运营。需要新增店铺管理模块和商家后台系统。
移动端适配:开发响应式前端或独立的移动APP,提升移动端用户体验。可采用Vue.js或React重构前端界面。
供应链集成:对接物流API实现订单跟踪,集成库存预警系统自动生成采购建议,提升供应链管理效率。
数据分析增强:引入ELK栈(Elasticsearch、Logstash、Kibana)实现用户行为分析,为营销决策提供数据支持。
该系统通过严谨的架构设计和完善的功能实现,为糖果行业提供了专业的电商解决方案。三层架构确保了系统的可维护性和扩展性,精细化的数据库设计保障了数据一致性,而完整的业务流程覆盖了从商品展示到订单处理的各个环节。随着后续功能的持续优化,该系统有望成为糖果行业数字化转型的重要工具。