项目概述
随着智能手机的普及,人们更加习惯于通过手机来看新闻,因此对于移动资讯客户端的需求也越来越高,黑马头条项目正是在这样背景下开发出来
黑马头条项目采用当下火热的"微服务+大数据"技术架构实现。本项目主要着手于获取最新最热新闻资讯,通过大数据分析用户喜好精确推送咨询新闻
相关技术
SpringBoot:用于构建独立运行的后端服务。
SpringCloud Alibaba:提供微服务架构的框架套件,支持服务注册、负载均衡、熔断等功能。
MyBatis/MyBatis-Plus:方便对数据库进行操作,处理业务逻辑。
Nacos : 作为微服务项目的注册中心、配置中心。
Gateway:作为微服务网关,处理路由、认证与限流。
RabbitMQ : 消息中间件,用来实现服务间的异步调用,降低耦合。
Seata:用于分布式事务管理,确保数据一致性。
OpenFeign:用于服务之间的HTTP请求调用。
MySQL:作为主数据库,存储订单、用户、服务等核心业务数据。
Redis:用于缓存高频访问数据(如门户、服务信息、订单信息),提升系统性能。
Redisson:实现分布式锁,保障数据一致性。
Elasticsearch:用于服务项目搜索等功能,支持全文检索。
Nginx:实现反向代理、负载均衡。
MinIO:采用Golang实现的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档
Freemarker:生成静态页面的技术
MongoDB:由C++语言编写,是一个跨平台的面向文档的数据库,它支持的数据结构非常松散,是类似JSON的BSON格式,因此可以存储比较复杂的数据类型
主要流程
管理端
管理员使用:主要用于系统管理、文章分类管理、用户审核等操作
主要职责:
1.频道管理:频道是文章的分类,管理员可以对频道进行增删改查操作,频道属于自媒体库,因此应该将其操作放入自媒体微服务,先创建出自媒体微服务,导入依赖添加配置,频道管理有频道列表查询和频道新增两个功能,频道列表查询可以实现根据频道名称模糊查询分页频道列表,使用MybatisPlus的分页查询实现,新增频道,将前端传入的信息,保存到频道信息表中,最后修改网关。
2.用户审核列表:我们系统的读者用户数据保存到了leadnews_user库中的ap_user表中,如果有的读者想称为媒体人则需要进行申请,一旦读者发起申请,系统就会将其数据保存到leadnews_user库中的ap_user_realname表中,然后我们就可以从这个表中查询出数据来,然后做审核,用户审核的功能包括按照状态查询用户认证列表,用户审核的驳回,审核通过。按照状态查询用户认证列表功能使用MybatisPlus的分页查询实现,用户审核的驳回功能将状态修改成已驳回的状态即可,审核通过,1.需要修改用户库的ap_user_realname表的status为9(审核通过),2.修改用户库的ap_user表的flag=1(自媒体人),3.将用户信息复制到自媒体库的wm_user表,4.将用户信息复制到文章库的ap_author表--heima-leadnews-article ,最后通过开启分布式事务保证数据的一致性。
自媒体端
自媒体人使用:主要用于自媒体人发布文章等操作
主要职责:
1.素材管理:在保存素材时,引入了Minio用来存储图片,MinIO是采用Golang实现的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档,MinIO非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,自媒体用户登录自媒体端后台可以上传图片,后台将图片上传到minio,同时要保存一份数据到表中,方便后期管理。保存图片之前,需要先知道是哪一位自媒体人登录了当前系统,也就是需要确定哪个自媒体人上传了图片,具体流程:1,上传图片需要携带token 2,首先请求到网关服务,解析token是否有效,如果有效,解析后把用户数据设置到下一级请求的header中 3,在自媒体微服务中使用拦截器解析header中的数据,拿到用户数据,设置到当前本地线程中4,在具体业务代码中可以从当前本地线程中获取用户,完成之后,就可以实现图片上传功能,素材保存到了leadnews_media库的wm_material表中,调用Minio的相关接口即可完成。素材列表查询,前台可以传入查询条件 : 全部 , 收藏,图片根据创建时间倒序排列,使用MybatisPlus的分页查询实现即可
2.内容列表:在保存素材时,引入了Minio用来存储图片,MinIO是采用Golang实现的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档,MinIO非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,自媒体用户登录自媒体端后台可以上传图片,后台将图片上传到minio,同时要保存一份数据到表中,方便后期管理。保存图片之前,需要先知道是哪一位自媒体人登录了当前系统,也就是需要确定哪个自媒体人上传了图片,具体流程:1,上传图片需要携带token 2,首先请求到网关服务,解析token是否有效,如果有效,解析后把用户数据设置到下一级请求的header中 3,在自媒体微服务中使用拦截器解析header中的数据,拿到用户数据,设置到当前本地线程中4,在具体业务代码中可以从当前本地线程中获取用户,完成之后,就可以实现图片上传功能,素材保存到了leadnews_media库的wm_material表中,调用Minio的相关接口即可完成。素材列表查询,前台可以传入查询条件 : 全部 , 收藏,图片根据创建时间倒序排列,使用MybatisPlus的分页查询实现即可
3.自媒体文章发布:1.先判断是新增文章还是修改文章,判断依据是前端是否传过来ID,如果没传ID,则是新增操作,否则就是修改操作2.如果是新增文章,则将文章的标题,内容,封面图片以及内容图片收集起来,将收集的内容先保存到自媒体人的表中,此时还处于未发布的状态,接下来就判断文章是否是草稿,如果不是草稿就将所有数据保存到中间表,最后执行发布操作3.如果是修改文章,则先删除中间表的数据,然后继续执行与新增文章一样的操作,最后保存到中间表并发布
4.自媒体文章机审:自媒体文章保存之后,需要进行审核,审核通过之后才能保存到文章微服务给互联网用户查看。内容安全是识别服务,支持对图片、视频、文本、语音等对象进行多样化场景检测,有效降低内容违规风险,黑马头条发布文章中有内容可能违规,如何有效避免风险,可以使用第三方接口进行内容检测,目前很多平台都支持内容检测,如阿里云、腾讯云、百度AI、网易云等国内大型互联网公司都对外提供了API,按照性能和收费来看,黑马头条项目使用的就是阿里云的内容安全接口,使用到了图片和文本的审核。机审的流程:1.自媒体端发布文章后,开始审核文章,审核的主要是审核文章的内容(文本内容和图片) 2.借助第三方提供的接口审核文本 3.借助第三方提供的接口审核图片,图片存储到minIO中,在没有部署外网可以访问的域名情况下需要先下载才能审核 4.如果审核成功,则需要在文章微服务中创建app端需要的文章,这个过程需要调用文章微服务保存文章,5.如果审核失败,则需要修改自媒体文章的状态,status:2 审核失败 status:3 转到人工审核。为了解决等待阿里平台返回响应结果的问题,采用了异步线程的方式审核文章,解耦合,性能提升。
5.文章人工审核:自媒体文章如果没有自动审核成功,而是到了人工审核(自媒体文章状态为3),需要在admin端人工处理文章的审核。平台管理员可以查看待人工审核的文章信息,可以通过(状态改为4)或驳回(状态改为2),也可以通过点击查看按钮,查看文章详细信息,查看详情后可以根据内容判断是否需要通过审核。最后根据判断结果,修改文章状态即可。
6.文章上下架:可以将已经发布的文章进行上下架的功能,根据前端传过来的状态,将消息发送到MQ,再写一个监听器负责监听消息,如果收到消息,修改数据库的状态即可。
7.发表评论:由于评论数量可能很大,并且评论的数据的重要性并不是很大,所以我们项目采用了MongoDB数据库来存储评论,MongoDB由C++语言编写,是一个跨平台的面向文档的数据库,它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系(MySQL)数据库的产品,它支持的数据结构非常松散,是类似JSON的BSON格式,因此可以存储比较复杂的数据类型,量大,存储的数据价值低。发表评论:文章详情页下方可以查看评论信息,按照点赞数量倒序排列,展示评论内容、评论的作者、点赞数、回复数、时间默认查看5条评论,如果想查看更多,可以点击加载更多进行分页登录用户可以针对当前文章发布评论。其中需要注意的是:评论必须在登录的情况下才能发布,所以需要验证用户获取用户信息,添加拦截器,并且评论内容不为空且不超过140字,评论内容需要做文本反垃圾检测,评论数据修改较为频繁,并且数据库比较大,这里最终存储在mongo数据库中
评论列表:根据文章id查询评论列表,按照评论发布时间倒序排列 ,直接使用MybatisPlus的分页查询实现
app端
普通用户使用:主要用于文章的查看、评论等操作
主要职责:
1.定时发布文章:发布文章时可以选择未来的时间,比如第二天早上8点发布,那么到第二天早上8点就需要发布文章。由于没有固定的开始时间,我们项目采用的是延迟任务,技术采用的是Redisson,Redisson是一个在Redis的基础上实现的工具集,提供了使用Redis的最简单和最便捷的方法,Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。当我们向Redis保存一个内容的时候,内容会首先进入到ZSET中按照延迟时间进行排序,一旦说到了发布时间, 内容就会从ZSET中来到LIST中等待消费,在自媒体微服务写一个监听器,负责监听List,有内容就取出来,有消息就执行根据文章id查询文章内容并发布。
2.app端文章列表:在默认频道展示10条最新文章信息(发布时间倒序),文章不是删除且不是下架,可以切换频道查看不同种类文章(频道id)
当用户下拉可以加载最新的文章信息(按照发布时间倒序排列),发布时间晚(大)于第一条的
当用户上拉可以加载更多的文章(按照发布时间倒序排列),发布时间早(小)于最后一条的
这三个功能可以通过一个方法来实现,直接使用MybatisPlus的分页查询就可以完成以上三个功能
3.app端文章详情:在文章列表中点击文章进入到文章详情查看页面,页面显示内容包括:标题、作者、作者头像、发布时间、是否关注、喜欢、不喜欢、分享、评论、收藏、转发、猜你喜欢、打赏等内容。根据ID查询所需内容即可。在进行文章信息查询是会出现不能查询出文章信息,原因:目前文章id为long类型,在转换json传递到前端以后精度丢失,所以查询详情的文章id也是丢失精度的id,不能查询数据。因为js数字类型最大长度为16位,而java的long类型的最大长度为19位。所以如果数据长度大于16位的话传输到前端就会丢失精度。为了解决这个问题,我们采用的是 直接在字段上添加注解,明确指定JSON转换的时候是目标类型。
4.app端页面静态化:我们文章页面的访问量可能很大,每次都从数据库中查询数据,会对数据库造成很大压力,此时可以将文章详情页面生成固定的静态页面,放入到nginx或者minio中,这样后面查询就不再访问数据库了,目前主流的生成静态页面的技术有Freemarker和Themleaf,我们本项目选择Freemarker。首先根据文章内容通过模板技术生成静态的html文件,把生成好的html访问路径存入文章中并且将生成的静态html文件存入到分布式系统中,最后前端访问静态页面即可。
5.文章搜索:用户输入关键字搜索文章列表,为了加快检索的效率,查询的时候不会直接从mysql数据库中查询文章,需要在elasticsearch中进行高速检索,这就需要把文章相关的数据存储到es索引库中,也就是从文章微服务向搜索微服务同步数据:
ⅰ在文章微服务中提供分页查询文章的方法
ⅱ将文章微服务的分页查询方法暴露成Feign的接口
ⅲ在搜索微服务中调用查询方法获取数据,然后保存到es中
6.搜索记录:系统可以记录下用户每次的搜索记录(记录内容包含:设备标识、用户标识、搜索关键字、搜索时间),由于搜索记录数据量比较大,价值比较低,因此我们采用mongodb进行存储,当用户点击搜索框的时候,可以将最近搜索的五条数据展示在搜索界面上 ,用户也可以点击删除按钮,删除掉搜索记录
核心模块
黑马头条后台管理系统
主要用于系统管理、文章分类管理、用户审核等操作
管理员登录
管理员在页面输入用户名和密码,请求提交到nginx,nginx反向代理到网关,网关通过路径匹配再讲请求路由到管理员微服务,管理员自己的登录,则放到管理员微服务heima-leadnews-admin
频道管理
●频道是文章的分类,管理员可以对频道进行增删改查操作
频道属于自媒体库,因此应该将其操作放入自媒体微服务heima-leadnews-article
用户审核列表
管理员查询操作查看用户审核列表,如果有的读者想称为媒体人则需要进行申请,则管理员可以进行审批的通过和驳回,这个放在用户微服务heima-leadnews-user
-审核通过
审核通过,则需要进行以下的操作,自媒体微服务保存用户,文章微服务heima-leadnews-article保存作者
-审核失败
审核不通过则用户申请失败,不对其他微服务和表进行改动
文章人工审核
自媒体文章如果没有自动审核成功,而是到了人工审核,需要在admin端人工处理文章的审核,平台管理员可以查看待人工审核的文章信息
也可以通过点击查看按钮,查看文章详细信息,查看详情后可以根据内容判断是否需要通过审核
文章上下架
黑马头条自媒体系统
主要用于自媒体人素材管理和发布文章等操作
自媒体登录
自媒体人在页面输入用户名和密码,请求提交到nginx,nginx反向代理到网关,网关通过路径匹配再讲请求路由到自媒体微服务,媒体人自己的登录,则放到自媒体微服务heima-leadnews-article
素材管理
自媒体用户登录自媒体端后台可以上传图片,后台将图片上传到minio,同时要保存一份数据到表中,方便后期管理。
内容列表
-频道列表
-文章列表
-文章查看
文章发布
定时发布文章
发布文章时可以选择未来的时间,比如第二天早上8点发布,那么到第二天早上8点就需要发布文章
●延迟任务:没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件
审核通过时发送消息,到达时间后发布文章
黑马头条APP
主要用于文章的查看、评论等操作
文章列表
1在默认频道展示10条最新文章信息(发布时间倒序),文章不是删除且不是下架,可以切换频道查看不同种类文章(频道id)
2当用户下拉可以加载最新的文章信息(按照发布时间倒序排列),发布时间晚(大)于第一条的
3当用户上拉可以加载更多的文章(按照发布时间倒序排列),发布时间早(小)于最后一条的
文章详情
在文章列表中点击文章进入到文章详情查看页面,页面显示内容包括:标题、作者、作者头像、发布时间、
是否关注、喜欢、不喜欢、分享、评论、收藏、转发、猜你喜欢、打赏等内容。
页面静态化
我们文章页面的访问量可能很大,每次都从数据库中查询数据,会对数据库造成很大压力
此时可以将文章详情页面生成固定的静态页面,放入到nginx或者minio中,这样后面查询就不再访问数据库了
目前主流的生成静态页面的技术有Freemarker和Themleaf,我们本项目选择Freemarker
发表评论
●文章详情页下方可以查看评论信息,按照点赞数量倒序排列,展示评论内容、评论的作者、点赞数、回复数、时间
●默认查看5条评论,如果想查看更多,可以点击加载更多进行分页
●登录用户可以针对当前文章发布评论
评论列表
按照评论发布时间倒序排列,分页查询
文章搜索
根据条件搜索文章:根据标题分词分页查询,按照发布时间倒序排序
搜索记录
系统可以记录下用户每次的搜索记录(记录内容包含:设备标识、用户标识、搜索关键字、搜索时间)
由于搜索记录数据量比较大,价值比较低,因此我们采用mongodb进行存储
当用户点击搜索框的时候,可以将最近搜索的五条数据展示在搜索界面上
用户也可以点击删除按钮,删除掉搜索记录
面试题
如何保证ES和MySQL的数据一致性
RabbitMQ工作模式有哪些
Redis的数据类型有哪些
MySQL索引的创建原则
SpringCloud组件有哪些