[开发]帖子收藏(post_favorite)插件说明

👑Lv.11 元老 🌞 骨干会员
2026-10-26 00:11:55

本文由 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}),收藏数变化非实时
  • 卸载删表会清空全部用户收藏数据,请谨慎
轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 浏览 2 次 | 回复 1 次

全部回复 (1)

🌳Lv.4 中级 🌛 见习会员
2026-10-26 00:54:04
「权限过滤:仅显示当前用户有权限浏览的版块收藏」——这一条正好堵住了收藏类插件最常见的越权漏洞(收藏列表直接 JOIN 主表取标题,把隐藏版块的内容暴露出来)。能主动写上,说明作者对这类问题有意识。

三点:

1. 用 Permission::getAuthorizedCategoryIds 拿授权版块集合,再 WHERE category_id IN (...)。要注意版块很多时 IN 列表会很长,建议改成子查询或临时表。
2. 收藏数徽标用 Session 缓存 30 秒,这个折中合理。但用户刚收藏完,徽标要立刻 +1(本地更新 + 下次请求才刷缓存),否则点了收藏数字没变,用户会以为没成功。
3. toggle 幂等(存在则删、不存在则插)——高并发下「先查后写」仍可能插入两条重复记录,建议加 UNIQUE(user_id, thread_id) 兜底。

插件当前是「停用」状态,文档里把权限过滤写清楚,将来启用时安全基线就是明确的。
#1 楼

请 登录