黑马头条 项目分析

项目概述

随着智能手机的普及,人们更加习惯于通过手机来看新闻,因此对于移动资讯客户端的需求也越来越高,黑马头条项目正是在这样背景下开发出来

黑马头条项目采用当下火热的"微服务+大数据"技术架构实现。本项目主要着手于获取最新最热新闻资讯,通过大数据分析用户喜好精确推送咨询新闻

相关技术

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索引库中,也就是从文章微服务向搜索微服务同步数据:

      1. 在文章微服务中提供分页查询文章的方法
      2. 将文章微服务的分页查询方法暴露成Feign的接口
      3. 在搜索微服务中调用查询方法获取数据,然后保存到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进行存储

当用户点击搜索框的时候,可以将最近搜索的五条数据展示在搜索界面上

用户也可以点击删除按钮,删除掉搜索记录

1.2. 结构化一下 1.3. 图形化一下 1.3.1. 运营商后台 1.3.2. 商家后台 1.3.3. 网页前台 参考京东 2. 技术选型 前端:angularJS + Bootstrap 后台:SSM( springmvc+spring+mybatis) 数据库:mysql,使用mycat读写分离 开发模式:SOA 服务中间件:dubbox,需要和zookeeper配合使用 注册中心:zookeeper 消息中间件:Activemq,使用spring-jms 负载均衡:nginx 搜索:solr集群(solrCloud),配合zookeeper搭建, 使用spring-data-solor 缓存:redis集群,使用spring-data-redis 图片存储:fastDFS集群 网页静态化:freemarker 单点登录:cas 权限管理:SpringSecurity, 跨域:cros 支付:微信扫描 短信验证:阿里大于 密码加密:BCrypt 富文本:KindEditor 事务:声明式事务 任务调度:spring task 所有的技术,都可能涉及到为什么用?怎么用?用的过程中有什么问题? 3. 框架搭建 3.1. 前端 理解baseControler.js、base.js、base_pagination.js,以及每一个xxxController.js里面都公共的做了些什么。 baseControler.js 分页配置 列表刷新 处理checkBox勾选 xxxControler.js 自动生成增删改查 base_pagination.js 带分页 base.js 不带分页 3.2. dao 使用了mybatis逆向工程 4. 模块开发 逐个模块开发就好 4.1. 学会评估模块难不难 一个模块难不难从几方面考虑。 涉及几张表? 1,2张表的操作还是没有什么难度的。 涉及哪些功能? 增删改查,批量删除。 前端展示? 分页列表、树形、面包屑、三级联动、内容格式化。 4.2. 举几个简单模块的例子 4.2.1. 品牌管理 单表 分页、新增、删除、修改 4.2.2. 规格管理 2张表 分页、新增、删除、修改、显示优化(显示列表内容的一部分) 4.2.3. 模板管理 2张表 分页、新增、删除、修改、显示优化(显示列表内容的一部分) 4.2.4. 分类管理 单表 4.2.5. 商家审核 单表 4.3. 举一个复杂模块 4.3.1. 商品新增 需要插入3张表,tb_goods、tb_goods_desc、tb_item 前端:三级联动、富文本、图片上传、动态生成内容 4.3.2. 商品修改 需要从3张表获取数据,然后进行回显。 4.4. 典型模块设计 4.4.1. 管理后台 商品新增、商品修改 4.4.2. 前台页面 搜索模块实现 购物车模块实现 支付模块实现 秒杀模块实现 5. 开发过程中问题&优化 1.1. 登录 单点登录怎么实现 session怎么共享 1.2. 缓存 哪些场景需要用到redis redis存储格式的选择 怎么提高redis缓存利用率 缓存如何同步 1.3. 图片上传 图片怎么存储 图片怎么上传 1.4. 搜索 ​ 怎么实现 数据量大、 并发量高的搜索 怎么分词 1.5. 消息通知 ​ 哪些情况用到activeMq 1.6. 优化 seo怎么优化 怎么加快访问速度 1.7. 秒杀 ​ 怎么处理高并发 ​ 秒杀过程中怎么控制库存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值