瑞吉外卖-day01

YangeIT大约 26 分钟瑞吉外卖软件开发流程登录

瑞吉外卖-day01

课程内容

  • 软件开发整体介绍 🍐
  • 瑞吉外卖项目介绍 🍐
  • 管理端
    • 开发环境搭建
    • 后台登录功能开发
    • 后台退出功能开发
    • 完善登录功能

1. 软件开发整体介绍 🍐

软件开发整体介绍

作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。那么这一小节,我们将从 三个方面,来整体上介绍一下软件开发。

1.1 软件开发流程 🍐

image-20210725231106363
image-20210725231106363

1). 第 1 阶段: 需求分析

完成产品原型、需求规格说明书的编写

产品原型,一般是通过网页(html)的形式展示当前的页面展示什么样的数据, 页面的布局是什么样子的,点击某个菜单,打开什么页面,点击某个按钮,出现什么效果,都可以通过产品原型看到。

需求规格说明书, 一般来说就是使用 Word 文档来描述当前项目有哪些功能,每一项功能的需求及业务流程是什么样的,都会在文档中描述。

2). 第 2 阶段: 设计

设计的内容包含 产品设计、UI 界面设计、概要设计、详细设计、数据库设计。

在设计阶段,会出具相关的 UI 界面、及相关的设计文档。比如数据库设计,需要设计当前项目中涉及到哪些数据库,每一个数据库里面包含哪些表,这些表结构之间的关系是什么样的,表结构中包含哪些字段,字段类型都会在文档中描述清楚。

3). 第 3 阶段: 编码

编写项目代码、并完成单元测试。

作为软件开发工程师,我们主要的工作就是在该阶段, 对分配给我们的模块功能,进行编码实现。编码实现完毕后,进行单元测试,单元测试通过后再进入到下一阶段。

4). 第 4 阶段: 测试

在该阶段中主要由测试人员, 对部署在测试环境的项目进行功能测试, 并出具测试报告。

5). 第 5 阶段: 上线运维

在项目上线之前, 会由运维人员准备服务器上的软件环境安装、配置, 配置完毕后, 再将我们开发好的项目,部署在服务器上运行。

我们作为软件开发工程师, 我们主要的任务是在编码阶段, 但是在一些小的项目组当中, 也会涉及到数据库的设计、测试等方面的工作。

2. 瑞吉外卖项目介绍 🍐

瑞吉外卖项目介绍

在开发瑞吉外卖这个项目之前,我们需要全方位的来介绍一下当前我们学习的这个项目。接下来,我们将从以下的五个方面 👇, 来介绍瑞吉外卖这个项目。

2.1 项目介绍

image-20210726000655646
image-20210726000655646

本项目(瑞吉外卖)是专门为餐饮企业(餐厅、饭店) 定制的一款软件产品,包括 系统管理后台 和 移动端应用 两部分。其中系统管理后台 主要提供给餐饮企业内部员工使用,可以对餐厅的分类、菜品、套餐、订单、员工等进行管理维护。移动端应用主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单等。

本项目共分为 2 期进行开发:

阶段功能实现
第一期主要实现基本需求,其中移动端应用通过 H5 实现,用户可以通过手机浏览器访问
第二期主要针对系统进行优化升级,提高系统的访问性能
                       |

3. 开发环境搭建 ✏️ ❤️

3.1 数据库环境搭建

数据库环境搭建

3.1.1 创建数据库和数据库表导入

可以通过以下两种方式中的任意一种, 来创建项目的数据库和数据库表导入:

1).图形界面

image-20210726123903694
image-20210726123903694

注意: 本项目数据库的字符串, 选择 utf8mb4

项目的数据库创建好了之后, 可以直接将 资料/数据模型/db_reggie.sql 直接导入到数据库中,

image-20210726124752975
image-20210726124752975

数据库表介绍

数据库表导入之后, 接下来介绍一下本项目中所涉及到的表结构:

序号表名说明
1employee员工表
2category菜品和套餐分类表
3dish菜品表
4setmeal套餐表
5setmeal_dish套餐菜品关系表
6dish_flavor菜品口味关系表
7user用户表(C 端)
8address_book地址簿表
9shopping_cart购物车表
10orders订单表
11order_detail订单明细表

3.2 Maven 项目搭建

Maven 项目搭建

搭建基础环境方式1 -使用现场的框架

初始项目架子中,已经包含了前端静态资源,书写静态资源配置器后(3.2.3 的第 3 部),可以直接启动运行

搭建基础环境方式2 -手动创建 maven 项目 👇

1). 在 idea 中创建 maven project, 项目名称 reggie_take_out

image-20210726172842675
image-20210726172842675

3.2.3 前端静态资源导入

我们作为服务端开发工程师, 我们课程学习的重心应该放在, 前端的页面我们只需要导入课程资料中的前端资源, 前端页面的代码我们只需要能看懂即可。

1). 导入静态资源

前端资源存放位置为 资料/前端资源 : image-20210726225948411

将上述两个目录中的静态资源文件, 导入到项目的 resources 目录下:

image-20210726230327313
image-20210726230327313

3.3 搭建框架练习 ✏️

练习时长:10min

3.3.0「搭建框架练习」目的

搭建好瑞吉外卖项目的基础框架

3.3.1「搭建框架练习」需求&效果

启动服务器,打开浏览器访问:http://localhost:8080/backend/index.htmlopen in new window 显示下述效果

image-20210726232859596
image-20210726232859596

报红色的 404 错误是正常现象,因为后台的代码还没有写,目前只访问前端的代码

3.3.2「搭建框架练习」步鄹

  • 下载 reggie_take_outfrist.zip 压缩包,解压到非中文目录中,

  • 使用 idea 打开工程,选择 reggie_take_out 文件夹,打开后显示如下效果:

  • 将 com.itheima.reggie.config.WebMvcConfig 类,错误的代码进行注释或删除

  • 启动 ReggieApplication 中的 main 方法

  • 打开浏览器,访问 http://localhost:8080/backend/index.htmlopen in new window 观察效果如 3.3.1 要求所示

  • 注意:导工程后,一定要做的三个步鄹

    1. 检查 Maven 仓库 是否正确配置仓库
    2. 检查 jdk-1.8
    3. 检查编译器版本-1.8

4. 后台系统登录功能

4.1 需求分析

1). 页面原型展示

image-20210726233540703
image-20210726233540703

4.2 代码开发 ✏️

4.2.1 基础准备工作

首先在工程下创建包结构:

image-20210727001117783
image-20210727001117783

提示

  1. common --放一些通用的类
  2. config --配置文件
  3. controller --放一些控制类,用来处理前端请求
  4. entity --对象实体类
  5. mapper --操作数据库的接口类
  6. service --业务层代码

控制层(controller) 调用业务层(service)--->调用持久层(mapper)

1). 创建实体类 Employee

该实体类主要用于和员工表 employee 进行映射。 该实体类, 也可以直接从资料( 资料/实体类 )中拷贝工程中。

所属包: com.itheima.reggie.entity

@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; //驼峰命名法 ---> 映射的字段名为 id_number
    private Integer status;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
}

4.2.2 登录逻辑分析

处理逻辑

①. 将页面提交的密码 password 进行 , 得到加密后的字符串

②. 根据页面提交的用户名 username 查询数据库中员工数据信息

③. 如果没有查询到, 则返回登录失败结果

④. 密码比对,如果不一致, 则返回登录失败结果

⑤. 查看员工状态,如果为已禁用状态,则返回员工已禁用结果

⑥. 登录成功, 并返回登录成功结果

4.2.3 代码实现 ✏️

技术点说明:

A. 由于需求分析时, 我们看到前端发起的请求为 post 请求, 所以服务端需要使用注解

B. 由于前端传递的请求参数为 json 格式的数据, 这里使用 Employee 对象接收, 但是将 json 格式数据封装到实体类中, 在形参前需要加注解 @RequestBody

点击查看代码
/**
 * 员工登录
 * @param request
 * @param employee
 * @return
 */
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request,@RequestBody Employee employee){

    //1、将页面提交的密码password进行md5加密处理
    String password = employee.getPassword();
    password = DigestUtils.md5DigestAsHex(password.getBytes());

    //2、根据页面提交的用户名username查询数据库
    LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(Employee::getUsername,employee.getUsername());
    Employee emp = employeeService.getOne(queryWrapper);

    //3、如果没有查询到则返回登录失败结果
    if(emp == null){
        return R.error("登录失败");
    }

    //4、密码比对,如果不一致则返回登录失败结果
    if(!emp.getPassword().equals(password)){
        return R.error("登录失败");
    }

    //5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果
    if(emp.getStatus() == 0){
        return R.error("账号已禁用");
    }

    //6、登录成功,将员工id存入Session并返回登录成功结果
    request.getSession().setAttribute("employee",emp.getId());
    return R.success(emp);
}

4.3 功能测试

代码实现完毕后, 启动项目, 访问 url: http://localhost:8080/backend/page/login/login.htmlopen in new window , 进行登录测试。

在测试过程中, 可以通过 debug 断点调试的方式来跟踪程序的执行过程,并且可以查看程序运行时各个对象的具体赋值情况。而且需要注意, 在测试过程中,需要将所有的情况都覆盖到。

1). 问题说明

当我们在进行 debug 端点调试时, 前端可能会出现如下问题: 前端页面的控制台报出错误-超时;

2). 解决方案

前端进行异步请求时, 默认超时 10000ms , 可以将该值调大一些。

5. 后台系统退出功能

5.1 需求分析 🍐

在后台管理系统中,管理员或者员工,登录进入系统之后,页面跳转到后台系统首页面(backend/index.html),此时会在系统的右上角显示当前登录用户的姓名。

如果员工需要退出系统,直接点击右侧的退出按钮即可退出系统,退出系统后页面应跳转回登录页面。

1). 退出页面展示

image-20210727005437531

2).前端页面分析

image-20210727010054851

点击 image-20210727010150207 将会调用一个 js 方法 logout, 在 logout 的方法中执行如下逻辑:

image-20210727010422199
image-20210727010422199

A. 发起 post 请求, 调用服务端接口 /employee/logout 执行退出操作 ;

B. 删除客户端 localStorage 中存储的用户登录信息, 跳转至登录页面 ;

5.2 代码实现 ✏️

需要在 Controller 中创建对应的处理方法, 接收页面发送的 POST 请求 /employee/logout ,具体的处理逻辑:

提示

A. 清理 Session 中的用户 id

B. 返回结果

点击查看代码
/**
* 员工退出
* @param request
* @return
*/
@PostMapping("/logout")
public R<String> logout(HttpServletRequest request){
    //清理Session中保存的当前登录员工的id
    request.getSession().removeAttribute("employee");
    return R.success("退出成功");
}

5.3 功能测试

1). 代码实现完毕后, 重启服务, 访问登录界面 http://localhost:8080/backend/page/login/login.htmlopen in new window ;

2). 登录完成之后, 进入到系统首页 backend/index.html, 点击右上角 image-20210727011020244 按钮 执行退出操作, 完成后看看是否可以跳转到登录页面 , 并检查 localStorage。

image-20210727011215186
image-20210727011215186
image-20210727011259297
image-20210727011259297

###补充说明:

image-20220708091512730
image-20220708091512730