首页 > 其他分享 >【项目】黑马头条

【项目】黑马头条

时间:2025-01-21 20:30:47浏览次数:3  
标签:return 项目 黑马 token response swagger public cloud 头条

目录结构

在这里插入图片描述
在这里插入图片描述

全局异常

在这里插入图片描述

登录手动加密(md5 + 随机字符串)

【问题】md5是不可逆加密,md5相同的密码每次加密都一样,不安全。
【解决】在md5的基础上手动加盐(salt)处理
在这里插入图片描述
校验过程:
在这里插入图片描述

接口测试

1. ApiFox中测试

2. swagger

  1. 引入依赖
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
</dependency>
  1. 在common模块下添加swagger配置类:
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

   @Bean
   public 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();
   }
}

由于其他model下的包名和common的包名不一样,为了让其他微服务可以扫描到这个配置类,需要在resources目录中添加该配置类的全类名:在这里插入图片描述

  1. swagger的常用注解
  • @Api:修饰整个类,描述Controller的作用
  • @ApiOperation:描述接口
  • @ApiModelProperty:描述属性

成功后启动项目,浏览器访问:http://localhost:51801/swagger-ui.html

3. knife4j(常用)

knife4j继承了swagger,功能比swagger更强大,也会生成接口文档

  1. 引入依赖
<dependency>
     <groupId>com.github.xiaoymin</groupId>
     <artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
  1. 在common中添加配置类:
@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();
    }
}

同样也需要在resources目录中添加该配置类的全类名
成功后启动项目,浏览器访问:http://host:port/doc.html

网关

1. 配置网关

一个父模块(heima-leadnews-gateway)下,放多个子模块(heima-leadnews-app-gateway)。
在这里插入图片描述

  1. 在父模块中引入依赖
<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>
  1. 编写子模块的引导类
package com.heima.app.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient  //开启注册中心
public class AppGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(AppGatewayApplication.class,args);
    }
}
  1. 编写子模块的bootstrap.yml
server:
  port: 51601
spring:
  application:
    name: heima-leadnews-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.140.102:8848
      config:
        server-addr: 192.168.140.102:8848
        file-extension: yml
  1. 在注册中心中引入子模块的配置
    在这里插入图片描述
spring:
  cloud:
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true
        corsConfigurations:
          '[/**]':
            allowedHeaders: "*"
            allowedOrigins: "*"
            allowedMethods:
              - GET
              - POST
              - DELETE
              - PUT
              - OPTION
      routes:
        # 平台管理
        - id: user
          uri: lb://leadnews-user
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix= 1

2. 设置认证过滤器

@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1. 获取request、response对象
        ServerHttpResponse response = exchange.getResponse();
        ServerHttpRequest request = exchange.getRequest();
        // 2. 判断是否是登录
        if(request.getURI().getPath().contains("/login")) {
            // 放行
            return chain.filter(exchange);
        }
        // 3. 获取token
        String token = request.getHeaders().getFirst("token");
        // 4. 判断token是否存在
        if(StringUtils.isBlank(token)) {
            // 拦截
            response.setStatusCode(HttpStatus.UNAUTHORIZED); // 返回401未授权
            return response.setComplete();
        }
        // 5. 判断token是否有效
        try {
            if(!AppJwtUtil.isValidToken(token)) {
            // token过期
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        return chain.filter(exchange); // 放行
        }catch (Exception e) {
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete(); // 抛异常,结束
        }
    }

    /**
     * 优先级设置,值越小,优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

认证过滤器用来拦截前端发过来的请求,写在网关里。

文章列表

表的拆分——垂直分表

在这里插入图片描述
将一个表的字段分散到多个表,每个表存储其中一部分字段

优势

  • 减少IO争抢,减少锁表的几率(查看文章信息与文章内容互不影响)
  • 充分发挥高频数据的操作效率,对文章信息操作的高频率不会被操作文章详情数据的低效率拖累。

拆分规则

  1. 把不常用的字段单独放在一张表
  2. 把text、blob等大字段拆分出来单独放在一张表
  3. 经常组合查询的字段单独放在一张表

文章详情

方案1. 直接查文章内容表

用户某一条文章,根据id去查询文章内容表,返回渲染页面
在这里插入图片描述

方案2. 静态模板展示(效率高)

在这里插入图片描述

把文章的内容变成静态的html文件,把生成之后的文件上传到minio中,并保存生成的html存入文章信息表中(static_url字段),前端渲染的时候,直接获取文章信息表的static_url字段,然后去minIO里获取静态访问页面即可。

Freemaker知识点:Freemarker模板引擎技术

持续更新中…

标签:return,项目,黑马,token,response,swagger,public,cloud,头条
From: https://blog.csdn.net/qq_57882997/article/details/145242891

相关文章

  • IDEA 在远程 Tomcat 上运行项目(转载补充版)
    转载:IDEA在远程Tomcat上运行项目(亲身避坑版)我在操作的时候,遇到个问题,提示Unabletoopendebuggerport(192.168.252.232:54578):java.net.ConnectException"Connectionrefused:connect"原因是,开启JVM调试,需要在2.1小节设置环境变量的时候,加一个JAVA_OPTS="$JAVA_OPTS......
  • 【技巧】优雅的使用 pnpm 单体仓库构建一个高效、灵活的多项目架构
    单体仓库(Monorepo)搭建指南:从零开始单体仓库(Monorepo)是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置,并简化依赖管理。本文将通过实际代码示例,详细介绍如何使用pnpm搭建一个单体仓库。1.创建项目目录mkdirxxx&&cdxxxmk......
  • 2025年带你探索Trello、JIRA替代品:8款顶级项目管理工具全面解析!
    在项目管理的广阔领域中,Trello和JIRA一直是备受瞩目的工具,但随着市场的不断发展,还有许多优秀的替代品值得我们去探索。本文将为你详细解析8款顶级项目管理工具,它们分别是禅道、Trello、Asana、MicrosoftProject、Wrike、Monday.com、Basecamp、Teambition。这些工具各有千秋,涵盖......
  • 项目解决方案:商业区多大厦视频汇聚系统建设解决方案
    目录一.背景说明1.1安全必要性1.2其他必要性二.需求说明2.1录像资源的集中管理需求2.2严格的权限划分需求2.3视频资源的整合与分类需求三.实现难点解析3.1科学实现大厦资源管理的挑战3.2账号管理的科学与安全实现3.3跨平台视频观看功能的实现难点四.方案需要实现特......
  • 又一个新项目完结,炸裂!
    大家好,我是程序员鱼皮。经过了2个月的爆肝,我在自己的编程导航的第11套有保姆级教程的大项目——企业级智能协同云图库平台,完结啦!除了全程直播讲解的、50个小时的保姆级视频教程之外,我还写了整套文字教程(15万多字),细致入微!这还不够,每个项目我都写了详细的简历写法和面......
  • 计算机毕业设计Springboot汉中市项目投资管理系统 基于Springboot框架的汉中市投资项
    计算机毕业设计Springboot汉中市项目投资管理系统e237k6n7(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着经济的快速发展,汉中市作为西部重要的经济和交通枢纽,面临着前所未有的发展机遇。然而,传统的项目投资管理方式已难以满足......
  • 【AI变现】每天一个赚米路子------AI写真变现项目!
    宝子们,今天来和大家唠唠“快手短视频带货爆单秘诀”。今日,我将深入剖析一个独特的AI写真项目,在此之前,让我们先聚焦市场上同类产品的销售业绩。特别值得一提的是,一款聚焦于宝宝与热气球元素的AI生成图片,尽管每张售价高达62元,却仍取得了289笔交易的佳绩,总销售额约达18180元。......
  • 【Python项目实战】爬取中国天气网天气数据
    1.引言在日常生活中,我们经常需要获取实时的天气数据。中国天气网www.weather.com.cn提供了较为丰富的天气数据资源,同时爬取不设过多限制,对新手友好。代码资源:https://download.csdn.net/download/weixin_74773078/90274520(有个性化程序定制需求可私信作者)2.准备工作在开......
  • 项目管理-------十大管理-输入-输出-工具和技术详解
    在项目管理的广袤领域中,存在着十大核心知识领域,它们如同精密运转的齿轮,相互协作,共同推动项目从概念走向成功交付。这些管理领域涵盖了项目从启动到收尾的全生命周期,是确保项目顺利进行、达成目标的关键所在。接下来,让我们逐一深入探究这十大管理领域,包括它们的输入、输出、......
  • 1、疯狂的项目之六拍、四没、三边、只谈
            尽管我们做的大部分项目都会失败,但管理优秀的项目败在方向(项目选择)上,管理拙劣的项目败在执行上。因此,必须通过商业论证对项目进行可行性评估。一般来说,商业论证可从技术可行性、经济可行性、运行环境可行性、法律可行性、社会可行性等方面对项目进行考量。......