1. 项目背景与意义
随着互联网技术的快速发展和电子商务的普及,线上购物已成为人们日常生活中不可或缺的一部分。厨具用品作为家庭生活的重要消费品,其线上销售市场也在不断扩大。传统的厨具销售模式主要依赖线下实体门店,存在地域限制、营业时间受限、商品展示不充分等问题,难以满足消费者日益增长的便捷购物需求。
基于 Spring Boot 的厨具用品线上销售平台,旨在构建一个功能完善、操作便捷、安全可靠的 B2C 电商系统。该平台能够为消费者提供厨具商品的浏览、搜索、下单、支付、订单管理等一站式服务,同时为商家提供商品管理、库存管理、订单处理等后台管理功能。通过线上化、数字化的运营方式,可以有效降低销售成本、扩大销售范围、提升用户体验,具有重要的实际应用价值。
2. 技术栈选型
本系统采用前后端分离的架构设计,后端基于 Spring Boot 框架构建,前端采用 Vue.js 进行页面开发,数据库选用 MySQL 存储业务数据。具体技术栈如下:
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | Spring Boot 2.7.x | 简化配置,快速构建 RESTful API |
| 持久层框架 | MyBatis-Plus | 简化数据库操作,内置分页插件 |
| 数据库 | MySQL 8.0 | 存储用户、商品、订单等业务数据 |
| 安全认证 | Spring Security + JWT | 实现用户认证与接口权限控制 |
| 前端框架 | Vue.js 3 + Element UI | 构建用户界面与后台管理页面 |
| 构建工具 | Maven | 项目依赖管理与构建打包 |
| 缓存技术 | Redis | 缓存热点数据,提升系统性能 |
| 接口文档 | Swagger / Knife4j | 自动生成在线接口文档 |
3. 系统功能模块设计
本系统按照用户角色划分为前台用户端和后台管理端两大功能模块,具体功能结构如下:
3.1 前台用户端
- 用户注册与登录:支持手机号注册、密码登录、JWT 令牌认证。
- 商品浏览与搜索:按分类浏览厨具商品,支持关键词搜索和价格筛选。
- 商品详情展示:展示商品图片、价格、库存、规格参数和详细描述。
- 购物车管理:支持商品加入购物车、修改数量、删除商品等操作。
- 订单管理:提交订单、在线支付、查看订单状态、确认收货。
- 个人中心:管理收货地址、查看收藏商品、修改个人信息。
3.2 后台管理端
- 商品管理:商品分类维护、商品上下架、库存管理、商品信息编辑。
- 订单管理:查看订单列表、处理发货、查看订单详情。
- 用户管理:查看注册用户信息、禁用或启用用户账号。
- 数据统计:统计商品销量、订单金额、用户增长等运营数据。
4. 数据库设计
系统核心数据表包括用户表、商品分类表、商品表、购物车表、订单表和订单明细表。各表之间的关系如下:
erDiagram USER ||--o{ CART : "拥有" USER ||--o{ ORDERS : "下单" CATEGORY ||--o{ PRODUCT : "包含" PRODUCT ||--o{ CART : "加入" PRODUCT ||--o{ ORDER_ITEM : "明细" ORDERS ||--|{ ORDER_ITEM : "包含" USER { int id PK string username string password string phone string address } CATEGORY { int id PK string name int parent_id } PRODUCT { int id PK string name int category_id FK decimal price int stock string image string description } CART { int id PK int user_id FK int product_id FK int quantity } ORDERS { int id PK int user_id FK string order_no decimal total_amount int status datetime create_time } ORDER_ITEM { int id PK int order_id FK int product_id FK int quantity decimal price }5. 核心代码实现
5.1 项目基础配置
首先在pom.xml中引入核心依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>5.2 实体类定义
以商品实体类为例,使用 MyBatis-Plus 注解简化映射配置:
@Data @TableName("product") public class Product { @TableId(type = IdType.AUTO) private Integer id; private String name; private Integer categoryId; private BigDecimal price; private Integer stock; private String image; private String description; private Integer status; private Date createTime; }5.3 商品查询接口
在 Controller 层实现商品分页查询接口,支持按分类和关键词筛选:
@RestController @RequestMapping("/api/product") public class ProductController { @Autowired private ProductService productService; @GetMapping("/page") public Result<Page<Product>> page( @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize, @RequestParam(required = false) Integer categoryId, @RequestParam(required = false) String keyword) { Page<Product> page = productService.queryPage( pageNum, pageSize, categoryId, keyword); return Result.success(page); } }对应的 Service 实现类代码如下:
@Service public class ProductServiceImpl implements ProductService { @Autowired private ProductMapper productMapper; @Override public Page<Product> queryPage(Integer pageNum, Integer pageSize, Integer categoryId, String keyword) { LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>(); if (categoryId != null) { wrapper.eq(Product::getCategoryId, categoryId); } if (StringUtils.hasText(keyword)) { wrapper.like(Product::getName, keyword); } wrapper.eq(Product::getStatus, 1); wrapper.orderByDesc(Product::getCreateTime); return productMapper.selectPage(new Page<>(pageNum, pageSize), wrapper); } }5.4 下单业务逻辑
订单提交是系统的核心业务,需要保证事务一致性。代码如下:
@Service public class OrderServiceImpl implements OrderService { @Autowired private OrderMapper orderMapper; @Autowired private OrderItemMapper orderItemMapper; @Autowired private ProductMapper productMapper; @Override @Transactional(rollbackFor = Exception.class) public Order createOrder(Integer userId, List<CartItemDTO> items) { // 1. 计算订单总金额 BigDecimal totalAmount = BigDecimal.ZERO; List<OrderItem> orderItems = new ArrayList<>(); for (CartItemDTO item : items) { Product product = productMapper.selectById(item.getProductId()); if (product == null || product.getStock() < item.getQuantity()) { throw new RuntimeException("商品库存不足:" + product.getName()); } totalAmount = totalAmount.add( product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); // 2. 扣减库存 product.setStock(product.getStock() - item.getQuantity()); productMapper.updateById(product); // 3. 构建订单明细 OrderItem orderItem = new OrderItem(); orderItem.setProductId(product.getId()); orderItem.setQuantity(item.getQuantity()); orderItem.setPrice(product.getPrice()); orderItems.add(orderItem); } // 4. 保存订单主表 Order order = new Order(); order.setUserId(userId); order.setOrderNo(generateOrderNo()); order.setTotalAmount(totalAmount); order.setStatus(0); orderMapper.insert(order); // 5. 保存订单明细 for (OrderItem orderItem : orderItems) { orderItem.setOrderId(order.getId()); orderItemMapper.insert(orderItem); } return order; } private String generateOrderNo() { return "CK" + System.currentTimeMillis() + String.format("%04d", new Random().nextInt(10000)); } }5.5 JWT 登录认证
使用 JWT 实现无状态登录认证,登录接口代码如下:
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public String login(String username, String password) { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getUsername, username); User user = userMapper.selectOne(wrapper); if (user == null || !user.getPassword().equals( DigestUtils.md5DigestAsHex(password.getBytes()))) { throw new RuntimeException("用户名或密码错误"); } // 生成 JWT 令牌 return JwtUtil.generateToken(user.getId(), user.getUsername()); } }JWT 工具类封装令牌的生成与解析:
public class JwtUtil { private static final String SECRET = "kitchen-sale-secret-key"; private static final long EXPIRE = 7 * 24 * 60 * 60 * 1000L; public static String generateToken(Integer userId, String username) { return Jwts.builder() .setSubject(username) .claim("userId", userId) .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); } public static Claims parseToken(String token) { return Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(token) .getBody(); } }6. 系统测试与总结
系统开发完成后,对用户注册登录、商品浏览、购物车管理、下单支付等核心功能进行了完整的测试。测试结果表明,各功能模块运行稳定,接口响应正常,数据读写准确,能够满足厨具用品线上销售的基本业务需求。
本系统基于 Spring Boot 实现了厨具用品线上销售平台,具备商品管理、购物车、订单处理等核心电商功能,系统架构清晰、代码规范、易于扩展。后续可在此基础上进一步引入支付网关对接、商品推荐算法、物流跟踪等功能,持续提升系统的完整性和用户体验。