# Reggie - 瑞吉外卖
**Repository Path**: zheng-zicong27/cc-code
## Basic Information
- **Project Name**: Reggie - 瑞吉外卖
- **Description**: Reggie瑞吉外卖 - SpringBoot
作者:cc
创建时间:2022/06/20
本项目(瑞吉外卖)是为餐饮企业定制的一款软件产品,包括系统管理后台和移动端应用两部分。其中系统管理后台主要提供给餐饮企业内部员工使用,可以对餐厅的菜品、套餐、订单等进行管理维护。移动端应用主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单等。
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 29
- **Forks**: 3
- **Created**: 2022-06-20
- **Last Updated**: 2025-03-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Java, SpringBoot, Spring-MVC, Spring, Vue
## README
# Reggie - SpringBoot(瑞吉外卖)
---
> 🦐 本项目(瑞吉外卖)是为餐饮企业定制的一款软件产品,包括系统管理后台和移动端应用两部分。
>
>🥗 其中系统管理后台主要提供给餐饮企业内部员工使用,可以对餐厅的菜品、套餐、订单等进行管理维护。
>
>🍲 移动端应用主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单等。
>
>😎 by 程序员cc
## 项目介绍
---
### 💻 环境
- Intellij IDEA 2021.2
- JDK 8.0 版本
- Maven 3.3.9
- MySql 8.0.23
- Redis 3.0.504
### 🛠️ 技术选型
### 🔦 功能架构
[comment]: <> (
)
#### 📱 移动端应用
手机号登录 |
个人中心 |
地址管理 |
历史订单 |
浏览菜品、套餐 |
购物车 |
添加购物车 |
清空购物车 |
下单 |
菜品浏览 |
#### 🖥️ 系统管理后台
类别 |
功能 |
员工管理 |
员工登录 |
员工退出 |
新增员工 |
修改信息 |
员工列表 |
启用/禁用 |
分类管理 |
新增分类 |
新增套餐 |
修改分类/套餐 |
分类列表 |
删除分类 |
菜品管理 |
新增菜品 |
修改菜品 |
菜品列表 |
删除菜品 |
启售/停售 |
套餐管理 |
新增套餐 |
修改套餐 |
套餐列表 |
删除套餐 |
启售/停售 |
订单明细 |
订单列表 |
订单操作(查看/配送) |
查询订单 |
### 🧑🏻 角色
- #### 后台系统管理员:登录后台系统,拥有后台系统中的操作权限
- #### 后台系统普通员工:登录后台系统,对菜品、套餐、订单进行管理
- #### C端用户:登录移动端应用,可以浏览菜品、添加购物车、设置地址、在线下单等
## 项目使用
---
### 📄 使用说明
1. #### 本项目自带前端代码,也可以不用分离运行
2. #### 注意:启动项目前,需要启动Redis服务,因为项目前端验证码、前后端的菜品、套餐等模块都使用到了Redis。
3. #### 使用时需要使用相应的端口及主机地址,可通过配置文件修改。
- 后台管理:http://localhost:8080/backend/index.html
- 前端页面:http://localhost:8080/front/index.html
### 🔑 项目优化
#### 在原本项目的基础上,我自行实现了如下功能:
1. ###### 菜品(批量)启售和(批量)停售
2. ###### 菜品的批量删除
3. ###### 套餐的(批量)启售、停售
4. ###### 套餐管理的修改
5. ###### 后台按条件查看和展示客户订单
6. ###### 手机端减少购物车中的菜品或者套餐数量
7. ###### 用户查看自己订单 移动端点击套餐图片查看套餐具体菜品
### 🧬 开发目录
0. #### [环境搭建](#0)
1. #### [后台登录功能开发](#1)
2. #### [后台退出功能开发](#2)
3. #### [完善登录功能](#3)
4. #### [新增员工](#4)
5. #### [员工分类查询](#5)
6. #### [启用/禁用员工账号](#6)
7. #### [编辑员工信息](#7)
8. #### [公共字段自动填充](#8)
9. #### [新增分类](#9)
10. #### [分类信息分页查询](#10)
11. #### [删除分类](#11)
12. #### [修改分类](#12)
13. #### [文件上传](#13)
14. #### [文件下载](#14)
15. #### [新增菜品](#15)
16. #### [菜品信息分页查询](#16)
17. #### [修改菜品](#17)
18. #### [停售/启售菜品,删除菜品](#18)
19. #### [新增套餐](#19)
20. #### [套餐分页查询](#20)
21. #### [删除、起售、停售套餐](#21)
22. #### [修改套餐](#22)
23. #### [短信发送](#23)
24. #### [手机验证码登录](#24)
25. #### [地址簿相关功能](#25)
26. #### [菜品展示](#26)
27. #### [购物车](#27)
28. #### [下单](#28)
29. #### [功能补充](#29)
30. #### [缓存优化](#30)
环境搭建
---
### 数据库环境搭建
1. #### 创建数据库
按如图设置在数据库软件创建出对应数据库
或者使用命令行创建数据库
`create database reggie character set utf8mb4`
2. ##### 执行SQL脚本 db_reggie.sql
存放路径:cc_reggie\src\main\resources\db_reggie.sql
直接运行sql文件:
- 或者使用命令行导入数据库:`source D:\db_reggie.sql`
3. ##### 数据库表说明
---
### maven项目搭建
1. #### 创建maven工程(可以直接创建SpringBoot工程)
2. #### 导入maven配置
- 添加spring-boot-starter-parent
- 指定java版本为1.8
- 导入依赖
- 添加spring-boot-maven-plugin插件
完整pom.xml文件如下:
pom.xml
```xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.4.5
com.cc
reggie
1.0-SNAPSHOT
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-web
compile
com.baomidou
mybatis-plus-boot-starter
3.4.2
org.projectlombok
lombok
1.18.24
com.alibaba
fastjson
1.2.76
commons-lang
commons-lang
2.6
mysql
mysql-connector-java
runtime
com.alibaba
druid-spring-boot-starter
1.1.23
com.aliyun
aliyun-java-sdk-core
4.5.16
com.aliyun
aliyun-java-sdk-dysmsapi
2.1.0
com.aliyun
dysmsapi20170525
2.0.5
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-maven-plugin
2.4.5
```
3. #### 配置application.yml
- 在resources目录下创建application.yml
- 配置端口
- 配置项目名称
- 配置数据库连接
完整application.yml文件如下:
- application.yml
```yml
server:
port: 8080 //端口号
spring:
main:
allow-bean-definition-overriding: true //允许bean定义覆盖
application:
name: cc_reggie
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
redis:
host: 127.0.0.1 //redis服务器地址
port: 6379 //redis服务器端口
# password: 123456 //redis服务器密码
database: 0
cache:
redis:
time-to-live: 1800000 //缓存时间
mybatis-plus:
configuration:
#在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: ASSIGN_ID
reggie:
path: D:\\desktop\\img\\ //图片存放路径
```
4. #### 启动SpringBoot
创建启动类ReggieApplication,点击运行
- ReggieApplication.java
```java
package com.cc.reggie;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableTransactionManagement
@EnableCaching //开启缓存
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class, args);
log.info("项目启动成功...");
}
}
```
---
### 导入前端页面
#### 1. 把资料里的backend和front目录复制到resources目录下
#### 2. 创建配置类WebMvcConfig配置前端资源请求映射
- WebMvcConfig.java
```java
package com.cc.reggie.config;
import com.cc.reggie.common.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 设置静态资源映射
*
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("开始进行静态资源映射...");
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
}
```
#### 3. 重启服务,访问 http://localhost:8080/backend/index.html 查看效果
一、后台登录功能开发
---
### 需求分析
- 登录页面展示(http://localhost:8080/backend/page/login/login.html)
- 查看登录请求信息
- 数据模型(employee表)
### 代码开发
- 创建实体类Employee,和employee表进行映射
- Employee.java
```java
package com.cc.reggie.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String name;
private String password;
private String phone;
private String sex;
private String idNumber;
private Integer status;
@TableField(fill = FieldFill.INSERT)//插入时填充字段
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新时填充字段
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
}
```
- 创建Controller,Service,Mapper
- EmployeeMapper.java
```java
@Mapper
public interface EmployeeMapper extends BaseMapper {
}
```
- EmployeeService.java
```java
public interface EmployeeService extends IService {
}
```
- EmployeeServiceImpl.java
```java
@Service
public class EmployeeServiceImpl extends ServiceImpl implements EmployeeService {
@Autowired
private EmployeeServiceImpl employeeService;
}
```
- EmployeeController.java
```java
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeServiceImpl employeeService;
}
```
- 导入返回结果类R
- 此类是一个通用结果类,服务端响应的所有结果最终都会包装成此种类型返回给前端页面
- R.java
```java
package com.cc.reggie.common;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* 通用结果返回类。服务端响应的数据最终都会封装成此对象,一定要实现erializable接口
*
* @param
*/
@Data
public class R implements Serializable {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
private Map map = new HashMap(); //动态数据
public static R success(T object) {
R r = new R();
r.data = object;
r.code = 1;
return r;
}
public static R error(String msg) {
R r = new R();
r.msg = msg;
r.code = 0;
return r;
}
public R add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
```
- 在Controller中创建登录方法
- EmployeeController.java
```java
/**
* 员工登录
*
* @param request
* @param employee
* @return
*/
@PostMapping("/login")
public R