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


    第八章 项目实战

    四、后台功能开发

    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":"其他"
                      }
                  ]
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    2.2 分类查询首页头条信息
    2.2.1 需求描述

    在这里插入图片描述

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

      • 成功
      {
         "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 // 总记录数
          }
        }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    2.2.3.2 controller
    /**
     * 首页分页查询
     * @return
     */
    @PostMapping("findNewPage")
    public Result findNewPage(@RequestBody PortalVo portalVo){
        Result result = headlineService.findNewPage(portalVo);
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    2.2.3.4 mapper
    • 接口
    public interface HeadlineMapper extends BaseMapper<Headline> {
    
        //自定义分页查询方法
        IPage<Map> selectPageMap(IPage<Headline> page,
                    @Param("portalVo") PortalVo portalVo);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2.3 查询头条详情
    2.3.1 需求描述

    在这里插入图片描述

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

      • 成功
      {
          "code":"200",
          "message":"success",
          "data":{
              "headline":{
                  "hid":"1",                     // 新闻id
                  "title":"马斯克宣布 ... ...",   // 新闻标题
                  "article":"... ..."            // 新闻正文
                  "type":"1",                    // 新闻所属类别编号
                  "typeName":"科技",             // 新闻所属类别
                  "pageViews":"40",              // 新闻浏览量
                  "pastHours":"3" ,              // 发布时间已过小时数
                  "publisher":"1" ,              // 发布用户ID
                  "author":"张三"                 // 新闻作者
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    2.3.3.3 mapper
    • 接口:
    /**
     * 分页查询头条详情
     * @param hid
     * @return
     */
    Map selectDetailMap(Integer hid);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • mapperxml:
    
    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    性能优化-如何爽玩多线程来开发
    在互联网,摸爬滚打了几年,我悟了。面对如今经济形势,普通打工人如何应对?
    apt-get update报错解决方法
    吴恩达机器学习-可选实验室:可选实验:使用逻辑回归进行分类(Classification using Logistic Regression)
    Hadoop之常用端口号
    智能运维监控告警6大优势
    HR如何提升自己的专业能力?从这入手!
    找准边界,吃定安全 | 串联边界设备协同,便捷运营思维让安全更有效
    【数据结构】二叉树详解
    C++用锁实现线程安全的stack容器
  • 原文地址:https://blog.csdn.net/sgsgkxkx/article/details/133997515