黑马跟学.苍穹外卖.Day01

打印 上一主题 下一主题

主题 1096|帖子 1096|积分 3288

苍穹外卖-day01

项目升级

课程内容



  • 软件开辟整体先容
  • 苍穹外卖项目先容
  • 开辟环境搭建
  • 导入接口文档
  • Swagger

项目整体效果展示:

​ 管理端-外卖商家利用

​ 用户端-点餐用户利用
当我们完成该项目标学习,可以培养以下能力:

1. 软件开辟整体先容

作为一名软件开辟工程师,我们必要相识在软件开辟过程中的开辟流程, 以及软件开辟过程中涉及到的岗位脚色,脚色的分工、职责, 并相识软件开辟中涉及到的三种软件环境。那么这一末节,我们将从 软件开辟流程、脚色分工、软件环境 三个方面整体先容一下软件开辟。
1.1 软件开辟流程


1). 第1阶段: 需求分析
完成需求规格说明书、产品原型编写。
需求规格说明书, 一样平常来说就是利用 Word 文档来描述当前项目标各个组成部分,如:体系界说、应用环境、功能规格、性能需求等,都会在文档中描述。例如:

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

2). 第2阶段: 设计
设计的内容包罗 UI设计、数据库设计、接口设计。
UI设计:用户界面的设计,主要设计项目标页面效果,小到一个按钮,大到一个页面布局,还有人机交互逻辑的体现。例如:

数据库设计:必要设计当前项目中涉及到哪些数据库,每一个数据库里面包罗哪些表,这些表结构之间的关系是什么样的,表结构中包罗哪些字段。例如:

接口设计:通过分析原型图,起首,粗粒度地分析每个页面有多少接口,然后,再细粒度地分析每个接口的传入参数,返回值参数,同时明确接口路径及请求方式。例如:

3). 第3阶段: 编码
编写项目代码、并完成单元测试。
项目代码编写:作为软件开辟工程师,我们必要对项目标模块功能分析后,进行编码实现。
单元测试:编码实现完毕后,进行单元测试,单元测试通过后再进入到下一阶段。例如:

4). 第4阶段: 测试
在该阶段中主要由测试人员, 对部署在测试环境的项目进行功能测试, 并出具测试报告。
5). 第5阶段: 上线运维
在项目上线之前, 会由运维人员准备服务器上的软件环境安装、设置, 设置完毕后, 再将我们开辟好的项目,部署在服务器上运行。
1.2 脚色分工

在对整个软件开辟流程熟悉后, 我们还有必要相识一下在整个软件开辟流程中涉及到的岗位脚色,以及各个脚色的职责分工。

岗位/脚色对应阶段职责/分工项目司理全阶段对整个项目负责,任务分配、把控进度产品司理需求分析进行需求调研,输出需求调研文档、产品原型等UI设计师设计根据产品原型输出界面效果图架构师设计项目整体架构设计、技能选型等开辟工程师编码功能代码实现测试工程师测试编写测试用例,输出测试报告运维工程师上线运维软件环境搭建、项目上线 上述我们讲解的脚色分工, 是在一个项目组中比力标准的脚色分工, 但是在实际的项目中, 有一些项目组由于人员设置告急, 可能并没有专门的架构师或测试人员, 这个时间可能必要有项目司理或者步伐员兼任。
1.3 软件环境

作为软件开辟工程师,在编码的过程中就不可避免地会接触多种软件环境,我们主要来分析在工作中经常遇到的三套环境, 分别是: 开辟环境、测试环境、生产环境。 接下来,我们分别先容一下这三套环境的作用和特点。
1). 开辟环境(development)
我们作为软件开辟人员,在开辟阶段利用的环境,就是开辟环境,一样平常外部用户无法访问。
好比,我们在开辟中利用的MySQL数据库和其他的一些常用软件,我们可以安装在本地, 也可以安装在一台专门的服务器中, 这些应用软件仅仅在软件开辟过程中利用, 项目测试、上线时,我们不会利用这套环境了,这个环境就是开辟环境。
2). 测试环境(testing)
当软件开辟工程师,将项目标功能模块开辟完毕,并且单元测试通过后,就必要将项目部署到测试服务器上,让测试人员对项目进行测试。那这台测试服务器就是专门给测试人员利用的环境, 也就是测试环境,用于项目测试,一样平常外部用户无法访问。
3). 生产环境(production)
当项目开辟完毕,并且由测试人员测试通过之后,就可以上线项目,将项目部署到线上环境,并正式对外提供服务,这个线上环境也称之为生产环境。
开辟环境 测试环境 生产环境

起首,会在开辟环境中进行项目开辟,每每开辟环境大多数都是本地的电脑环境和局域网内的环境,当开辟完毕后,然后会把项目部署到测试环境,测试环境一样平常是一台独立测试服务器的环境,项目测试通过后,终极把项目部署到生产环境,生产环境可以是机房或者云服务器等线上环境。
2. 苍穹外卖项目先容

在开辟苍穹外卖这个项目之前,我们必要全方位的来先容一下当前我们学习的这个项目。接下来,我们将从项目简介、产品原型、技能选型三个方面来先容苍穹外卖这个项目。
2.1 项目先容

本项目(苍穹外卖)是专门为餐饮企业(餐厅、饭店)定制的一款软件产品,包括 体系管理配景 和 小步伐端应用 两部分。其中体系管理配景主要提供给餐饮企业内部员工利用,可以对餐厅的分类、菜品、套餐、订单、员工等进行管理维护,对餐厅的各类数据进行统计,同时也可进行来单语音播报功能。小步伐端主要提供给消费者利用,可以在线欣赏菜品、添加购物车、下单、付出、催单等。

接下来,通过功能架构图来展示管理端用户端的具体业务功能模块。

1). 管理端功能
员工登录/退出 , 员工信息管理 , 分类管理 , 菜品管理 , 套餐管理 , 菜品口胃管理 , 订单管理 ,数据统计,来单提醒。
2). 用户端功能
微信登录 , 收件人地址管理 , 用户汗青订单查询 , 菜品规格查询 , 购物车功能 , 下单 , 付出、分类及菜品欣赏。
2.2 产品原型

产品原型,用于展示项目标业务功能,一样平常由产品司理进行设计。
   留意事项: 产品原型主要用于展示项目标功能,并不是终极的页面效果。
  在课程资料的产品原型文件夹下,提供了两份产品原型。

管理端原型图:

用户端原型图:

1). 管理端
餐饮企业内部员工利用。 主要功能有:
模块描述登录/退出内部员工必须登录后,才可以访问体系管理配景员工管理管理员可以在体系配景对员工信息进行管理,包罗查询、新增、编辑、禁用等功能分类管理主要对当前餐厅经营的 菜品分类 或 套餐分类 进行管理维护, 包罗查询、新增、修改、删除等功能菜品管理主要维护各个分类下的菜品信息,包罗查询、新增、修改、删除、启售、停售等功能套餐管理主要维护当前餐厅中的套餐信息,包罗查询、新增、修改、删除、启售、停售等功能订单管理主要维护用户在移动端下的订单信息,包罗查询、取消、派送、完成,以及订单报表下载等功能数据统计主要完成对餐厅的各类数据统计,如营业额、用户数量、订单等 2). 用户端
移动端应用主要提供给消费者利用。主要功能有:
模块描述登录/退出用户必要通过微信授权后登录利用小步伐进行点餐点餐-菜单在点餐界面必要展示出菜品分类/套餐分类, 并根据当前选择的分类加载其中的菜品信息, 供用户查询选择点餐-购物车用户选中的菜品就会加入用户的购物车, 主要包罗 查询购物车、加入购物车、删除购物车、清空购物车等功能订单付出用户选完菜品/套餐后, 可以对购物车菜品进行结算付出, 这时就必要进行订单的付出个人信息在个人中心页面中会展示当前用户的基本信息, 用户可以管理收货地址, 也可以查询汗青订单数据 2.3 技能选型

关于本项目标技能选型, 我们将会从 用户层、网关层、应用层、数据层 这几个方面进行先容,主要用于展示项目中利用到的技能框架和中心件等。

1). 用户层
本项目中在构建体系管理配景的前端页面,我们会用到H5、Vue.js、ElementUI、apache echarts(展示图表)等技能。而在构建移动端应用时,我们会利用到微信小步伐。
2). 网关层
Nginx是一个服务器,主要用来作为Http服务器,部署静态资源,访问性能高。在Nginx中还有两个比力重要的作用: 反向代理和负载平衡, 在进行项目部署时,要实现Tomcat的负载平衡,就可以通过Nginx来实现。
3). 应用层
SpringBoot: 快速构建Spring项目, 采取 “约定优于设置” 的头脑, 简化Spring项目标设置开辟。
SpringMVC:SpringMVC是spring框架的一个模块,springmvc和spring无需通过中心整合层进行整合,可以无缝集成。
Spring Task: 由Spring提供的定时任务框架。
httpclient: 主要实现了对http请求的发送。
Spring Cache: 由Spring提供的数据缓存框架
JWT: 用于对应用步伐上的用户进行身份验证的标记。
阿里云OSS: 对象存储服务,在项目中主要存储文件,如图片等。
Swagger: 可以自动的资助开辟人员生成接口文档,并对接口进行测试。
POI: 封装了对Excel表格的常用操纵。
WebSocket: 一种通信网络协议,使客户端和服务器之间的数据互换更加简单,用于项目标来单、催单功能实现。
4). 数据层
MySQL: 关系型数据库, 本项目标核心业务数据都会采取MySQL进行存储。
Redis: 基于key-value格式存储的内存数据库, 访问速度快, 经常利用它做缓存。
Mybatis: 本项目长期层将会利用Mybatis开辟。
pagehelper: 分页插件。
spring data redis: 简化java代码操纵Redis的API。
5). 工具
git: 版本控制工具, 在团队协作中, 利用该工具对项目中的代码进行管理。
maven: 项目构建工具。
junit:单元测试工具,开辟人员功能实现完毕后,必要通过junit对功能进行单元测试。
postman: 接口测工具,模仿用户发起的各类HTTP请求,获取对应的响应效果。
3. 开辟环境搭建


开辟环境搭建主要包罗前端环境后端环境两部分。作为服务端开辟工程师, 我们课程学习的重心应该放在后端的业务代码上, 前端的页面我们只必要导入资料中的nginx, 前端页面的代码我们只必要能看懂即可。
3.1 前端环境搭建

1). 前端工程基于 nginx
从资料中找到前端运行环境的nginx,移动到非中文目录下。

sky目录中存放了管理端的前端资源,具体如下:

2). 启动nginx,访问测试
双击 nginx.exe 即可启动 nginx 服务,访问端口号为 80
http://localhost:80

3.2 后端环境搭建

3.2.1 熟悉项目结构

后端工程基于 maven 进行项目构建,并且进行分模块开辟。
1). 从当天资料中找到后端初始工程:

2). 用 IDEA 打开初始工程,相识项目标整体结构:

对工程的每个模块作用说明:
序号名称说明1sky-take-outmaven父工程,统一管理依靠版本,聚合其他子模块2sky-common子模块,存放公共类,例如:工具类、常量类、异常类等3sky-pojo子模块,存放实体类、VO、DTO等4sky-server子模块,后端服务,存放设置文件、Controller、Service、Mapper等 对项目整体结构相识后,接下来我们具体分析上述的每个子模块:


  • sky-common: 模块中存放的是一些公共类,可以供其他模块利用

分析sky-common模块的每个包的作用:
名称说明constant存放相干常量类context存放上下文类enumeration项目标罗列类存储exception存放自界说异常类json处理json转换的类properties存放SpringBoot相干的设置属性类result返回效果类的封装utils常用工具类

  • sky-pojo: 模块中存放的是一些 entity、DTO、VO

分析sky-pojo模块的每个包的作用:
名称说明Entity实体,通常和数据库中的表对应DTO数据传输对象,通常用于步伐中各层之间通报数据VO视图对象,为前端展示数据提供的对象POJO普通Java对象,只有属性和对应的getter和setter

  • sky-server: 模块中存放的是 设置文件、设置类、拦截器、controller、service、mapper、启动类等

分析sky-server模块的每个包的作用:
名称说明config存放设置类controller存放controller类interceptor存放拦截器类mapper存放mapper接口service存放service类SkyApplication启动类 3.2.2 Git版本控制

利用Git进行项目代码的版本控制,具体操纵:
1). 创建Git本地堆栈


当Idea中出现:

说明本地堆栈创建乐成。
2). 创建Git远程堆栈
访问https://gitee.com/,新建堆栈

点击 创建

3). 将本地文件推送到Git远程堆栈

  • 提交文件至本地堆栈
    忽略以下类型文件

开始提交

中心出现:点击commit


  • 添加Git远程堆栈地址
    复制远程地址:

添加地址:



  • 推送

乐成推送至远程堆栈

3.2.3 数据库环境搭建


  • 从资料中找到sky.sql

直接打开sky.sql文件

通过该sql文件直接可创建数据库,以是不必要提前创建数据库,直接导入该文件执行即可。

  • 执行sky.sql文件



执行完成后,共创建出11张表

每张表的说明:
序号表名中文名1employee员工表2category分类表3dish菜品表4dish_flavor菜品口胃表5setmeal套餐表6setmeal_dish套餐菜品关系表7user用户表8address_book地址表9shopping_cart购物车表10orders订单表11order_detail订单明细表 我们目前先简单相识大概有哪些表, 每张表存储什么数据, 有一个印象。对于具体的表结构, 以及表结构中的字段, 可以参考资料中的**《数据库设计文档》**,同时在讲解具体的功能开辟时, 我们也会再具体先容。

3.2.4 前后端联调

后端的初始工程中已经实现了登录功能,直接进行前后端联调测试即可
实现思绪:

1.Controller层
在sky-server模块中,com.sky.controller.admin.EmployeeController
  1. /**
  2.      * 登录
  3.      *
  4.      * @param employeeLoginDTO
  5.      * @return
  6.      */
  7.     @PostMapping("/login")
  8.     public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {
  9.         log.info("员工登录:{}", employeeLoginDTO);
  10.                 //调用service方法查询数据库
  11.         Employee employee = employeeService.login(employeeLoginDTO);
  12.         //登录成功后,生成jwt令牌
  13.         Map<String, Object> claims = new HashMap<>();
  14.         claims.put(JwtClaimsConstant.EMP_ID, employee.getId());
  15.         String token = JwtUtil.createJWT(
  16.                 jwtProperties.getAdminSecretKey(),
  17.                 jwtProperties.getAdminTtl(),
  18.                 claims);
  19.         EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder()
  20.                 .id(employee.getId())
  21.                 .userName(employee.getUsername())
  22.                 .name(employee.getName())
  23.                 .token(token)
  24.                 .build();
  25.         return Result.success(employeeLoginVO);
  26.     }
复制代码
2.Service层
在sky-server模块中,com.sky.service.impl.EmployeeServiceImpl
  1. /**
  2.      * 员工登录
  3.      *
  4.      * @param employeeLoginDTO
  5.      * @return
  6.      */
  7.     public Employee login(EmployeeLoginDTO employeeLoginDTO) {
  8.         String username = employeeLoginDTO.getUsername();
  9.         String password = employeeLoginDTO.getPassword();
  10.         //1、根据用户名查询数据库中的数据
  11.         Employee employee = employeeMapper.getByUsername(username);
  12.         //2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
  13.         if (employee == null) {
  14.             //账号不存在
  15.             throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
  16.         }
  17.         //密码比对
  18.         if (!password.equals(employee.getPassword())) {
  19.             //密码错误
  20.             throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
  21.         }
  22.         if (employee.getStatus() == StatusConstant.DISABLE) {
  23.             //账号被锁定
  24.             throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
  25.         }
  26.         //3、返回实体对象
  27.         return employee;
  28.     }
复制代码
3.Mapper层
在sky-server模块中,com.sky.mapper.EmployeeMapper
  1. package com.sky.mapper;
  2. import com.sky.entity.Employee;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import org.apache.ibatis.annotations.Select;
  5. @Mapper
  6. public interface EmployeeMapper {
  7.     /**
  8.      * 根据用户名查询员工
  9.      * @param username
  10.      * @return
  11.      */
  12.     @Select("select * from employee where username = #{username}")
  13.     Employee getByUsername(String username);
  14. }
复制代码
注:可以通过断点调试跟踪后端步伐的执行过程
3.2.5 nginx反向代理和负载平衡

对登录功能测试完毕后,接下来,我们思考一个问题:前端发送的请求,是如何请求到后端服务的?
前端请求地址:http://localhost/api/employee/login
后端接口地址:http://localhost:8080/admin/employee/login
前端请求地址 后端接口地址


很显着,两个地址不一致,那是如何请求到后端服务的呢?

1). nginx反向代理
nginx 反向代理,就是将前端发送的动态请求由 nginx 转发到后端服务器

那为什么不直接通过欣赏器直接请求配景服务端,必要通过nginx反向代理呢?
nginx 反向代理的利益:


  • 进步访问速度
    由于nginx本身可以进行缓存,如果访问的同一接口,并且做了数据缓存,nginx就直接可把数据返回,不必要真正地访问服务端,从而进步访问速度。
  • 进行负载平衡
    所谓负载平衡,就是把大量的请求按照我们指定的方式平衡的分配给集群中的每台服务器。
  • 包管后端服务安全
    由于一样平常配景服务地址不会袒露,以是利用欣赏器不能直接访问,可以把nginx作为请求访问的入口,请求到达nginx后转发到具体的服务中,从而包管后端服务的安全。

nginx 反向代理的设置方式:
  1. server{
  2.     listen 80;
  3.     server_name localhost;
  4.    
  5.     location /api/{
  6.         proxy_pass http://localhost:8080/admin/; #反向代理
  7.     }
  8. }
复制代码
**proxy_pass:**该指令是用来设置代理服务器的地址,可以是主机名称,IP地址加端口号等情势。
如上代码的寄义是:监听80端口号, 然后当我们访问 http://localhost:80/api/…/…这样的接口的时间,它会通过 location /api/ {} 这样的反向代理到 http://localhost:8080/admin/上来。
接下来,进到nginx-1.20.2\conf,打开nginx设置
  1. # 反向代理,处理管理端发送的请求
  2. location /api/ {
  3.         proxy_pass   http://localhost:8080/admin/;
  4.     #proxy_pass   http://webservers/admin/;
  5. }
复制代码
当在访问http://localhost/api/employee/login,nginx吸收到请求后转到http://localhost:8080/admin/,故终极的请求地址为http://localhost:8080/admin/employee/login,和配景服务的访问地址一致。
2). nginx 负载平衡
当如果服务以集群的方式进行部署时,那nginx在转发请求到服务器时就必要做相应的负载平衡。着实,负载平衡从本质上来说也是基于反向代理来实现的,终极都是转发请求。
nginx 负载平衡的设置方式:
  1. upstream webservers{
  2.     server 192.168.100.128:8080;
  3.     server 192.168.100.129:8080;
  4. }
  5. server{
  6.     listen 80;
  7.     server_name localhost;
  8.    
  9.     location /api/{
  10.         proxy_pass http://webservers/admin;#负载均衡
  11.     }
  12. }
复制代码
**upstream:**如果代理服务器是一组服务器的话,我们可以利用upstream指令设置后端服务器组。
如上代码的寄义是:监听80端口号, 然后当我们访问 http://localhost:80/api/…/…这样的接口的时间,它会通过 location /api/ {} 这样的反向代理到 http://webservers/admin,根据webservers名称找到一组服务器,根据设置的负载平衡策略(默认是轮询)转发到具体的服务器。
**注:**upstream背面的名称可自界说,但要上下保持一致。
nginx 负载平衡策略:
名称说明轮询默认方式weight权重方式,默认为1,权重越高,被分配的客户端请求就越多ip_hash依据ip分配方式,这样每个访客可以固定访问一个后端服务least_conn依据最少连接方式,把请求优先分配给连接数少的后端服务url_hash依据url分配方式,这样雷同的url会被分配到同一个后端服务fair依据响应时间方式,响应时间短的服务将会被优先分配 具体设置方式:
轮询:
  1. upstream webservers{
  2.     server 192.168.100.128:8080;
  3.     server 192.168.100.129:8080;
  4. }
复制代码
weight:
  1. upstream webservers{
  2.     server 192.168.100.128:8080 weight=90;
  3.     server 192.168.100.129:8080 weight=10;
  4. }
复制代码
ip_hash:
  1. upstream webservers{
  2.     ip_hash;
  3.     server 192.168.100.128:8080;
  4.     server 192.168.100.129:8080;
  5. }
复制代码
least_conn:
  1. upstream webservers{
  2.     least_conn;
  3.     server 192.168.100.128:8080;
  4.     server 192.168.100.129:8080;
  5. }
复制代码
url_hash:
  1. upstream webservers{
  2.     hash &request_uri;
  3.     server 192.168.100.128:8080;
  4.     server 192.168.100.129:8080;
  5. }
复制代码
fair:
  1. upstream webservers{
  2.     server 192.168.100.128:8080;
  3.     server 192.168.100.129:8080;
  4.     fair;
  5. }
复制代码
3.3 完善登录功能

**问题:**员工表中的暗码是明文存储,安全性太低。

解决思绪:

  • 将暗码加密后存储,进步安全性


  • 利用MD5加密方式对明文暗码加密

实现步骤:

  • 修改数据库中明文暗码,改为MD5加密后的密文
    打开employee表,修改暗码

  • 修改Java代码,前端提交的暗码进行MD5加密后再跟数据库中暗码比对
    打开EmployeeServiceImpl.java,修改比对暗码
    1. /**
    2.      * 员工登录
    3.      *
    4.      * @param employeeLoginDTO
    5.      * @return
    6.      */
    7.     public Employee login(EmployeeLoginDTO employeeLoginDTO) {
    8.         //1、根据用户名查询数据库中的数据
    9.       
    10.         //2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
    11.         //.......
    12.         //密码比对
    13.         // TODO 后期需要进行md5加密,然后再进行比对
    14.         password = DigestUtils.md5DigestAsHex(password.getBytes());
    15.         if (!password.equals(employee.getPassword())) {
    16.             //密码错误
    17.             throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
    18.         }
    19.         //........
    20.         //3、返回实体对象
    21.         return employee;
    22.     }
    复制代码
4. 导入接口文档

接下来,就要进入到项目标业务开辟了,而我们的开辟方式就是基本当前企业主流的前后端分离开辟方式,那么这种方式就要求我们之前必要先将接口界说好,这样前后端人员才能并行开辟,以是,这个章节就必要将接口文档导入到管理平台,为我们背面业务开辟做好准备。着实,在真实的企业开辟中,接口设计过程着实是一个非常漫长的过程,可能必要多次开会讨论调解,以致在开辟的过程中才会发现某些接口界说还必要再调解,这种环境着实是非经常见的,但是由于项目时间原因,以是选择一次性导入所有的接口,在开辟业务功能过程当中,也会带着各人一起来分析一下对应的接口是怎么确定下来的,为什么要这样界说,从而培养同学们的接口设计能力。
4.1 前后端分离开辟流程


第一步:界说接口,确定接口的路径、请求方式、传入参数、返回参数。
第二步:前端开辟人员和后端开辟人员并行开辟,同时,也可自测。
第三步:前后端人员进行连调测试。
第四步:提交给测试人员进行终极测试。
4.2 操纵步骤

将课程资料中提供的项目接口导入YApi。访问地址:http://yapi.smart-xwork.cn/
1). 从资料中找到项目接口文件

2). 导入到YApi平台
在YApi平台创建出两个项目

选择苍穹外卖-管理端接口.json导入

导入乐成

另一个用户端json文件也执行雷同操纵。
5. Swagger

5.1 先容

Swagger 是一个规范和完备的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是:

  • 使得前后端分离开辟更加方便,有利于团队协作
  • 接口的文档在线自动生成,降低后端开辟人员编写接口文档的负担
  • 功能测试
    Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Springfox ,即可非常简单快捷的利用Swagger。
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是盼望它能像一把匕首一样小巧,轻量,并且功能强悍!
目前,一样平常都利用knife4j框架。
5.2 利用步骤


  • 导入 knife4j 的maven坐标
    在pom.xml中添加依靠
    1. <dependency>
    2.    <groupId>com.github.xiaoymin</groupId>
    3.    <artifactId>knife4j-spring-boot-starter</artifactId>
    4. </dependency>
    复制代码
  • 在设置类中加入 knife4j 相干设置
    WebMvcConfiguration.java
    1. /**
    2.      * 通过knife4j生成接口文档
    3.      * @return
    4. */
    5.     @Bean
    6.     public Docket docket() {
    7.         ApiInfo apiInfo = new ApiInfoBuilder()
    8.                 .title("苍穹外卖项目接口文档")
    9.                 .version("2.0")
    10.                 .description("苍穹外卖项目接口文档")
    11.                 .build();
    12.         Docket docket = new Docket(DocumentationType.SWAGGER_2)
    13.                 .apiInfo(apiInfo)
    14.                 .select()
    15.                 .apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
    16.                 .paths(PathSelectors.any())
    17.                 .build();
    18.         return docket;
    19.     }
    复制代码
  • 设置静态资源映射,否则接口文档页面无法访问
    WebMvcConfiguration.java
    1. /**
    2.      * 设置静态资源映射
    3.      * @param registry
    4. */
    5. protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    6.         registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
    7.         registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    8. }
    复制代码
  • 访问测试
    接口文档访问路径为 http://ip:port/doc.html —> http://localhost:8080/doc.html

接口测试:测试登录功能

**思考:**通过 Swagger 就可以生成接口文档,那么我们就不必要 Yapi 了?
1、Yapi 是设计阶段利用的工具,管理和维护接口
2、Swagger 在开辟阶段利用的框架,资助后端开辟人员做后端的接口测试
5.3 常用注解

通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性,常用注解如下:
注解说明@Api用在类上,例如Controller,表现对类的说明@ApiModel用在类上,例如entity、DTO、VO@ApiModelProperty用在属性上,描述属性信息@ApiOperation用在方法上,例如Controller的方法,说明方法的用途、作用 接下来,利用上述注解,生成可读性更好的接口文档
在sky-pojo模块中
EmployeeLoginDTO.java
  1. package com.sky.dto;
  2. import io.swagger.annotations.ApiModel;
  3. import io.swagger.annotations.ApiModelProperty;
  4. import lombok.Data;
  5. import java.io.Serializable;
  6. @Data
  7. @ApiModel(description = "员工登录时传递的数据模型")
  8. public class EmployeeLoginDTO implements Serializable {
  9.     @ApiModelProperty("用户名")
  10.     private String username;
  11.     @ApiModelProperty("密码")
  12.     private String password;
  13. }
复制代码
EmployeeLoginVo.java
  1. package com.sky.vo;
  2. import io.swagger.annotations.ApiModel;
  3. import io.swagger.annotations.ApiModelProperty;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Builder;
  6. import lombok.Data;
  7. import lombok.NoArgsConstructor;
  8. import java.io.Serializable;
  9. @Data
  10. @Builder
  11. @NoArgsConstructor
  12. @AllArgsConstructor
  13. @ApiModel(description = "员工登录返回的数据格式")
  14. public class EmployeeLoginVO implements Serializable {
  15.     @ApiModelProperty("主键值")
  16.     private Long id;
  17.     @ApiModelProperty("用户名")
  18.     private String userName;
  19.     @ApiModelProperty("姓名")
  20.     private String name;
  21.     @ApiModelProperty("jwt令牌")
  22.     private String token;
  23. }
复制代码
在sky-server模块中
EmployeeController.java
  1. package com.sky.controller.admin;
  2. import com.sky.constant.JwtClaimsConstant;
  3. import com.sky.dto.EmployeeLoginDTO;
  4. import com.sky.entity.Employee;
  5. import com.sky.properties.JwtProperties;
  6. import com.sky.result.Result;
  7. import com.sky.service.EmployeeService;
  8. import com.sky.utils.JwtUtil;
  9. import com.sky.vo.EmployeeLoginVO;
  10. import io.swagger.annotations.Api;
  11. import io.swagger.annotations.ApiOperation;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.web.bind.annotation.PostMapping;
  15. import org.springframework.web.bind.annotation.RequestBody;
  16. import org.springframework.web.bind.annotation.RequestMapping;
  17. import org.springframework.web.bind.annotation.RestController;
  18. import java.util.HashMap;
  19. import java.util.Map;
  20. /**
  21. * 员工管理
  22. */
  23. @RestController
  24. @RequestMapping("/admin/employee")
  25. @Slf4j
  26. @Api(tags = "员工相关接口")
  27. public class EmployeeController {
  28.     @Autowired
  29.     private EmployeeService employeeService;
  30.     @Autowired
  31.     private JwtProperties jwtProperties;
  32.     /**
  33.      * 登录
  34.      *
  35.      * @param employeeLoginDTO
  36.      * @return
  37.      */
  38.     @PostMapping("/login")
  39.     @ApiOperation(value = "员工登录")
  40.     public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO)         {
  41.         //..............
  42.         
  43.     }
  44.     /**
  45.      * 退出
  46.      *
  47.      * @return
  48.      */
  49.     @PostMapping("/logout")
  50.     @ApiOperation("员工退出")
  51.     public Result<String> logout() {
  52.         return Result.success();
  53.     }
  54. }
复制代码
启动服务:访问http://localhost:8080/doc.html


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表