黑马头条2

news/2024/12/5 7:16:52/

文章目录

    • 前言
    • 一、接口工具
      • 1.1 postman
      • 1.2 swagger
      • 1.3 knife4j
    • 二、 网关
      • 一、基本搭建
      • 二、全局过滤器jwt
    • 三、 前端集成
      • 导入前端工程项目
      • 安装nginx
      • 测试

🌕博客x主页:己不由心王道长🌕!
🌎文章说明:黑马头条开发🌎
✅系列专栏:微服务项目
🌴本篇内容:对黑马的黑马头条微服务进行开发讲解🌴
☕️每日一语:这个世界本来就不完美,如果我们再不接受不完美的自己,那我们要怎么活。☕️
🚩 交流社区:己不由心王道长(优质编程社区)

前言

文章内容为微服务内容,项目是跟着黑马头条进行的。本次内容为黑马头条的第二天,由于之前出现了一些问题,然后没解决就停止了一段时间,现在决定从上次断更的地点从头来一遍。本篇文章的主要内容是接口工具postman、swagger、knife4j,网关、前端集成

一、接口工具

1.1 postman

一、简介:

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。postman被500万开发者和超100,000家公司用于每月访问1.3亿个API。

官网地址:https://www.postman.com/

在这里插入图片描述

下载解压即可使用

下面是本项目使用例子:
在这里插入图片描述

1.2 swagger

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

  1. 使得前后端分离开发更加方便,有利于团队协作

  2. 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担

  3. 功能测试

    Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Springfox ,即可非常简单快捷的使用Swagger。

二、SpringBoot集成Swagger:

  • 引入依赖,在heima-leadnews-model和heima-leadnews-common模块中引入该依赖
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId>
</dependency>

只需要在heima-leadnews-common中进行配置即可,因为其他微服务工程都直接或间接依赖即可。

三、添加Swagger配置类:

  • 在heima-leadnews-common工程中添加一个配置类:
  • 新增:com.heima.common.swagger.SwaggerConfiguration
package com.heima.common.swagger;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2
public class SwaggerConfiguration {@Beanpublic Docket buildDocket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(buildApiInfo()).select()// 要扫描的API(Controller)基础包.apis(RequestHandlerSelectors.basePackage("com.heima")).paths(PathSelectors.any()).build();}private ApiInfo buildApiInfo() {Contact contact = new Contact("己不由心王王长","","");return new ApiInfoBuilder().title("己不由心-平台管理API文档").description("己不由心后台api").contact(contact).version("1.0.0").build();}
}

在这里插入图片描述
四、添加自动装配:
在heima-leadnews-common模块中的resources目录中新增以下目录和文件

文件:resources/META-INF/Spring.factories
在这里插入图片描述
四、Swagger常用注解:
在Java类中添加Swagger的注解即可生成Swagger接口文档,常用Swagger注解如下:

@Api:修饰整个类,描述Controller的作用

@ApiOperation:描述一个类的一个方法,或者说一个接口

@ApiParam:单个参数的描述信息

@ApiModel:用对象来接收参数

@ApiModelProperty:用对象接收参数时,描述对象的一个字段

@ApiResponse:HTTP响应其中1个描述

@ApiResponses:HTTP响应整体描述

@ApiIgnore:使用该注解忽略这个API

@ApiError :发生错误返回的信息

@ApiImplicitParam:一个请求参数

@ApiImplicitParams:多个请求参数的描述信息

五、测试:

我们在之前编写的登录方法上加上注释
ApUserLoginController:

package com.heima.user.controller.v1;import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.user.dtos.LoginDto;
import com.heima.user.service.ApUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author Administrator* @Date 2023/6/21 19:35* @description* @Version 1.0*/
@Api(value = "app端用户登录",tags = "app端用户登录")
@RestController
@RequestMapping("/api/v1/login")
public class ApUserLoginController {@AutowiredApUserService userService;/*** App端登录功能* @param dto* @return*/@ApiOperation(value = "用户登录方法")@PostMapping("/login_auth")public ResponseResult login(LoginDto dto){return  userService.login(dto);}
}

LoginDto:

package com.heima.model.common.user.dtos;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data
public class LoginDto {/*** 手机号*/@ApiModelProperty(value = "手机号",required = true)private String phone;/*** 密码*/@ApiModelProperty(value = "密码",required = true)private String password;
}

之前在model层也添加依赖就是因为swagger文档也要用到

接下来重启测试:

启动user微服务,访问地址:http://localhost:51801/swagger-ui.html

在这里插入图片描述

1.3 knife4j

一、简介:
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!

二、核心功能:

该UI增强包主要包括两大核心功能:文档说明 和 在线调试

  • 文档说明:根据Swagger的规范说明,详细列出接口文档的说明,包括接口地址、类型、请求示例、请求参数、响应示例、响应参数、响应码等信息,使用swagger-bootstrap-ui能根据该文档说明,对该接口的使用情况一目了然。
  • 在线调试:提供在线接口联调的强大功能,自动解析当前接口参数,同时包含表单验证,调用参数可返回接口响应内容、headers、Curl请求命令实例、响应时间、响应状态码等信息,帮助开发者在线调试,而不必通过其他测试工具测试接口是否正确,简介、强大。
  • 个性化配置:通过个性化ui配置项,可自定义UI的相关显示信息
  • 离线文档:根据标准规范,生成的在线markdown离线文档,开发者可以进行拷贝生成markdown接口文档,通过其他第三方markdown转换工具转换成html或pdf,这样也可以放弃swagger2markdown组件
  • 接口排序:自1.8.5后,ui支持了接口排序功能,例如一个注册功能主要包含了多个步骤,可以根据swagger-bootstrap-ui提供的接口排序规则实现接口的排序,step化接口操作,方便其他开发者进行接口对接

三、快速集成:

  • 引入依赖:在common下
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
  • 创建Swagger文件

在heima-leadnews-common模块中新建配置类

新建Swagger的配置文件SwaggerConfiguration.java文件,创建springfox提供的Docket分组对象,代码如下:

package com.heima.common.knife4j;import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class Swagger2Configuration {@Bean(value = "defaultApi2")public Docket defaultApi2() {Docket docket=new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())//分组名称.groupName("1.0").select()//这里指定Controller扫描包路径.apis(RequestHandlerSelectors.basePackage("com.heima")).paths(PathSelectors.any()).build();return docket;}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("黑马头条API文档").description("黑马头条API文档").version("1.0").build();}
}

注解说明:

注解说明
@EnableSwagger2该注解是Springfox-swagger框架提供的使用Swagger注解,该注解必须加
@EnableKnife4j该注解是knife4j提供的增强注解,Ui提供了例如动态参数、参数过滤、接口排序等增强功能,如果你想使用这些增强功能就必须加该注解,否则可以不用加

别忘了添加配置:
在这里插入图片描述

测试:
在这里插入图片描述
下载离线文档:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、 网关

一、基本搭建

一、在微服务gateway中导入对应依赖:网关也需要去注册中心注册服务,导入其依赖不过分吧?

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency>
</dependencies>

二、在对应微服务下创建gateway微服务:

在这里插入图片描述
在这里插入图片描述
三、在nacos的配置中心创建dataid为leadnews-app-gateway的yml配置:
在这里插入图片描述

spring:cloud:gateway:globalcors:add-to-simple-url-handler-mapping: truecorsConfigurations:'[/**]':allowedHeaders: "*"allowedOrigins: "*"allowedMethods:- GET- POST- DELETE- PUT- OPTIONroutes:# 平台管理- id: useruri: lb://leadnews-userpredicates:- Path=/user/**filters:- StripPrefix= 1

二、全局过滤器jwt

在这里插入图片描述
思路分析:

  1. 用户进入网关开始登陆,网关过滤器进行判断,如果是登录,则路由到后台管理微服务进行登录
  2. 用户登录成功,后台管理微服务签发JWT TOKEN信息返回给用户
  3. 用户再次进入网关开始访问,网关过滤器接收用户携带的TOKEN
  4. 网关过滤器解析TOKEN ,判断是否有权限,如果有,则放行,如果没有则返回未认证错误

具体实现:

第一:

​ 在认证过滤器中需要用到jwt的解析,所以需要把工具类拷贝一份到网关微服务

第二:

在网关微服务中新建全局过滤器:

package app.gateway.filter;import app.gateway.util.AppJwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** @Author Administrator* @Date 2023/6/22 16:22* @description* @Version 1.0*/
@Component
@Slf4j
public class AuthorizeFilter implements Ordered, GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//1.获取request和response对象ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();//2.判断是否是登录if(request.getURI().getPath().contains("/login")){//放行return chain.filter(exchange);}//3.获取tokenString token = request.getHeaders().getFirst("token");//4.判断token是否存在if(StringUtils.isBlank(token)){response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}//5.判断token是否有效try {Claims claimsBody = AppJwtUtil.getClaimsBody(token);//是否是过期int result = AppJwtUtil.verifyToken(claimsBody);if(result == 1 || result  == 2){response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}}catch (Exception e){e.printStackTrace();response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}//6.放行return chain.filter(exchange);}/*** 优先级设置  值越小  优先级越高* @return*/@Overridepublic int getOrder() {return 0;}
}

三、 前端集成

导入前端工程项目

在这里插入图片描述

安装nginx

在这里插入图片描述

测试

![在这里插入图片描述](https://img-blog.csdnimg.cn/292bbeb37dc4442e932183fec2d42f72.png
因为这里全是给的内容,安装步骤来就可以,就不再仔细了,吃饭去!


http://www.ppmy.cn/news/517122.html

相关文章

内存模型和名称空间

头文件中常包含的内容&#xff1a; 函数原型 使用#define或const定义的符号常量&#xff1b; 结构声明&#xff0c; 类声明&#xff0c; 模板声明 内联函数 声明包括&#xff1a;引用声明&#xff08;extern&#xff09;&#xff0c;定义声明&#xff0c;区别在于是否分配内存空…

【2023,学点儿新Java-20】流程控制语句关键字及其介绍:while、do、break、continue、return

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-19】Java特殊空类型关键字 | Java流程控制语句关键字 | switch-case 选择结构的执行过程&注意点 | 详解&#xff1a;for循环的普通和增强版本【2023&#xff0c;学点儿新Java-18】Java关键字汇总说明 |附&#xff1a…

多核CPU

ps&#xff1a;本文较长&#xff0c;全文两千五百字左右&#xff01; 前言 半导体工艺和架构是提升CPU性能的双驾马车。CPU的发展史&#xff0c;其实就是处理器架构和半导体工艺交互升级、协同演进的发展史。半导体工艺采用更先进的制程&#xff0c;晶体管尺寸变小了&#xf…

平面设计计算机基本配置,平面设计电脑配置要求

如何配置一台好用的用于平面设计的电脑&#xff1f;首先我们要了解下电脑有哪些部分组成&#xff0c;一台电脑有CPU、主板、硬盘、内存条、显卡、显示器、机箱、电源、鼠标和键盘组成。电脑的配置&#xff0c;也就是这些硬件的配置。 作为一个平面设计的电脑&#xff0c;需要打…

cpu满载寿命_CPU的使用寿命大概有多少年,多久迭代一次为佳?

主频fcpu占用率*最高主频,核心电压cpu占用率*标称电压,功耗cpu占用率的三次方*标称功耗.有的CPU平均满负荷有效寿命高达10万小时。CPU并不是易损件&#xff0c;CPU正常使用下,保养得好的话(注意散热和除尘&#xff0c;防潮也做得很好&#xff0c;而且朝频后的温度也不高)&#…

计算机组成CPU最佳配置,计算机组成原理--CPU

算是读书笔记吧 最简单的 CPU 1. 首先&#xff0c;我们有一个自动计数器 这个自动计数器会随着时钟主频不断地自增&#xff0c;来作为我们的 PC 寄存器。 2. 在这个自动计数器的后面&#xff0c;我们连上一个译码器 译码器还要同时连着我们通过大量的 D 触发器组成的内存。 3. …

实时操作系统的滴答Tick设置多少才合适?

关注星标公众号&#xff0c;不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 最近有读者问了这么一个问题&#xff1a;为啥RTOS的系统滴答&#xff08;Tick&#xff09;默认配置都是1000&#xff0c;我配置为100、10000&#xff0c;或者2000可以不&#xff1f; 相…

linux线程时间片是多少合适,嵌入式linux 线程内usleep与cpu调度时间片大小分析

1.在嵌入式linux平台下调用sleep或者usleep函数的CPU线程调度情况&#xff1f; 2.开发板上使用的时at91sam9261 ARM9 CPU芯片,主频240M&#xff0c;操作系统是linux2.6.28.10版本&#xff0c;那么在该操作系统下的线程调度的切换CPU时间片是多长&#xff0c;网上有地方说是linu…