本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:WWW/plugins/post_favorite/说明.md。
帖子收藏(post_favorite)插件说明
版本:1.0.0 | 作者:SoSite | 状态:⏸️ 停用(默认未启用)
功能:用户收藏喜欢/有价值的帖子,支持收藏/取消收藏、收藏列表展示(分页 + 权限过滤)
一、功能简介
- 帖子页注入收藏按钮(
layout_head_end注入 CSS/JS,帖子页显示收藏/已收藏状态) - 一键收藏/取消收藏(
toggle,幂等:存在则删、不存在则插) - 收藏列表:前台"我的收藏"页,分页展示已收藏帖子
- 列表权限过滤:仅显示当前用户有权限浏览的版块收藏(
Permission::getAuthorizedCategoryIds) - 收藏数徽标:用户菜单"我的收藏"入口显示收藏总数(Session 缓存 30 秒,避免每页 COUNT)
二、目录结构
plugins/post_favorite/
├── plugin.json # 插件清单(hooks: init_after / route_register / nav_user_menu_items / layout_head_end)
├── Plugin.php # 生命周期(activate 建表 / 收藏计数查询)
├── FavoriteController.php # 控制器(index / toggle / check)
├── hook/
│ ├── init_after.php # 懒建表
│ ├── route_register.php # 路由(/favorites /favorites/toggle /favorites/check)
│ ├── nav_user_menu_items.php # 用户下拉菜单"我的收藏"入口(含计数徽标)
│ └── layout_head_end.php # 注入收藏按钮 CSS/JS(仅登录)
├── assets/
│ ├── style.css # 收藏按钮样式
│ └── script.js # 收藏按钮交互
└── views/index.php # 收藏列表页(A+ 规则:视图在插件目录)三、数据表
| 表 | 用途 |
|---|---|
post_favorites | 收藏记录(user_id / thread_id / fav_time,UNIQUE(user_id, thread_id) 防重复收藏) |
- 建表:
activate()幂等 CREATE TABLE IF NOT EXISTS - 卸载:
uninstall()删除表
四、Hooks
| Hook | 用途 |
|---|---|
init_after | 懒建表 |
route_register | 前台路由 |
nav_user_menu_items | 用户菜单"我的收藏"入口(计数徽标,Session 缓存 30 秒) |
layout_head_end | 注入收藏按钮 CSS/JS(仅登录用户) |
五、路由
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /favorites | 我的收藏列表(分页) |
| POST | /favorites/toggle | 收藏/取消收藏(JSON:{fav: true/false}) |
| GET | /favorites/check | 检查当前用户是否已收藏某帖 |
六、核心逻辑
public function toggle() // 幂等:查存在则删、不存在则插
public function check() // 单帖收藏状态判断(页面初始显示用)
public function index() // 收藏列表:JOIN threads + 版块权限过滤 + 分页七、注意事项
- 收藏表
UNIQUE(user_id, thread_id)兜底防重复,toggle 先查后改 - 列表权限过滤防越权:无权限版块的收藏不显示(SQL 层 IN 白名单)
- 用户菜单徽标有 30 秒 Session 缓存(
_fav_count_{uid}),收藏数变化非实时 - 卸载删表会清空全部用户收藏数据,请谨慎