Spring boot+Vue3博客平台:文章搜索与推荐和文章阅读统计模块

news2025/6/21 10:58:48

一、文章搜索与推荐功能

 

1.前端搜索功能实现

在文章列表组件中添加搜索框,用户可以输入关键字进行文章搜索。同时,在搜索结果下方展示相关文章推荐。

<template>
  <div class="article-list">
    <div class="search">
      <input type="text" v-model="searchKeyword" @input="searchArticles" placeholder="Search articles" />
    </div>
    <!-- ... -->
    <div class="related-articles" v-if="relatedArticles.length">
      <h3>Related articles</h3>
      <ul>
        <li v-for="article in relatedArticles" :key="article.id">
          <a :href="'/article/' + article.id">{{ article.title }}</a>
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // ...
      searchKeyword: "",
      relatedArticles: [],
    };
  },
  methods: {
    // ...
    async searchArticles() {
      const response = await this.$http.get("/api/articles/search", {
        params: { keyword: this.searchKeyword },
      });
      this.articles = response.data;
      this.fetchRelatedArticles();
    },
    async fetchRelatedArticles() {
      // 实现根据搜索关键字获取相关文章的逻辑
    },
  },
};
</script>

2.后端搜索功能实现

ArticleController中添加搜索文章的接口。

@GetMapping("/search")
public ResponseEntity<?> searchArticles(@RequestParam String keyword) {
    List<Article> articles = articleRepository.searchByKeyword(keyword);
    return ResponseEntity.ok(articles);
}

ArticleRepository中添加根据关键字搜索文章的方法。

public interface ArticleRepository extends JpaRepository<Article, Long> {
    @Query("SELECT a FROM Article a WHERE a.title LIKE %:keyword% OR a.content LIKE %:keyword%")
    List<Article> searchByKeyword(@Param("keyword") String keyword);
}

二、文章阅读统计模块

1.前端阅读次数显示

在文章详情组件中,展示文章阅读次数。

<template>
  <div class="article-detail">
    <h1>{{ article.title }}</h1>
    <p class="meta">Views: {{ article.views }}</p>
    <!-- ... -->
  </div>
</template>

2.后端阅读次数更新

ArticleController中添加更新阅读次数的接口。

@PutMapping("/{articleId}/views")
public ResponseEntity<?> updateArticleViews(@PathVariable Long articleId) {
    Optional<Article> optionalArticle = articleRepository.findById(articleId);
    if (optionalArticle.isPresent()) {
        Article article = optionalArticle.get();
        article.setViews(article.getViews() + 1);
        articleRepository.save(article);
        return ResponseEntity.ok("Article views updated successfully.");
    } else {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Article not found.");
    }
}

3.更新阅读次数

在文章详情页加载完成后,调用更新阅读次数接口。

export default {
  // ...
  async mounted() {
    await this.fetchArticle();
    await this.incrementArticleViews();
  },
  methods: {
    // ...
    async incrementArticleViews() {
      await this.$http.put(`/api/articles/${this.articleId}/increment-views`);
    },
  },
};

通过上述代码,我们优化了更新阅读次数的功能。在文章详情页加载完成后,调用更新阅读次数接口,使阅读次数增加。在后端,我们更改了接口名称以更好地反映其功能。

在这里,我们将补充文章详情页面中文章推荐的功能。为了给用户提供更好的阅读体验,我们可以在文章详情页面底部展示相关文章推荐。

  1. 前端相关文章推荐

在文章详情组件中添加相关文章推荐部分。

<template>
  <div class="article-detail">
    <!-- ... -->
    <div class="related-articles" v-if="relatedArticles.length">
      <h3>Related articles</h3>
      <ul>
        <li v-for="article in relatedArticles" :key="article.id">
          <a :href="'/article/' + article.id">{{ article.title }}</a>
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // ...
      relatedArticles: [],
    };
  },
  async mounted() {
    await this.fetchArticle();
    await this.incrementArticleViews();
    await this.fetchRelatedArticles();
  },
  methods: {
    // ...
    async fetchRelatedArticles() {
      const response = await this.$http.get(`/api/articles/${this.articleId}/related`);
      this.relatedArticles = response.data;
    },
  },
};
</script>

2.后端相关文章推荐

ArticleController中添加获取相关文章的接口。

@GetMapping("/{articleId}/related")
public ResponseEntity<?> getRelatedArticles(@PathVariable Long articleId) {
    Optional<Article> optionalArticle = articleRepository.findById(articleId);
    if (optionalArticle.isPresent()) {
        Article article = optionalArticle.get();
        List<Article> relatedArticles = articleRepository.findRelatedArticles(article.getCategoryId(), articleId);
        return ResponseEntity.ok(relatedArticles);
    } else {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Article not found.");
    }
}

ArticleRepository中添加根据分类获取相关文章的方法。

public interface ArticleRepository extends JpaRepository<Article, Long> {
    // ...
    @Query("SELECT a FROM Article a WHERE a.category.id = :categoryId AND a.id <> :articleId")
    List<Article> findRelatedArticles(@Param("categoryId") Long categoryId, @Param("articleId") Long articleId);
}

通过上述代码,我们实现了文章详情页面中相关文章推荐的功能。在前端,我们根据文章的分类展示相关文章。在后端,我们创建了一个根据分类获取相关文章的接口,忽略当前正在查看的文章。这样,用户在阅读文章时可以方便地找到其他相关文章。

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

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

相关文章

手写vuex4源码(六)命名空间实现

一、命名空间使用 在子模块对象中添加 namespaced&#xff1a;true&#xff0c;为模块开启命名空间功能&#xff1b; 开启命名空间功能&#xff0c;相当于为每个模块添加独立的作用域&#xff0c;实现模块间状态和事件的隔离&#xff1b; 二、命名空间实现逻辑 在模块注册阶…

Vue3+Typescript+Vitest单元测试环境+组件测试基础篇

上一章我们把环境配置好了&#xff0c;并且进行了最简单的一个单元测试Vue3TypescriptVitest单元测试环境基础用例篇 现在让我们去编写一个最简单的组件 这个代码包含最简单的部分&#xff0c;就是一个按钮&#xff0c;接受一个内容插槽、自身有一个button样式 了解相关API…

JavaWeb——File类和InputStream,OutputStream类详解

目录 一、File类 1、定义 2、属性 3、构造方法 4、方法 &#xff08;1&#xff09;、获取文件路径 &#xff08;2&#xff09;、文件的创建和删除 &#xff08;3&#xff09;、目录的创建 二、InputStream和OutputStream 1、InputStream &#xff08;1&#xff09;、…

从头创建一个新的浏览器,这合理吗?

从头构建一个新浏览器&#xff1f;这如果是不是个天大的“伪需求”&#xff0c;便是一场开发者的噩梦&#xff01; 要知道&#xff0c;如果没有上百亿的资金和数百名研发工程师的投入&#xff0c;从头开始构建一个新的浏览器引擎&#xff0c;几乎是不可能的。然而SerenityOS系统…

AI风暴 :文心一言 VS GPT-4

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 文心一言 VS GPT-4 文心一言&#xff1a;知识增强大语言模型百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#…

代码随想录Day49

今天继续学习动规解决完全背包问题。 322.零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;…

虹科分享 | 使用IOTA检查受3CX DLL旁加载攻击影响的客户端 | 网络性能监控

2023年3月底&#xff0c;VoIP制造商3CX&#xff08;流行的互联网语音协议&#xff08;VoIP&#xff09;专用交换机&#xff08;PBX&#xff09;电话系统的开发商&#xff09;遭到DLL旁加载攻击。他们的软件被大约60万家公司和1200万用户使用&#xff0c;其中包括梅赛德斯-奔驰、…

人工智能中的监督学习到底是啥?其应用方向有哪些?

人工智能&#xff08;Artificial Intelligence, AI&#xff09;是一门致力于使机器能够像人类一样进行智能决策和行为的学科。监督学习&#xff08;Supervised Learning&#xff09;是人工智能领域中的一种重要学习方式&#xff0c;通过使用标注好的样本数据来训练模型&#xf…

零基础如何入门网络安全?【2023最新】

前言 最近收到不少关注朋友的私信和留言&#xff0c;大多数都是零基础小友入门网络安全&#xff0c;需要相关资源学习。其实看过的铁粉都知道&#xff0c;之前的文里是有过推荐过的。新来的小友可能不太清楚&#xff0c;这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

Linux 操作系统原理 — 内核协议栈收包/发包流程

目录 文章目录目录关键技术NIC DMAKernel 中的 sk_buff 与 sk_bufferKernel 中的 Rx/Tx RingBuffer Descriptor Table中断收包机制NAPI 收包机制多队列网卡内核协议栈收包/发包流程概览内核协议栈收包流程详解驱动程序层&#xff08;数据链路层&#xff09;VLAN 协议族Linux Br…

基于MATLAB的语音识别仿真系统

本文实现的语音识别系统&#xff0c;主要是对语音识别的特征参数的提取和识别模型的匹配&#xff0c;进行深入的研究。首先,对语音识别进行了概述&#xff0c;给出了语音识别的系统框架。然后就是如何实现语音识别的问题&#xff0c;这个过程可分为两个部分:第一个是语音特征参…

【Ruby 2D】【unity learn】控制敌人随机运动以及动画控制

前两天考完蓝桥杯稍微休息了一下&#xff0c;昨天做了一个动画控制&#xff0c;但是想到写出来可能会字很多&#xff0c;我就搁置到今天来写了&#xff0c;unity learn是一个官方教程平台&#xff0c;里面有unity assert store的配套教程&#xff0c;全是文档&#xff0c;比看视…

#java mavn安装图像验证码jar失败kaptcha-2.3.2.jar#

场景&#xff1a;在登录的时候添添加图形验证码功能&#xff0c;使用 com.google.code.kaptcha开发图像验证码&#xff0c;。通过pom引入依赖一直红色提示&#xff0c;找打不到依赖,如图所示 原因&#xff1a;kaptcha-2.3.jar 没有放在mavan的中央仓库 解决方案&#xff0c;需…

Hive笔记

目录 第3章 Hive数据类型 第 4 章 DDL 数据定义 第5章DML数据操作 第6章 查询&#xff08;语法与MySQL一样&#xff09; 第 7 章 分区表和分桶表 第 8 章 函数 第3章 Hive数据类型 如array<map<string,int>> 集合数据类型工作中不是很常用&#xff0c;最常用…

Web 攻防之业务安全:Response状态值修改测试(修改验证码返回值 绕过限制.)

Web 攻防之业务安全&#xff1a;Response状态值修改测试 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台&#xff08;操作系统、数据库&#xff0c;中间件等&#xff09;、业务系统自身&#xff08;软件或设备&#xff09;、业务…

2.17、多生产者-多消费者进程

桌子上有一只盘子&#xff0c;每次只能向其中放入一个水果。爸爸专向盘子中放苹果&#xff0c;妈妈专向盘子中放橘子&#xff0c;儿子专等着吃盘子中的橘子&#xff0c;女儿专等着吃盘子中的苹果。只有盘子空时&#xff0c;爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己…

Linux系统应用编程(四)Linux多线程

本篇文章主要内容&#xff1a;Linux系统应用编程&#xff08;四&#xff09;Linux多线程一、线程和进程的区别二、Linux多线程1.线程的使用 - 创建、退出、等待2.线程的同步 - 互斥量&#xff08;1&#xff09;互斥量的理解&#xff08;略&#xff09;&#xff08;2&#xff09…

你真的会自动化测试?自动化测试技术选型抉择

自动化测试框架 在学习自动化测试或者实践自动化测试时&#xff0c;我们一定会对一个名词不陌生&#xff0c;那就是“自动化测试框架”&#xff0c;而有些人也将Selenium、Appium这样的工具也称之为“自动化测试框架”&#xff0c;那么到底自动化测试框架如何理解呢&#xff1…

多种文字翻译软件-翻译常用软件

整篇文档翻译软件 整篇文档翻译软件是一种实现全文翻译的自动翻译工具&#xff0c;它能够快速、准确地将整篇文档的内容翻译成目标语言。与单词、句子翻译不同&#xff0c;整篇文档翻译软件不仅需要具备准确的语言识别和翻译技术&#xff0c;还需要考虑上下文语境和文档格式等多…

【Linux】一文带你探究网络世界的基石

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;计算机网络…