苍穹外卖
day01
1、项目效果展示
点外卖流程:
打开外卖平台-->选中一个商家-->选择商品-->选择口味-->添加购物车-->去结算-->添加收获地址-->添加备注-->选择付款方式-->点击确认付款-->输入密码,确认支付---->等待收餐(催单)

2、软件开发整体介绍-软件开发流程
软件开发流程
需求分析:需求规格说明书、产品原型;
设计:UI设计、数据库设计、接口设计;
编码:项目代码、单元测试;
测试:测试用例、测试报告。
上线运维:软件环境安装、配置。
3、软件开发整体介绍-角色分工+软件环境
角色分工
- 项目经理:对整个项目负责,任务分配、把控进度;
- 产品经理:进行需求调研,输出需求调研文档、产品原型等;
- UI设计师:根据产品原型输出界面原型图;
- 架构师:项目整体架构设计、技术选型等;
- 开发工程师:代码实现;
- 测试工程师:编写测试用例,输出测试报告;
- 运维工程师:软件环境搭建、项目上线。
软件环境
开发环境:开发人员在开发阶段使用的环境,一般外部用户无法访问;
测试环境:专门给测试人员使用的环境,用于测试 项目,一般外部用户无法访问;
生产环境:即线上环境,正式提供对外服务的环境。
4、软件项目整体介绍
项目介绍
定位:专门为餐饮企业(餐厅、饭店)定制的一款软件产品
功能架构:体现项目中的业务功能模块


技术选型
技术选型:展示项目中使用到的技术框架和中间件等

Nginx的负载均衡和反向代理。
5、开发环境搭建-前端环境
前端环境搭建
前端工程基于nginx运行

启动nginx:双击nginx.exe即可启动nginx服务,访问端口号为80。
6、开发环境搭建-后端工程导入
后端环境搭建
后端工程基于maven进行项目构建,并且进行分模块开发。
后端环境搭建-熟悉项目结构
用IDEA打开初始工程,了解项目的整体结构

多版本JDK共存

切换JAVA_HOME进行切换JDK操作。
- sky-pojo子模块中存放的是一些entity、DTO\VO

注意:DTO封装请求参数,没有数据库字段映射的,数据之间串联的数据。
- sky-server子模块中存放的是配置文件、配置类、拦截器、controller、service、mapper、启动类等。
7、开发环境搭建-Git管理后端项目
后端环境搭建-使用Git进行版本控制
使用Git进行项目代码的版本控制,具体操作:
- 创建Git本地仓库;

- 创建Git远程仓库;

- 将本地文件推送到Git远程仓库;

8、开发环境搭建-数据库环境
后端环境搭建-数据库环境搭建
通过数据库建表语句创建数据库表结构:
执行sql语句报错,遗留问题。
2026-03-10 11:19:03\] \[HY000\]\[1273\] Unknown collation: 'utf8mb4_0900_ai_ci'
注意:问题原因,目标mysql服务器的版本过低。
解决办法:将utf8mb4_0900_ai_ci改为utf8mb4_general_ci。
MySQL版本

直接导入sky.sql文件,创建数据库


9、开发环境搭建-前后端联调
后端的初始工程中已经实现了登录功能,直接进行前后端联调测试即可。
登录

代码演示:
java
@ApiOperation("员工登录")
@PostMapping("/login")
public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {
log.info("员工登录:{}", employeeLoginDTO);
Employee employee = employeeService.login(employeeLoginDTO);
//登录成功后,生成jwt令牌
Map<String, Object> claims = new HashMap<>();
claims.put(JwtClaimsConstant.EMP_ID, employee.getId());
String token = JwtUtil.createJWT(
jwtProperties.getAdminSecretKey(),
jwtProperties.getAdminTtl(),
claims);
//链式编程,构造对象 builder() 等同于 new EmployeeLoginVo();
EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder()
.id(employee.getId())
.userName(employee.getUsername())
.name(employee.getName())
.token(token)
.build();
return Result.success(employeeLoginVO);
}
10、开发环境搭建-Nginx反向代理+负载均衡
思考:前端发送的请求,是如何请求到后端服务的?

nginx反向代理的好处:
提高访问速度,进行负载均衡。
所谓的负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器。

配置多台服务器的IP地址

nginx负载均衡的配置方式:

nginx负载均衡策略:

11、开发环境搭建-完善登录功能MD5加密
完善登录功能
- 问题:现在密码是明文存取,安全性太低。
- 思路:1、将密码加密后存储,提高安全性;2、使用MD5加密方式对明文密码加密
单向的密码

- 步骤:完善登录功能
修改数据库中明文密码,改为MD5加密后的密文;
修改Java代码,前端提交的密码进行MD5加密后再跟数据库中密码比对
代码演示:
java
//密码比对
//需要进行md5加密,然后再进行比对
password = DigestUtils.md5DigestAsHex(password.getBytes());
12、导入接口文档-Yapi+Apifox
在线的接口文档
操作步骤
将课程资料中提供的项目接口导入YApi。
13、Swagger-使用方式
介绍
使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,一级在线接口调试页面。

步骤:使用方式

第一步,导入依赖包坐标,在需要的工程下配置即可
代言演示:
XML
<!--swagger相关依赖-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
第二步,配置类加入knife4j相关配置
代码演示:
java
/**
* 通过knife4j生成接口文档
* @return
*/
@Bean
public Docket docket1() {
ApiInfo apiInfo = new ApiInfoBuilder()
.title("苍穹外卖项目接口文档")
.version("2.0")
.description("苍穹外卖项目接口文档")
.build();
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.groupName("管理端接口")
.apiInfo(apiInfo)
.select()
// 扫描控制器所在包
.apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin"))
.paths(PathSelectors.any())
.build();
return docket;
}
@Bean
public Docket docket2() {
ApiInfo apiInfo = new ApiInfoBuilder()
.title("苍穹外卖项目接口文档")
.version("2.0")
.description("苍穹外卖项目接口文档")
.build();
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.groupName("用户端接口")
.apiInfo(apiInfo)
.select()
// 扫描控制器所在包
.apis(RequestHandlerSelectors.basePackage("com.sky.controller.user"))
.paths(PathSelectors.any())
.build();
return docket;
}
/**
* 设置静态资源映射
* @param registry
*/
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
14、Swagger-常用注解

Yapi是设计阶段使用的工具,管理和维护接口。是代码写之前的接口设计工具。
swagger是有了代码才可以生成的,在开发阶段使用的框架,帮助后端开发人员做后端的接口测试。
常用注解
通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性,常用注解如下:

@Api注解


@ApiOperation方法上的


@ApiModel与@ApiOperation


注意:需要引入@ApiModel所需要的包。