Java项目瑞吉外卖保姆级学习笔记(改项目名称+改邮件验证码登录+功能补充)
Posted 自牧君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java项目瑞吉外卖保姆级学习笔记(改项目名称+改邮件验证码登录+功能补充)相关的知识,希望对你有一定的参考价值。
前言
- 本项目《听海餐厅》是基于黑马《瑞吉外卖》改名而来,感谢黑马贡献的高质量视频教程。
- 本项目将短信登录改造成了邮箱登录。只想看邮箱验证码登录的小伙伴点此跳转【邮箱验证码】。
- 为了避免各位小伙伴面试时被面试官嘲讽【你们项目组还挺大啊】的尴尬场面,将原项目改名成了《听海餐厅》。
本期目录
- 前言
- 一、 软件开发整体介绍
- 二、 项目介绍
- 三、 开发环境搭建
- 四、 后台登录退出功能开发
- 五、 员工管理业务开发
- 六、 分类管理业务开发
- 七、 菜品管理业务开发
- 八、 套餐管理业务开发
- 九、 邮箱验证码登录(替换短信)
- 十、 用户端开发
- 十一、 后台订单管理业务
一、 软件开发整体介绍
- 本项目是一个单体架构,没有使用微服务。
1. 软件开发流程
2. 角色分工
- 项目经理:对整个项目负责,任务分配、把控进度。
- 产品经理:进行需求调研,输出需求调研文档、产品原型等。
- UI设计师:根据产品原型输出界面效果图。
- 架构师:项目整体架构设计、技术选型等。
- 开发工程师:代码实现。
- 测试工程师:编写测试用例,输出测试报告。
- 运维工程师:软件环境搭建、项目上线。
3. 软件环境
- 开发环境 (development):开发人员在开发阶段使用的环境,一般外部用户无法访问。
- 测试环境 (testing):专门给测试人员使用的环境,用于测试项目,一般外部用户无法访问。
- 生产环境 (production):即线上环境,正式提供对外服务的环境。
二、 项目介绍
1. 项目介绍
1.1 B端和C端
- 本项目 (瑞吉外卖) 是专门为餐饮企业 (餐厅、饭店) 定制的一款软件产品,包括系统管理后台和移动端应用两部分。
- 其中系统管理后台主要提供给餐饮企业内部员工使用,可以对餐厅的菜品、套餐、订单等进行管理维护。
- 移动端应用主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单等。
1.2 开发周期
- 本项目共分为3期进行开发:
- 第一期主要实现基本需求,其中移动端应用通过 H5 实现,用户可以通过手机浏览器访问。
- 第二期主要针对移动端应用进行改进,使用微信小程序实现,用户使用起来更加方便。
- 第三期主要针对系统进行优化升级,提高系统的访问性能。
2. 产品原型展示
2.1 后台管理登录界面
2.2 后台管理界面展示
2.3 用户端登录界面展示
2.4 邮件验证码展示
2.5 用户端界面展示
3. 技术选型
4. 功能架构
5. 角色
- 后台系统管理员:登录后台管理系统,拥有后台系统中的所有操作权限。
- 后台系统普通员工:登录后台管理系统,对菜品、套餐、订单等进行管理。
- C端用户:登录移动端应用,可以浏览菜品、添加购物车、设置地址、在线下单等。
三、 开发环境搭建
1. 数据库环境搭建
1.1 数据库设计
-
本项目不涉及到微服务架构,所有模块的数据表都统一放在一个数据库中。
-
因此只需创建一个数据库,命名为
reggie
。CREATE DATABASE IF NOT EXISTS reggie CHARACTER SET 'utf8';
1.2 数据表设计
-
根据功能划分为不同模块,我根据模块的不同创建不同的数据表。
数据表 描述 难点 后台系统用户表 该数据库的root用户就是管理员 C 端用户表 订单表 菜品表 地址表 套餐表 -
很不幸,我想破脑袋也只能想到划分为 6 张表。但老师对该项目却划分出 11 张表。
-
导入老师设计好的数据表:
-
老师设计数据表的思路:
数据表 描述 address_book 地址簿表 category 菜品和套餐的分类表 (荤菜、素菜、周一套餐 ) dish 菜品表 dish_flavor 菜品口味关系表 employee 后台系统普通员工表 order_detail 订单明细表 orders 订单表 setmeal 套餐表 setmeal_dish 套餐菜品关系表 shopping_cart 购物车表 (感觉增删会很频繁) user C 端用户表
2. Spring Boot项目搭建
- 本项目使用的 IDEA 版本为 2022.2.2 Ultimate 。
2.1 检查Maven目录与本地仓库
-
创建前首先确保自己的 Maven 软件和 Maven 仓库已经与 IDEA 关联好:
2.2 创建Spring Boot项目
-
按下图设置:
-
导入依赖,有些依赖如 MyBatis-Plus 和 Druid 依赖没有被官方收录,我们先导入下图的三个:
2.3 整合第三方依赖
-
打开项目的
pom.xml
文件,加入以下依赖:<!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <!-- Lombok官方收录无需写版本号 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- Fastjson:将对象转成json --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> <!-- 通用语言包 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!-- Druid数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.12</version> </dependency>
-
牢记每次修改完
pom.xml
配置文件都必须按 Shift + Ctrl + O 来刷新 Maven,Maven 才能帮你下载并导入依赖。
2.4 编写Spring Boot配置文件
-
把 Spring Boot 默认的配置文件
application.properties
修改为application.yml
: -
在
application.yml
中添加如下配置:# 配置服务器端口 server: port: 8080 # 配置Druid数据库连接池 spring: application: # 应用名称 (可选) name: reggie_take_out 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: 你的数据库密码 # 配置Mybatis-Plus mybatis-plus: configuration: # 在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 # 例如:属性名映射 user_name --> userName # 例如:类名映射 address_book --> AddressBook map-underscore-to-camel-case: true # 开启MP运行日志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: ASSIGN_ID
2.5 运行Spring Boot启动类
-
打开
src/main/java/edu/ouc/ReggieTakeOutApplication.java
,添加 Lombok 提供的@Slf4j
注解,方便输出日志来调试:@Slf4j // 日志 @SpringBootApplication // Spring Boot启动类 public class ReggieTakeOutApplication public static void main(String[] args) SpringApplication.run(ReggieTakeOutApplication.class, args); // 打印Slf4j日志 log.info("项目启动成功");
-
运行
ReggieTakeOutApplication.java
: -
看到如图所示的输出,就说明你的 Spring Boot 开发环境已经搭建好了。
2.6 导入前端代码
-
本项目以后端开发为主要学习目标,前端代码已经提供好,直接加载即可。
-
粘贴到
src/main/resources/static
目录下: -
重启项目,在浏览器中输入
http://localhost:8080/backend/index.html
: -
看到此页面说明前端代码已成功导入。
四、 后台登录退出功能开发
1. 后台登录功能开发
- 本章从后台管理页面的登录功能开始。
1.1 需求分析
① 请求分析
-
先来查看后台登录的前端页面,浏览器地址栏输入
http://localhost:8080/backend/page/login/login.html
: -
按 F12 打开浏览器的控制台,点击 “登录” 按钮,查看浏览器是以何种方式向服务器发送请求的:
-
可以看到请求方式是 POST ,请求 URL 是
http://localhost:8080/employee/login
。由于我们还没写对应的 Controller ,报 404 是很正常的。 -
按照 Spring Boot 的开发思路,我们应该按照:数据层 (Mapper) –> 服务层 (Service) –> 表现层 (Controller) 三步走来开发。
② 数据库分析
-
后台登录功能对应的数据表为
employee
,其表结构如下:DESC employee;
-
对数据表中的字段进行逐一分析:
字段 作用 id 员工编号,主键,为什么不用自增?可能使用了MyBatis-Plus的雪花算法 name 员工姓名 username 登录账号,加了唯一约束,登录账号不允许重复 password 登录密码 phone 手机号码 sex 性别 id_number 身份证号码 status 员工状态 (禁用/可用) create_time 创建时间 update_time 修改时间 create_user 创建人是谁,以员工ID记录 update_user 修改人是谁,以员工ID记录 -
目前数据表
employee
仅有一条记录,就是后台管理员的记录:
③ 前端代码分析
-
打开
src/main/resources/static/backend/page/login/login.html
,这是后台管理系统的登录页面。 -
其中,我们后端工程师需要关心的最核心的东西就是:前后端数据交换的统一格式 (也称前后端协议) 。具体来说,是后端响应给前端的数据格式。就是下面这段代码:
methods: async handleLogin() this.$refs.loginForm.validate(async (valid) => if (valid) this.loading = true let res = await loginApi(this.loginForm) if (String(res.code) === '1') // code:状态,1表示登录成功 localStorage.setItem('userInfo', JSON.stringify(res.data)) // data:数据,这里指的是账号和密码 window.location.href = '/backend/index.html' else //登录失败 this.$message.error(res.msg) // msg:登录失败提示信息 this.loading = false )
-
从上面这段登录代码中可以看出来,这里和前端工程师约定好的前后端数据交换的统一格式应当包含 3 部分:
协议 描述 code 状态,1 表示成功 data 传递的数据 msg 操作失败/成功的提示信息 json 格式如下所示:
res "code":1, "data": "username":"admin", "password":"123456" , "msg":"登录成功/登录失败"
2. 代码编写
2.1 创建实体类
-
创建数据表
employee
的实体类Employee.java
。并用 Lombok 快速生成 Getter 、Setter 、toString() 、equals() 等。 -
其中的属性与数据表
employee
的字段一一对应。 -
创建
src/main/java/edu/ouc/entity/Employee.java
:@Data public class Employee private static final Long serialVersionUID = 1L;// 序列化ID private Long id; private String name; private String username; private String password; private String phone; private String sex; private String idNumber; private Integer status; private LocalDateTime createTime; private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT) private Long createUser; @TableField(fill = FieldFill.INSERT) private Long updateUser;
2.2 数据层开发
-
登录只涉及到对数据库的查询操作。即,根据账户名
username
查询密码password
。 -
创建数据层、服务层和表现层对应的文件夹。
① 创建数据层接口
-
创建
src/main/java/edu/ouc/mapper/EmployeeMapper.java
。 -
继承 MyBatis-Plus 的
BaseMapper<T>
泛型接口,添加@Mapper
注解。就能获取父类BaseMapper<T>
中已经写好的增删改查方法。@Mapper public interface EmployeeMapper extends BaseMapper<Employee>
2.3 服务层开发
① 创建服务层接口
-
创建
src/main/java/edu/ouc/service/IEmployeeService.java
。 -
我们可以让服务层接口继承 MyBatis-Plus 的
IService<T>
泛型接口来进行快速开发。public interface IEmployeeService extends IService<Employee>
-
继承
IService<T>
后能获取很多通用的增删改查方法:
②创建服务层接口实现类
- 创建
src/main/java/edu/ouc/service/impl/IEmployeeServiceImpl.java
。 - 我们可以让其先继承 MyBatis-Plus 的
ServiceImpl<M,T>
,再实现IEmployeeService.java
。其中,<M,T>
中的 M 指的是对应的 DAO 接口,T 指的是实体类。这样,我们就无需实现IEmployeeService.java
中全部的方法,而是根据需要,既可以使用提供的基础 CRUD 方法,也可以自定义新的方法。
2.4 表现层开发
① 创建前后端统一格式协议类R
-
创建
src/main/java/edu/ouc/common/R.java
。@Data public class R<T> private Integer code; private T data; private String msg; private Map map
瑞吉外卖(个人记录)
本文为个人学习黑马《瑞吉外卖》项目后进行的项目总结,更偏向于对自己编写文本能力的锻炼以及对项目知识点的简短记录。因为个人能力问题,其中可行性分析和测试部分只进行了小标题的陈列,并没有进行编辑。对《瑞吉外卖》项目感兴趣的朋友也可以浏览本文后再去学习,可以对该项目架构有大体感知,同时黑马《瑞吉外卖》非常适合框架学习阶段的朋友,大力推荐本项目。
个人完成后项目源码上传至gitee,有兴趣者可自行参考。
gitee链接:xiaosong111/reggie-take-out - 码云 - 开源中国 (gitee.com)
一、绪论
1.1 项目背景
随着我国城镇和农村居民生活水平达到富裕和小康层次,消费在国民经济活动中的比重逐步加大,居民的餐饮消费逐渐从一日三餐的刚需升级到感受餐饮文化以及社交的重要方式,近年来我国餐饮业销售收入逐年攀升,2019年中国餐饮收入达4.67万亿元,较2018年增加了0.40万亿元,同比增长9.38%,受新冠肺炎疫情影响,2020年中国餐饮收入大幅下滑,随着国内疫情的有效控制,中国餐饮市场也逐渐复苏,2021年中国餐饮收入完成4.69万亿元,较2020年增加了0.74万亿元,同比增长18.64%。“新冠疫情”改变了人们的就餐习惯,对于病毒的心理障碍,更多人选择外卖的方式来就餐,截止2021年12月末中国网上外卖用户规模达54416万人,较2020年同期增加了12533万人,同比增长29.92%。“新冠疫情”改变了人们的就餐习惯,对于病毒的心理障碍,更多人选择外卖的方式来就餐,截止2021年12月末中国网上外卖用户规模达54416万人,较2020年同期增加了12533万人,同比增长29.92%。
1.2 项目介绍
本项目(瑞吉外卖)是专门为餐厅、饭店定制的一款软件产品,包括系统管理后台和移动端应用两部分。其中系统管理后台主要提供给餐饮内部员工使用,可以对餐厅的菜品、套餐、订单进行管理和维护。移动端应用主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单等。
1.3 项目亮点
1、使用Redis进行缓存
当用户数量较多时,系统访问量大,频繁的访问数据库,数据库压力大,系统的性能下降,用户体验感差。因
此使用Redis对数据进行缓存,从而减小数据库的压力,在数据更新时删除缓存,从而保证数据库和缓存的一致性,同时有效提高系统的性能和访问速度。
2、使用MySQL主从复制,进行读写分离
读和写数据的所有压力全都由一台数据库承担,压力大,数据库服务器磁盘损坏则数据丢失,单点故障。使用
MySQL进行主从复制,主库(master)进行写操作(intsert update delete),从库(salve)进行读操作(se
lect),从而减轻数据库负担,增大系统承受能力,提高系统性能。本项目使用Sharding-JDBC在程序中实
现读写分离。
注:MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库目带的二进制日志功能。就是一台或
多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日
志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MysQL数据库自带功能,
无需借助第三方工具。
3、前后端分别部署,使用Nginx进行反向代理
前端页面部署到Nginx服务器中,后端代码部署到后端服务器中,使用Nginx对后端服务器进行反向代理,使
用户只需要访问Nginx服务器便可获得后端服务器的服务(便于后期扩展集群,提高系统并发量)。
二、需求分析
2.1 可行性分析
2.1.1 技术可行性
2.1.2 经济可行性
2.1.3 风险因素及对策
2.2 功能需求分析
2.2.1 后台管理功能分析
2.2.2 移动端功能分析
2.3 非功能需求分析
三、系统总体设计
3.1 项目技术选型
总体基于SpringBoot + MybatisPlus进行开发,使用MySQL数据库进行数据存储,使用Redis进行项目优化,使用git和maven进行版本控制和项目管理。
3.2 项目功能架构
3.3 项目功能清单
四、数据库设计
4.1 数据库概念结构设计
数据库设计共为十一张表,分别为员工表(employee)、用户表(user)、地址簿表(address_book)、
菜品表(dish)、订单表(orders)、菜品口味表(dish_flavor)、套餐表(setmeal)、套餐菜品关系表(setmeal_dish)、购物车表(shopping_cart)、订单详情表(order_detail)、分类表(category)。
其中套餐为菜品的各类组合,套餐和菜品的关系由setmeal_dish表来维系,菜品包括不同口味,由dish_flavor
表来维系,一个订单可能包括多个内容(即菜品或套餐),这些内容由order_detail表来维系,order表则记录
每次付钱后的订单。
4.2 数据库逻辑结构设计
五、系统功能实现
5.1 后台管理系统
5.1.1 管理员登录
输入“瑞吉外卖”后台地址,显示平台登录页面。输入账号和密码点击“登录”登录平台后台管理系统,登录账号为用户名,初始密码由平台运营人员设置。登录平台后可修改密码。账号或密码和验证码校验出错时有提示“账号号或密码错误,请重试”。
登录成功进入后台管理系统我的控制面板。我的面板模块主要分为五个部分:员工管理、分类管理、菜品管理、套餐管理和订单明细,同时包括一个退出登录按钮。
5.1.2 员工管理
员工分类管理员和普通员工,管理员可进行员工的添加,编辑和禁用操作,普通员工只能执行查询员工信息操作,以此避免员工出现误操作,造成人员信息错误。
5.1.3 分类管理
分类管理包括菜品分类和套餐分类,本模块可对菜品分类和套餐分类分别进行增删改查操作,实现对管理方提供的菜品进行分类管理。
5.1.4 菜品管理
本模块包括对菜品的增删改查操作以及停售和起售操作,同时菜品需要停售以后才能删除,以避免员工误操作删除在售菜品。
5.1.5 套餐管理
本模块包括对套餐的增删改查操作以及停售起售操作。
5.1.6 订单明细
本模块为订单管理模块,可以查看订单信息以及订单具体内容以及修改订单的状态和查找订单,便于工作人员对订单的统一管理以及信息统计。
5.2 移动端
5.2.1 移动端主页
主页根据分类展示菜品和套餐数据,套餐和菜品均可点击图片查看详情信息,同时菜品可以选择不同规格(甜度,加蒜,份数等)。菜品或套餐选择完毕后会加入购物车,购物车可对菜品套餐的份数进行管理以及清空。
5.2.2 个人中心
个人中心包括地址管理、历史订单、最新订单展示和退出登录。地址管理包括地址的增删改和展示以及默认地址设置,历史订单为以往订单展示。
5.2.3 订单支付
订单支付模块添加订单备注后可直接进行支付,支付后订单自动同步到历史订单以及最新订单中。
六、系统测试
6.1 测试的目的及意义
6.2 测试环境
6.3 测试与分析
以上是关于Java项目瑞吉外卖保姆级学习笔记(改项目名称+改邮件验证码登录+功能补充)的主要内容,如果未能解决你的问题,请参考以下文章
基于Springboot+MybatisPlus的外卖项目瑞吉外卖Day3