资讯头条P2&文章查看

本文介绍了如何在数据库中进行表的垂直拆分以提高查询效率,详细阐述了文章列表查询的设计思路,包括分页加载机制,并展示了如何在SpringBoot项目中集成新模块、配置Nacos和使用MinIO与Freemarker处理大文本内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.文章查看

1. 文章相关的表

主要有3张表

  • ap_article 文章基本信息表
  • ap_article_config 文章配置表
  • ap_article_content 文章内容表

以上三张本来是可以放到一张表中,为了提高查询效率,作了表的垂直拆分,垂直拆分(将一张大的表拆分成若干个较小的表)应该遵循的原则:

  • 不常用的字段单独放在一张表
  • 大字段拆分比如longtext,其中可能包含上万个字符,单独放到一张表中
  • 经常组合查询的字段单独放在一张表中

将这些表导入到一个新的数据库leadnews-article中,然后创建对应的实体类

2. 文章列表的查询

实现思路

  • 1.在默认频道展示10条文章信息
  • 2.可以切换频道查看不同种类文章
  • 3.当用户下拉可以加载最新的文章(分页)本页文章列表中发布时间为最大的时间为依据
  • 4.当用户上拉可以加载更多的文章信息(按照发布时间)本页文章列表中发布时间最小的时间为依据
  • 5.如果是当前频道的首页,前端传递默认参数:
  • maxBehotTime:0(毫秒)
  • minBehotTime:20000000000000(毫秒)—>2063年

解释
用户下拉(加载最新文章)时,按照本页中发布时间最大的作为查询条件,新的文章发布时间会大于这个最大值,用户上拉加载更多文章类似

接口设计
文章列表的获取主要有3个接口:加载首页,加载更多,加载最新

导入模块
1.将模块复制粘贴
2.在该模块的父模块中添加该模块的名称:

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

3.如果2在修改pom.xml之后新模块仍然为灰色,则重新添加文章微服务的pom文件
在这里插入图片描述
4.在nacos中添加对应的配置

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

5.编写业务代码
这里主要对业务层代码解析,dao层和controller层代码比较简单固定,首先参数1表示类型type1加载更多,type2表示加载最新,ArticleHomeDto中包含了最大时间,最小时间,分页size,频道ID,执行流程如下:

  • 校验参数,分页size是最关键的,如果没有传递该参数或者为0,则设置为默认值10;同时在类中定义了一个静态变量表示一次请求的最大条数为50,size也不能超过50;其次是对类型参数校验,如果既不是1也不是2,则设置为默认值1;其三,对文章类型校验,如果没有提供该参数,则不将频道作为查询参数,直接从所有频道的文章中进行查询;
  • 时间校验,分别对最大时间和最小时间进行校验,如果没有就默认为当前时间
  • 查询数据库,封装返回结果
@Service
@Transactional
@Slf4j
public class ApArticleServiceImpl  extends ServiceImpl<ApArticleMapper, ApArticle> implements ApArticleService {

    // 单页最大加载的数字
    private final static short MAX_PAGE_SIZE = 50;

    @Autowired
    private ApArticleMapper apArticleMapper;

    /**
     * 根据参数加载文章列表
     * @param loadtype 1为加载更多  2为加载最新
     * @param dto
     * @return
     */
    @Override
    public ResponseResult load(Short loadtype, ArticleHomeDto dto) {
        //1.校验参数
        Integer size = dto.getSize();
        if(size == null || size == 0){
            size = 10;
        }
        size = Math.min(size,MAX_PAGE_SIZE);
        dto.setSize(size);

        //类型参数检验
        if(!loadtype.equals(ArticleConstants.LOADTYPE_LOAD_MORE)&&!loadtype.equals(ArticleConstants.LOADTYPE_LOAD_NEW)){
            loadtype = ArticleConstants.LOADTYPE_LOAD_MORE;
        }
        //文章频道校验
        if(StringUtils.isEmpty(dto.getTag())){
            dto.setTag(ArticleConstants.DEFAULT_TAG);
        }

        //时间校验
        if(dto.getMaxBehotTime() == null) dto.setMaxBehotTime(new Date());
        if(dto.getMinBehotTime() == null) dto.setMinBehotTime(new Date());
        //2.查询数据
        
        List<ApArticle> apArticles = apArticleMapper.loadArticleList(dto, loadtype);

        //3.结果封装
        ResponseResult responseResult = ResponseResult.okResult(apArticles);
        return responseResult;
    }
    
}

6.在nacos注册中心中gateway网关中添加文章业务的路由

- id: article
  uri: lb://leadnews-article
  predicates:
    - Path=/article/**
  filters:
    - StripPrefix= 1

3. 文章详情的查询与展示

方案一:直接请求查询数据库,由于是大文本效率较低;
方案二:使用Freemarker生成模版文件,然后存储到MINIO分布式文件系统中,并在数据库中记录对应的URL,然后查询时直接查询MINIO即可,不用再查询数据库;
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

3.1 基础语法种类

注释

<#-- 注释 -->

插值表达式: . . . , f r e e m a r k e r 会用真是的值来代替 {...},freemarker会用真是的值来代替 ...,freemarker会用真是的值来代替{…}部分

Hello ${name}

ftl指令:名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑

<# > ftl 指令 </#>

普通文本:仅文本信息

普通文本
3.2 FTL指令

详情参见文档

3.3 freemarker生成html文件
3.4 MINIO分布式文件系统

3.0(本机部署)

Docker安装MINIO
经典3步走,拉取镜像,创建并运行容器,访问minio系统
1.拉取minio镜像

docker pull minio/minio

2.创建并运行容器

docker run -p 9000:9000 \
--name minio -d \
-restart=always \
-e "MINIO_ACCESS_KEY=minio" \
-e "MINIO_SECRET_KEY=minio123" \
-v /home/data:/data \
-v /home/config:/root/.minio \
minio/minio \
server /data

这些命令参数的意义分别是
-p 9000:9000主机与docker的端口映射
–name minio 为容器起名为 minio
-d 容器在后台运行,不阻塞当前终端
-e “MINIO_ACCESS_KEY=minio”
-e “MINIO_SECRET_KEY=minio123” \ 分别指定了登陆minio服务的客户端账号与密码;
-v /home/data:/data \ 目录挂载,将宿主机的/home/data目录挂载到容器中的/data目录上
-v /home/config:/root/.minio \ 目录挂载,将宿主机的/home/config目录挂载到容器中的/root/.minio目录上
minio/minio \ 使用的镜像名称
server /data 启动MinIO容器时指定的命令,这里是启动MinIO服务器并指定数据存储目录为/data

如果想要在阿里云服务器上部署对应的内容,可以参考我的另一篇文章阿里云部署

3.1 封装Minio为Starter

3.1.1 导入minio-starter模块

将xxx-basic包解压到项目目录下>>>在父工程中添加该模块

3.1.2 在其他微服务中引入该模块

第一,在其他微服务中导入heima-file-starter的依赖,比如在文章微服务中导入依赖:

		<dependency>
            <groupId>com.heima</groupId>
            <artifactId>heima-file-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--如果需要生成freemarker文件则使用该依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

第二,在使用minio的微服务中添加配置文件,比如在文章微服务中添加(可以直接添加到nacos配置中心中):

minio:
  accessKey: minio
  secretKey: minio123
  bucket: leadnews
  endpoint: http://47.108.218.101:9000
  readPath: http://47.108.218.101:9000

第三,在对应使用的业务类中注入FileStorageService,样例如下:

 @Autowired
    private FileStorageService fileStorageService;

第四(可选),手动上传生成freemakrer文件用的js与css文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黒猫.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值