项目概述、环境搭建
软件开发整体介绍
软件开发流程
步骤 | 任务或输出文件 |
---|---|
需求分析 | 需求规格说明书、产品原型 |
设计 | UI设计、数据库设计、接口设计 |
编码 | 项目代码、单元测试 |
测试 | 测试用例、测试报告 |
上线运维 | 软件环境安装、配置 |
角色分工
角色 | 分工 | 处于流程 |
---|---|---|
项目经理 | 对整个项目负责,任务分配、把控进度 | 全部流程 |
产品经理 | 进行需求调研,输出需求调研文档、产品原型等 | 需求分析 |
UI设计师 | 根据产品原型输出界面效果图 | 设计 |
架构师 | 项目整体架构设计、技术选型等 | 设计 |
开发工程师 | 代码实现 | 编码 |
测试工程师 | 编写测试用例,输出测试报告 | 测试 |
运维工程师 | 软件环境搭建、项目上线 | 上线运维 |
软件环境
软件环境 | 说明 |
---|---|
开发环境(development) | 开发人员在开发阶段使用的环境,一般外部用户无法访问 |
测试环境(testing) | 专门给测试人员使用的环境,用于测试项目,一般外部用户无法访问 |
生产环境(production) | 即线上环境,正式提供对外服务的环境 |
苍穹外卖项目介绍
项目介绍
定位
- 专门为某一家餐饮企业(餐厅、饭店)定制的一款软件产品。
功能架构
-
功能架构用于体现项目中的业务功能模块。
-
整个项目包含管理端和外卖端,其中管理端供外卖商家使用,用户端供点餐用户使用,功能架构如下:
产品原型
- 产品原型用于展示项目的业务功能,一般由产品经理进行设计。
技术选型
- 技术选型用于展示项目中使用到的技术框架和中间件等,技术选型如下:
开发环境搭建
整体结构
前端环境搭建
- 前端工程基于nginx运行。
- 启动nginx:双击nginx.exe即可启动nginx服务,访问端口号为 80。
注意:此处先使用开发好的前端页面,后端开发完成后再来开发前端页面。
后端环境搭建
- 后端工程基于 Maven 进行项目构建,并且进行分模块开发。
- 后端已经写好了初始文件,直接导入即可。
项目整体结构
名称 | 说明 |
---|---|
sky-take-out | Maven父工程,统一管理依赖版本,聚合其他子模块 |
sky-common | 子模块,存放公共类,例如:工具类、常量类、异常类等 |
sky-pojo | 子模块,存放实体类、VO、DTO等 |
sky-server | 子模块,后端服务,存放配置文件、Controller、Service、Mapper等 |
sky-common
- sky-common子模块中存放的是一些公共类,可以供其他模块使用。
sky-pojo
- sky-pojo子模块中存放的是一些entity、DTO、VO,entity、DTO、VO都属于pojo。
名称 | 说明 |
---|---|
Entity | 实体,通常和数据库中的表对应 |
DTO | 数据传输对象,通常用于程序中各层之间传递数据 |
VO | 视图对象,为前端展示数据提供的对象 |
POJO | 普通Java对象,只有属性和对应的getter和setter |
sky-server
- sky-server子模块中存放的是 配置文件、配置类、拦截器、controller、service、mapper、启动类等。
使用Git进行版本控制
- 使用Git进行项目代码的版本控制,具体操作:
- 创建Git本地仓库。
- 创建Git远程仓库。
- 将本地文件推送到Git远程仓库。
数据库环境搭建
- 通过数据库建表语句创建数据库表,数据库表结构如下:
序号 | 表名 | 中文名 |
---|---|---|
1 | employee | 员工表 |
2 | category | 分类表 |
3 | dish | 菜品表 |
4 | dish_flavor | 菜品口味表 |
5 | setmeal | 套餐表 |
6 | setmeal_dish | 套餐菜品关系表 |
7 | user | 用户表 |
8 | address_book | 地址表 |
9 | shopping_cart | 购物车表 |
10 | orders | 订单表 |
11 | order_detail | 订单明细表 |
前后端联调
- 后端的初始工程中已经实现了登录功能,直接进行前后端联调测试即可。
注意:可以通过断点调试跟踪后端程序的执行过程。
nginx反向代理
- nginx反向代理就是将前端发送的动态请求由nginx转发到后端服务器。
- 本次测试中,前端请求地址为http://localhost/api/employee/login,nginx服务器接收到这个请求后,将请求转发到后端接口地址,后端接口地址为http://localhost:8080/admin/employee/login。
- nginx 反向代理的好处:
- 提高访问速度
- 进行负载均衡
- 保证后端服务安全
nginx反向代理的配置方式
- 在nginx.conf文件中配置以下信息:
server{
listen 80; #监听端口号
server_name localhost; #服务器名
location /api/ { #前端请求地址中要匹配的部分
proxy_pass http://localhost:8080/admin/; #反向代理,后端接口地址中要替换的部分
}
}
nginx负载均衡的配置方式
- 在nginx.conf文件中配置以下信息:
upstream webservers{
server 192.168.100.128:8080; #后端服务器1地址
server 192.168.100.129:8080; #后端服务器2地址
}
server{
listen 80; #监听端口号
server_name localhost; #服务器名
location /api/ { #前端请求地址中要匹配的部分
proxy_pass http://webservers/admin/; #负载均衡,后端接口地址中要替换的部分,其中服务器地址由上方的配置决定
}
}
nginx负载均衡策略
名称 | 说明 |
---|---|
轮询 | 默认方式 |
weight | 权重方式,默认为1,权重越高,被分配的客户端请求就越多 |
ip_hash | 依据ip分配方式,这样每个访客可以固定访问一个后端服务 |
least_conn | 依据最少连接方式,把请求优先分配给连接数少的后端服务 |
url_hash | 依据url分配方式,这样相同的url会被分配到同一个后端服务 |
fair | 依据响应时间方式,响应时间短的服务将会被优先分配 |
完善登录功能
当前登陆功能存在问题
- 员工表中的密码是明文存储,安全性太低。
解决方案
- 使用MD5加密方式对明文密码加密后存储,提高安全性。
执行步骤
- 修改数据库中明文密码,改为MD5加密后的密文:123456 → e10adc3949ba59abbe56e057f20f883e。
- 修改Java代码,前端提交的密码进行MD5加密后再跟数据库中密码比对:
//在EmployeeServiceImpl.java中
//进行md5加密,然后再进行比对
password = DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
//密码错误
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
导入接口文档
前后端分离开发流程
操作步骤
- 将课程资料中提供的项目接口导入YApi即可。
Swagger
介绍
-
只需要按照Swagger的规范去定义接口及接口相关的信息,就可以生成接口文档以及在线接口调试页面。
-
Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。
使用步骤
- 导入knife4j的Maven坐标:
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
- 在配置类中加入knife4j相关配置:
//WebMvcConfiguration.java中
@Bean
public Docket docket(){
ApiInfo apiInfo = new ApiInfoBuilder()
.title("苍穹外卖项目接口文档")
.version(“2.0”)
.description("苍穹外卖项目接口文档")
.build();
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo)
.select()
//指定生成接口需要扫描的包
.apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
.paths(PathSelectors.any())
.build();
return docket;
}
- 设置静态资源映射,否则接口文档页面无法访问:
//WebMvcConfiguration.java中
/**
* 设置静态资源映射
* @param registry
*/
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("开始设置静态资源映射...");
registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
- 访问接口文档,访问路径为http://ip:port/doc.html。
- 进行接口测试。
YApi vs Swagger
-
Yapi是在设计阶段使用的工具,用于管理和维护接口。
-
Swagger是在开发阶段使用的框架,用于帮助后端开发人员做后端的接口测试
常用注解
- 通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性,常用注解如下:
注解 | 说明 |
---|---|
@Api | 用在类上,例如Controller,表示对类的说明 |
@ApiModel | 用在POJO类上,例如entity、DTO、VO,表示对POJO类的说明 |
@ApiModelProperty | 用在属性上,描述属性信息 |
@ApiOperation | 用在方法上,例如Controller的方法,说明方法的用途、作用 |