本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:8月12日的备份/update/11/README-部署说明.md。
SoSite 通知中心更新包(2026-08-11)
本目录包含 1 个新插件 + 3 个核心修改 + 1 个审核插件修改,按原目录结构放置。
覆盖方式:将本目录内所有文件按相同路径上传覆盖到站点根目录(如 D:/phpstudy_pro/WWW 或服务器对应路径)。
生成环境:PHP 8.2 / MySQL 5.7.26。
一、本包功能说明
新增 通知中心插件(plugins/notifications/),统一聚合全局通知:回复、点赞、积分变动、注册欢迎、内容审核结果。PC 顶栏图标 + 移动端用户菜单双入口,未读徽标,进页自动已读,支持批量删除与分页。
通知场景全景:
| 场景 | 通知内容示例 | 触发点 |
|---|---|---|
| 有人回复我的帖子 | 张三 回复了你的帖子「帖子标题」(链接到对应楼层) | 核心 post_create_after |
| 我的帖子/回复被点赞 | 李四 赞了你的帖子「帖子标题」 | 新增核心 hook vote_after |
| 积分增加 | 你通过 发帖 获得 2 积分 | 新增核心 hook points_award_after |
| 积分扣除 | 你因 下载附件 扣除 5 积分 | 新增核心 hook points_deduct_after |
| 注册欢迎 | 欢迎加入 SoSite!完善个人资料,开启社区之旅吧 | 核心 auth_register_after |
| 内容审核结果 | 你的帖子「标题」已审核通过 / 未通过审核,原因:… | content_review 新增 hook review_result_after |
二、数据库变更(1 张新表,幂等,无需手动执行)
- 新表
notifications:user_id / type / title / link / actor_name / summary / related_id / related_type / is_read / created_at - 由插件启用时
Plugin::activate()创建(CREATE TABLE IF NOT EXISTS),hook/init_after.php懒建兜底。
三、新增核心 hook(3 个,插件挂载点)
| Hook | 触发位置 | 参数 |
|---|---|---|
vote_after | app/Controllers/ApiController.php 投票成功后 | type、id、vote、user_id(投票人)、owner_id(被赞人) |
points_award_after | app/Helpers/Points.php 加分后(调用方事务内) | user_id、points、reason、related_id、related_type |
points_deduct_after | app/Helpers/Points.php 扣分提交后 | 同上(points 为负数) |
四、内容审核插件联动(方案 B:深度接管)
plugins/content_review/Plugin.php的approve()/reject()末尾新增review_result_after广播(参数含user_id/result/target_type/title/link/reason)- 通知插件监听该 hook,将审核结果写入统一
notifications表 - 审核插件自身的
review_notifications表与/review-notifications页保留(双写,双保险)——审核插件关闭/卸载均不影响通知插件(通知插件只作为"接收方")
五、覆盖前必须做的事
备份服务器现状
把服务器上以下文件整体备份一份(zip 即可):
app/Helpers/Points.phpapp/Controllers/ApiController.phpplugins/content_review/Plugin.phpplugins/notifications/(若已存在)
六、本包包含的文件清单(18 个)
新增插件(15 个)
plugins/notifications/
├── plugin.json # hooks 注册(10 个钩子)
├── Plugin.php # activate 建表 / uninstall DROP / add / getList / getTotal / getUnreadCount / markAllRead / deleteByIds
├── NotificationController.php # /notifications 列表(进页自动已读、批量删除、分页)
├── views/index.php # 通知列表视图(类型图标/未读高亮/全选删除/分页)
├── assets/style.css
└── hook/
├── init_after.php # 懒建表兜底
├── route_register.php # 注册 /notifications 路由
├── nav_pc_user_links.php # PC 顶栏图标(bell + 未读徽标,Session 缓存 30s)
├── nav_user_menu_items.php # 移动端用户菜单(图标+文字+未读徽标)
├── post_create_after.php # 回复通知楼主(排除自己回自己)
├── vote_after.php # 点赞通知作者(仅"赞",排除自己赞自己)
├── points_award_after.php # 积分增加通知
├── points_deduct_after.php # 积分扣除通知
├── auth_register_after.php # 注册欢迎
└── review_result_after.php # 审核结果通知(content_review 联动)修改(3 个)
| 文件 | 改动 |
|---|---|
app/Helpers/Points.php | award() 末尾加 points_award_after;deduct() 提交后加 points_deduct_after |
app/Controllers/ApiController.php | vote() 成功后加 vote_after |
plugins/content_review/Plugin.php | approve() / reject() 末尾加 review_result_after 广播 |
七、部署步骤(推荐顺序)
- 备份(见第五节)
- 上传本 update 包全部文件,按路径覆盖
- 清插件缓存:删除站点根目录
plugins/plugins_cache.php(关键!hooks 映射缓存在其中,不删不生效) - 后台"插件管理" → 启用「通知中心」(
activated默认 false,需手动启用) - 清空模板编译缓存:
protected/cache/templates/目录下文件(模板引擎会自动重建) - 浏览器回归验证(见下)
八、回归验证清单
| 页面/场景 | 检查点 |
|---|---|
| PC 顶栏(登录态) | 用户名右侧、消息左侧出现 🔔 通知图标(未读时带数字) |
| 移动端用户菜单 | 出现"通知"入口(未读时带数字) |
| 有人回复你的帖子 | 通知中心出现「用户名 回复了你的帖子「标题」」,链接跳转对应楼层 |
| 他人点赞你的帖子/回复 | 通知中心出现「用户名 赞了你的帖子/回复「标题」」 |
| 发帖/回帖/签到获积分 | 通知中心出现「你通过 XXX 获得 N 积分」 |
| 注册新账号 | 收到"欢迎加入"通知 |
| 启用 content_review 后审核 | 帖子被通过/驳回 → 通知中心出现审核结果通知;/review-notifications 页仍正常 |
/notifications | 列表正常、进入自动已读、全选删除、分页 |
九、注意事项
- 插件默认停用(
activated: false),部署后需在后台手动启用 - 通知未读数有 Session 缓存(30 秒),标记已读后徽标最多延迟 30 秒消失(属设计行为)
- 积分通知在加分事务内写入(award 在调用方事务中),事务回滚时通知同步回滚,保证一致性
- 点赞通知仅"赞"触发(点踩不打扰);自己赞自己/回自己不通知
- 通知插件是"接收方",审核插件关闭/卸载不影响通知插件本体(只是不再产生审核通知)
本包由 2026-08-11 会话生成(通知中心插件 + 3 个核心 hook + 审核插件联动,方案 B 深度接管)。