# 外卖
**Repository Path**: ns6/takeout
## Basic Information
- **Project Name**: 外卖
- **Description**: 基于Spring和Vue的外卖网站,学习用
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-02-14
- **Last Updated**: 2026-06-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 苍穹外卖 - 全栈外卖平台系统
一个基于 **Spring Boot + Vue3 + 微信小程序** 的完整外卖点餐系统




[技术栈](#技术栈) • [功能模块](#功能模块) • [快速开始](#快速开始) • [API 文档](#api-文档) • [项目结构](#项目结构)
---
## 📖 项目简介
苍穹外卖是一个全栈式的外卖点餐平台,包含三个核心端:
- **🖥️ 管理后台**:供商家使用,管理菜品、订单、员工、数据统计等
- **📱 用户端小程序**:供消费者使用,支持浏览菜品、下单支付、订单查询等功能
- **⚙️ 后端服务**:提供 RESTful API,处理业务逻辑、数据存储、支付集成等
### ✨ 核心特性
- 🔐 **JWT 无状态认证**:前后端分离,支持分布式部署
- 💳 **微信支付集成**:完整的支付流程,支持模拟支付模式
- 📊 **实时数据推送**:WebSocket 实现来单提醒、催单通知
- ⏰ **定时任务处理**:自动取消超时订单、自动完成派送订单
- 🛒 **购物车管理**:完整的购物车功能,支持再来一单
- 📈 **数据统计分析**:营业额统计、订单量统计、销量排名
---
## 🛠️ 技术栈
### 后端服务 (rearend)
#### 核心框架
- **Spring Boot 2.7.3** - 核心框架,提供自动配置和快速开发能力
- **MyBatis 2.2.0** - ORM 持久层框架
- **Spring Security** - 安全框架(用于 JWT 认证)
- **Spring Cache** - 缓存抽象框架
- **Spring WebSocket** - WebSocket 实时通信
- **Spring Task** - 定时任务调度
#### 数据库与中间件
- **MySQL** - 关系型数据库
- **Druid 1.2.1** - 阿里巴巴数据库连接池,提供监控和扩展功能
- **PageHelper 1.3.0** - MyBatis 分页插件
- **Redis** - 缓存数据库,存储店铺状态、验证码等临时数据
#### 第三方服务集成
- **微信支付 API v3** - 处理订单支付、退款
- **阿里云 OSS / MinIO** - 对象存储,存放菜品图片等资源
- **微信小程序接口** - 获取用户 openid、手机号授权
#### 开发辅助工具
- **Lombok 1.18.20** - 简化代码(@Data, @Builder, @Slf4j 等注解)
- **Knife4j 3.0.2** - Swagger 增强版,生成接口文档
- **FastJSON 1.2.83** - JSON 序列化和反序列化
- **Apache POI 3.16** - Excel 文件导入导出(数据统计报表)
- **AspectJ 1.9.4** - AOP 面向切面编程(自动填充公共字段)
- **JWT (JJWT 0.9.1)** - 生成和解析 Token,实现无状态认证
### 前端管理后台 (frontend)
- **Vue 3** - 渐进式 JavaScript 框架
- **Vite** - 新一代前端构建工具
- **TypeScript 4.x** - JavaScript 的超集,提供类型安全
- **Pinia** - Vue 3 的状态管理库
- **Vue Router** - Vue.js 的官方路由管理器
- **Naive UI** - Vue 3 组件库
- **Tailwind CSS** - 实用优先的 CSS 框架
- **Axios** - HTTP 请求库
- **Iconify** - 图标库
### 微信小程序 (weixin)
- **原生小程序开发** - 微信官方框架
- **uni-ui** - UI 组件库
- **本地存储** - wx.setStorageSync 存储用户信息和 token
## 开发环境配置
### 前端管理后台
```bash
# 安装依赖
npm install
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 预览生产构建
npm run preview
# 代码检查
npm run lint
```
### 后端服务
```bash
# 使用 Maven 构建
mvn clean package
# 启动服务
java -jar sky-server/target/sky-server.jar
```
## 端口与地址
- **前端管理后台**: http://localhost:3000
- **后端服务**: http://localhost:8080
- **API 基础路径**: /api
- **微信小程序 AppID**: wxec66c715195866c7
---
## 📦 项目结构
```
waimai/
├── frontend/ # 前端管理后台(Vue3 + TypeScript)
│ ├── src/
│ │ ├── views/ # 页面组件
│ │ ├── components/ # 公共组件
│ │ ├── router/ # 路由配置
│ │ ├── stores/ # Pinia 状态管理
│ │ ├── services/ # API 服务
│ │ └── utils/ # 工具函数
│ ├── .env.development # 开发环境变量
│ ├── .env.production # 生产环境变量
│ └── vite.config.ts # Vite 配置文件
│
├── rearend/ # 后端服务(Spring Boot)
│ ├── sky-common/ # 公共模块(工具类、常量、异常)
│ ├── sky-pojo/ # 实体类模块(Entity、DTO、VO)
│ └── sky-server/ # 服务主模块
│ ├── controller/ # 控制器层
│ ├── service/ # 服务层
│ ├── mapper/ # 数据访问层
│ ├── entity/ # 实体类
│ ├── dto/ # 数据传输对象
│ ├── vo/ # 视图对象
│ ├── config/ # 配置类
│ ├── interceptor/ # 拦截器
│ ├── aspect/ # 切面
│ ├── task/ # 定时任务
│ └── websocket/ # WebSocket 服务
│
└── weixin/ # 微信小程序
├── pages/ # 页面
├── components/ # 组件
├── utils/ # 工具函数
└── static/ # 静态资源
```
---
## 🎯 功能模块
### 🖥️ 管理后台功能
#### 工作台
- 数据概览(今日订单、今日营收、有效订单)
- 快捷入口(订单管理、菜品管理等)
#### 订单管理
- 订单列表查询(按状态筛选)
- 订单详情查看
- 订单操作(接单、拒单、派送、完成)
- 催单处理(WebSocket 实时通知)
#### 商品管理
- **菜品管理**:新增、编辑、删除、上下架
- **套餐管理**:新增、编辑、删除、上下架
- **分类管理**:菜品分类、套餐分类
- **口味管理**:为菜品设置多种口味
#### 员工管理
- 员工列表(分页查询)
- 新增/编辑员工信息
- 启用/禁用员工账号
- 员工密码修改
#### 数据统计
- 营业额数据统计(折线图展示)
- 用户数据统计
- 订单数量统计
- 销量排名 TOP10
#### 财务管理
- 财务报表查看
- 数据导出(Excel 格式)
### 📱 小程序端功能
#### 首页
- 店铺营业状态显示
- 轮播图广告
- 菜品分类展示
- 推荐菜品
#### 点餐功能
- 菜品浏览(按分类)
- 菜品详情(图片、价格、口味选择)
- 加入购物车
- 购物车管理(增减数量、清空)
#### 订单功能
- 提交订单(选择地址、备注、餐具数量)
- 订单支付(微信支付、模拟支付)
- 历史订单查询
- 订单详情查看
- 再来一单(一键加购)
- 取消订单
- 催单功能
#### 个人中心
- 用户信息展示
- 地址管理(新增、编辑、删除、默认地址)
- 最近订单
### ⚙️ 后端核心功能
#### 认证授权
- JWT Token 生成与验证
- 管理端与用户端双 Token 体系
- ThreadLocal 用户上下文隔离
#### 订单处理
- 订单创建(事务控制)
- 订单支付(真实支付 + 模拟支付)
- 订单状态流转
- 超时订单自动取消(定时任务)
- 派送中订单自动完成(定时任务)
#### 缓存优化
- Redis 缓存店铺状态
- Spring Cache 缓存菜品数据
- 缓存清理策略(新增/修改时清除)
#### 实时推送
- WebSocket 服务端搭建
- 来单提醒推送
- 催单通知推送
#### 文件上传
- MinIO/OSS 对象存储集成
- 图片上传接口
- 文件大小限制(1MB)
---
## 🚀 快速开始
### 环境要求
- **JDK**: 9+
- **Node.js**: 14+
- **Maven**: 3.6+
- **MySQL**: 5.7+
- **Redis**: 5.0+
- **微信开发者工具**: 最新版
### 1️⃣ 数据库初始化
```bash
# 1. 创建数据库
CREATE DATABASE sky_take_out CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 2. 导入 SQL 脚本(在 docs/sql 目录下)
mysql -u root -p sky_take_out < docs/sql/schema.sql
mysql -u root -p sky_take_out < docs/sql/data.sql
```
### 2️⃣ 后端服务启动
```bash
# 1. 进入后端目录
cd rearend
# 2. 修改配置文件(sky-server/src/main/resources/application.yml)
# 配置数据库连接、Redis、JWT 密钥、MinIO、微信支付等信息
# 3. Maven 构建
mvn clean package -DskipTests
# 4. 启动服务
java -jar sky-server/target/sky-server.jar
# 启动成功后会显示:server started
```
**访问后端接口文档**:http://localhost:8080/doc.html
### 3️⃣ 前端管理后台启动
```bash
# 1. 进入前端目录
cd frontend
# 2. 安装依赖
npm install
# 3. 启动开发服务器
npm run dev
# 启动成功后访问:http://localhost:3000
```
### 4️⃣ 小程序端启动
```bash
# 1. 打开微信开发者工具
# 2. 导入项目:选择 weixin 目录
# 3. 配置 AppID(project.config.json)
# 当前配置:wxec66c715195866c7
# 4. 编译运行即可
```
---
## ⚙️ 配置说明
### 后端环境变量配置
在 `application.yml` 中配置以下环境变量:
```yaml
sky:
datasource:
host: localhost
port: 3306
database: sky_take_out
username: root
password: your_password
redis:
host: localhost
port: 6379
jwt:
admin-secret-key: itcast
user-secret-key: zong
admin-ttl: 7200000 # 2 小时
user-ttl: 7200000
minio:
endpoint: http://localhost:9000
access-key: your_access_key
secret-key: your_secret_key
bucket-name: takeout
wechat:
appid: wxec66c715195866c7
secret: your_wechat_secret
mchid: your_mch_id
notifyUrl: http://your-domain.com/user/order/paySuccess
```
### 前端环境变量
**开发环境** (`.env.development`):
```env
NODE_ENV=development
VITE_APP_TITLE=外卖平台管理系统
VITE_APP_BASE_API=/api
```
**生产环境** (`.env.production`):
```env
NODE_ENV=production
VITE_APP_TITLE=外卖平台管理系统
VITE_APP_BASE_API=/api
```
### 小程序配置
在 `utils/api.js` 中配置后端接口地址:
```javascript
const BASE_URL = 'http://localhost:8080';
```
---
## 🌐 端口与地址
| 服务 | 地址 | 说明 |
|------|------|------|
| **前端管理后台** | http://localhost:3000 | Vue3 管理后台 |
| **后端服务** | http://localhost:8080 | Spring Boot API 服务 |
| **API 文档** | http://localhost:8080/doc.html | Knife4j 接口文档 |
| **微信小程序** | 微信开发者工具 | 需要导入项目运行 |
| **MinIO 控制台** | http://localhost:9001 | 对象存储管理界面 |
---
## 📝 常用命令
### 前端命令
```bash
# 安装依赖
npm install
# 启动开发服务器(热重载)
npm run dev
# 构建生产版本
npm run build
# 预览生产构建
npm run preview
# 代码检查
npm run lint
# 格式化代码
npm run format
```
### 后端命令
```bash
# Maven 清理
mvn clean
# Maven 编译
mvn compile
# Maven 打包(跳过测试)
mvn clean package -DskipTests
# Maven 测试
mvn test
# 启动服务
java -jar sky-server/target/sky-server.jar
# 查看日志
tail -f sky-server/logs/sky.log
```
---
## 📚 API 文档
后端服务提供了 Knife4j 生成的交互式 API 文档,包含完整的接口说明和在线调试功能。
### 访问地址
```
http://localhost:8080/doc.html
```
### 文档分组
- **管理端接口**:`/admin/**` 路径下的所有接口
- **用户端接口**:`/user/**` 路径下的所有接口
### 接口测试
1. 访问 doc.html 页面
2. 在对应接口处点击"尝试"
3. 填写参数后执行即可测试
**注意**:需要先登录后端系统获取 Token,然后在请求头中添加 `authentication: your_token`
---
## 🔧 开发指南
### 新增菜品接口
**后端**:
```java
@PostMapping
@ApiOperation("新增菜品")
public Result add(@RequestBody DishDTO dishDTO) {
dishService.saveWithFlavor(dishDTO);
return Result.success();
}
```
**前端**:
```typescript
const addDish = async (data: DishDTO) => {
return axios.post('/admin/dish', data);
};
```
### 添加定时任务
```java
@Component
public class CustomTask {
@Scheduled(cron = "0 */5 * * * ?") // 每 5 分钟执行一次
public void execute() {
// 业务逻辑
}
}
```
### WebSocket 消息推送
```java
@Autowired
private WebSocketServer webSocketServer;
// 发送消息
public void sendOrderNotification(Long orderId) {
Map message = new HashMap<>();
message.put("type", 1); // 1 来单提醒,2 客户催单
message.put("orderId", orderId);
message.put("content", "订单号:" + orderId);
webSocketServer.sendToAllClient(JSON.toJSONString(message));
}
```
---
## 🐛 常见问题
### 1. 跨域问题
**解决方案**:已在后端配置 CORS
```java
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE");
}
}
```
### 2. 文件上传大小限制
默认限制为 1MB,如需修改:
```yaml
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
```
### 3. 数据库连接失败
检查以下几点:
- MySQL 服务是否启动
- 数据库连接信息是否正确
- 数据库字符集是否为 utf8mb4
### 4. Redis 连接失败
检查:
- Redis 服务是否启动
- Redis 连接配置是否正确
- 防火墙是否阻止 6379 端口
---
## 📄 开源协议
MIT License
---
## 👨💻 项目信息
- **创建时间**: 2024
- **最后更新**: 2026-03-28
- **版本**: 1.0-SNAPSHOT
- **技术栈**: Spring Boot 2.7.3 + Vue 3 + TypeScript + 微信小程序
---