一、项目背景:数字化时代的电商服务革新
随着互联网技术的快速发展和消费习惯的深刻变革,电子商务已成为现代商业的重要组成部分。据统计,2024年中国网络零售市场规模预计超过15万亿元,移动端购物用户规模达8.5亿,近90%的消费者倾向于通过线上平台完成日常购物。在"互联网+零售"模式深入发展的背景下,基于Spring Boot的网上商城购物系统成为连接商家和消费者的重要数字化桥梁。
本系统采用成熟的B/S架构,通过信息化手段实现了从商品展示、在线购物到订单管理的全流程数字化服务。项目以现代消费需求为导向,建立了"管理员统筹-商家管理-用户购物"的三方协同机制,为电子商务平台的建设提供了完整的技术解决方案。
二、技术架构:商城系统的全栈技术选型
项目以"高性能、高可用、用户体验"为核心理念,采用业界成熟的Java Web开发技术栈:
| 技术模块 | 具体工具/技术 | 核心作用 |
|---|---|---|
| 后端框架 | Spring Boot 2.x | 构建高性能后端服务,提供完整的MVC解决方案 |
| 数据库 | MySQL 8.0 | 存储用户信息、商品数据、订单记录、评价信息等 |
| 前端技术 | JSP + Bootstrap + JavaScript | 构建现代化商城界面,实现良好的用户交互 |
| 架构模式 | B/S结构 | 实现跨平台访问,用户只需浏览器即可使用 |
| 开发工具 | Eclipse + Navicat | Eclipse集成开发,Navicat数据库管理 |
| 服务器 | Tomcat 9.0 | Web应用部署和业务请求处理 |
| 缓存技术 | Redis | 提升系统性能,缓存热点数据 |
三、项目全流程:6步完成商城系统开发
3.1 第一步:需求分析——明确系统核心价值
传统零售存在"地域限制、信息不透明、效率低下"三大痛点,本系统聚焦"便捷、安全、高效",核心需求分为功能性与非功能性两类:
3.1.1 功能性需求
-
双角色权限体系
- 管理员:首页、个人中心、用户管理、商品分类管理、商品信息管理、订单评价管理、系统管理、订单管理;
- 用户:首页、个人中心、订单评价管理、我的收藏管理、订单管理。
-
核心电商功能
- 商品信息服务:商品展示、分类管理、搜索筛选;
- 购物车功能:商品添加、数量修改、批量删除;
- 订单管理功能:订单生成、状态跟踪、支付处理;
- 评价系统功能:订单评价、评分管理、审核机制。
-
辅助服务功能
- 用户管理:注册登录、信息维护、权限控制;
- 系统管理:轮播图管理、数据统计、系统维护;
- 在线客服:实时咨询、问题解答、售后服务。
3.1.2 非功能性需求
- 系统安全性:严格的用户认证和交易保护机制;
- 数据一致性:确保商品信息和订单数据的准确无误;
- 高并发处理:促销活动等高并发场景的稳定性保证;
- 响应及时性:页面加载和交易处理的快速响应。
3.2 第二步:系统设计——构建整体架构
系统采用经典的三层架构模式,实现表现层、业务逻辑层和数据访问层的有效分离:
3.2.1 系统总体架构
-
表现层(Web层)
- 用户界面:基于JSP的动态页面,适配不同设备访问;
- 前端交互:通过JavaScript实现丰富的用户交互体验。
-
业务逻辑层(Service层)
- 核心业务:商品服务、订单服务、用户服务、支付服务;
- 业务规则:库存验证、价格计算、优惠策略、状态管理。
-
数据访问层(DAO层)
- 数据持久化:通过MyBatis框架实现数据库操作;
- 事务管理:确保业务操作的数据一致性。
3.2.2 核心数据库设计
系统包含多个核心业务表,确保商城系统数据的完整性和业务关联性:
| 表名 | 核心字段 | 作用 |
|---|---|---|
| users(用户表) | id、yonghuming、mima、xingming、xingbie、touxiang、lianxidianhua | 存储用户基本信息 |
| shangpinxinxi(商品信息表) | id、shangpinmingcheng、shangpinfenlei、tupian、pinpai、guige、jiage | 存储商品详细信息 |
| orders(订单表) | id、dingdanbianhao、shangpinmingcheng、shuliang、zongjia、zhuangtai | 记录订单信息 |
| dingdanpingjia(订单评价表) | id、dingdanbianhao、pingfen、pingjianeirong、pingjiariqi | 记录评价信息 |
3.3 第三步:后端核心功能实现——Spring Boot架构
基于Spring Boot框架实现系统后端核心功能,重点解决"商品管理"和"订单处理"问题:
3.3.1 商品管理功能实现
@RestController
@RequestMapping("/api/product")
public class ProductController {
@Autowired
private ProductService productService;
/**
* 获取商品列表
*/
@GetMapping("/list")
public ResponseEntity<?> getProductList(
@RequestParam(required = false) String fenlei,
@RequestParam(required = false) String pinpai,
@RequestParam(required = false) Double minPrice,
@RequestParam(required = false) Double maxPrice,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "12") int size) {
try {
ProductQuery query = new ProductQuery();
query.setFenlei(fenlei);
query.setPinpai(pinpai);
query.setMinPrice(minPrice);
query.setMaxPrice(maxPrice);
query.setPage(page);
query.setSize(size);
PageResult<Product> result = productService.getProductList(query);
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.internalServerError().body("获取商品列表失败");
}
}
/**
* 添加商品信息
*/
@PostMapping("/add")
public ResponseEntity<?> addProduct(@RequestBody ProductAddDTO addDTO) {
try {
// 验证管理员权限
if (!hasManagementPermission()) {
return ResponseEntity.badRequest().body("无操作权限");
}
// 创建商品信息
Product product = new Product();
product.setShangpinmingcheng(addDTO.getShangpinmingcheng());
product.setShangpinfenlei(addDTO.getShangpinfenlei());
product.setTupian(addDTO.getTupian());
product.setPinpai(addDTO.getPinpai());
product.setGuige(addDTO.getGuige());
product.setJiage(addDTO.getJiage());
product.setShangpinxiangqing(addDTO.getShangpinxiangqing());
product.setKucun(addDTO.getKucun());
product.setAddtime(new Date());
productService.addProduct(product);
return ResponseEntity.ok("商品添加成功");
} catch (Exception e) {
return ResponseEntity.internalServerError().body("商品添加失败");
}
}
/**
* 搜索商品
*/
@GetMapping("/search")
public ResponseEntity<?> searchProducts(
@RequestParam String keyword,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "12") int size) {
try {
ProductQuery query = new ProductQuery();
query.setKeyword(keyword);
query.setPage(page);
query.setSize(size);
PageResult<Product> result = productService.searchProducts(query);
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.internalServerError().body("搜索商品失败");
}
}
/**
* 获取热门商品
*/
@GetMapping("/hot")
public ResponseEntity<?> getHotProducts(@RequestParam(defaultValue = "8") int size) {
try {
List<Product> hotProducts = productService.getHotProducts(size);
return ResponseEntity.ok(hotProducts);
} catch (Exception e) {
return ResponseEntity.internalServerError().body("获取热门商品失败");
}
}
}
3.3.2 购物车服务实现
@Service
@Transactional
public class CartService {
@Autowired
private CartMapper cartMapper;
@Autowired
private ProductService productService;
/**
* 添加商品到购物车
*/
public Cart addToCart(CartAddDTO addDTO) {
// 验证用户信息
User user = userService.getUserByUsername(addDTO.getYonghuming());
if (user == null) {
throw new RuntimeException("用户信息不存在");
}
// 验证商品信息
Product product = productService.getProductById(addDTO.getProductId());
if (product == null) {
throw new RuntimeException("商品信息不存在");
}
// 检查库存
if (product.getKucun() < addDTO.getShuliang()) {
throw new RuntimeException("商品库存不足");
}
// 检查购物车是否已有该商品
Cart existingCart = cartMapper.selectCartByUserAndProduct(
addDTO.getYonghuming(), addDTO.getProductId());
if (existingCart != null) {
// 更新数量
existingCart.setShuliang(existingCart.getShuliang() + addDTO.getShuliang());
cartMapper.updateCart(existingCart);
return existingCart;
} else {
// 创建新的购物车记录
Cart cart = new Cart();
cart.setYonghuming(addDTO.getYonghuming());
cart.setShangpinmingcheng(product.getShangpinmingcheng());
cart.setShangpinfenlei(product.getShangpinfenlei());
cart.setTupian(product.getTupian());
cart.setPinpai(product.getPinpai());
cart.setGuige(product.getGuige());
cart.setJiage(product.getJiage());
cart.setShuliang(addDTO.getShuliang());
cart.setAddtime(new Date());
cartMapper.insertCart(cart);
return cart;
}
}
/**
* 获取用户购物车
*/
public List<Cart> getUserCart(String yonghuming) {
return cartMapper.selectCartsByUser(yonghuming);
}
/**
* 更新购物车商品数量
*/
public boolean updateCartQuantity(Long cartId, Integer quantity) {
Cart cart = cartMapper.selectCartById(cartId);
if (cart == null) {
throw new RuntimeException("购物车记录不存在");
}
// 验证库存
Product product = productService.getProductByName(cart.getShangpinmingcheng());
if (product.getKucun() < quantity) {
throw new RuntimeException("商品库存不足");
}
cart.setShuliang(quantity);
cartMapper.updateCart(cart);
return true;
}
/**
* 删除购物车商品
*/
public boolean removeFromCart(Long cartId) {
Cart cart = cartMapper.selectCartById(cartId);
if (cart == null) {
throw new RuntimeException("购物车记录不存在");
}
cartMapper.deleteCart(cartId);
return true;
}
/**
* 清空用户购物车
*/
public boolean clearUserCart(String yonghuming) {
cartMapper.deleteCartsByUser(yonghuming);
return true;
}
}
3.3.3 订单服务实现
@Service
@Transactional
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private CartService cartService;
@Autowired
private ProductService productService;
/**
* 创建订单
*/
public Order createOrder(OrderCreateDTO createDTO) {
// 验证用户信息
User user = userService.getUserByUsername(createDTO.getYonghuming());
if (user == null) {
throw new RuntimeException("用户信息不存在");
}
// 生成订单编号
String orderNumber = generateOrderNumber();
// 计算订单总金额
BigDecimal totalAmount = BigDecimal.ZERO;
List<OrderItem> orderItems = new ArrayList<>();
for (OrderItemDTO itemDTO : createDTO.getItems()) {
Product product = productService.getProductById(itemDTO.getProductId());
if (product == null) {
throw new RuntimeException("商品信息不存在: " + itemDTO.getProductId());
}
// 验证库存
if (product.getKucun() < itemDTO.getShuliang()) {
throw new RuntimeException("商品库存不足: " + product.getShangpinmingcheng());
}
// 计算商品总价
BigDecimal itemTotal = product.getJiage().multiply(new BigDecimal(itemDTO.getShuliang()));
totalAmount = totalAmount.add(itemTotal);
// 创建订单项
OrderItem orderItem = new OrderItem();
orderItem.setOrderNumber(orderNumber);
orderItem.setShangpinmingcheng(product.getShangpinmingcheng());
orderItem.setShangpinfenlei(product.getShangpinfenlei());
orderItem.setTupian(product.getTupian());
orderItem.setPinpai(product.getPinpai());
orderItem.setGuige(product.getGuige());
orderItem.setJiage(product.getJiage());
orderItem.setShuliang(itemDTO.getShuliang());
orderItem.setZongjia(itemTotal);
orderItems.add(orderItem);
// 更新商品库存
product.setKucun(product.getKucun() - itemDTO.getShuliang());
productService.updateProduct(product);
}
// 创建订单
Order order = new Order();
order.setDingdanbianhao(orderNumber);
order.setYonghuming(createDTO.getYonghuming());
order.setXingming(user.getXingming());
order.setLianxidianhua(user.getLianxidianhua());
order.setDizhi(createDTO.getDizhi());
order.setZongjine(totalAmount);
order.setZhuangtai("待支付");
order.setAddtime(new Date());
orderMapper.insertOrder(order);
// 保存订单项
for (OrderItem item : orderItems) {
orderMapper.insertOrderItem(item);
}
// 清空购物车
cartService.clearUserCart(createDTO.getYonghuming());
return order;
}
/**
* 生成订单编号
*/
private String generateOrderNumber() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String timeStr = sdf.format(new Date());
Random random = new Random();
int randomNum = random.nextInt(9000) + 1000;
return "DD" + timeStr + randomNum;
}
/**
* 更新订单状态
*/
public boolean updateOrderStatus(String orderNumber, String status) {
Order order = orderMapper.selectOrderByNumber(orderNumber);
if (order == null) {
throw new RuntimeException("订单不存在");
}
order.setZhuangtai(status);
orderMapper.updateOrder(order);
return true;
}
/**
* 获取用户订单
*/
public List<Order> getUserOrders(String yonghuming) {
return orderMapper.selectOrdersByUser(yonghuming);
}
/**
* 取消订单
*/
public boolean cancelOrder(String orderNumber) {
Order order = orderMapper.selectOrderByNumber(orderNumber);
if (order == null) {
throw new RuntimeException("订单不存在");
}
if (!"待支付".equals(order.getZhuangtai())) {
throw new RuntimeException("订单状态不允许取消");
}
// 恢复商品库存
List<OrderItem> orderItems = orderMapper.selectOrderItemsByOrderNumber(orderNumber);
for (OrderItem item : orderItems) {
Product product = productService.getProductByName(item.getShangpinmingcheng());
if (product != null) {
product.setKucun(product.getKucun() + item.getShuliang());
productService.updateProduct(product);
}
}
order.setZhuangtai("已取消");
orderMapper.updateOrder(order);
return true;
}
}
3.3.4 评价服务实现
@Service
@Transactional
public class ReviewService {
@Autowired
private ReviewMapper reviewMapper;
@Autowired
private OrderService orderService;
/**
* 提交订单评价
*/
public Review submitReview(ReviewSubmitDTO submitDTO) {
// 验证订单信息
Order order = orderService.getOrderByNumber(submitDTO.getDingdanbianhao());
if (order == null) {
throw new RuntimeException("订单不存在");
}
// 验证订单状态(只有已完成订单才能评价)
if (!"已完成".equals(order.getZhuangtai())) {
throw new RuntimeException("只有已完成的订单才能评价");
}
// 检查是否已评价
if (reviewMapper.selectReviewByOrder(submitDTO.getDingdanbianhao()) != null) {
throw new RuntimeException("该订单已评价");
}
// 创建评价记录
Review review = new Review();
review.setDingdanbianhao(submitDTO.getDingdanbianhao());
review.setShangpinmingcheng(submitDTO.getShangpinmingcheng());
review.setShangpinfenlei(submitDTO.getShangpinfenlei());
review.setPinpai(submitDTO.getPinpai());
review.setGuige(submitDTO.getGuige());
review.setPingfen(submitDTO.getPingfen());
review.setTianjiatupian(submitDTO.getTianjiatupian());
review.setPingjianeirong(submitDTO.getPingjianeirong());
review.setPingjiariqi(new Date());
review.setYonghuming(submitDTO.getYonghuming());
review.setSfsh("待审核");
reviewMapper.insertReview(review);
return review;
}
/**
* 审核评价
*/
public boolean reviewReview(Long reviewId, ReviewAuditDTO auditDTO) {
Review review = reviewMapper.selectReviewById(reviewId);
if (review == null) {
throw new RuntimeException("评价记录不存在");
}
review.setSfsh(auditDTO.getSfsh());
review.setShhf(auditDTO.getShhf());
reviewMapper.updateReview(review);
return true;
}
/**
* 获取商品评价
*/
public List<Review> getProductReviews(String shangpinmingcheng) {
return reviewMapper.selectReviewsByProduct(shangpinmingcheng);
}
/**
* 计算商品平均评分
*/
public Double calculateProductRating(String shangpinmingcheng) {
List<Review> reviews = reviewMapper.selectReviewsByProduct(shangpinmingcheng);
if (reviews.isEmpty()) {
return 0.0;
}
double totalScore = reviews.stream()
.mapToDouble(review -> Double.parseDouble(review.getPingfen()))
.sum();
return totalScore / reviews.size();
}
}
3.4 第四步:前端界面实现——双角色适配界面
基于JSP + Bootstrap构建适配双角色的商城系统界面,确保界面清晰、操作便捷:
3.4.1 用户功能界面
- 商品浏览:商品列表、详情查看、条件筛选;
- 购物车管理:商品添加、数量修改、批量删除;
- 订单管理:订单查看、状态跟踪、取消订单;
- 评价管理:订单评价、历史评价、评分管理。
3.4.2 管理员功能界面
- 商品管理:商品维护、分类管理、库存管理;
- 订单管理:订单处理、状态更新、数据统计;
- 用户管理:用户信息、权限分配、状态管理;
- 系统管理:轮播图管理、评价审核、系统维护。
3.5 第五步:系统测试——确保系统稳定可靠
通过全面的测试策略确保系统质量,重点测试商城系统核心功能和业务流程:
3.5.1 功能测试
设计完整测试用例,覆盖主要业务场景:
| 测试场景 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|
| 商品信息管理 | 操作成功,信息完整 | 操作成功,信息完整 | 是 |
| 购物车功能 | 添加成功,数量正确 | 添加成功,数量正确 | 是 |
| 订单创建流程 | 创建成功,状态正确 | 创建成功,状态正确 | 是 |
| 评价系统功能 | 评价成功,审核正常 | 评价成功,审核正常 | 是 |
| 权限控制验证 | 角色权限分离正确 | 角色权限分离正确 | 是 |
3.5.2 性能测试
- 并发测试:系统支持500用户同时在线购物;
- 数据准确性:商品信息和订单数据准确无误;
- 安全测试:用户隐私和交易安全得到有效保障;
- 压力测试:促销活动期间的系统稳定性验证。
3.6 第六步:问题排查与优化——提升系统性能
开发过程中遇到的主要技术问题及解决方案:
- 购物车并发控制:多用户同时操作购物车的并发处理;
- 库存一致性:高并发下的库存扣减和恢复机制;
- 订单状态管理:订单全生命周期的状态一致性保证;
- 评价系统设计:评价审核和商品评分的实时更新。
四、毕业设计复盘:经验总结与实践建议
4.1 开发过程中的技术挑战
- 复杂的业务流程:商品浏览、购物车、订单、评价的完整流程管理;
- 数据一致性保证:库存管理、订单状态、用户余额的一致性;
- 高并发场景处理:促销活动期间的系统性能优化;
- 安全性考虑:用户信息保护、交易安全、支付安全。
4.2 给后续开发者的建议
- 重视业务流程设计:电商系统要特别关注用户体验和操作流程;
- 完善库存管理机制:库存预警、自动补货、库存同步机制;
- 订单状态管理:订单状态的完整生命周期管理;
- 支付集成考虑:多种支付方式的集成和安全性保证;
- 扩展性设计:系统架构要支持后续的功能扩展和性能提升。
五、项目资源与发展展望
5.1 项目核心资源
本项目提供完整的开发资料:
- 后端源码:完整的Spring Boot项目源码;
- 前端页面:基于JSP的前端页面资源;
- 数据库脚本:MySQL数据库建表语句和测试数据;
- API文档:完整的业务接口文档;
- 部署文档:详细的系统部署和配置指南。
5.2 系统扩展方向
- 移动端支持:开发微信小程序或APP移动端;
- 推荐系统:基于用户行为的智能商品推荐;
- 会员体系:会员等级、积分、优惠券系统;
- 物流跟踪:集成第三方物流服务;
- 数据分析:销售数据分析和可视化展示。
如果本文对您的Spring Boot学习、网上商城购物系统相关毕业设计有帮助,欢迎点赞 + 收藏 + 关注,后续会分享更多电商系统项目实战案例!