搜索并展示文章列表
业务逻辑:
- 判断分页参数 设置默认值
- 根据分页参数构建Page列表
- 它这个前端有bug 只要一直往下划 分页一直 + 1 没有限制 所以我们若是结果为空 则直接返回
- 文章列表不单单只显示文章 还有显示发布文章的作者信息
- 根据查询到的文章列表中的作者id 远程调用获取用户信息
- 新建分页对象 将用户信息和文章拼接返回
controller
若分页参数为空这设置默认值
// 0. 判断分页参数是否存在 若不存在 设置一个默认值
if (page == null) {
page = 0;
}
if (pageSize == null) {
pageSize = 10;
}
根据前端传入的参数分页查询文章列表 若结果为空 直接返回
PageGridResult pageGridResult = portalService.queryListPageByCondition(keyword, category, page, pageSize);
// 分页查询结果为空则直接返回
if (pageGridResult.getRows().size() == 0) {
return GraceJSONResult.ok(pageGridResult);
}
这一陀shirt一样的代码逻辑:
- 因为set是不可以保存重复数据的 将作者id保存直set中
- 将set转换为json数据 发起远程调用
- 循环之前查出的所有文章 若文章的作者id相同 则构建indexArticleBO并保存至list
- 最后将list返回
@NotNull
private List<IndexArticleBO> getIndexArticleList(PageGridResult pageGridResult) {
List<Article> pageGridResultRows = (List<Article>) pageGridResult.getRows();
Set<String> userIdSet = new HashSet<>();
List<String> articleIdList = new ArrayList<>();
// 获取文章所对应而id 保存之set中 用于查询用户信息
pageGridResultRows.forEach((article -> {
userIdSet.add(article.getPublishUserId());
articleIdList.add(REDIS_READ_ARTICLE_COUNT + ":" + article.getId());
}));
String userIdsJson = JsonUtil.objectForJson(userIdSet);
// 根据article id类别获取阅读数 若为空 则list中保存的值为空 根据articleIdList自上而下保存之readCountList中 后面根据id列表遍历 获取
// 若为空 则没人阅读 设置为空即可
List<String> articleReadCountList = redisOperator.mget(articleIdList);
// restTemplate原创调用根据id列表查询用户信息
String url = "http://admin.imoocnews.com:8003/user/queryUserListByUserIds?userIds=" + userIdsJson;
GraceJSONResult basicUserInformationJsonResult = restTemplate.getForObject(url, GraceJSONResult.class);
if (basicUserInformationJsonResult == null) {
GraceException.display(ResponseStatusEnum.USER_NOT_EXIST_ERROR);
}
Object data = basicUserInformationJsonResult.getData();
List<PublishUserVO> publishUserVOS = null;
try {
publishUserVOS = objectMapper.readValue(objectMapper.writeValueAsString(data), TypeFactory.defaultInstance().constructCollectionType(List.class, PublishUserVO.class));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
if (publishUserVOS == null) {
GraceException.display(ResponseStatusEnum.ARTICLE_QUERY_PARAMS_ERROR);
}
List<IndexArticleBO> indexArticleBOS = new ArrayList<>();
// 构建主页每条文章分页信息 若userId == publishId直接设置
for (int i = 0; i < pageGridResultRows.size(); i++) {
IndexArticleBO indexArticleBO = new IndexArticleBO();
BeanUtils.copyProperties(pageGridResultRows.get(i), indexArticleBO);
for (PublishUserVO publishUserVO : publishUserVOS) {
if (publishUserVO.getId().equalsIgnoreCase(indexArticleBO.getPublishUserId())) {
indexArticleBO.setPublisherVO(publishUserVO);
if (StringUtils.isBlank(articleReadCountList.get(i))) {
indexArticleBO.setReadCounts(0);
} else {
indexArticleBO.setReadCounts(Integer.valueOf(articleReadCountList.get(i)));
}
}
}
indexArticleBOS.add(indexArticleBO);
}
return indexArticleBOS;
}
最后controller直接返回indxAricleBO即可
service
判断参数非空 然后拼接上去即可 然后根据发文时间进行排序
public PageGridResult queryListPageByCondition(String keyword, Integer category, Integer page, Integer pageSize) {
QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
if (keyword != null) {
queryWrapper.like("title", keyword);
}
if (category != null) {
queryWrapper.eq("category_id", category);
}
setCommonQueryMapper(queryWrapper);
queryWrapper.orderByDesc("publish_time");
Page<Article> articlePage = new Page<>(page, pageSize);
articleMapper.selectPage(articlePage, queryWrapper);
return setPageGridResult(articlePage);
}
远程调用业务逻辑
很简单 遍历id列表 根据id查询返回
public GraceJSONResult queryUserListByUserIds(String userIds) {
if (StringUtils.isBlank(userIds)) {
GraceException.display(ResponseStatusEnum.USER_STATUS_ERROR);
}
List<String> userIdList = null;
try {
userIdList = objectMapper.readValue(userIds, TypeFactory.defaultInstance().constructCollectionType(List.class, String.class));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
if (userIdList == null || userIdList.size() <= 0) {
GraceException.display(ResponseStatusEnum.USER_STATUS_ERROR);
}
List<AccountBasicInfoVO> appUsers = new ArrayList<>();
userIdList.forEach((userId) -> {
// 因为首页会被用户不停的刷新 可以将用户数据存储到redis中以减少数据库的压力
AppUser user = getUser(userId);
AccountBasicInfoVO accountBasicInfoVO =
new AccountBasicInfoVO();
BeanUtils.copyProperties(user, accountBasicInfoVO);
appUsers.add(accountBasicInfoVO);
});
return GraceJSONResult.ok(appUsers);
}
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律