85:第七章:开发前台首页、作家个人展示页、粉丝等功能:6:作家个人展示页,展示该作者的可展示文章列表,近期佳文;

本文介绍了如何通过独立接口来增强项目的可维护性,分别展示了在Controller和Service层实现作家个人展示页的文章列表及近期佳文查询。在Controller层定义了GET接口,并在Service层实现了查询逻辑,同时处理了数据的增补操作,确保返回信息的完整。此做法虽增加了工作量,但有助于后续的扩展和维护。

说明:

(1)本篇博客内容:作家个人展示页,展示该作者的可展示文章列表,近期佳文;

(2)一个需要注意的点:就算两个地方功能相似,但在业务上是各自独立的;尽量也要解耦处理,虽然这会增加一点重复工作量,但有利于后续的维护和各自扩展;

目录

一:本篇博客内容:

二:开发【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】:Controller层;

1.在【api】接口工程的ArticlePortalControllerApi接口中,定义【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】;

2.在【article】文章服务中的ArticlePortalController类中,去实现【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】;

三:开发【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】:Service层;

1.在【article】文章服务的ArticlePortalService接口中,定义查询作家发布的文章、查询某作家近期佳文的方法;

2.在【article】文章服务的ArticlePortalServiceImpl类中,去实现查询作家发布的文章、查询某作家近期佳文的方法;

四:效果;


一:本篇博客内容:


 

虽然,【在用户个人后首页,展示该作者的可展示文章列表、近期佳文;】和【前台首页,展示文章列表、热文】很类似(只是,参数不一样);但是,我们还是新创了接口,来解耦,以提高项目的后续可维护性;


这两个功能,其实挺简单的;自己直接就开发了,本篇博客不在过多介绍;

二:开发【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】:Controller层;

1.在【api】接口工程的ArticlePortalControllerApi接口中,定义【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】;

    /**
     * 作家个人展示页,查询文章列表,接口;
     * @param writerId:查询的是哪个用户,该用户的id;
     * @param page
     * @param pageSize
     * @return
     */
    @ApiOperation(value = "作家个人展示页,查询文章列表", notes = "作家个人展示页,查询文章列表", httpMethod = "GET")
    @GetMapping("/queryArticleListOfWriter") //设置路由,这个是需要前后端约定好的;
    public GraceJSONResult queryArticleListOfWriter(@RequestParam String writerId,
                                        @RequestParam Integer page,
                                        @RequestParam Integer pageSize);
    
    /**
     * 作家个人展示页,查询最新热闻,接口;
     * @param writerId
     * @return
     */
    @ApiOperation(value = "作家个人展示页,查询最新热闻", notes = "作家个人展示页,查询最新热闻", httpMethod = "GET")
    @GetMapping("/queryGoodArticleListOfWriter") //设置路由,这个是需要前后端约定好的;
    public GraceJSONResult queryGoodArticleListOfWriter(@RequestParam String writerId);

说明:

(1)两个接口的请求方式、url、参数,在前端代码中有; 

2.在【article】文章服务中的ArticlePortalController类中,去实现【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】;

 /**
     * 作家个人展示页,查询文章列表,接口;
     * @param writerId:查询的是哪个用户,该用户的id;
     * @param page
     * @param pageSize
     * @return
     */
    @Override
    public GraceJSONResult queryArticleListOfWriter(String writerId, Integer page, Integer pageSize) {
        // 1.如果前端传的page或者pageSize为空,我们就给其设置默认值,page设为1,pageSize设为10;
        if (page == null) {
            page = COMMON_START_PAGE; //在BaseController中定义的常量;
        }
        if (pageSize == null) {
            pageSize = COMMON_PAGE_SIZE;
        }

        // 3.调用Service层逻辑,去查询文章列表;
        PagedGridResult pagedGridResult = articlePortalService.queryArticleListOfWriter(writerId, page, pageSize);
        //4.然后,调用工具方法,去完善"作者昵称"和"用户头像"
        pagedGridResult = rebuildArticleGrid(pagedGridResult);
        return GraceJSONResult.ok(pagedGridResult);
    }

    /**
     * 作家个人展示页,查询最新热闻,接口;
     * @param writerId
     * @return
     */
    @Override
    public GraceJSONResult queryGoodArticleListOfWriter(String writerId) {
        PagedGridResult gridResult = articlePortalService.queryGoodArticleListOfWriter(writerId);
        return GraceJSONResult.ok(gridResult);
    }


 /**
     * 工具方法:根据查询出来的包含文章信息(主要是"作者昵称"和"用户头像"没有完善)的分页对象,去完善"作者昵称"和"用户头像";
     * @param pagedGridResult
     * @return
     */
    public PagedGridResult rebuildArticleGrid(PagedGridResult pagedGridResult) {
        // START:完善文章列表查询结果中的"作者昵称"和"用户头像";
        // (1) 构建id列表;
        // (1.1)首先,从PagedGridResult分页对象中,获取具体的文章数据的List;
        List<Article> list = (List<Article>) pagedGridResult.getRows();
        // (1.2)因为,有的文章的作者,可能一样;所以,这儿我么利用set,去重获取文章的作者id;
        Set userIdSet = new HashSet();
        for (Article article : list) {
            userIdSet.add(article.getPublishUserId());
        }
        //(2)发起远程调用(RestTemplate),请求【user】用户服务,获得对应的列表,主要目的是获取"作者昵称"和"用户头像";
        // (2.1) 创建字符串:【user】用户服务中【根据用户的ids,查询用户列表,接口】的url地址;并且拼凑上了参数;
        String userServerUrlExecute = "http://user.imoocnews.com:8003/user/queryByIds?userIds=" +
                JsonUtils.objectToJson(userIdSet);
        // (2.2) 创建一个List,后面会用来承接请求得到的数据;
        List<AppUserVO> appUserVOList = new ArrayList<>();
        // (2.3)去远程调用接口;参数化依次是:url,返回值类型的class;
        ResponseEntity<GraceJSONResult> graceJSONResultResponseEntity =
                restTemplate.getForEntity(userServerUrlExecute, GraceJSONResult.class);
        //(2.4)从接口返回中,获取body;
        GraceJSONResult bodyResult = graceJSONResultResponseEntity.getBody();
        // (2.5)如果响应是200,则表示请求成功;
        if (bodyResult.getStatus() == 200) {
            /**
             * 从响应body中,获取数据(这个数据的类型是Object类型的);
             * 我们先把这个Object类型的对象,转成JSON;;;然后再把JSON字符串,转成List<AppUserVO>;
             */
            String userJson = JsonUtils.objectToJson(bodyResult.getData());
            appUserVOList = JsonUtils.jsonToList(userJson, AppUserVO.class);
        }
        //(3)根据业务需求,重新组装返回给前端的文章列表(主要目的是把"作者昵称"和"用户头像"设置进去)
        List<IndexArticleVO> indexArticleVOList = new ArrayList<>();

        //循环遍历List<Article>
        for (Article a : list) {
            IndexArticleVO indexArticleVO = new IndexArticleVO();
            BeanUtils.copyProperties(a, indexArticleVO);
            //从List<AppUserVO>中,获取属于该用户的基本信息;
            AppUserVO appUserVO = getUserIfPublisher(a.getPublishUserId(), appUserVOList);

            //然后,把用户基本信息拼凑到indexArticleVO上去;
            indexArticleVO.setPublisherVO(appUserVO);
            indexArticleVOList.add(indexArticleVO);
        }
        //(4)最后,我们需要重新指定pagedGridResult分页对象的rows;(具体,前端拿到List<IndexArticleVO>后,如何渲染展示,可以暂不必深究)
        pagedGridResult.setRows(indexArticleVOList);
        // END
        return pagedGridResult;
    }

说明:

(1)这儿我们把完善文章分页对象中的"作者昵称"和"用户头像",单独抽成了一个方法; 


三:开发【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】:Service层;

1.在【article】文章服务的ArticlePortalService接口中,定义查询作家发布的文章、查询某作家近期佳文的方法;

    /**
     * 查询作家发布的所有文章列表
     */
    public PagedGridResult queryArticleListOfWriter(String writerId,
                                                    Integer page,
                                                    Integer pageSize);

    /**
     * 作家页面查询近期佳文
     */
    public PagedGridResult queryGoodArticleListOfWriter(String writerId);

2.在【article】文章服务的ArticlePortalServiceImpl类中,去实现查询作家发布的文章、查询某作家近期佳文的方法;

 /**
     * 作家个人展示页,查询作家发布的所有(可以显示)文章列表
     */
    @Override
    public PagedGridResult queryArticleListOfWriter(String writerId, Integer page, Integer pageSize) {
        //1.首先,调用工具方法;构建一些基本的条件;(前台显示文章的,一些基本的、默认的条件)
        Example example = new Example(Article.class);
        Example.Criteria criteria = setDefaultArticleExample(example);
        // 2.自然,需要查询的是该作者的文章;
        criteria.andEqualTo("publishUserId", writerId);

        // 3. 设置分页;
        PageHelper.startPage(page, pageSize);
        // 4. 去查询
        List<Article> list = articleMapper.selectByExample(example);
        // 5. 把查询结果,包装成符合前端要求的pagedGridResult格式的;
        PagedGridResult pagedGridResult = setterPagedGrid(list, page);
        return pagedGridResult;
    }

    /**
     * 作家个人展示页,查询该作者近期佳文
     */
    @Override
    public PagedGridResult queryGoodArticleListOfWriter(String writerId) {
        Example example = new Example(Article.class);
        Example.Criteria criteria = setDefaultArticleExample(example);
        // 自然,需要查询的是该作者的文章;
        criteria.andEqualTo("publishUserId", writerId);

        // 通过设置分页,来达到只展示五条数据的目的;
        PageHelper.startPage(1,5);
        // 去查询
        List<Article> list = articleMapper.selectByExample(example);

        PagedGridResult pagedGridResult = setterPagedGrid(list, 1);
        return pagedGridResult;
    }

四:效果;

(1)先install一下整个项目;(2)记得使用SwitchHost开启虚拟域名映射;(3)使用Tomcat启动前端项目;(4)然后,启动后端项目; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值