Recommendations
Flarum 2.0 推荐系统扩展,基于 FoF Forum Widgets Core 框架构建,在论坛首页以三栏小部件形式展示推荐帖子、最新帖子和热门浏览帖子。
依赖
| 扩展 | 必要性 | 说明 |
flarum/core | 必需 | Flarum 2.0 核心 (2.0) |
fof/forum-widgets-core | 必需 | 小部件容器框架 (2.0) |
fof/discussion-views | 推荐 | 记录帖子浏览量,热门浏览栏目依赖此扩展提供 view_count 数据。未安装时浏览量均为 0,热门栏目仍可工作但无区分度 |
| Redis | 推荐 | 后端缓存。未配置时 Laravel 使用文件缓存,性能略低 |
功能
三栏小部件
| 栏目 | 算法 | 说明 |
| 推荐帖子 (Recommended) | HN/Reddit 热度算法 + 随机选取 | 综合评论数、参与人数、浏览量与时序衰减计算热度分,从排名靠前的候选池中随机抽取展示 |
| 最新帖子 (Latest) | 时间窗口 + 低互动过滤 | 仅展示指定天数内发布、参与人数未达阈值的帖子,按发布时间降序排列 |
| 热门浏览 (Most Viewed) | 浏览量门槛 + 随机选取 | 从浏览量排名前列的帖子中随机抽取,可设最低浏览门槛过滤 |
每个栏目项展示:头像 + 标题 + 元数据(推荐:评论数 / 最新:发布时间 / 热门:浏览数)。点击可跳转到帖子详情页。
实时刷新
- 后端 Redis 缓存,默认 TTL 15 分钟
- 前端自动轮询,间隔与后端缓存同步
- 缓存过期 / 到期时推荐和热门栏目重新随机,保证内容多样性
- 页面隐藏(切标签页)时自动暂停轮询,返回时立即刷新并恢复
- 可以到后台设置中设为 0 分钟来关闭缓存(每次请求实时计算)
移动端适配
三栏保持横向排列,移动端:
- 表头仅显示图标,隐藏文字
- 头像缩小至 20px
- 隐藏元数据(评论数/时间/浏览数)
- 标题字体缩小至 11px
安装
composer require lcoy/recommendations
推荐同时安装浏览量追踪扩展:
composer require fof/discussion-views
后台设置
扩展设置页位于 后台 → 论坛小组件 → Recommendations,共 8 项可配置参数:
推荐栏目
| 设置项 | 默认值 | 说明 |
| 推荐帖子展示数量 | 5 | 推荐栏目展示条数 |
| 重力因子 | 1.5 | 热度算法的时间衰减强度。值越大新帖权重越高、旧帖下沉越快 |
最新帖子栏目
| 设置项 | 默认值 | 说明 |
| 最新帖子展示数量 | 5 | 最新栏目展示条数 |
| 时间窗口(天) | 7 | 仅展示此天数内发布的帖子 |
| 最大参与人数 | 5 | 仅展示独特参与者 ≤ 此值的帖子 |
热门浏览栏目
| 设置项 | 默认值 | 说明 |
| 热门浏览展示数量 | 5 | 热门栏目展示条数 |
| 热门浏览最低门槛 | 0 | 浏览量需 ≥ 此值才进入候选池。设 0 不设限 |
全局
| 设置项 | 默认值 | 说明 |
| 数据刷新间隔(分钟) | 15 | 前端轮询与后端缓存时长。设为 0 关闭缓存 |
算法详解
推荐算法(HN/Reddit 热度)
engagement = 评论数 × 2.0 + 参与人数 × 3.0 + 浏览量 × 0.05
hours = max(1, 距发布小时数)
score = engagement / (hours + 2)^gravity
- 从近 90 天帖子中取 200 条候选
- 按热度分降序排列
- 取前 N × 10 条组成随机池,shuffle 后选取前 N 条
- 保证既有质量又有多样性
热门浏览随机化
- 按浏览量降序取前 N × 10 条
- 如有门槛要求则先过滤浏览量不足的帖子
- shuffle 后取前 N 条