14. 实现业务功能--帖子列表

news2024/9/29 13:29:54

1. 版块帖子列表

  • 对应版块中显示的帖子列表以发布时间降序排列(desc)
  • 不传入版块 Id 返回所有帖子

2. 实现逻辑

  1. 用户点击某个版块或首页时,将版块 Id 做为参数向服务器发送请求
  2. 服务器接收请求,并获取版块 Id,查询对应版块下的所有帖子
  3. 返回查询结果

如果 ID 为空,表示首页下的帖子列表,查询所有;

如果 ID 不为空,表示对应版块的帖子列表。

3. 参数要求

参数名描述类型默认值条件
boardId板块 IdLong可为空

4. 修改扩展 Mapper.xml

在 extension 目录下新建 ArticleExtMapper.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.ArticleMapper">
  <!--  定义表关系的结果集映射  -->
  <resultMap id="AllInfoResultMap" type="com.example.demo.model.Article" extends="ResultMapWithBLOBs">
    <!--    关联对象  -->
    <association property="user" resultMap="com.example.demo.dao.UserMapper.BaseResultMap" columnPrefix="u_"/>
  </resultMap>
  <!--  查询所有的帖子集合  -->
  <select id="selectAll" resultMap="AllInfoResultMap">
    select
    u.id as u_id,
    u.nickname as u_nickname,
    u.gender as u_gender,
    u.avatarUrl as u_avatarUrl,
    a.id,
    a.boardId,
    a.userId,
    a.title,
    a.visitCount,
    a.replyCount,
    a.likeCount,
    a.state,
    a.deleteState,
    a.createTime,
    a.updateTime
    from t_article as a ,t_user as u
    where a.userId = u.id
    and a.deleteState = 0
    order by a.createTime desc;
  </select>
</mapper>

5. 修改 DAO

在 dao 包下的 ArticleMapper 中添加方法声明:
/**
     * 主⻚中显⽰的帖⼦列表以发布时间降序排列
     * 查询所有的帖子集合
     * @return 帖⼦列表
     */
    List<Article> selectAll ();

6. 创建 Service 接口

在 services 包下新建 IArticleService 接口:

public interface IArticleService {
    /**
     * 主⻚中显⽰的帖⼦列表以发布时间降序排列
     * 查询所有的帖子集合
     * @return 帖⼦列表
     */
    List<Article> selectAll ();
}

7. 实现 Service 接口

@Slf4j
@Service
public class ArticleServiceImpl implements IArticleService {
    
    @Resource
    ArticleMapper articleMapper;
    
    @Override
    public List<Article> selectAll() {
        // 调用 DAO
        List<Article> result = articleMapper.selectAll();
        // 返回结果
        return result;
    }
}

8. 生成测试方法

@SpringBootTest
class ArticleServiceImplTest {

    @Resource
    private IArticleService articleService;
    @Resource
    private ObjectMapper objectMapper;
            
    @Test
    void selectAll() throws JsonProcessingException {
        List<Article> articles = articleService.selectAll();
        System.out.println(objectMapper.writeValueAsString(articles));
    }
}

9. 实现 Controller

在 ArticleController 中提供对外的 API 接口:

@Api(tags = "帖子接口")
@Slf4j
@RestController
@RequestMapping("/article")
public class ArticleController {

    @Resource
    private IArticleService articleService;

    @ApiOperation("获取板块帖⼦列表")
    @GetMapping("/getAllByBoardId")
    public AppResult<List<Article>> getAllByBoardId(){
        // 调用 Service
        List<Article> articles = articleService.selectAll();
        // 判断是否为空
        if(articles == null){
            articles = new ArrayList<>();
        }
        // 返回结果
        return AppResult.success(articles);
    }
}

10. API 访问测试

11. 实现前端界面

// ========================= 获取帖子列表 =======================
    // 成功后,调用listBuildArticleList()方法,构建帖子列表
    $.ajax({
      type: 'GET',
      url: 'article/getAllByBoardId' + queryString,
      // 成功回调
      success: function(respData){
        if(respData.code == 0){
          // 成功
          listBuildArticleList(respData.data);
        }else{
          // 失败
          $.toast({
              heading : '警告',
              text : respData.message,
              icon : 'Warning'
            }); 
          }
        },
        // 失败回调
        error: function(){
          $.toast({
              heading : '错误',
              text : '出错了,请联系管理员',
              icon : 'error'
            });
        }

    });

12. 获取版块信息

12.1 修改扩展 Mapper.xml

  <!--  查询所有的帖子集合  -->
  <select id="selectByBoardId" resultMap="AllInfoResultMap">
    select
    u.id as u_id,
    u.nickname as u_nickname,
    u.gender as u_gender,
    u.avatarUrl as u_avatarUrl,
    a.id,
    a.boardId,
    a.userId,
    a.title,
    a.visitCount,
    a.replyCount,
    a.likeCount,
    a.state,
    a.deleteState,
    a.createTime,
    a.updateTime
    from t_article as a ,t_user as u
    where a.userId = u.id
    and a.deleteState = 0
    and a.boardId = #{boardId,jdbcType=BIGINT}
    order by a.createTime desc;
  </select>

12.2 修改 DAO

/**
     * 根据板块ID 查询帖子列表
     * @param boardId 板块Id
     * @return List<Article>
     */
    List<Article> selectByBoardId (Long boardId);

12.3 创建 Service 接口

    /**
     * 根据板块ID 查询帖子列表
     * @param boardId 板块Id
     * @return List<Article>
     */
    List<Article> selectByBoardId (Long boardId);

12.4 实现 Service 接口

@Override
    public List<Article> selectByBoardId(Long boardId) {
        // 非空校验
        if(boardId == null || boardId <= 0){
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));
        }
        // 调用 DAO
        List<Article> result = articleMapper.selectByBoardId(boardId);
        return result;
    }

12.5 测试

    @Test
    void selectByBoardId() throws JsonProcessingException {
        List<Article> articles = articleService.selectByBoardId(1l);
        System.out.println(objectMapper.writeValueAsString(articles));
        
        articles = articleService.selectByBoardId(2l);
        System.out.println(objectMapper.writeValueAsString(articles));
        
        articles = articleService.selectByBoardId(20l);
        System.out.println(objectMapper.writeValueAsString(articles));
    }

测试结果如下:

12.6 实现 Controller

@Api(tags = "帖子接口")
@Slf4j
@RestController
@RequestMapping("/article")
public class ArticleController {

    @Resource
    private IArticleService articleService;

    @ApiOperation("获取板块帖⼦列表")
    @GetMapping("/getAllByBoardId")
    public AppResult<List<Article>> getAllByBoardId((@ApiParam(value = "版块Id") @RequestParam(value = "boardId", required = false) Long boardId) {
        // 声明返回的集合
        List<Article> articles;
        // 根据传入的 boardId 来获取不同的集合
        if(boardId == null){
            // 首页,查询所有
            articles = articleService.selectAll();
        }else {
            // 查询对应的板块的帖子集合
            articles = articleService.selectByBoardId(boardId);
        }
        // 判断是否为空
        if(articles == null){
            articles = new ArrayList<>();
        }
        // 返回结果
        return AppResult.success(articles);
    }
}

12.7 测试结果

13. 获取指定板块列表

客户端发送请求传入版块Id,服务器响应对应板块的详情。

参数名

描述

类型默认值条件
id版块 Idlong必要

13.1 创建 Service 接口

    /**
     * 根据 ID 查询板块信息
     * @param id 版块Id
     * @return Board
     */
    Board selectById (Long id);

13.2 实现 Service 接口

    @Override
    public Board selectById(Long id) {
        // 非空校验
        if (id == null || id <= 0) {
            // 打印日志
            log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
            // 抛出异常
            throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));
        }
        // 调用 DAO
        Board board = boardMapper.selectByPrimaryKey(id);
        return null;
    }

13.3 测试

    @Test
    void selectById() throws JsonProcessingException {
        Board board = boradService.selectById(1l);
        System.out.println(objectMapper.writeValueAsString(board));

        board = boradService.selectById(2l);
        System.out.println(objectMapper.writeValueAsString(board));

        board = boradService.selectById(20l);
        System.out.println(objectMapper.writeValueAsString(board));
    }

测试结果:

13.4 实现 Controller

    @ApiOperation("获取版块详情")
    @GetMapping("/getById")
    public AppResult<Board> getBoardInfo(@Param("版块Id") @RequestParam("id") @NonNull Long id){
        // 调用 Service
        Board board = boradService.selectById(id);
        // 返回结果
        return AppResult.success(board);
    }

13.5 实现前端界面

    // ========================= 获取版块信息 =======================
    // 
    function getBoardInfo (boardId) {
      if (!boardId) {
        return;
      }
      // 发送请求, 成功后,显示版块相关信息
      $.ajax({
        type: 'GET',
        url: 'board/getById?id=' + boardId,
        // 成功回调
        success: function(respData){
          if(respData.code == 0){
            // 成功
            let board = respData.data;
            // 1. 设置版块名
            $('#article_list_board_title').html(board.name);
            // 2. 设置版块下的贴子数
            $('#article_list_count_board').html('帖子数量:' + board.articleCount);
            // 3. 是否显示帖子标签
            $('#article_list_count_board').show();
          }else{
            // 失败
            $.toast({
                heading : '警告',
                text : respData.message,
                icon : 'Warning'
              }); 
            }
          },
          // 失败回调
          error: function(){
            $.toast({
                heading : '错误',
                text : '出错了,请联系管理员',
                icon : 'error'
              });
          }
      });
    }

 

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

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

相关文章

多领域模型效果测试指南

在我最近的写作创作实践中&#xff0c;我尝试了使用不同的模型来测试它们的效果。通过这些测试&#xff0c;我发现每个模型在不同任务上的表现和适用性都有所不同。 首先&#xff0c;对于写作创作领域&#xff0c;我发现生成式模型可以很好地生成创意性的文章和故事。当我使用…

STM32都学什么

一、什么是STM32? 对于STM32&#xff0c;从字面意思上来理解&#xff0c;ST是意法半导体&#xff0c;M是Microelectronics的缩写&#xff0c;其中32表示的是32位&#xff0c;那么整合起来理解就是&#xff1a;STM32就是指的ST公司开发的32位微控制器。在如今的32位控制器中&am…

【二叉树构建与遍历1】先序遍历+中序遍历构建一个二叉树并输出后序遍历 C++实现

思路&#xff1a; 先来一个例子&#xff1a; 先序遍历序列为&#xff1a;FDXEAG 中序遍历序列为&#xff1a;XDEFAG 要根据先序序列和中序序列确定这个二叉树&#xff0c;通用的步骤为&#xff1a; 1.根据先序序列的第一位确定这棵树的根&#xff1b; 2.在中序序列中找到…

LVS之keepalived

1、keepalived 概述 总结&#xff1a;Keepalived 软件就是通过VRRP协议来实现高可用功能。 应用场景&#xff1a;企业应用中&#xff0c;单台服务器承担应用存在单点故障的危险 单点故障一旦发生&#xff0c;企业服务将发生中断&#xff0c;造成极大的危害 VRRP通信原理&…

【CASS精品教程】CAD2016+CASS11.0安装教程(附CASS11.0安装包下载)

文章目录 一、CAD2016_x64安装二、CASS11.0安装1. 安装程序2. 安装补丁3. 安装注册机三、CASS11.0下载地址一、CAD2016_x64安装 CASS11.0.0.8 支持 AutoCAD2010-2023,大家可以根据自己的情况安装对应的版本,本文以CAD2016为例,CAD安装过程略去。 二、CASS11.0安装 点击订…

Pytorch 手写数字识别-MINIST 数据集训练

CNN 前期文章我们分享了tensorflow 的手写数字识别的训练以及识别过程,有网友私信是否写一下pytorch训练识别过程,本期文章我们来分享一下pytorch的手写数字训练人工智能TensorFlow(十六)MNIST手写数字识别 说到图片识别就不得不提卷积神经网络,我们会在后期详细介绍,或者…

docker启动容器失败:STATUS:‘ Exited ‘

先查看正在运行的容器 # 查看正在运行的容器 docker ps # 查看所有的docker容器 docker ps -a 这个时候如果显示的是up状态&#xff0c;那就是启动成功了。 状态为exited&#xff0c;所以没有启动成功。 解决问题 1、移除镜像 先把镜像移除掉 //移除一个镜像(出现问题可以移…

一篇文章看懂前端性能优化(2023详解)

性能优化这个词我们经常会在前端的工作或面试中遇到&#xff0c;这个东西说难好像也并不怎么难&#xff0c;毕竟谁都能说上几点。但是如果你想在工作上遇到各种场景的性能瓶颈时都有直击本质的性能方案&#xff0c;或者在面试时让面试官眼前一亮&#xff0c;那就不能只拘泥于『…

nodejs+vue+elementui大学生就业管理系统hch86

本学生就业管理系统以vue作为框架&#xff0c;b/s模式以及MySql作为后台运行的数据库&#xff0c; 本系统主要包括首页&#xff0c;个人中心&#xff0c;辅导员管理&#xff0c;学生管理&#xff0c;企业管理&#xff0c;工作类型管理&#xff0c;企业招聘管理&#xff0c;投简…

TOWE机房电源线的用料成分及导体材质大揭秘

在IDC数据机房中&#xff0c;各种制式的电源转换线是一个连接设备端与供电端的重要配件产品。平常我们在各大电商平台搜索电源转换线产品&#xff0c;会发现同一种电源线&#xff0c;有卖几十块钱的&#xff0c;也有十块钱不到的。同一产品出现较大价差的现象&#xff0c;最根本…

信息监理工程师-----监理内容

文章目录 信息监理工程师的监理内容1 四控1.1 质量控制1.2 进度控制1.3 投资控制1.4 变更控制 2 三管2.1 信息管理2.2 合同管理2.3 信息安全管理 3 一协调3.1 协调 信息监理工程师的监理内容 监理活动的主要内容被概括为"四控,三管,一协调". 1 四控 四控&#xff…

ES:一次分片设计问题导致的故障

### 现象&#xff1a; 1. 单节点CPU持续高 2.写入骤降 3.线程池队列积压&#xff0c;但没有reject 4.使用方没有记录日志 ### 排查 1.ES监控 只能看到相应的结果指标&#xff0c;无法反应出原因。 2.ES日志&#xff1a;大量日志打印相关异常&#xff08;routate等调用栈&a…

docker安装Oracle11gR2

文章目录 目录 文章目录 前言 一、前期准备 二、具体配置 2.1 配置oracle容器 2.2 配置navicat连接 总结 前言 使用docker模拟oracle环境 一、前期准备 安装好docker #拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g #启动 docker run -…

书单背景图怎么设置,怎么把书单转成视频?

书单是一种记录阅读内容的方式&#xff0c;它可以让我们更好地跟踪我们的阅读进度并分享我们的阅读心得。有时候你想要将自己的书单转化为视频格式来与更多人分享&#xff0c;但你不知道如何做到这一点。在本文中&#xff0c;我将向你介绍如何设置书单背景图并将书单转成视频。…

操作系统-笔记-第二章-锁

目录 二、第二章——【锁】 1、互斥锁​编辑 2、信号量机制 &#xff08;1&#xff09;信号量机制——整形信号量 &#xff08;2&#xff09;信号量机制——记录信号量 &#xff08;3&#xff09;总结&#xff08;重点——记录信号量&#xff09; 3、信号量机制——实现…

数仓分类及基本概念

【数仓建设系列之二】数仓分类及基本概念 随着移动互联网的快速发展&#xff0c;数据的生产也成几何式的增长&#xff0c;传统意义上的数据库已经无法满足日益增长的需求&#xff0c;建设一个好的数仓&#xff0c;不仅可以为企业的决策和发展带来具有价值的指导意义&#xff0c…

Python自动化测试代理程序可用性

在网络爬虫和数据采集过程中&#xff0c;代理服务器扮演着重要的角色。然而&#xff0c;代理服务器的可用性经常会受到影响&#xff0c;给爬虫工作带来一定的挑战。本文将介绍如何使用Python自动化测试代理程序的可用性&#xff0c;为您提供具备实际操作价值的解决方案。让我们…

同为科技(TOWE)65W快充插排插线板,快人一步,乐享生活

在现代生活中&#xff0c;手机、平板、笔记本电脑等电子设备已成为人们生活中不可或缺的工具。然而&#xff0c;诸多电子产品在充电方面也出现了许多问题&#xff0c;比如充电过程慢、插口不够用、充电时温度过高等。随着随着技术的更新迭代&#xff0c;满足高功率、多接口且多…

机器学习与模式识别2:KNN(k近邻)

一、简介 首先&#xff0c;随机选择K个对象&#xff0c;而且所选择的每个对象都代表一个组的初始均值或初始的组中心值&#xff0c;对剩余的每个对象&#xff0c;根据其与各个组初始均值的距离&#xff0c;将他们分配各最近的&#xff08;最相似&#xff09;小组&#xff0c;然…

Redis原理剖析

一、Redis简介 Redis是一个开源的&#xff0c;基于网络的&#xff0c;高性能的key-value数据库&#xff0c;弥补了memcached这类key-value存储的不足&#xff0c;在部分场合可以对关系数据库起到很好的补充作用&#xff0c;满足实时的高并发需求。 Redis跟memcached类似&#…