SSM - Springboot - MyBatis-Plus 全栈体系(三十五)

news2024/11/18 17:45:57

第八章 项目实战

四、后台功能开发

2. 首页模块开发

2.1 查询首页分类
2.1.1 需求描述

在这里插入图片描述

  • 进入新闻首页,查询所有分类并动态展示新闻类别栏位
2.1.2 接口描述
  • url 地址:portal/findAllTypes

  • 请求方式:get

  • 请求参数:无

  • 响应数据:

    • 成功
    {
       "code":"200",
       "message":"OK"
       "data":{
                [
                    {
                        "tid":"1",
                        "tname":"新闻"
                    },
                    {
                        "tid":"2",
                        "tname":"体育"
                    },
                    {
                        "tid":"3",
                        "tname":"娱乐"
                    },
                    {
                        "tid":"4",
                        "tname":"科技"
                    },
                    {
                        "tid":"5",
                        "tname":"其他"
                    }
                ]
        }
    }
    
2.1.3 代码实现
  • controller
@RestController
@RequestMapping("portal")
@CrossOrigin
public class PortalController {

    @Autowired
    private TypeService typeService;

    /**
     * 查询全部类别信息
     * @return
     */
    @GetMapping("findAllTypes")
    public Result findAllTypes(){
        //直接调用业务层,查询全部数据
        List<Type> list = typeService.list();
        return Result.ok(list);
    }
}
2.2 分类查询首页头条信息
2.2.1 需求描述

在这里插入图片描述

  • 客户端向服务端发送查询关键字,新闻类别,页码数,页大小
  • 服务端根据条件搜索分页信息,返回含页码数,页大小,总页数,总记录数,当前页数据等信息,并根据时间降序,浏览量降序排序
2.2.2 接口描述
  • url 地址:portal/findNewsPage
  • 请求方式:post
  • 请求参数:
{
    "keyWords":"马斯克", // 搜索标题关键字
    "type":0,           // 新闻类型
    "pageNum":1,        // 页码数
    "pageSize":10     // 页大小
}
  • 响应数据:

    • 成功
    {
       "code":"200",
       "message":"success"
       "data":{
          "pageInfo":{
            "pageData":[
              {
                "hid":"1",                     // 新闻id
                "title":"小帽课堂宣布 ... ...",   // 新闻标题
                "type":"1",                    // 新闻所属类别编号
                "pageViews":"40",              // 新闻浏览量
                "pastHours":"3" ,              // 发布时间已过小时数
                "publisher":"1"                // 发布用户ID
            },
            {
                "hid":"1",                     // 新闻id
                "title":"小帽课堂宣布 ... ...",   // 新闻标题
                "type":"1",                    // 新闻所属类别编号
                "pageViews":"40",              // 新闻浏览量
                "pastHours":"3",              // 发布时间已过小时数
                "publisher":"1"                // 发布用户ID
            },
            {
                "hid":"1",                     // 新闻id
                "title":"小帽课堂宣布 ... ...",   // 新闻标题
                "type":"1",                    // 新闻所属类别编号
                "pageViews":"40",              // 新闻浏览量
                "pastHours":"3",               // 发布时间已过小时数
                "publisher":"1"                // 发布用户ID
            }
            ],
          "pageNum":1,    //页码数
          "pageSize":10,  // 页大小
          "totalPage":20, // 总页数
          "totalSize":200 // 总记录数
        }
      }
    }
    
2.2.3 代码实现
2.2.3.1 准备条件实体类
@Data
public class PortalVo {

    private String keyWords;
    private Integer type;
    private Integer pageNum = 1;
    private Integer pageSize = 10;
}
2.2.3.2 controller
/**
 * 首页分页查询
 * @return
 */
@PostMapping("findNewPage")
public Result findNewPage(@RequestBody PortalVo portalVo){
    Result result = headlineService.findNewPage(portalVo);
    return result;
}
2.2.3.3 service
@Service
public class HeadlineServiceImpl extends ServiceImpl<HeadlineMapper, Headline>
    implements HeadlineService{

    @Autowired
    private HeadlineMapper headlineMapper;

    /**
     * 首页数据查询
     * @param portalVo
     * @return
     */
    @Override
    public Result findNewPage(PortalVo portalVo) {

        //1.条件拼接 需要非空判断
        LambdaQueryWrapper<Headline> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(!StringUtils.isEmpty(portalVo.getKeyWords()),Headline::getTitle,portalVo.getKeyWords())
                .eq(portalVo.getType()!= null,Headline::getType,portalVo.getType());

        //2.分页参数
        IPage<Headline> page = new Page<>(portalVo.getPageNum(),portalVo.getPageSize());

        //3.分页查询
        //查询的结果 "pastHours":"3"   // 发布时间已过小时数 我们查询返回一个map
        //自定义方法
        headlineMapper.selectPageMap(page, portalVo);

        //4.结果封装
        //分页数据封装
        Map<String,Object> pageInfo =new HashMap<>();
        pageInfo.put("pageData",page.getRecords());
        pageInfo.put("pageNum",page.getCurrent());
        pageInfo.put("pageSize",page.getSize());
        pageInfo.put("totalPage",page.getPages());
        pageInfo.put("totalSize",page.getTotal());

        Map<String,Object> pageInfoMap=new HashMap<>();
        pageInfoMap.put("pageInfo",pageInfo);
        // 响应JSON
        return Result.ok(pageInfoMap);
    }
}
2.2.3.4 mapper
  • 接口
public interface HeadlineMapper extends BaseMapper<Headline> {

    //自定义分页查询方法
    IPage<Map> selectPageMap(IPage<Headline> page,
                @Param("portalVo") PortalVo portalVo);
}
  • mapperxml:
<select id="selectPageMap" resultType="map">
    select hid,title,type,page_views pageViews,TIMESTAMPDIFF(HOUR,create_time,NOW()) pastHours,
            publisher from news_headline where is_deleted=0
            <if test="portalVo.keyWords !=null and portalVo.keyWords.length()>0 ">
                and title like concat('%',#{portalVo.keyWords},'%')
            </if>
            <if test="portalVo.type != null and portalVo.type != 0">
                and type = #{portalVo.type}
            </if>
</select>
2.3 查询头条详情
2.3.1 需求描述

在这里插入图片描述

  • 用户点击"查看全文"时,向服务端发送新闻 id
  • 后端根据新闻 id 查询完整新闻文章信息并返回
  • 后端要同时让新闻的浏览量+1
2.3.2 接口描述
  • url 地址:portal/showHeadlineDetail
  • 请求方式:post
  • 请求参数:
hid=1 param形成参数
  • 响应数据:

    • 成功
    {
        "code":"200",
        "message":"success",
        "data":{
            "headline":{
                "hid":"1",                     // 新闻id
                "title":"马斯克宣布 ... ...",   // 新闻标题
                "article":"... ..."            // 新闻正文
                "type":"1",                    // 新闻所属类别编号
                "typeName":"科技",             // 新闻所属类别
                "pageViews":"40",              // 新闻浏览量
                "pastHours":"3" ,              // 发布时间已过小时数
                "publisher":"1" ,              // 发布用户ID
                "author":"张三"                 // 新闻作者
            }
        }
    }
    
2.3.3 代码实现
2.3.3.1 controller
 /**
 * 首页详情接口
 * @param hid
 * @return
 */
@PostMapping("showHeadlineDetail")
public Result showHeadlineDetail(Integer hid){
    Result result = headlineService.showHeadlineDetail(hid);
    return result;
}
2.3.3.2 service
/**
 * 详情数据查询
 * "headline":{
 * "hid":"1",                     // 新闻id
 * "title":"马斯克宣布 ... ...",   // 新闻标题
 * "article":"... ..."            // 新闻正文
 * "type":"1",                    // 新闻所属类别编号
 * "typeName":"科技",             // 新闻所属类别
 * "pageViews":"40",              // 新闻浏览量
 * "pastHours":"3" ,              // 发布时间已过小时数
 * "publisher":"1" ,              // 发布用户ID
 * "author":"张三"                 // 新闻作者
 * }
 * 注意: 是多表查询 , 需要更新浏览量+1
 *
 * @param hid
 * @return
 */
@Override
public Result showHeadlineDetail(Integer hid) {

    //1.实现根据id的查询(多表)
    Map headLineDetail = headlineMapper.selectDetailMap(hid);
    //2.拼接头条对象(阅读量和version)进行数据更新
    Headline headline = new Headline();
    headline.setHid(hid);
    headline.setPageViews((Integer) headLineDetail.get("pageViews")+1); //阅读量+1
    headline.setVersion((Integer) headLineDetail.get("version")); //设置版本
    headlineMapper.updateById(headline);

    Map<String,Object> pageInfoMap=new HashMap<>();
    pageInfoMap.put("headline",headLineDetail);
    return Result.ok(pageInfoMap);
}
2.3.3.3 mapper
  • 接口:
/**
 * 分页查询头条详情
 * @param hid
 * @return
 */
Map selectDetailMap(Integer hid);
  • mapperxml:
<!--    Map selectDetailMap(Integer hid);-->
<select id="selectDetailMap" resultType="map">
    select hid,title,article,type, h.version ,tname typeName ,page_views pageViews
            ,TIMESTAMPDIFF(HOUR,create_time,NOW()) pastHours,publisher
                    ,nick_name author from news_headline h
                        left join news_type t on h.type = t.tid
                                left join news_user u  on h.publisher = u.uid
                                            where hid = #{hid}
</select>

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

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

相关文章

一文解读 SmartX 超融合虚拟化下的网络 I/O 虚拟化技术

随着技术的不断发展&#xff0c;不少行业应用都对网络性能和隔离性有着越来越高的要求。例如&#xff1a; 低延迟&#xff1a;一些期货行业用户选择在期货公司机房托管服务器并自行编写交易程序&#xff0c;以实现对市场波动的快速&#xff08;微秒级&#xff09;反应。尤其是在…

DYC算法开发与测试(基于ModelBase实现)

ModelBase是经纬恒润开发的车辆仿真软件&#xff0c;包含两个大版本&#xff1a;动力学版本、智能驾驶版本。动力学版包含高精度动力学模型&#xff0c;能很好地复现车辆在实际道路中运行的各种状态变化&#xff0c;可用于乘用车、商用车动力底盘系统算法开发、控制器仿真测试&…

2023深圳CPSE安博会亮点指引

一、深圳安博会开展预告 10月25-28日&#xff0c;第十九届中国国际社会公共安全博览会&#xff08;简称“CPSE安博会”&#xff09;即将在深圳会展中心&#xff08;福田&#xff09;拉开帷幕。110,000㎡展示面积&#xff0c;130,000名专业观众&#xff0c;1000参展企业&#x…

如何制作自己的数字人

如何制作自己的数字人呢&#xff1f;不用担心平台的使用授权&#xff0c;也不用担心哪一天自己自媒体被号被无故封杀&#xff0c;那么SadTalker将是你的首选&#xff0c;他是完全开源的数字人软件&#xff0c;现已达到Apache2的授权&#xff0c;完全自由的开源软件。作者自己试…

Java中,字符串有多个空格如何截取

笔者在开发中&#xff0c;遇到需要对三方接口返回的报文进行处理&#xff0c;将对方填充的所有空格干掉&#xff0c;截取成list 使用正则表达式&#xff1a;split(“\s”) public static void main(String[] args) {String str "1111 22 33 888";// …

离线直线度测量仪的自动检测之旅!

离线直线度测量仪更适用于产品的抽检&#xff0c;虽然是离线检测设备&#xff0c;但需人工操作的工作非常少&#xff0c;是智能化的检测设备&#xff0c;本来来简单的介绍一下该测量设备。 离线直线度测量仪采用光电测头的直径和位置测量原理进行测量&#xff0c;测量仪采用成9…

【QT开发(11)】QT 线程QThread

Qt的线程支持与平台无关的&#xff1a; 线程类、一个线程安全的发送事件方式跨线程的信号-槽的关联 这使得可以从分利用多处理器机器&#xff0c;有效解决不冻结一份应用程序用户界面的情况下&#xff0c;处理一个耗时操作的问题。 文章目录 1、QThread 一个与平台无关的线程…

JAVAEE初阶相关内容第十六弹--网络编程

写在前 这一节的内容首先是对十五弹&#xff08;UDP回显服务器&#xff09;进行简单的改进&#xff0c;在这基础上开始介绍TCP流套接字编程。 目录 写在前 1.改进回显服务器 1.1完整代码实现 1.2运行输出结果 2.TCP流套接字编程 2.1ServerSocketAPI 2.2SocketAPI 3.TC…

JZ23链表中环的入口结点

JZ23链表中环的入口结点 思路: 采用双指针&#xff0c;设定快指针fast_p是慢指针slow_p的2倍&#xff0c;如果有环&#xff0c;则当两指针第一次相遇时慢指针一定不可能在环中走超过一圈&#xff0c;因此假设头结点到环的开头距离为a,环开头到第一次相遇节点的距离为b&#xf…

【数据分享】2023年我国科技型中小企业数据(免费获取/Excel格式/Shp格式)

企业是经济活动的参与主体&#xff0c;一个城市的企业数量决定了这个城市的经济发展水平&#xff01;之前我们分享过2023年高新技术企业数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;我国专精特新“小巨人”企业数据&#xff08;可查看之前的文章获悉详情…

基于深度学习网络的手势识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd)); rng(default)load gnet.mat[Pr…

32二叉树——DFS深度优先遍历

目录 深度优先算法&#xff08;Depth-First Search&#xff0c;DFS&#xff09; LeetCode之路——102. 二叉树的层序遍历 分析 深度优先算法&#xff08;Depth-First Search&#xff0c;DFS&#xff09; DFS是一种用于遍历或搜索树状数据结构的算法&#xff0c;其中它首先探…

解决“您点击的链接已过期”;The Link You Followed Has Expired的问题

今天WP碰到一个坑。无论发布文章还是更新插件、更换主题都是这么一种状态“您点击的链接已过期”&#xff1b;The Link You Followed Has Expired 百度出来的答案都是修改post_max_size 方法1. 通过functions.php文件修复 这种方法更容易&#xff0c;只需将以下代码添加到Wor…

程序可以创建多少个用户界面对象?

有人提到这样一个问题&#xff1a;”一个程序最多可以注册多少个窗口类?” 问题的答案不是一个具体的数字。因为大多数用户界面对象都来自一个共享的内存池&#xff0c;我们称之为”桌面堆内存”。尽管我们可以计算一个最大的理论值&#xff0c;但是在实际的场景中&#xff0…

模仿企业微信界面

备注&#xff1a;未实现相关功能&#xff0c;仅模仿界面&#xff0c;不能作为商业用途&#xff0c;若有侵权&#xff0c;请联系删除。 <Window x:Class"模仿企业微信界面.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"…

身为网络工程师必考证书:华为HCIP认证!

为了找到一份心仪的工作&#xff0c;有的人选择入职前先自我提升考取贴合岗位需求的从业相关证书&#xff0c;进而面试并开始工作&#xff0c;有的人选择先从“基层”开始积累经验为首&#xff0c;先进入行业内夯实基础&#xff0c;学习和考证作为了工作“平稳”后的计划。 很…

Qt Creater 设计的登录注册界面 使用SQLite数据库

Qt Creater 设计的登录注册界面 使用SQLite数据库 案例截图 登录页面 注册页面 项目目录结构截图 代码 main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;//第一个是…

AUTOSAR通信篇 - CAN网络通信(七:Nm)

文章目录 基础功能NM协调器功能NM协调器功能的适用性保持协调总线活动总线关闭的协调嵌套子总线的协调关闭定时器的计算同步用例1 – 同步指令同步用例2-同步启动同步用例3 -同步网络睡眠示例 唤醒和中止协调关闭外部的网络唤醒协调唤醒协调关闭的中止 部分网络功能PNC位向量过…

高速电路设计----第三章(2)LVDS信号详解

一、TTL和CMOS不适用于高速电路设计的原因&#xff08;都是数字电路信号&#xff09; 原因&#xff1a; ①电平幅度较大&#xff0c;电平最低都达到了2.5V或者3.3V。因此信号沿变化所需要的时间很长。不适合大于200MHZ的信号。 ②容易被干扰&#xff0c;输出信号为单端&#xf…