1. 项目概述
这个小零食销售商城系统是基于SpringBoot框架开发的Java Web应用,主要面向零食电商领域。系统采用B/S架构,包含完整的前后端功能模块,能够满足中小型零食电商企业的日常运营需求。
作为一个全栈项目,它涵盖了商品管理、订单处理、用户管理、支付对接等核心电商功能。系统采用MVC设计模式,前端使用HTML+CSS+JavaScript技术栈,后端基于SpringBoot+MyBatis框架组合,数据库选用MySQL。
提示:这个项目特别适合Java Web开发者学习电商系统开发的全流程,也适合作为毕业设计或课程设计的参考项目。
2. 技术架构解析
2.1 SpringBoot框架优势
SpringBoot作为本项目的核心框架,主要带来以下优势:
- 自动配置:简化了传统SSM框架繁琐的XML配置
- 内嵌Tomcat:无需额外部署Web服务器
- Starter依赖:一站式引入相关技术组件
- Actuator监控:提供系统健康检查和管理端点
实际开发中,我们通过spring-boot-starter-web引入Web支持,使用spring-boot-starter-thymeleaf作为模板引擎,数据库访问则依赖spring-boot-starter-jdbc和mybatis-spring-boot-starter。
2.2 数据库设计要点
系统主要包含以下几张核心表:
- 商品表(product_info):存储商品基本信息、价格、库存等
- 用户表(user_info):管理注册用户信息
- 订单表(order_master):记录订单主体信息
- 订单详情表(order_detail):记录订单中的商品明细
CREATE TABLE `product_info` ( `product_id` VARCHAR(32) NOT NULL, `product_name` VARCHAR(64) NOT NULL COMMENT '商品名称', `product_price` DECIMAL(8,2) NOT NULL COMMENT '单价', `product_stock` INT NOT NULL COMMENT '库存', `product_description` VARCHAR(64) COMMENT '描述', `product_icon` VARCHAR(512) COMMENT '小图', `category_type` INT NOT NULL COMMENT '类目编号', `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`product_id`) ) COMMENT='商品表';2.3 前后端交互设计
系统采用传统服务端渲染模式,主要交互流程:
- 浏览器发起HTTP请求
- Controller接收请求并处理
- Service层执行业务逻辑
- Mapper层访问数据库
- 返回Thymeleaf模板页面
- 浏览器渲染最终HTML
对于AJAX请求,系统统一采用JSON格式返回数据,前端通过jQuery处理响应结果。
3. 核心功能实现
3.1 商品管理模块
商品模块主要功能包括:
- 商品列表分页展示
- 商品添加/编辑表单
- 商品上架/下架状态管理
- 商品图片上传处理
关键实现代码示例:
@Controller @RequestMapping("/seller/product") public class SellerProductController { @Autowired private ProductService productService; @GetMapping("/list") public String list(Model model, @RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "size", defaultValue = "10") Integer size) { PageRequest request = PageRequest.of(page - 1, size); Page<ProductInfo> productInfoPage = productService.findAll(request); model.addAttribute("productInfoPage", productInfoPage); model.addAttribute("currentPage", page); model.addAttribute("size", size); return "product/list"; } @PostMapping("/save") public String save(@Valid ProductForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes) { if (bindingResult.hasErrors()) { redirectAttributes.addFlashAttribute("msg", bindingResult.getFieldError().getDefaultMessage()); return "redirect:/seller/product/index"; } ProductInfo productInfo = new ProductInfo(); try { BeanUtils.copyProperties(form, productInfo); productService.save(productInfo); } catch (Exception e) { redirectAttributes.addFlashAttribute("msg", e.getMessage()); return "redirect:/seller/product/index"; } redirectAttributes.addFlashAttribute("msg", "操作成功"); return "redirect:/seller/product/list"; } }3.2 订单处理流程
订单处理的核心状态流转:
- 新订单 → 等待支付
- 已支付 → 等待发货
- 已发货 → 等待收货
- 已完成/已取消
状态变更时需要特别注意事务处理:
@Transactional public OrderDTO cancel(OrderDTO orderDTO) { // 1. 校验订单状态 if (!orderDTO.getOrderStatus().equals(OrderStatusEnum.NEW.getCode())) { throw new SellException(ResultEnum.ORDER_STATUS_ERROR); } // 2. 修改订单状态 orderDTO.setOrderStatus(OrderStatusEnum.CANCEL.getCode()); OrderMaster orderMaster = new OrderMaster(); BeanUtils.copyProperties(orderDTO, orderMaster); OrderMaster updateResult = orderMasterRepository.save(orderMaster); if (updateResult == null) { throw new SellException(ResultEnum.ORDER_UPDATE_FAIL); } // 3. 返还库存 if (CollectionUtils.isEmpty(orderDTO.getOrderDetailList())) { throw new SellException(ResultEnum.ORDER_DETAIL_EMPTY); } List<CartDTO> cartDTOList = orderDTO.getOrderDetailList().stream() .map(e -> new CartDTO(e.getProductId(), e.getProductQuantity())) .collect(Collectors.toList()); productService.increaseStock(cartDTOList); // 4. 如果已支付,需要退款 if (orderDTO.getPayStatus().equals(PayStatusEnum.SUCCESS.getCode())) { payService.refund(orderDTO); } return orderDTO; }4. 系统部署方案
4.1 开发环境配置
推荐开发环境:
- JDK 1.8+
- Maven 3.6+
- MySQL 5.7+
- IntelliJ IDEA/Eclipse
application-dev.yml配置示例:
server: port: 8080 servlet: context-path: /snack spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/snack_shop?useSSL=false&serverTimezone=UTC username: root password: 123456 jpa: show-sql: true thymeleaf: cache: false mode: HTML4.2 生产环境部署
Linux服务器部署步骤:
- 打包项目:
mvn clean package - 上传jar包到服务器
- 创建启动脚本:
#!/bin/bash nohup java -jar snack-shop.jar --spring.profiles.active=prod > shop.log 2>&1 &- 配置Nginx反向代理:
server { listen 80; server_name shop.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { alias /data/static/; } }5. 常见问题解决
5.1 跨域问题处理
当需要对接小程序或APP时,可能会遇到跨域问题,解决方案:
- 全局CORS配置:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .maxAge(3600); } }- 单个Controller注解方式:
@RestController @RequestMapping("/api") @CrossOrigin(origins = "*", maxAge = 3600) public class ApiController { // ... }5.2 性能优化建议
- 数据库层面:
- 为常用查询字段添加索引
- 合理设计表结构,避免过度冗余
- 使用连接池控制连接数
- 应用层面:
- 启用二级缓存(Redis/Ehcache)
- 异步处理耗时操作(如发送邮件)
- 合理使用分页查询
- JVM调优:
java -jar -Xms512m -Xmx1024m -XX:+UseG1GC snack-shop.jar6. 项目扩展方向
这个基础商城系统还可以进一步扩展:
- 增加秒杀功能:
- Redis预减库存
- 消息队列异步处理
- 接口限流防刷
- 接入第三方服务:
- 支付宝/微信支付
- 物流查询接口
- 短信验证码服务
- 微服务改造:
- 按业务拆分服务
- 引入Spring Cloud组件
- 服务注册与发现
实际开发中,我建议先确保基础功能稳定运行,再逐步引入这些高级特性。对于初学者来说,理解这个项目的完整实现过程,比盲目追求新技术更有价值。