本文最后更新于 2026年3月22日 下午
修复标签无法在文章详情页和文章列表中显示的问题
起因
在测试的时候发现在首页文章详情页和文章详情页中不能显示文章所属标签
经过测试查出是后端在文章列表和文章详情接口的实现方法中没有关于标签列表传递到前端
而且由于一篇文章可以拥有多个标签,在数据库中是通过文章标签表来进行查询的
这就意味着将标签添加到文章列表和文章详情里不能像分类那样简单直接获取再添加
解决办法
分别在文章列表和文章详情的Vo类中加上标签列表字段
在ArticleServiceImpl类中引入TagMapper
然后在ArticleServiceImpl中写两个私有方法(fillArticleListTags,fillArticleDetailTags)来将标签添加到文章列表和文章详情中
两个方法各司其职
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
private void fillArticleListTags(List<ArticleListVo> articleListVos) { if (articleListVos == null || articleListVos.isEmpty()) { return; }
List<Long> articleIds = articleListVos.stream() .map(ArticleListVo::getId) .collect(Collectors.toList());
LambdaQueryWrapper<ArticleTag> articleTagWrapper = new LambdaQueryWrapper<>(); articleTagWrapper.in(ArticleTag::getArticleId, articleIds); List<ArticleTag> articleTagList = articleTagMapper.selectList(articleTagWrapper);
if (articleTagList.isEmpty()) { return; }
List<Long> tagIds = articleTagList.stream() .map(ArticleTag::getTagId) .distinct() .collect(Collectors.toList());
LambdaQueryWrapper<Tag> tagWrapper = new LambdaQueryWrapper<>(); tagWrapper.in(Tag::getId, tagIds) .eq(Tag::getDelFlag, SystemConstants.NOT_DELETED); List<Tag> tags = tagMapper.selectList(tagWrapper);
Map<Long, TagVo> tagVoMap = tags.stream() .collect(Collectors.toMap( Tag::getId, tag -> BeanCopyUtils.copyBean(tag, TagVo.class) ));
Map<Long, List<TagVo>> articleTagMap = articleTagList.stream() .filter(at -> tagVoMap.containsKey(at.getTagId())) .collect(Collectors.groupingBy( ArticleTag::getArticleId, Collectors.mapping( at -> tagVoMap.get(at.getTagId()), Collectors.toList() ) ));
articleListVos.forEach(article -> article.setTags(articleTagMap.getOrDefault(article.getId(), List.of())) ); }
private void fillArticleDetailTags(ArticleDetailVo articleDetailVo) { if (articleDetailVo == null || articleDetailVo.getId() == null) { return; }
LambdaQueryWrapper<ArticleTag> articleTagWrapper = new LambdaQueryWrapper<>(); articleTagWrapper.eq(ArticleTag::getArticleId, articleDetailVo.getId()); List<ArticleTag> articleTagList = articleTagMapper.selectList(articleTagWrapper);
if (articleTagList.isEmpty()) { articleDetailVo.setTags(List.of()); return; }
List<Long> tagIds = articleTagList.stream() .map(ArticleTag::getTagId) .collect(Collectors.toList());
LambdaQueryWrapper<Tag> tagWrapper = new LambdaQueryWrapper<>(); tagWrapper.in(Tag::getId, tagIds) .eq(Tag::getDelFlag, SystemConstants.NOT_DELETED); List<Tag> tags = tagMapper.selectList(tagWrapper);
List<TagVo> tagVos = BeanCopyUtils.copyBeanList(tags, TagVo.class); articleDetailVo.setTags(tagVos); }
|
然后在两个方法分别在articleList和getArticleDetail中调用
这样即可实现在文章列表和文章详情页中展示文章所属标签的功能
至此博客系统的前台所包含的前端和后端基本开发完整
PS:该系列只做为作者学习开发项目做的笔记用
不一定符合读者来学习,仅供参考
预告
后续会记录博客的开发过程
每次学习会做一份笔记来进行发表
“一花一世界,一叶一菩提”
版权所有 © 2025 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/