说明:
(1)本篇博客内容:作家个人展示页,展示该作者的可展示文章列表,近期佳文;
(2)一个需要注意的点:就算两个地方功能相似,但在业务上是各自独立的;尽量也要解耦处理,虽然这会增加一点重复工作量,但有利于后续的维护和各自扩展;
目录
二:开发【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】:Controller层;
1.在【api】接口工程的ArticlePortalControllerApi接口中,定义【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】;
2.在【article】文章服务中的ArticlePortalController类中,去实现【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】;
三:开发【作家个人展示页,展示文章列表,接口】、【作家个人展示页,展示近期佳文,接口】:Service层;
1.在【article】文章服务的ArticlePortalService接口中,定义查询作家发布的文章、查询某作家近期佳文的方法;
2.在【article】文章服务的ArticlePortalServiceImpl类中,去实现查询作家发布的文章、查询某作家近期佳文的方法;
虽然,【在用户个人后首页,展示该作者的可展示文章列表、近期佳文;】和【前台首页,展示文章列表、热文】很类似(只是,参数不一样);但是,我们还是新创了接口,来解耦,以提高项目的后续可维护性;
这两个功能,其实挺简单的;自己直接就开发了,本篇博客不在过多介绍;
/** * 作家个人展示页,查询文章列表,接口; * @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、参数,在前端代码中有;
/** * 作家个人展示页,查询文章列表,接口; * @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; Listlist = (List ) 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,后面会用来承接请求得到的数据; ListappUserVOList = new ArrayList<>(); // (2.3)去远程调用接口;参数化依次是:url,返回值类型的class; ResponseEntitygraceJSONResultResponseEntity = 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; */ String userJson = JsonUtils.objectToJson(bodyResult.getData()); appUserVOList = JsonUtils.jsonToList(userJson, AppUserVO.class); } //(3)根据业务需求,重新组装返回给前端的文章列表(主要目的是把"作者昵称"和"用户头像"设置进去) ListindexArticleVOList = new ArrayList<>(); //循环遍历List for (Article a : list) { IndexArticleVO indexArticleVO = new IndexArticleVO(); BeanUtils.copyProperties(a, indexArticleVO); //从List中,获取属于该用户的基本信息; AppUserVO appUserVO = getUserIfPublisher(a.getPublishUserId(), appUserVOList); //然后,把用户基本信息拼凑到indexArticleVO上去; indexArticleVO.setPublisherVO(appUserVO); indexArticleVOList.add(indexArticleVO); } //(4)最后,我们需要重新指定pagedGridResult分页对象的rows;(具体,前端拿到List后,如何渲染展示,可以暂不必深究) pagedGridResult.setRows(indexArticleVOList); // END return pagedGridResult; }说明:
(1)这儿我们把完善文章分页对象中的"作者昵称"和"用户头像",单独抽成了一个方法;
- /**
- * 查询作家发布的所有文章列表
- */
- public PagedGridResult queryArticleListOfWriter(String writerId,
- Integer page,
- Integer pageSize);
-
- /**
- * 作家页面查询近期佳文
- */
- public PagedGridResult queryGoodArticleListOfWriter(String writerId);
- /**
- * 作家个人展示页,查询作家发布的所有(可以显示)文章列表
- */
- @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
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
list = articleMapper.selectByExample(example); -
- PagedGridResult pagedGridResult = setterPagedGrid(list, 1);
- return pagedGridResult;
- }
(1)先install一下整个项目;(2)记得使用SwitchHost开启虚拟域名映射;(3)使用Tomcat启动前端项目;(4)然后,启动后端项目;