[开发]勋章中心(medal)插件说明

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

本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:WWW/plugins/medal/说明.md。

勋章中心(medal)插件说明

版本:1.0.0 | 作者:SoSite | 状态:⏸️ 停用(默认未启用)

功能:勋章系统——后台定义勋章(内置图标 + 颜色,可传图片)、自动/手动颁发、用户佩戴 1–3 枚并展示于帖子楼层 / 个人主页 / 右栏


一、功能简介

  • 自定义勋章:后台定义勋章(名称 / 图标 + 颜色 / 描述 / 排序 / 状态,可上传图片 image)
  • 颁发规则:manual 手动,或按 thread_count(发帖数)/ post_count(回帖数)/ reg_days(注册天数)/ points(积分)条件自动颁发
  • 佩戴展示:用户佩戴 1–3 枚(WEAR_LIMIT = 3),展示于帖子楼层 / 个人主页 / 右栏
  • 积分商城联动:points_mall_medal_redeem 钩子支持积分兑换勋章
  • 前台勋章墙:浏览全部可领取 / 已获得勋章

二、目录结构

plugins/medal/
├── plugin.json              # 插件清单(init_after / route_register / admin_route_register / nav_plugin_links / points_mall_medal_redeem / thread_create_after / post_create_after / auth_register_after / controller_view_before)
├── Plugin.php               # 建表(3 表)+ 勋章业务(佩戴 / 自动规则 / 颁发)
├── MedalController.php      # 前台勋章墙(列表 / 佩戴设置)
├── AdminMedalController.php # 后台勋章管理(/admin/medals)
├── hook/                    # init_after / route_register / admin_route_register / nav_plugin_links / points_mall_medal_redeem / thread_create_after / post_create_after / auth_register_after / controller_view_before
├── views/                   # admin.php / index.php(勋章墙)
└── lang/                    # zh.php / en.php / zh_tw.php

三、数据表(插件独立库 plugins/medal/data/medal.sqlite)

表用途
medals勋章定义(name / icon / color / description / condition_type / condition_value / sort / status / image)
user_medals用户获得记录(user_id / medal_id / source[auto
user_medal_wears佩戴记录(user_id / medal_id / wear_sort,UNIQUE(user_id, wear_sort) 与 UNIQUE(user_id, medal_id))

四、路由

方法路径说明
GET/medals前台勋章墙(全部 / 已获得 / 佩戴设置)
POST/medals/wear保存佩戴(1–3 枚,CSRF)
GET/admin/medals后台勋章管理
POST/admin/medals/add / edit / delete后台增删改
POST/admin/medals/save-rule保存自动颁发规则

五、核心规则

  • 自动颁发:触发钩子(发帖 / 回帖 / 注册 / 积分变动 / 登录)时按 condition_type + condition_value 判断,达标 INSERT OR IGNORE 到 user_medals
  • 佩戴去重:UNIQUE(user_id, medal_id) 保证同枚勋章只佩戴一次;UNIQUE(user_id, wear_sort) 保证槽位不冲突
  • 手动颁发由后台直接添加,source='manual'

六、注意事项

  • 卸载删表会清空全部勋章定义、用户获得与佩戴记录,请谨慎
  • 佩戴上限 3 枚为常量 WEAR_LIMIT,可通过改插件代码调整
  • 图标使用内置图标名 + 颜色;image 非空时以图片优先展示
轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| Views 3 | Replies 1

All Replies (1)

🌳Lv.4 中级 🌛 见习会员
2026-10-26 00:54:54
勋章系统最容易做错的地方是「展示位置」——佩戴 1–3 枚要同时出现在帖子楼层、个人主页、右栏三个位置,每个位置的空间差异很大(楼层内只有一行空间、右栏可以竖排)。

三点:

1. WEAR_LIMIT = 3 这个上限合理,但三个位置同时渲染意味着每次渲染都要查一次佩戴关系。建议进页面时一次性把「帖子作者列表」的佩戴勋章批量查出来,而不是每个楼层查一次(20 层就是 20 次查询)。
2. 自动颁发规则(thread_count / post_count / reg_days / points)是「达成即发」还是「定时扫描」?达成即发要挂到对应钩子上;定时扫描在没有 cron 的站点上不会跑。建议优先做钩子触发,把扫描作为补偿。
3. 与积分商城联动走 points_mall_medal_redeem 钩子,这个解耦做对了。但商城兑换的勋章要能区分「自动颁发」和「积分购买」,否则用户投诉「我花钱买的勋章,为什么重置条件后消失了」。

「可上传图片 + 内置图标配色」两种形态并存,覆盖了无图和有图的站点。
#1 floor

Please Log in