snack-mall/项目介绍.md

227 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 零食商城 Snack Mall — 项目介绍
> 毕业设计 · 前后端分离的 B2C 零食电商平台
>
> 技术栈Spring Boot 4 + Vue 3 + MySQL 8 + Redis + WebSocket
## 一、项目简介
零食商城是一个面向"爱吃零食的年轻人"的在线购物平台,覆盖**商品浏览、购物车、下单支付、订单追踪、优惠券、限时抢购、在线客服**等完整电商闭环。项目采用前后端分离架构包含用户端H5/PC、管理后台、后端 API 服务三部分,并配套完整的数据库脚本与设计文档,适合作为毕业设计展示"全栈 + 高并发 + 实时通信"的综合能力。
### 核心目标
- **用户端**:商品浏览与搜索、商品详情、购物车、收藏、订单支付(支付宝沙箱)、领券中心、限时抢购、在线客服、公告、个人中心
- **管理端**:数据可视化仪表盘、商品/分类/SKU 管理、订单处理、用户管理、优惠券管理、抢购活动管理、公告管理、客服会话处理
- **技术验证**Redis 原子操作防超卖、WebSocket 实时客服、订单状态机、双端登录鉴权、支付宝沙箱支付
## 二、功能模块
### 2.1 用户端(前台)
| 模块 | 说明 |
|------|------|
| 商品中心 | 首页轮播、商品分类浏览、关键词搜索、商品详情SKU 选择/多图预览) |
| 购物车 | 增删改、全选/单选、批量结算 |
| 订单支付 | 地址选择、优惠券抵扣、支付宝沙箱收银台、支付回调自动更新状态 |
| 收藏 | 商品详情页一键收藏,个人中心"我的收藏"管理 |
| 领券中心 | 展示可领取优惠券(满减/折扣/无门槛),一键领取,我的优惠券按状态筛选 |
| 限时抢购 | 活动场次倒计时、抢购价 + 库存进度、一键抢购生成订单、立即支付 |
| 在线客服 | WebSocket 实时聊天、等待接入/处理中/已关闭状态流转、历史消息 |
| 个人中心 | 资料、订单(支付/取消/确认收货)、地址管理、收藏、优惠券 |
### 2.2 管理端(后台)
| 模块 | 说明 |
|------|------|
| 仪表盘 | ECharts 数据可视化:销售趋势、订单状态分布、热销商品 |
| 商品管理 | SPU/分类/SKU 管理、上下架、图片上传、富文本详情 |
| 订单管理 | 分页筛选、订单详情(商品/金额/物流/时间轴)、发货、取消 |
| 用户管理 | 用户启停、重置密码、历史订单查询 |
| 优惠券管理 | 优惠券模板 CRUD、领取记录查询 |
| 抢购管理 | 活动创建/编辑/上线预热、活动商品配置、强制结束 |
| 公告管理 | 公告 CRUD + 上下线 |
| 客服管理 | 会话列表(待处理/处理中)、接管、转接、快捷回复、实时聊天 |
## 三、系统架构
```mermaid
flowchart TB
subgraph FE["前端层 Vue 3"]
WEB["用户端 web-snack<br/>Vite + Element Plus + Pinia"]
ADMIN["管理端 admin-snack<br/>Vite + Element Plus + ECharts"]
end
subgraph BE["后端层 Spring Boot 4"]
API["RESTful API<br/>MyBatis-Plus / Sa-Token"]
WS["WebSocket 客服<br/>原生 WS + JSON 协议"]
JOB["定时任务 @Scheduled"]
end
subgraph DATA["数据层"]
MYSQL[("MySQL 8<br/>21 张表")]
REDIS[("Redis<br/>缓存 / 抢购库存 / 在线状态")]
end
WEB --> API
ADMIN --> API
WEB --> WS
ADMIN --> WS
API --> MYSQL
API --> REDIS
WS --> MYSQL
```
### 技术栈
| 层次 | 技术 | 说明 |
|------|------|------|
| 用户端 | Vue 3.5 · Vite 8 · TypeScript 6 · Element Plus 2.14 · Pinia · VueUse | H5/PC 响应式商城 |
| 管理端 | Vue 3.5 · Vite 6 · TypeScript 5 · Element Plus 2.9 · Pinia 2 · ECharts 5 | 数据密集型管理后台 |
| 后端 | Spring Boot 4.0.6 · Java 21 · MyBatis-Plus 3.5 · Sa-Token 1.45 · Knife4j | RESTful API + 鉴权 + 接口文档 |
| 数据 | MySQL 8 · Redis | 持久化 + 缓存/原子操作 |
| 通信 | RESTaxios· WebSocketVueUse useWebSocket | HTTP 业务 + 实时客服 |
| 第三方 | 支付宝开放平台(沙箱) | 电脑网站支付 |
## 四、界面预览
### 4.1 用户端
| 页面 | 预览 | 说明 |
|------|------|------|
| 商城首页 | ![商城首页](images/商城首页.png) | 轮播图、分类导航、商品推荐 |
| 商品详情 | ![商品详情](images/商品详情.png) | 图片画廊、SKU 选择、加购与收藏 |
| 购物车 | ![购物车](images/购物车.png) | 数量调整、勾选结算 |
| 限时抢购 | ![限时抢购](images/限时抢购.png) | 活动倒计时、抢购价、库存进度 |
| 在线客服 | ![客服](images/客服.png) | WebSocket 实时会话 |
| 用户中心 | ![用户中心](images/用户中心.png) | 订单、地址、收藏、优惠券 |
### 4.2 管理端
| 页面 | 预览 | 说明 |
|------|------|------|
| 后台登录 | ![后台登录](images/后台登录.png) | 管理员登录(验证码) |
| 数据仪表盘 | ![后台首页](images/后台首页.png) | ECharts 销售统计 |
| 商品管理 | ![后台商品列表](images/后台商品列表.png) | 商品列表与上下架 |
| 订单详情 | ![后台订单详情](images/后台订单详情.png) | 商品/金额/物流/状态时间轴 |
| 客服会话 | ![后台客服](images/后台客服.png) | 会话列表 + 快捷回复 + 实时聊天 |
| 抢购活动 | ![后台限时抢购活动](images/后台限时抢购活动.png) | 活动与商品配置 |
## 五、核心业务亮点
### 5.1 双端登录鉴权Sa-Token
用户端与管理端使用两套登录体系(`LoginType.USER / ADMIN`),通过 `SaRouter` 按 URL 模式统一拦截,`Authorization: Bearer <token>` 传递凭证,业务异常由全局异常处理器统一返回 `Result<T>`code/message/data
### 5.2 支付宝沙箱支付
电脑网站支付(`alipay.trade.page.pay`):后端生成签名收银台 URL浏览器跳转沙箱收银台支付成功后支付宝**异步通知**验签、金额比对、幂等更新订单(状态 0→1、支付渠道、交易号、支付时间**同步跳转**仅用于前端展示,不修改业务状态。
### 5.3 WebSocket 实时客服
- 原生 WebSocket + JSON 文本协议,客户端基于 **VueUse `useWebSocket`** 封装,断线自动重连;
- 握手时 Sa-Token 校验,按 `user:{id}` / `admin:{id}` 建立连接表,消息**点对点推送** + 客服广播;
- 消息全部落 `chat_message` 表,`seq` 递增 + ACK 已读确认,断线后按序号补发,**不丢消息**
- 管理端支持**接管 / 转接 / 已解决 / 关闭**会话与**快捷回复**模板,用户端可见"等待接入/客服接入/已关闭"状态流转。
### 5.4 限时抢购防超卖Redis 原子操作)
- **Lua 脚本原子完成**"限购校验 + 库存扣减",杜绝高并发超卖;
- `seckill:stock:{activityId}:{skuId}` 实时库存,`seckill:user:{userId}:{activityId}:{skuId}` 一人一单限购;
- 抢购成功**同步生成主订单**orders + order_item 快照)并回填 `seckill_order.order_id`,落库失败自动回滚 Redis 库存;
- 取消未支付订单自动**恢复抢购库存**;支付回调同步抢购记录状态。
### 5.5 优惠券体系
领券中心展示可领取优惠券(满减/折扣/无门槛),支持每人限领、库存限制、领取后有效期;订单结算时校验并抵扣,状态机管控"未使用 → 已使用/已过期"防止重复核销。
### 5.6 订单状态机
`待付款 → 待发货 → 待收货 → 已完成`,取消/退款分支由 `OrderStatusEnum.canTransition` 严格约束,配合 `UPDATE ... WHERE status = ?` 条件更新防止并发状态错乱;支付、发货、收货、取消均记录对应时间字段。
## 六、数据库设计
**21 张表**,覆盖用户、商品、订单、支付、收藏、优惠券、抢购、客服、公告等业务:
| 分类 | 表 |
|------|----|
| 基础 | `user`、`admin`、`address` |
| 商品 | `product`、`product_sku`、`product_category`、`banner`、`favorite` |
| 交易 | `orders`、`order_item`、`cart`、`payment` |
| 营销 | `coupon`、`user_coupon`、`seckill_activity`、`seckill_product`、`seckill_order` |
| 客服 | `chat_session`、`chat_message`、`quick_reply` |
| 内容 | `notice`、`file` |
> 完整 DDL 见 `db/schema.sql`,演示数据见 `db/seed.sql`,核心业务设计见 `db/BUSINESS_DESIGN.md`。
## 七、快速启动
### 环境要求
| 工具 | 版本 |
|------|------|
| JDK | 21 |
| Maven | 3.8+ |
| Node.js | ≥ 20 |
| MySQL | 8.0+ |
| Redis | 6.0+ |
### 启动步骤
```bash
# 1. 初始化数据库(建库 + 21 张表)
mysql -u root -p < db/schema.sql
# 可选:导入演示数据
mysql -u root -p < db/seed.sql
# 2. 启动后端(端口 8080接口文档 http://localhost:8080/doc.html
cd server-snack && mvn spring-boot:run
# 3. 启动管理端http://localhost:5173
cd admin-snack && npm install && npm run dev
# 4. 启动用户端http://localhost:5174
cd web-snack && npm install && npm run dev
```
> Vite 已把 `/api`、`/uploads`、`/ws` 代理到后端 `http://localhost:8080`,联调前确认后端与 MySQL/Redis 已启动。
### 默认账号
| 角色 | 用户名 | 密码 |
|------|--------|------|
| 管理员 | `admin` | `123456` |
| 普通用户 | `user001` ~ `user005` | `123456` |
## 八、项目目录结构
```
snack-mall/
├── server-snack/ # 后端 APISpring Boot 4 + MyBatis-Plus + Redis
│ └── src/main/java/com/snack/server/module/
│ ├── product/ # 商品 / 分类 / SKU
│ ├── order/ # 订单 / 支付宝支付
│ ├── cart/ # 购物车
│ ├── coupon/ # 优惠券 / 领券
│ ├── seckill/ # 限时抢购Lua 防超卖)
│ ├── chat/ # 客服WebSocket 处理器)
│ ├── user/ # 用户 / 认证
│ ├── admin/ # 管理员
│ ├── notice/ # 公告
│ └── favorite/ # 收藏
├── web-snack/ # 用户端Vue 3 + Vite
├── admin-snack/ # 管理端Vue 3 + Element Plus + ECharts
├── db/ # schema.sql / seed.sql / BUSINESS_DESIGN.md
├── images/ # 项目截图
├── 功能设计文档.md # 功能与接口设计v1.2
└── 项目介绍.md # 本文档
```
## 九、相关文档
| 文档 | 路径 | 内容 |
|------|------|------|
| 功能设计总览 | `功能设计文档.md` | 六大模块业务与接口设计 |
| 核心业务设计 | `db/BUSINESS_DESIGN.md` | WebSocket 客服 + Redis 防超卖 |
| 数据库设计 | `db/schema.sql` | 21 张表 DDL 与说明 |
| 管理端说明 | `admin-snack/README.md` | 技术栈、命令、设计系统 |