本课程采用理论与实践并重的方式,讲练结合,适合具有一定java基础、了解java web、spring、mybatis、mysql、maven的初学者,可以帮助学员更牢固地对所学知识进行掌握。
项目分为管理端和移动端:管理端提供给商家使用,移动端提供给客户使用。
软件开发流程
角色分工
软件环境
- 项目经理:对整个项目负责,任务分配、把控进度
- 产品经理:进行需求调研,输出需求调研文档、产品原型等
- UI设计师:根据产品原型输出界面效果图
- 架构师:项目整体架构设计、技术选型等
- 开发工程师:代码实现
- 测试工程师:编写测试用例,输出测试报告
- 运维工程师:软件环境搭建、项目上线
- 开发环境(development):开发人员在开发阶段使用的环境,一般外部用户无法访问
- 测试环境(testing):专门给测试人员使用的环境,用于测试项目,一般外部用户无法访问
- 生产环境(production):即线上环境,正式提供对外服务的环境
- 基本介绍
- 项目架构
- 技术选型
定位:专门为餐饮企业定制的一款软件产品
- 前端环境搭建
- 后端环境搭建
- 登录功能的完善
前端的环境基于 nginx 运行,nginx 负责反向代理和负载均衡,即将前端的请求发送到后端,并且如果有多个后端服务器还可以合理的分配使用。
直接使用资料中的前端环境即可,双击启动 Nginx 即可,其他前端的资源已经自动配置好。
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
}
server{
listen 80;
server_name localhost;
location /api/ {
proxy_pass http://webservers/admin/; #负载均衡
}
}
代码解析
webservers
即是提供访问的后端服务器,这个名称是可以自定义的,下面调用的是 8080 端口,即是 tomcat 的默认端口号,定义了两个后端服务器,会使用的时候会自动进行负载均衡。
server
即是提供服务,下面定义了端口 80 和请求服务的 localhost,会将请求反向代理到下面的端口中,转换为我们在 RequestMapping 中定义的请求 url。
所以我们只需要双击打开 nginx 引用即可,在浏览器中输入 localhost,会自动访问 80 端口来进入默认的登录界面。
后端环境基于 maven 搭建且采用分模块开发。
简要叙述一下分模块开发:
先来看一个应用场景,如果有一个电商平台的项目,有订单和商品两个模块,订单中需要包含商品的详细信息,所以需要商品的模型类,商品模块也会用到商品的模型类,这个时候如果两个模块中都写模型类,就会出现重复代码,所以考虑将这两个模块中的重复部分单独抽取出来,构建一个新的模块。
或者当一个项目有多个功能需要实现的时候,将这些功能放在一起,会导致功能之间的耦合过高,有一个功能出错的时候就会导致严重的后果,所以可以将各个功能放置在不同的模块中。
来看看该项目中具体的实现
<parent>
<artifactId>sky-take-outartifactId>
<groupId>com.skygroupId>
<version>1.0-SNAPSHOTversion>
parent>
<dependency>
<groupId>com.skygroupId>
<artifactId>sky-commonartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>com.skygroupId>
<artifactId>sky-pojoartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
通过上述的代码段可以很清晰的看到,这个项目的父项目是整个项目,且下面的各个模块是相互依赖的,在其他两个模块的配置文件中也可以找到该语句。
后端的基础代码也在资料中被提供,可以直接用 idea 中通过 pom.xml
来打开这个项目,来看看这个项目的基础结构
名称 | 说明 |
---|---|
sky-take-out | 父工程,统一管理依赖的版本,聚合其他子模块 |
sky-common | 子模块,存放公共类,如:工具类、常量类、异常类 |
sky-pojo | 子模块,存放实体类、VO、DTO 等 |
sky-server | 子模块、后端服务,存放配置文件、Controller、Service、Mapper |
可以看出来该工程是通过功能来进行分模块的
关于 pojo 中存放的类
名称 | 说明 |
---|---|
Entity | 实体,通常和数据库中的表对应 |
DTO | 数据传输对象,通常用于程序中各层之间传递数据,前端到后端和后端到前端 |
VO | 视图对象,为前端展示数据提供的对象 |
POJO | 普通Java对象,只有属性和对应的getter和setter |
创建Git本地仓库
通过选项栏的 ACS 中的创建 git 仓库选项
创建Git远程仓库
通过 gitee 创建,并得到 url
将本地文件推送到Git远程仓库
在推送界面输入得到的 url
通过提供给的资料中的数据库文件来直接搭建项目sky-sql
已经在前面前端部分 nginx 介绍了,这里补充一下 nginx 的负载均衡策略
名称 | 说明 |
---|---|
轮询 | 默认方式 |
weight | 权重方式,默认为1,权重越高,被分配的客户端请求就越多 |
ip_hash | 依据ip分配方式,这样每个访客可以固定访问一个后端服务 |
least_conn | 依据最少连接方式,把请求优先分配给连接数少的后端服务 |
url_hash | 依据url分配方式,这样相同的url会被分配到同一个后端服务 |
fair | 依据响应时间方式,响应时间短的服务将会被优先分配 |
因为这时候还没有注册功能来将密码写入数据库,所以我们目前仅需要优化登录的方法即可,使用 MD5 的方法进行加密。
例如 123456
加密后为 e10adc3949ba59abbe56e057f20f883e
,但需要注意的是,该逆转是不可逆的,所以我们无法再次将数据库中的密码转回普通密码去验证登录,所以我们只能将传进来的密码加密后再与数据库中的密码比对。
password = DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
//密码错误
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
利用 spring 提供给我们的工具类中的 md5DigestAsHex
方法来实现加密,并且与数据库中已加密的密码比对。
- 前后端分离的流程
- 操作步骤
将课程资料中提供的项目接口导入YApi,。
YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。
使用添加项目将上述的文件导入该管理平台。
- 介绍
- 使用方式
- 常用注解
使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。
官网:https://swagger.io/
Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。
<dependency>
<groupId>com.github.xiaoymingroupId>
<artifactId>knife4j-spring-boot-starterartifactId>
<version>3.0.2version>
dependency>
创建Swagger配置依赖,或者直接将下面的方法导入已存在的配置类中
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {
@Bean(value = "dockerBean")
public Docket dockerBean() {
//指定使用Swagger2规范
Docket docket=new Docket(DocumentationType.SWAGGER_2)
.apiInfo(new ApiInfoBuilder()
//描述字段支持Markdown语法
.description("# Knife4j RESTful APIs")
.termsOfServiceUrl("https://doc.xiaominfo.com/")
.contact("[email protected]")
.version("1.0")
.build())
//分组名称
.groupName("用户服务")
.select()
//这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.basePackage("com.github.xiaoymin.knife4j.controller"))
.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/");
}
这样后端服务器就会将静态资源映射到上述的地址中,当客户端发送 /doc.html 的时候,就可以访问到,都是固定的写法,记住即可。
在 Spring Boot 中,我们可以通过 ResourceHttpRequestHandler
类来处理 Web 应用程序的静态资源请求。ResourceHttpRequestHandler
类会将静态资源文件的请求映射到 Spring Boot 应用程序的 JAR 文件中,然后由 Spring Boot 应用程序返回这些资源文件的内容。 在 Spring Boot 中,我们可以使用 registry.addResourceHandler()
方法来配置 ResourceHttpRequestHandler
类,指定要处理的资源文件的路径和请求方法。
addResourceHandler("/doc.html") 方法表示要处理的资源文件的路径是
/doc.html,
addResourceLocations(“classpath:/META-INF/resources/”)方法表示这些资源文件位于
classpath:/META-INF/resources/目录下。 通过配置
ResourceHttpRequestHandler类,我们可以将
/doc.html资源文件的请求映射到
classpath:/META-INF/resources/doc.html资源文件,然后由 Spring Boot 应用程序返回这个资源文件的内容。这样,我们就可以通过访问
/doc.html` URL 来访问这个资源文件,而不需要提供具体的文件路径。
注解 | 说明 |
---|---|
@Api | 用在类上,例如Controller,表示对类的说明 |
@ApiModel | 用在类上,例如entity、DTO、VO |
@ApiModelProperty | 用在属性上,描述属性信息 |
@ApiOperation | 用在方法上,例如Controller的方法,说明方法的用途、作用 |
这些我们通过注解输入的信息最后都会呈现在在线接口调试页面上。