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


    说明:

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

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

    目录

    一:本篇博客内容:

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

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

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

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

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

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

    四:效果;


    一:本篇博客内容:


     

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


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

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

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

    1. /**
    2. * 作家个人展示页,查询文章列表,接口;
    3. * @param writerId:查询的是哪个用户,该用户的id;
    4. * @param page
    5. * @param pageSize
    6. * @return
    7. */
    8. @ApiOperation(value = "作家个人展示页,查询文章列表", notes = "作家个人展示页,查询文章列表", httpMethod = "GET")
    9. @GetMapping("/queryArticleListOfWriter") //设置路由,这个是需要前后端约定好的;
    10. public GraceJSONResult queryArticleListOfWriter(@RequestParam String writerId,
    11. @RequestParam Integer page,
    12. @RequestParam Integer pageSize);
    13. /**
    14. * 作家个人展示页,查询最新热闻,接口;
    15. * @param writerId
    16. * @return
    17. */
    18. @ApiOperation(value = "作家个人展示页,查询最新热闻", notes = "作家个人展示页,查询最新热闻", httpMethod = "GET")
    19. @GetMapping("/queryGoodArticleListOfWriter") //设置路由,这个是需要前后端约定好的;
    20. public GraceJSONResult queryGoodArticleListOfWriter(@RequestParam String writerId);

    说明:

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

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

    1. /**
    2. * 作家个人展示页,查询文章列表,接口;
    3. * @param writerId:查询的是哪个用户,该用户的id;
    4. * @param page
    5. * @param pageSize
    6. * @return
    7. */
    8. @Override
    9. public GraceJSONResult queryArticleListOfWriter(String writerId, Integer page, Integer pageSize) {
    10. // 1.如果前端传的page或者pageSize为空,我们就给其设置默认值,page设为1,pageSize设为10;
    11. if (page == null) {
    12. page = COMMON_START_PAGE; //在BaseController中定义的常量;
    13. }
    14. if (pageSize == null) {
    15. pageSize = COMMON_PAGE_SIZE;
    16. }
    17. // 3.调用Service层逻辑,去查询文章列表;
    18. PagedGridResult pagedGridResult = articlePortalService.queryArticleListOfWriter(writerId, page, pageSize);
    19. //4.然后,调用工具方法,去完善"作者昵称"和"用户头像"
    20. pagedGridResult = rebuildArticleGrid(pagedGridResult);
    21. return GraceJSONResult.ok(pagedGridResult);
    22. }
    23. /**
    24. * 作家个人展示页,查询最新热闻,接口;
    25. * @param writerId
    26. * @return
    27. */
    28. @Override
    29. public GraceJSONResult queryGoodArticleListOfWriter(String writerId) {
    30. PagedGridResult gridResult = articlePortalService.queryGoodArticleListOfWriter(writerId);
    31. return GraceJSONResult.ok(gridResult);
    32. }
    33. /**
    34. * 工具方法:根据查询出来的包含文章信息(主要是"作者昵称"和"用户头像"没有完善)的分页对象,去完善"作者昵称"和"用户头像";
    35. * @param pagedGridResult
    36. * @return
    37. */
    38. public PagedGridResult rebuildArticleGrid(PagedGridResult pagedGridResult) {
    39. // START:完善文章列表查询结果中的"作者昵称"和"用户头像";
    40. // (1) 构建id列表;
    41. // (1.1)首先,从PagedGridResult分页对象中,获取具体的文章数据的List;
    42. List
      list = (List
      ) pagedGridResult.getRows();
    43. // (1.2)因为,有的文章的作者,可能一样;所以,这儿我么利用set,去重获取文章的作者id;
    44. Set userIdSet = new HashSet();
    45. for (Article article : list) {
    46. userIdSet.add(article.getPublishUserId());
    47. }
    48. //(2)发起远程调用(RestTemplate),请求【user】用户服务,获得对应的列表,主要目的是获取"作者昵称"和"用户头像";
    49. // (2.1) 创建字符串:【user】用户服务中【根据用户的ids,查询用户列表,接口】的url地址;并且拼凑上了参数;
    50. String userServerUrlExecute = "http://user.imoocnews.com:8003/user/queryByIds?userIds=" +
    51. JsonUtils.objectToJson(userIdSet);
    52. // (2.2) 创建一个List,后面会用来承接请求得到的数据;
    53. List appUserVOList = new ArrayList<>();
    54. // (2.3)去远程调用接口;参数化依次是:url,返回值类型的class;
    55. ResponseEntity graceJSONResultResponseEntity =
    56. restTemplate.getForEntity(userServerUrlExecute, GraceJSONResult.class);
    57. //(2.4)从接口返回中,获取body;
    58. GraceJSONResult bodyResult = graceJSONResultResponseEntity.getBody();
    59. // (2.5)如果响应是200,则表示请求成功;
    60. if (bodyResult.getStatus() == 200) {
    61. /**
    62. * 从响应body中,获取数据(这个数据的类型是Object类型的);
    63. * 我们先把这个Object类型的对象,转成JSON;;;然后再把JSON字符串,转成List
    64. */
    65. String userJson = JsonUtils.objectToJson(bodyResult.getData());
    66. appUserVOList = JsonUtils.jsonToList(userJson, AppUserVO.class);
    67. }
    68. //(3)根据业务需求,重新组装返回给前端的文章列表(主要目的是把"作者昵称"和"用户头像"设置进去)
    69. List indexArticleVOList = new ArrayList<>();
    70. //循环遍历List
    71. for (Article a : list) {
    72. IndexArticleVO indexArticleVO = new IndexArticleVO();
    73. BeanUtils.copyProperties(a, indexArticleVO);
    74. //从List中,获取属于该用户的基本信息;
    75. AppUserVO appUserVO = getUserIfPublisher(a.getPublishUserId(), appUserVOList);
    76. //然后,把用户基本信息拼凑到indexArticleVO上去;
    77. indexArticleVO.setPublisherVO(appUserVO);
    78. indexArticleVOList.add(indexArticleVO);
    79. }
    80. //(4)最后,我们需要重新指定pagedGridResult分页对象的rows;(具体,前端拿到List后,如何渲染展示,可以暂不必深究)
    81. pagedGridResult.setRows(indexArticleVOList);
    82. // END
    83. return pagedGridResult;
    84. }

    说明:

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


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

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

    1. /**
    2. * 查询作家发布的所有文章列表
    3. */
    4. public PagedGridResult queryArticleListOfWriter(String writerId,
    5. Integer page,
    6. Integer pageSize);
    7. /**
    8. * 作家页面查询近期佳文
    9. */
    10. public PagedGridResult queryGoodArticleListOfWriter(String writerId);

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

    1. /**
    2. * 作家个人展示页,查询作家发布的所有(可以显示)文章列表
    3. */
    4. @Override
    5. public PagedGridResult queryArticleListOfWriter(String writerId, Integer page, Integer pageSize) {
    6. //1.首先,调用工具方法;构建一些基本的条件;(前台显示文章的,一些基本的、默认的条件)
    7. Example example = new Example(Article.class);
    8. Example.Criteria criteria = setDefaultArticleExample(example);
    9. // 2.自然,需要查询的是该作者的文章;
    10. criteria.andEqualTo("publishUserId", writerId);
    11. // 3. 设置分页;
    12. PageHelper.startPage(page, pageSize);
    13. // 4. 去查询
    14. List
      list = articleMapper.selectByExample(example);
    15. // 5. 把查询结果,包装成符合前端要求的pagedGridResult格式的;
    16. PagedGridResult pagedGridResult = setterPagedGrid(list, page);
    17. return pagedGridResult;
    18. }
    19. /**
    20. * 作家个人展示页,查询该作者近期佳文
    21. */
    22. @Override
    23. public PagedGridResult queryGoodArticleListOfWriter(String writerId) {
    24. Example example = new Example(Article.class);
    25. Example.Criteria criteria = setDefaultArticleExample(example);
    26. // 自然,需要查询的是该作者的文章;
    27. criteria.andEqualTo("publishUserId", writerId);
    28. // 通过设置分页,来达到只展示五条数据的目的;
    29. PageHelper.startPage(1,5);
    30. // 去查询
    31. List
      list = articleMapper.selectByExample(example);
    32. PagedGridResult pagedGridResult = setterPagedGrid(list, 1);
    33. return pagedGridResult;
    34. }

    四:效果;

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

  • 相关阅读:
    理解C#里面的集合有哪些?怎么用,什么是安全集合?
    基于SpringBoot的墙绘产品展示交易平台设计与实现
    在WSL中基于命令行打开Windows资源管理器
    谷歌浏览器占CPU非常高的解决办法
    臻图信息赋能数字化变革,打造智慧商场新模式
    脚手架(vue-cli)创建Vue项目看这篇就够了
    【高级篇】线程与线程池
    数据链路层
    【react-笔记】
    变量赋值中 + 号 - 号 = 号的用法
  • 原文地址:https://blog.csdn.net/csucsgoat/article/details/126367659