分类目录(父级目录)文章数统计错误
前置条件
- [x] 已经在 issues 列表中搜索了相关问题。
- [x] 这是 Halo 项目本身存在的问题,如果是非项目本身的问题(如:安装部署问题),建议在 Discussions 提交。
- [x] 已经尝试过停用所有的插件,排除是插件导致的问题。
- [x] 如果是插件和主题的问题,请在对应的插件和主题仓库提交。
系统信息
- 外部访问地址: https://yokila.com
- 启动时间: 2024-11-09 22:45
- 版本: 2.20.8
- 构建时间: 2024-10-30 16:29
- Git Commit: 0d1a099
- Java: OpenJDK Runtime Environment / 17.0.12+7-Ubuntu-1ubuntu222.04
- 数据库: Source distribution / 8.0.34
- 操作系统: Linux / 5.15.0-92-generic
- 已激活主题: Earth 1.11.1
- 已启动插件:
使用的哪种方式运行?
Fat Jar
发生了什么?
- 已检查未对子分类开启“阻止文章级联查询”。
- 所有文章只归属单个“子分类”,未设置归属多个“子分类”或者同时归属“父分类”。
- 部分文章开启了 “私有”,目测下来“私有”文章不显示在访客页面的目录栏统计里(此时子分类的统计数已经自动过滤了私有文章),应该也不是这个的问题。
- 目前发现现象:父分类的文章统计数显示, 控制台的管理页面 和 访客浏览页面,都有 部分父分类显示文章数统计值错误。
- 目前不清楚是不是版本升级导致的历史数据遗留问题?还是实时统计出错?
复现步骤
No response
相关日志输出
附加信息
- 现在虽然父分类文章数显示错误(显示不对,或者为0),但是实际在访客页面选择这个父分类的话(从 “分类目录” 中选择),是可以看到显示完整的所有子分类文章。例如虽然显示数目是 0 ,但是实际观察是显示了所有子分类加在一起的 25篇文章。(印象中 1.x 版本的时候,大概是24年上半年的时候,点击父分类,若没有把文章直接同时归属父分类,是不会显示子分类文章的来着?)
- 另外,实测,假如我把某篇文章同时归属 子分类 和 父分类,则父分类的文章统计数将变成 1。然后我再把这个文章改为只归属子分类(去除归属父分类),则父分类文章统计数将变成 0 .(上图中那个父分类文章数 = 0 ,就是这么弄出来的)
cc @guqing
/kind bug /area core
我通过以下能够查询文章数汇总的表达式显示了第一层级的文章数量如下图左侧红框所示
<p th:each="category : ${categoryFinder.listAsTree()}">
<span th:text="${category.spec.displayName}"></span>
<span th:text="${category.postCount}"></span>
</p>
因此可以看出 earth 主题可能是没有使用后端计算的数量
需要注意的是: 在 Console 用户界面中,分类下显示的文章数量仅统计该分类本身直接关联的文章数量,不包含其子分类的文章数量。这样可以更加直观地查看每个分类的具体文章数。例如:
- 如果文章 A 直接属于分类 摘录,则 摘录 的文章数量为 1。
- 如果文章 A 属于子分类 常规摘录,而 摘录 本身没有直接关联的文章,则 摘录 的文章数量为 0。
所以需要确认两点:
- @17lhf 关于你图中 摘录 分类所属的直接关联文章是否确实为 0,以及 风袭异录 的直接关联文章是否确实为 35,并关注上述文章数量计算规则是否与实际数量情况符合,如果根据规则数量还是不正确则为 bug
- @ruibaby 需要确认以下 earth 的分类数量显示是怎么计算的,是否为后端的问题
需要确认以下 earth 的分类数量显示是怎么计算的,是否为后端的问题
不是算的,直接取的 status.visiblePostCount,https://github.com/halo-dev/theme-earth/blob/f5d2d756162c8fc5675dba8ac7fffa2f3c04fa3c/templates/modules/category-tree.html#L11
这个 status.visiblePostCount 和 postCount 到底应该怎么区分呢,这很容易造成误导,文档也没有写明白这个问题,现在一共三个代表文章数量的字段。
这个
status.visiblePostCount和postCount到底应该怎么区分呢,这很容易造成误导,文档也没有写明白这个问题,现在一共三个代表文章数量的字段。
status 中的文章数量是属于分类的直接关联的,postCount 是所有(包括私有、草稿、回收站),而 visiblePostCount 用在主题端是公开的文章数量,外层的 postCount 是属于分类树的节点的会汇总子节点文章数量,在主题端使用一般不需要去关系 status 中的值,永远取外层的即可一般都会提供在 VO 中,比如 CategoryVo 和 CategoryTreeVo 都是有在外层提供 postCount 直接用,不需要告诉主题开发者 status 有什么
但我感觉这样还是有点混乱,和其他地方有些区别,并且有些字段本来就是要在 status 获取的,比如 permalink。
any way,先改文档吧,晚点我检查所有主题的写法。
但我感觉这样还是有点混乱,和其他地方有些区别,并且有些字段本来就是要在 status 获取的,比如 permalink。
any way,先改文档吧,晚点我检查所有主题的写法。
确实需要改一下文档,把字段的作用介绍清楚就好了,虽然主题也可以直接取 status.visiblePostCount 但是也分场景,因为如果是平铺的话那就是取这个字段合适,如果是树状那就是外层的 postCount 合适,这取决于具体用途
能全部改成外层的 postCount 吗?不管是不是平铺
能全部改成外层的 postCount 吗?不管是不是平铺
可以,分类和标签都可以,如果是 CategoryTreeVo 外层 postCount 就是汇总的,CategoryVo适合平铺场景是单独的,TagVo也有,因此对于分类和标签的文档,可以隐去 status 中的部分字段的文档不写已简化理解成本
- @17lhf 关于你图中 摘录 分类所属的直接关联文章是否确实为 0,以及 风袭异录 的直接关联文章是否确实为 35,并关注上述文章数量计算规则是否与实际数量情况符合,如果根据规则数量还是不正确则为 bug
我并未给父级分类(摘录、 风袭异录)设置直接关联的文章,实际应该都是0。按照我 issue 的附加信息所述操作,可以将文章数回归到 0。 issue 里提及的相关操作:
实测,假如我把某篇文章同时归属 子分类 和 父分类,则父分类的文章统计数将变成 1。然后我再把这个文章改为只归属子分类(去除归属父分类),则父分类文章统计数将变成 0 .(上图中那个父分类文章数 = 0 ,就是这么弄出来的)
不过我有个问题,就是如果正确应该是都为0,为什么浏览页面点击父分类,展示却是所有子分类的文章?这是否相互矛盾?
不过我有个问题,就是如果正确应该是都为0,为什么浏览页面点击父分类,展示却是所有子分类的文章?这是否相互矛盾?
参考 https://github.com/halo-dev/theme-earth/pull/224 主题端如果展示为树状结构应该取汇总的文章数量显示会更合适,earth 主题已经修改等待发版即可
如果不想让主题点击分类时展示子分类关联的文章可以勾选阻止级联
已经在 https://github.com/halo-dev/theme-earth/releases/tag/v1.12.2 中修复此问题。
@ruibaby @guqing
我更新到了 Earth v1.12.2 ,试过刷新页面,也重新打开过浏览器,现在统计数据仍旧是错误的。
明显和实际数量对不上,像是错位读取数据了?
确实看起来有点不对,我在手动调整了 demo.halo.run 的数据之后,显示也不正确:
Console:
主题:
/reopen
@ruibaby: Reopened this issue.
In response to this:
/reopen
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.
确实看起来有点不对,我在手动调整了 demo.halo.run 的数据之后,显示也不正确:
主题:
mock 直接关联 33 halo直接关联34 halo 直接关联 64 那么在主题端 mock 汇总包含子分类的文章数量 33+34+64=131不是正确的吗?@ruibaby
参考 https://github.com/halo-dev/halo/issues/7095#issuecomment-2516110108
看第一张图,现在没有文章直接设置 Mock 这个分类
Hi @17lhf 目前测试了没有复现出来,首先需要确认一下 Console 的分类的数量显示是否是正确的,Console 分类关联的文章数量包含的有回收站,私有,公开,草稿这几种的文章
确实看起来有点不对,我在手动调整了 demo.halo.run 的数据之后,显示也不正确:
Demo 环境应该是旧版本的数据有问题,重新调整之后没有再复现。
指的是 Console 里各个分类显示的文章数 和 首页看到的是否一致吗? 我以一个父分类为例吧:
-
这是否是因为 https://github.com/halo-dev/halo/issues/7095#issuecomment-2530932078 提到的原因导致的呢,可以尝试先通过跟新对应文章的分类来触发更新将数量恢复到正确值,比如分类 A 的数量不正确,post-a 属于分类 A 那么先将它取消归属分类 A 来触发分类 A 的数量更新得到正确的值,以此类推,当分类的数量都正确后尝试重新复现一下这个问题看能否复现,以排除是以前版本计算不正确导致的,如果可以复现那么给出一个最小复现步骤
-
先不去管主题那边显示的数量是否符合预期,需要先确保 Console 的分类显示的数量是始终正确的(Console 的数量是直接关联分类的文章数)如果 Console 的数量没有 bug 再以此为依据去探讨主题那边的数量显示是否正确的问题
确实看起来有点不对,我在手动调整了 demo.halo.run 的数据之后,显示也不正确:
Demo 环境应该是旧版本的数据有问题,重新调整之后没有再复现。
可以说一下你那边是怎么处理这个问题的吗?我在一台旧电脑上复制部署了服务器上的服务,或许可以做一些比较激进的措施进行尝试解决 或者 获取你们需要用于排错的数据。
此问题已破案,原因是不知道哪个版本的时候,会将子分类的文章总数赋值给父分类进行保存(即便文章没有显式归属父分类),于是父分类会记录有文章数(但是实际没有文章直接归属)。 未知版本后没有了这个特性。 现版本访客页面显示时,会将子分类的文章数自动加到父分类上。由于此时父分类异常多了一些统计值,所以最终父分类显示的文章数量会多于实际子分类总数。 今天我使用Data Studio手动将父分类的文章数修正(归零),父分类的文章统计数就正常了。 (若有后来者准备按照我这个方式处理,建议同我一样,先备份好数据再操作)