资讯头条P3自媒体搭建

自媒体素材管理与文章管理

一.后台搭建

1.1 搭建自媒体网关

导入网关模块>>>在网关模块的pom.xml文件中添加该子模块>>>刷新maven

 	<modules>
        <module>heima-leadnews-app-gateway</module>
        <!--新增-->
        <module>heima-leadnews-wemedia-gateway</module> 
    </modules>

添加nacos配置

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]': # 匹配所有请求
            allowedOrigins: "*" #跨域处理 允许所有的域
            allowedMethods: # 支持的方法
              - GET
              - POST
              - PUT
              - DELETE
      routes:
        # 平台管理
        - id: wemedia
          uri: lb://leadnews-wemedia
          predicates:
            - Path=/wemedia/**
          filters:
            - StripPrefix= 1

1.2 搭建自媒体微服务

导入自媒体微服务模块>>>微服务模块的pom.xml文件中添加该子模块>>>刷新maven

	<modules>
        <module>heima-leadnews-user</module>
        <module>heima-leadnews-article</module>
        <module>heima-leadnews-wemedia</module>
    </modules>

添加nacos配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/leadnews_wemedia?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: root
# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  # 设置别名包扫描路径,通过该属性可以给包中的类注册别名
  type-aliases-package: com.heima.model.wemedia.pojos

创建数据库leadnews_wemedia>>>导入sql脚本

1.3 导入实体类

找到xxx-model模块>>>在com.heima.model下导入wemedia包

二.前台搭建

通过nginx的虚拟主机功能,使用同一个nginx访问多个项目

2.1 解压前端工程到指定目录

我的前端工程和nginx都放到了E:\JavaCode\heima-leadnews-front目录下

2.2 新增wemedia前端工程配置文件,并在外围配置文件nginx.conf中引入该配置文件

配置文件

upstream  heima-wemedia-gateway{
    server localhost:51602; # 自媒体模块网关端口
}

server {
	listen 8802; # 前端访问端口
	location / {
		root E:/JavaCode/heima-leadnews-front/wemedia-web/;
		index index.html;
	}
	
	location ~/wemedia/MEDIA/(.*) {   # 请求映射
		proxy_pass http://heima-wemedia-gateway/$1;
		proxy_set_header HOST $host;  # 不改变源请求头的值
		proxy_pass_request_body on;  #开启获取请求体
		proxy_pass_request_headers on;  #开启获取请求头
		proxy_set_header X-Real-IP $remote_addr;   # 记录真实发出请求的客户端IP
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  #记录代理信息
	}
}

2.3 启动nginx,启动自媒体微服务和对应网关

三.自媒体素材管理

3.1 自媒体素材管理&图片上传

3.1.1 添加自媒体素材对应的实体类

直接拷贝到对应的包下即可

3.1.2 上传素材实现思路

在这里插入图片描述
(1).前端发送上传图片请求,类型为MultipartFile

(2).网关进行token解析后,把解析后的用户信息存储到header中
需要在网关的全局认证过滤器中添加代码,用于解析用户信息到header中;

		//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();
            }
            //获得token解析后中的用户信息
            Object userId = claimsBody.get("id");
            //----------------------------新增部分------------------------\\
            //在header中添加新的信息
            ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
                httpHeaders.add("userId", userId + "");
            }).build();
            //重置header
            exchange.mutate().request(serverHttpRequest).build();
             //----------------------------新增部分------------------------\\
        } catch (Exception e) {
            e.printStackTrace();
        }

(3).自媒体微服务使用拦截器获取到header中的的用户信息,并放入到threadlocal中

3.1.3 新增ThreadLocal工具类WmThreadLocalUtil

WmThreadLocalUtil工具类会便于操作ThreadLocalUtil对象;

public class WmThreadLocalUtil {
    
    private final static ThreadLocal<WmUser> WM_USER_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 添加用户
     * @param wmUser
     */
    public static void  setUser(WmUser wmUser){
        WM_USER_THREAD_LOCAL.set(wmUser);
    }

    /**
     * 获取用户
     */
    public static WmUser getUser(){
        return WM_USER_THREAD_LOCAL.get();
    }

    /**
     * 清理用户
     */
    public static void clear(){
        WM_USER_THREAD_LOCAL.remove();
    }
    
}
3.1.4 在heima-leadnews-wemedia中新增拦截器

拦截器的作用,从header中取出登录用户ID存入当前线程;在 com.heima.wemedia.interceptor 包下创建拦截器WmTokenInterceptor

@Slf4j
public class WmTokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //得到header中的信息
        String userId = request.getHeader("userId");
        Optional<String> optional = Optional.ofNullable(userId);
        if(optional.isPresent()){
            //把用户id存入threadloacl中
            WmUser wmUser = new WmUser();
            wmUser.setId(Integer.valueOf(userId));
            WmThreadLocalUtil.setUser(wmUser);
            log.info("wmTokenFilter设置用户信息到threadlocal中...");
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("清理threadlocal...");
        WmThreadLocalUtil.clear();
    }
}
3.1.5 通过配置类WebMvcConfig配置拦截器生效

拦截所有请求

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new WmTokenInterceptor()).addPathPatterns("/**");
    }

}
3.1.6 自媒体微服务集成heima-file-starter

由于要用到上传minio的功能,因此需要集成heima-file-starter(该模块中提供了上传文件(图片,html文件),下载,删除文件的功能。
在自媒体微服务中导入依赖

	 <dependency>
        <groupId>com.heima</groupId>
        <artifactId>heima-file-starter</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

自媒体微服务的配置中心添加以下配置

minio:
  accessKey: minio
  secretKey: minio123
  bucket: leadnews
  endpoint: http://47.108.218.130:9000
  readPath: http://47.108.218.130:9000
3.1.7 具体实现

三步走,mapper>>>service>>>controller;
问题一
中间遇到了一个问题:上传文件到minio时失败

// 报错日志
minio put file error.
The request signature we calculated does not match the signature you provided. 
Check your key and signing method.

报错日志大意如下:

我们计算的请求签名与您提供的签名不匹配。
检查您的密钥和签名方法。

推测大概可能是配置文件中的minio的秘钥与创建minio容器时指定的不一致,我在创建时使用的秘钥是11位,而在配置文件中使用的是8位因此报错,修改后重启。该报错消失返回了fileId;
问题二
在解决了上述错误之后,又遇到了报错信息:

 catch exception:null
 java.lang.NullPointerException
	at com.heima.wemedia.service.impl.WmMaterialServiceImpl.uploadPicture
	(WmMaterialServiceImpl.java:56)

这个就不翻译了,推测应该是在业务层中出现了内容为空的情况,根据报错信息定位到对应的代码,经过检查发现并不是上传文件返回结果的问题,文件已经被上传到了minio,并且返回了相应的地址;问题是拦截器无法直接从请求的请求头中获得"userId",那么说明网关在过滤请求的时候确实是从请求中解析了token,但是没有把解析出来的内容userId直接添加到请求头中,因此要在heima-leadnews-wemedia-gateway模块的包com.heima.wemedia.gateway.filter下的AuthorizeFilter中步骤5中添加如下代码:

		//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();
            }
            //-------------------添加部分--------------------//
            //获得token解析后中的用户信息
            Object userId = claimsBody.get("id");
            //在header中添加新的信息
            ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
                httpHeaders.add("userId", userId + "");
            }).build();
            //重置header
            exchange.mutate().request(serverHttpRequest).build();
            //-------------------添加部分--------------------//
        } catch (Exception e) {
            e.printStackTrace();
        }

此时图片上传成功,并且可以正常回显,数据库中的数据已经更新:

3.2 自媒体素材管理&素材列表查询

在xxx-model模块对应包下新增WmMaterialDto

@Data
public class WmMaterialDto extends PageRequestDto {
    /**
     * 1 收藏
     * 0 未收藏
     */
    private Short isCollection;
}

三步走mapper>>>service>>>controller
另外,由于用到分页查询,需要在引导类中添加mp的分页拦截器

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
}

在这里插入图片描述

四.自媒体文章管理

4.1 文章列表查询

在xxx-model模块对应包下新增WmMaterialDto

@Data
public class WmNewsPageReqDto extends PageRequestDto {
    /**
     * 状态
     */
    private Short status;
    /**
     * 开始时间
     */
    private Date beginPubDate;
    /**
     * 结束时间
     */
    private Date endPubDate;
    /**
     * 所属频道ID
     */
    private Integer channelId;
    /**
     * 关键字
     */
    private String keyword;
}

对应如下:

三步走mapper>>>service>>>controller
主要来说一下业务层逻辑:
在这里插入图片描述
该查询是一个多条件分页查询

  • 1.检查查询条件
  • 2.分页参数检查
  • 3.获取当前登录人的信息
  • 4.使用lambdaQueryWrapper封装多个条件用于查询
  • 5.返回结果

针对一些核心代码进行说明:

		 //2.分页条件查询
        IPage page = new Page(dto.getPage(),dto.getSize());
        //创建了LambdaQueryWrapper 对象,并指定了泛型参数为 WmNews,这表示要查询的实体类型为 WmNews
        LambdaQueryWrapper<WmNews> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //状态精确查询
        if(dto.getStatus() != null){
        	//表示该查询条件为:数据库中字段为"status"且值等于dto.getStatus()的值的WmNews
            lambdaQueryWrapper.eq(WmNews::getStatus,dto.getStatus());
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/496766.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Aurora插件安装

介绍 Latext是一种基于TEX的排版系统。 CTeX中文套装是基于Windows下的MiKTeX系统&#xff0c;集成了编辑器WinEdt和PostScrip处理软件Ghostscript和GSview等主要工具。CTeX中文套装在MikTeX的基础上增加了对中文的完整支持。 CTeX&#xff1a; CTeX套装 - CTEX 下载安装 然后…

【Java程序设计】【C00345】基于Springboot的船舶监造管理系统(有论文)

基于Springboot的船舶监造管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…

Day50:WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

目录 文件包含-原理&分类&利用&修复 文件读取 文件写入 代码执行 远程利用思路 黑盒利用-VULWEB 白盒利用-CTFSHOW-伪协议玩法 78-php&http协议 79-data&http协议 80-81-日志包含 87-php://filter/write&加密编码 88-data&base64协议 …

韩顺平Java | C21网络编程

1 网络的相关概念 ip地址的组成&#xff1a;网络地址 主机地址 A类&#xff1a;0 ~ 2^7-1 0 ~ 127 B类&#xff1a;128 ~ 1282^6-1 128 ~ 191 C类&#xff1a;192 ~ 1922^5-1 192 ~ 223 D类&#xff1a;224 ~ 2242^4-1 224 ~ 239 E类&#xff1a;240 ~ 2402^3-1 240 ~ 2…

Unity PS5开发 天坑篇 之 URP管线与HDRP管线部署流程以及出包介绍04

目录 一, URP管线、HDRP管线下的Unity项目部署 1. PS5开发论坛关于Unity可支持的版本说明: 2. URP管线下的项目与部署 2.1 Build PS5 URP Project 2.2 运行画面 3. HDRP管线下的项目与部署 3.1 附上可以运行的画面: 4. PS5打包方式介绍 4.1 PC串流调试模式: Build Typ…

selenium自动化测试

selenium自动化测试 1、Javaselenium环境搭建2、测试&#xff0c;打开任意网页3、selenium 常见的Api3.1元素定位findElement3.1.1 css 选择语法3.1.2 xpath 选择语法 1、Javaselenium环境搭建 下载chromedriver&#xff0c;版本要与Chrome浏览器版本一致。 下载之后将chro…

算法打卡day25|回溯法篇05|Leetcode 491.递增子序列、46.全排列、47.全排列 II

算法题 Leetcode 491.递增子序列 题目链接:491.递增子序列 大佬视频讲解&#xff1a;递增子序列视频讲解 个人思路 和昨天的子集2有点像&#xff0c;但昨天的题是通过排序&#xff0c;再加一个标记数组来达到去重的目的。 而本题求自增子序列&#xff0c;是不能对原数组进行…

springboot检测脚本

import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) session requests.session()# 从文本文件中读取 with open(dic.txt, r) as file:paths file.readlines()# 移除每个末尾的换行符 paths [path.strip() for path in pa…

线程创建方式、构造方法和线程属性

欢迎各位&#xff01;&#xff01;&#xff01;推荐PC端观看 文章重点&#xff1a;学会五种线程的创造方式 目录 1.开启线程的五种方式 2.线程的构造方法 3.线程的属性及获取方法 1.开启线程的五种方式 创造线程的基本两步&#xff1a;&#xff08;1&#xff09;使用run方法…

并发编程之Callable方法的详细解析(带小案例)

Callable &#xff08;第三种线程实现方式&#xff09; Callable与Runnable的区别 Callable与Runnable的区别 实现方法名称不一样 有返回值 抛出了异常 ​class Thread1 implements Runnable{Overridepublic void run() { ​} } ​ class Thread2 implements Callable<…

x86的内存分段机制

8086 是 Intel 公司第一款 16 位处理器&#xff0c;诞生于 1978 年&#xff0c;所以说它很古老。 一.8086 的通用寄存器 8086 处理器内部共有 8 个 16 位的通用处理器&#xff0c;分别被命名为 AX、 BX、 CX、 DX、 SI、 DI、 BP、 SP。如下图所示。 “通用”的意思是…

【JavaSE】String类详解

目录 前言 1. 什么是String类 1.1 String的构造 1.2 String类的基本操作&#xff1a;打印、拼接、求字符串长度 2. String类的常用方法 2.1 字符串查找 2.2 字符串替换 2.3 字符串拆分 2.4 字符串截取 2.5 字符串和其他类型的转换 2.6 去除字符串左右两边的空格 3.…

日赚2000万的短剧,还能火多久?

沈瑶初十年前就义无反顾地爱上高禹川&#xff0c;当他们两人再次相遇&#xff0c;她主动靠近高禹川&#xff0c;不料&#xff0c;她却意外怀孕&#xff0c;高禹川为了负责选择领证&#xff0c;但不公布两人的关系...... 这是一部情绪稳定女航医与傲娇疯批男机长的虐恋剧。在这个…

【MongoDB】一问带你深入理解什么是MongDB,MongoDB超超详细保姆级教程

目录 1、MongoDB概述2、MongoDB 主要特点2.1、文档2.2、集合2.3、数据库2.4、数据模型 3、Windows安装MongoDB3.1、下载MongoDB3.2、安装MongoDB3.3、配置MongoDB 4、Linux安装MongoDB4.1、下载MongoDB4.2、解压安装4.3、安装一个可视化工具 5、MongoDB基本操作及增删改查5.1、…

【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)

问题描述&#xff1a; 需要使用当前时间、日期&#xff0c;可以使用 SQL 中的 CURDATE() 、NOW()、CURTIME()运算符 案例&#xff1a; INSERT INTO table_name(current_time, column_name2,...) VALUES (NOW(),, ...)规则(Date 相关函数)&#xff1a; 规则(Date数据类型)

构建一个包含mvn命令的Java 17基础镜像

前言 官方提供的openjdk基础镜像&#xff0c;不包含mvn命令&#xff0c;无法用容器来打包代码。 在官方提供的镜像基础上安装maven。 前期准备&#xff0c;需要安装好docker。 一、安装maven 1、下载openjdk基础镜像&#xff0c;执行如下代码。 docker pull openjdk:17-j…

19. 变量

文章目录 一、变量二、变量的定义格式 一、变量 变量&#xff1a;程序中临时存储数据的容器&#xff0c;在程序执行过程中&#xff0c;其值有可能发生改变的量&#xff08;数据&#xff09;。但是这个容器中只能存一个值。 应用场景&#xff1a;在我们登录页面的时候&#xf…

JavaSE day14笔记

第十四天课堂笔记 课上: 适当做笔记课下 : 总结 , 读代码 , 反复敲代码 , 做练习 数组★★★ 数组 : 存储多个 同一类型 的容器格式 :数组类型 : 引用数据类型, new运算符在堆中 分配一块连续的存储空间 , 系统会给数组元素默认初始化 , 将该数组的引用赋值给数组名 引用数据…

3月28号总结

java学习 1.this关键字 this关键字可以代表当前对象的引用。它可以在类的方法中使用&#xff0c;用于引用调用该方法的对象。通过this关键字&#xff0c;可以访问类的成员变量和方法&#xff0c;以及调用其他构造函数。 举一个实例来学习一下this关键字的作用。 比如&#…

【unity】如何汉化unity Hub

相信大家下载安装unity后看着满操作栏的英文&#xff0c;英文不好的小伙伴们会一头雾水。但是没关系你要记住你要怎么高速运转的机器进入中国&#xff0c;请记住我给出的原理&#xff0c;不懂不代表不会用啊。现在我们就来把编译器给进行汉化。 第一步&#xff1a;我们打开Uni…