本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:8月12日的备份/update/14/README-部署说明.md。
SoSite 勋章中心插件更新包(2026-08-11)
本目录包含 1 个新增插件目录(16 文件)+ 3 个修改 的文件,按原目录结构放置。
覆盖方式:将本目录内所有文件按相同路径上传覆盖到站点根目录(如 D:/phpstudy_pro/WWW 或服务器对应路径)。
生成环境:PHP 8.2 / MySQL 5.7.26。
一、本包功能说明
勋章中心插件(plugins/medal/):后台定义勋章、自动/手动颁发、用户佩戴 1-3 枚并展示在帖子楼层 / 个人主页 / 右栏发帖人信息栏。
- 勋章定义:名称 / 图标(内置 icon map 名 + 颜色,无图时兜底显示)/ 描述 / 获取条件 / 排序 / 启停;支持
image图片字段(图片放assets/medals/目录,后台填文件名如medal1.gif,按上传原尺寸显示,不裁剪成圆形/方形) - 获取方式:
- 后台手动颁发 / 回收(按用户名,防 IDOR,CSRF 校验)
- 自动规则 3 种:发帖数 ≥ N、回帖数 ≥ N、注册满 N 天、积分 ≥ N(
condition_type后台可选,幂等颁发,已有则跳过)
- 佩戴机制:用户在
/medal勋章墙勾选最多 3 枚保存佩戴(AJAX + CSRF,超限/未获得拦截),展示位只显示佩戴的勋章 - 展示位置(
controller_view_before批量注入,避免 N+1):
- 帖子详情页主帖/回帖用户名旁
- 帖子/博客详情页右栏"发帖人信息栏"用户名旁
- 个人主页(user_profile)up-badges 处
- 入口:前台"应用"面板"勋章中心"(带
__nav_uri激活判断,跳转/medal);后台侧边栏"勋章管理"
二、数据库变更(3 张新表,激活时幂等创建,无需手动执行)
medals:勋章定义(name/icon/color/description/condition_type/condition_value/sort/status/image/created_at)user_medals:用户持有(user_id/medal_id/source auto|manual/created_at,唯一键防重复颁发)user_medal_wears:佩戴位(user_id/medal_id/wear_sort 1-3,唯一键防同勋章重复佩戴)
建表由
Plugin::activate()与hook/init_after.php双保险幂等执行(CREATE TABLE IF NOT EXISTS);uninstall()删表。
三、覆盖前必须做的事
备份服务器现状
把服务器上以下文件/目录整体备份一份(zip 即可):
plugins/medal/(若已存在)app/Views/thread/show.phpapp/Views/_components/right_sidebar.phpplugins/user_profile/views/front.phpplugins/plugins_cache.php(运行时产物,若存在)
四、本包包含的文件清单
新增插件(plugins/medal/,16 文件)
plugins/medal/plugin.json
plugins/medal/Plugin.php (建表/勋章 CRUD/颁发回收/佩戴/自动规则/渲染)
plugins/medal/MedalController.php (前台:勋章墙 + 佩戴保存 AJAX)
plugins/medal/AdminMedalController.php (后台:CRUD + 手动颁发/回收)
plugins/medal/hook/route_register.php (/medal、/medal/wear)
plugins/medal/hook/admin_route_register.php (/admin/medals 系列)
plugins/medal/hook/init_after.php (懒建表 + 已登录用户惰性核对自动规则)
plugins/medal/hook/thread_create_after.php (发帖后核对)
plugins/medal/hook/post_create_after.php (回帖后核对)
plugins/medal/hook/auth_register_after.php (注册后核对)
plugins/medal/hook/controller_view_before.php (批量注入佩戴勋章数据)
plugins/medal/hook/nav_plugin_links.php (前台"应用"入口)
plugins/medal/hook/admin_sidebar_links.php (后台侧边栏入口)
plugins/medal/views/index.php (勋章墙:我的勋章 + 佩戴选择 + 全部勋章)
plugins/medal/views/admin.php (后台:CRUD + 颁发/回收 + 编辑弹窗)
plugins/medal/assets/style.css (.mn-medal 勋章化样式 + 勋章墙/后台样式)修改(3)
| 文件 | 改动 |
|---|---|
app/Views/thread/show.php | 主帖 + 回帖用户名旁渲染佩戴勋章(wearingMedals) |
app/Views/_components/right_sidebar.php | 发帖人信息栏用户名旁渲染佩戴勋章 |
plugins/user_profile/views/front.php | 个人主页 up-badges 渲染佩戴勋章 |
五、部署步骤(推荐顺序)
- 备份(见第三节)
- 上传本 update 包全部文件,按路径覆盖
- 删除
plugins/plugins_cache.php(插件缓存无 mtime 校验,不删 hooks 不生效) - 进入后台"插件管理"启用「勋章中心」(或确认本地已验证的
activated: true状态) - 进入后台"勋章管理"(
/admin/medals)添加勋章、配置自动条件、按需手动颁发 - 浏览器回归验证(见下)
六、回归验证清单
| 页面/场景 | 检查点 |
|---|---|
/admin/medals | 勋章 CRUD 正常;添加"发帖数 ≥ 2"勋章后保存 |
| 自动规则 | 发帖/回帖/积分达标后自动获得(帖子楼层用户名旁出现勋章) |
/admin/medals 手动颁发 | 输入用户名颁发成功;重复颁发提示"已拥有";不存在用户提示 |
/medal(勋章墙) | 展示全部勋章;未获得显示条件、已获得显示"已获得";勾选 1-3 枚保存成功,勾选 4 枚被拦截 |
| 帖子详情页 | 主帖/回帖用户名旁显示佩戴勋章(18px 圆形图标) |
个人主页 /u/{id} | up-badges 处显示佩戴勋章 |
| 帖子/博客详情右栏 | 发帖人信息栏用户名旁显示佩戴勋章 |
| 前台"应用"面板 | "勋章中心"入口存在,/medal 页时高亮 |
| 停用勋章 | 后台停用后展示位不再显示该勋章(前端 status=1 过滤) |
七、注意事项
- 插件缓存:部署后必须删
plugins/plugins_cache.php,否则 hooks 不生效(本插件 9 个 hook) - PDO 铁律:
controller_view_before批量查询用IN (1,2,3)内联整数(无占位符复用);SHOW TABLES LIKE用quote()内联(init_after) - 自动规则触发点:发帖/回帖/注册钩子 + 登录用户每请求惰性核对(init_after),勋章页访问也会核对;手动勋章仅后台颁发
controller_view_before只处理 3 个目标模板(thread/show、blog/detail、plugins/user_profile/front),其余页面零开销- 展示位模板改动依赖注入的
wearingMedals数据;插件停用时模板?? ''兜底,不影响页面 - 图标名沿用核心
TemplateCompiler::icon()map(trophy/award/crown/coins/star-fill/shield-alt 等);image字段可留空 - 勋章图片存放:放
assets/medals/(不要放assets/uploads/——后台"清理孤儿附件"只扫 uploads 目录,会误删无数据库记录的勋章图);后台"图片文件名"填medal1.gif(插件自动拼/assets/medals/前缀) - 卸载插件会 DROP 三张表(勋章与持有/佩戴数据一并删除),请谨慎
本包由 2026-08-11 会话生成(勋章中心插件:定义/自动+手动颁发/佩戴展示 + 三处展示位模板)。