资讯头条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- DELETEroutes:# 平台管理- id: wemediauri: lb://leadnews-wemediapredicates:- 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.Driverurl: jdbc:mysql://localhost:3306/leadnews_wemedia?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: 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;   # 记录真实发出请求的客户端IPproxy_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();//重置headerexchange.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 {@Overridepublic 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;}@Overridepublic 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 {@Overridepublic 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: miniosecretKey: minio123bucket: leadnewsendpoint: http://47.108.218.130:9000readPath: 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:nulljava.lang.NullPointerExceptionat 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();//重置headerexchange.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,这表示要查询的实体类型为 WmNewsLambdaQueryWrapper<WmNews> lambdaQueryWrapper = new LambdaQueryWrapper<>();//状态精确查询if(dto.getStatus() != null){//表示该查询条件为:数据库中字段为"status"且值等于dto.getStatus()的值的WmNewslambdaQueryWrapper.eq(WmNews::getStatus,dto.getStatus());}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大学生租房系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 1. 系统功能…

【ppt技巧】给PPT添加打开加密密码的方法

PPT文件制作完成之后&#xff0c;为了保证内容泄露或者修改&#xff0c;我们可以给PPT文件设置一个打开密码来保护文件&#xff0c;今天分享PPT加密方法给大家。希望能够帮助大家保护好自己的PPT文件。 如果想要其他人需要输入正确的密码才能够打开文件查看并编辑&#xff0c;…

如何在CentOS使用Docker搭建Rsshub服务并实现无公网IP远程访问

文章目录 1. Docker 安装2. Docker 部署Rsshub3. 本地访问Rsshub4. Linux安装Cpolar5. 配置公网地址6. 远程访问Rsshub7. 固定Cpolar公网地址8. 固定地址访问 Rsshub是一个开源、简单易用、易于扩展的RSS生成器&#xff0c;它可以为各种内容生成RSS订阅源。 Rsshub借助于开源社…

Python-VBA编程500例-024(入门级)

字符串写入的行数(Line Count For String Writing)在实际应用中有着广泛的应用场景。常见的应用场景有&#xff1a; 1、文本编辑及处理&#xff1a;在编写或编辑文本文件时&#xff0c;如使用文本编辑器或文本处理器&#xff0c;经常需要处理字符串并确定其在文件中的行数。这…

C#开发者必备!快速掌握onnxruntime实现YOWOv2视频动作检测技术!

C#开发者必备&#xff01;快速掌握onnxruntime实现YOWOv2视频动作检测技术&#xff01; 目录 介绍 效果 模型信息 项目 代码 Form1.cs YOWOv2.cs 下载 介绍 YOWOv2: A Stronger yet Efficient Multi-level Detection Framework for Real-time Spatio-temporal Action…

持续集成流水线介绍(CI)

目录 一、概述 二、持续集成的典型操作流程 2.1 概述 2.2 持续集成的操作流程图 2.3 持续集成关键流程说明 三、构建持续集成流水线的方式 3.1 依托云厂商能力 3.2 采用开源产品 3.3 企业自研 四、构建持续化集成流水线 4.1 基于GitHub的持续集成流水线&#xff08;公…

【氮化镓】GaN器件中关态应力诱导的损伤定位

概括总结&#xff1a; 这项研究通过低频1/f噪声测量方法&#xff0c;探究了在关态&#xff08;OFF-state&#xff09;应力作用下&#xff0c;AlGaN/GaN高电子迁移率晶体管&#xff08;HEMTs&#xff09;中由应力引起的损伤的定位。研究中结合了电致发光&#xff08;EL&#xf…

如何合理利用chatgpt写高质量论文,10分钟速成(四)

演示站点&#xff1a; https://www.cnsai.net/ 论文模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、文章结构剖析 如果我们经常去写文章或者是去看别人的文章&#xff0c;你会发现文章分为以下几部分 标题大纲前言/导语正文&#xff08;不同的结构&#xff09;结尾呼…

Linux查看重启时间,关机时间,运行时长的指令

Linux查看重启时间&#xff0c;关机时间&#xff0c;运行时长的指令 查看上次启动时间查看系统重启时间查看关机时间查看运行时长 这里测试环境为Ubuntu 16.04 查看上次启动时间 who -b可以通过who --help查看who指令的更多功能 查看系统重启时间 可以通过下面的方式来进行…

1. Java概述

文章目录 1.Java语言概述1.1 Java介绍1.1.1 软件开发概述1.1.2 计算机语言1.1.3 Java 简史1.1.4 Java 技术体系平台1.1.5 Java在各领域的应用1.1.6 Java语言特点1.1.7 Java核心机制一-Java虚拟机1.1.8 Java核心机制二-垃圾回收1.1.9 Java开发工具 1.2 Java环境搭建1.2.1 JDK、J…

农村分散式生活污水分质处理及循环利用技术指南

标准已完成意见征集&#xff1a; 本文件给出了农村分散式生活污水分质处理及循环利用的总则、污水收集、污水分质处理、资源化利用、利用模式、运维管理等的指导。 本文件适用于农村分散式生活污水分质处理及循环利用的设施新建、扩建和改建工程的设计、施工与运维。 注:本文件…

算法系列--动态规划--回文子串系列

&#x1f495;"我们好像在池塘的水底&#xff0c;从一个月亮走向另一个月亮。。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;算法系列–动态规划–回文子串系列 今天为大家带来的是算法系列--动态规划--回文子串系列(1),本文重点掌握如何快速判…

Echarts地图之——如何给地图添加外边框轮廓

有时候我们希望给地图外围加一圈边框来增加美感 但实际情况中&#xff0c;我们需要把国界的边框和各个省份属于国界的边框相吻合&#xff0c;否则就会造成两者看起来是错位的感觉 这就需要我们把echarts registerMap的全国省份json和国界边框json的坐标相一致。 这个json我们可…

佳能机械制造将莅临2024第13届生物发酵产品与技术装备展

参展企业介绍 过滤与分离设备专业制造商 •碟式离心机及机组模块、系统 •卧式螺旋卸料沉降离心机及系统 江苏佳能机械制造有限公司位于中国“龙虾之都”——江苏盱眙&#xff0c;地处淮安西南部&#xff0c;淮河下游&#xff0c;洪泽湖南岸&#…

网络七层模型之表示层:理解网络通信的架构(六)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【LeetCode热题100】124.二叉树的最大路径和(二叉树)

一.题目要求 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root …

Doris实践——叮咚买菜基于OLAP引擎的应用实践

目录 前言 一、业务需求 二、选型与对比 三、架构体系 四、应用实践 4.1 实时数据分析 4.2 B端业务查询取数 4.3 标签系统 4.4 BI看板 4.5 OLAP多维分析 五、优化经验 六、总结 原文大佬介绍的这篇Doris数仓建设实践有借鉴意义的&#xff0c;这些摘抄下来用作沉淀学…

docker-compose mysql

使用docker-compose 部署 MySQL&#xff08;所有版本通用&#xff09; 一、拉取MySQL镜像 我这里使用的是MySQL8.0.18&#xff0c;可以自行选择需要的版本。 docker pull mysql:8.0.18二、创建挂载目录 mkdir -p /data/mysql8/log mkdir -p /data/mysql8/data mkdir -p /dat…

软件测试基础理论、测试用例及设计方法、易混淆概念总结【软件测试】

一.软件测试基础理论 1.软件定义 软件是计算机系统中与硬件相互依存的一部分&#xff0c;包括程序、数据以及与其相关文档 的完整集合。 程序是按事先设计的功能和性能要求执行的指令序列&#xff1b; 数据是使程序能正常操作信息的数据结构&#xff1b; 文档是与程序开发、维…

对form表单对象中数组中的字段进行校验的方法

当对form表单中&#xff0c;数组readings中的字段进行校验时&#xff0c;prop和rules绑定要写成动态的&#xff0c;如下代码 <div v-for"(item,index) in form.readings"><el-form-item label"上次读数" > <!--prop"scds"-->…