温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与意义
随着互联网技术的快速发展和人们生活水平的不断提高,线上购物已经成为日常生活中不可或缺的一部分。家居生活用品作为高频刚需品类,其线上商城需求日益增长。本项目基于 Spring Boot 和 Vue3 技术栈,设计并实现一个功能完善、体验友好的家居生活商城网站,旨在为用户提供便捷的在线选购体验,同时为商家提供高效的商品管理与订单处理能力。
本系统采用前后端分离的架构模式,后端基于 Spring Boot 提供稳定可靠的 RESTful API 服务,前端基于 Vue3 结合 Element Plus 组件库构建响应式用户界面,整体技术选型成熟、生态完善,具备良好的扩展性和维护性。
2. 技术栈选型
本项目的技术选型遵循主流、稳定、易维护的原则,具体如下:
| 层次 | 技术 | 说明 |
|---|---|---|
| 后端框架 | Spring Boot 2.7.x | 快速构建独立运行的微服务应用 |
| 持久层框架 | MyBatis-Plus | 简化数据库操作,内置分页与代码生成 |
| 数据库 | MySQL 8.0 | 存储商品、订单、用户等核心业务数据 |
| 前端框架 | Vue3 + Vite | 组合式 API 开发,构建高效 |
| UI 组件库 | Element Plus | 提供丰富的后台管理端组件 |
| 状态管理 | Pinia | Vue3 官方推荐的状态管理方案 |
| 路由管理 | Vue Router 4 | 支持前端路由与权限控制 |
| 接口调用 | Axios | 统一封装 HTTP 请求与响应拦截 |
| 鉴权方案 | JWT + Spring Security | 无状态认证,保障接口安全 |
3. 系统功能模块设计
本系统面向普通用户和管理员两类角色,主要功能模块划分如下:
3.1 用户端功能
- 用户注册与登录:支持手机号或邮箱注册,登录后获取 JWT 令牌。
- 商品浏览与搜索:按分类浏览家居商品,支持关键字搜索与多条件筛选。
- 商品详情:展示商品图片、价格、库存、规格参数及用户评价。
- 购物车管理:支持添加、修改数量、删除商品及批量结算。
- 订单管理:提交订单、在线支付模拟、查看订单状态与物流信息。
- 个人中心:管理收货地址、修改个人信息、查看历史订单。
3.2 管理端功能
- 商品管理:商品分类维护、商品上下架、库存管理与图片上传。
- 订单管理:查看订单列表、处理发货、退款与售后。
- 用户管理:查看注册用户列表、禁用或启用账号。
- 数据统计:展示销售额、订单量、热门商品等可视化图表。
4. 数据库设计
根据业务需求,系统核心数据表设计如下:
| 表名 | 说明 | 关键字段 |
|---|---|---|
| user | 用户表 | id、username、password、phone、avatar、status |
| category | 商品分类表 | id、name、parent_id、sort |
| product | 商品表 | id、category_id、name、price、stock、cover、status |
| cart_item | 购物车表 | id、user_id、product_id、quantity |
| orders | 订单表 | id、order_no、user_id、total_amount、status、create_time |
| order_item | 订单明细表 | id、order_id、product_id、product_name、price、quantity |
| address | 收货地址表 | id、user_id、receiver、phone、province、city、detail |
5. 后端核心实现
后端采用分层架构,分为 Controller、Service、Mapper 三层,职责清晰。以下给出商品查询接口的核心代码示例:
@RestController @RequestMapping("/api/product") public class ProductController { @Resource private ProductService productService; @GetMapping("/page") public Result<Page<ProductVO>> page(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize, @RequestParam(required = false) Long categoryId, @RequestParam(required = false) String keyword) { Page<ProductVO> page = productService.queryPage(pageNum, pageSize, categoryId, keyword); return Result.success(page); } @GetMapping("/{id}") public Result<ProductVO> detail(@PathVariable Long id) { return Result.success(productService.getDetail(id)); } }订单提交是核心业务逻辑,涉及库存扣减与订单生成,使用事务保证数据一致性:
@Service public class OrderServiceImpl implements OrderService { @Resource private OrderMapper orderMapper; @Resource private ProductMapper productMapper; @Override @Transactional(rollbackFor = Exception.class) public OrderVO createOrder(OrderCreateDTO dto, Long userId) { // 1. 校验库存并扣减 for (OrderItemDTO item : dto.getItems()) { Product product = productMapper.selectById(item.getProductId()); if (product.getStock() < item.getQuantity()) { throw new BusinessException("商品库存不足:" + product.getName()); } product.setStock(product.getStock() - item.getQuantity()); productMapper.updateById(product); } // 2. 生成订单主表与明细 Order order = new Order(); order.setOrderNo(generateOrderNo()); order.setUserId(userId); order.setTotalAmount(calculateTotal(dto.getItems())); order.setStatus(0); orderMapper.insert(order); // 3. 返回订单信息 return buildOrderVO(order); } }6. 前端核心实现
前端基于 Vue3 组合式 API 开发,使用 Pinia 管理用户登录状态与购物车数据。以下给出商品列表页的核心代码:
<script setup> import { ref, onMounted } from 'vue' import { getProductPage } from '@/api/product' import { useCartStore } from '@/store/cart' const productList = ref([]) const total = ref(0) const loading = ref(false) const queryParams = ref({ pageNum: 1, pageSize: 12, categoryId: null, keyword: '' }) const cartStore = useCartStore() const loadProducts = async () => { loading.value = true const res = await getProductPage(queryParams.value) productList.value = res.data.records total.value = res.data.total loading.value = false } const addToCart = (product) => { cartStore.addItem({ productId: product.id, quantity: 1 }) ElMessage.success('已加入购物车') } onMounted(loadProducts) </script>购物车状态使用 Pinia 统一管理,实现跨页面共享:
import { defineStore } from 'pinia' export const useCartStore = defineStore('cart', { state: () => ({ items: [], totalCount: 0 }), actions: { addItem(item) { const exist = this.items.find(i => i.productId === item.productId) if (exist) { exist.quantity += item.quantity } else { this.items.push(item) } this.totalCount = this.items.reduce((sum, i) => sum + i.quantity, 0) }, removeItem(productId) { this.items = this.items.filter(i => i.productId !== productId) this.totalCount = this.items.reduce((sum, i) => sum + i.quantity, 0) } } })7. 系统部署与运行
项目采用前后端分离部署方式,后端打包为可执行 Jar 包,前端构建为静态资源文件。具体步骤如下:
- 后端执行
mvn clean package生成 Jar 包,通过java -jar启动服务。 - 前端执行
npm install安装依赖,再执行npm run build生成 dist 目录。 - 将 dist 目录部署到 Nginx,并配置反向代理将
/api请求转发到后端服务。 - 初始化 MySQL 数据库,执行项目提供的 SQL 脚本创建数据表与基础数据。
8. 总结与展望
本项目基于 Spring Boot 和 Vue3 实现了家居生活商城网站,覆盖商品展示、购物车、订单管理等核心电商流程,前后端职责清晰、接口规范,具备良好的可扩展性。后续可在以下方向继续优化:引入 Redis 缓存热点商品数据、接入真实支付网关、增加商品推荐算法以及完善后台数据可视化大屏,进一步提升系统的性能与用户体验。