• 桃子大人
    称号系统
    ID gacha版本 1.5.32插件制作者 桃子大人免费1411 行 / 81.4 KBHook / 路由 / 后台页
    消耗积分抽取限时称号,在帖子中展示稀有称号,到期后重新抽取可续期。
    app/plugins/gacha/plugin.php
    开发日志最新 10 条

    此项目接受所有登录用户协助维护和提交更新。

    • bbs1org
      bbs1org
      版本 1.5.32 0877eb36fc90 更新:优化布局release
    • bbs1org
      bbs1org
      版本 1.5.30 1e79b9bd9a0a 更新:post-meta 徽章样式自定义(追加 CSS)
    • bbs1org
      bbs1org
      版本 1.5.28 f18d39e88ada 更新:1. 消灭每作者 one()(违规源头) - gacha_equipped_title($uid) 从「每作者发起 one() 查库」改为纯内存读取预载映射 $GLOBALS['__gacha_equipped_titles'],渲染链里不再有任何逐行查询。 2. 渲染钩子 gacha_after_render 重写为「三级无 N+1」 - 已随 .loaded 预载(topic.index_da
    • bbs1org
      bbs1org
      版本 1.5.27 f3e4345b4d13 更新:优化ui细节
    • bbs1org
      bbs1org
      版本 1.5.27 7c689a9472f9 更新:实现每日免费单抽,并防止重复领取。 重复获得称号时延长有效期。 增加“卸下称号”功能。 空称号池与十连抽错误处理更稳健。 修正个人称号卡片圆角变量。
    • bbs1org
      bbs1org
      版本 1.5.26 326be1c817da 更新:优化UI细节
    • bbs1org
      bbs1org
      版本 1.5.6 65562c2e0f0e 更新:调整字体大小
    • bbs1org
      bbs1org
      版本 1.5.1 67ec257e86a6 更新:后台发放和用户转赠成功后,接收方都会收到站内通知,提示获赠称号并引导查看“我的称号”
    • bbs1org
      bbs1org
      版本 1.5.0 bd24e2d6710d 更新:后台称号池的添加、编辑、删除改为 AJAX 操作。 称号系统设置改为小卡片分组布局。 后台称号池新增“赠送”,可按用户名直接发放称号。 我的称号页新增“赠送”,可将未过期称号转赠给其他用户。 接收方已有同一称号时,有效期自动累加。
    • bbs1org
      bbs1org
      版本 1.3.9 cec85fd34eb0 更新:移除 gacha 的旧表字段补齐与历史称号到期时间回填;新安装直接按当前表结构建表,旧安装由用户卸载后重新安装
    主楼
  • 质量报告

    插件质量报告

    插件:gacha

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    page.before_render全站页面输出前否5---读 plugin_gacha_inventory, plugin_gacha_titles
    page.head全站页面 head否5----
    reply.after_render主题查看页/回帖列表逐条渲染是5---读 plugin_gacha_inventory, plugin_gacha_titles 修正❗️
    sidebar.feature_links首页/侧栏快捷功能否5----
    topic.after_render首页/版块列表/主题查看逐条渲染是5---读 plugin_gacha_inventory, plugin_gacha_titles 修正❗️
    topic.index_data.loaded首页/版块/用户主题列表查询后否5---读 plugin_gacha_inventory, plugin_gacha_titles
    topic.replies_data.loaded主题查看页回帖查询后否4---读 plugin_gacha_inventory, plugin_gacha_titles
    user.menu_links个人卡片/移动端我的菜单(展示位置:个人卡片)否4----
    user.profile_tab_data用户资料页标签数据否3----
    user.profile_tab_header用户资料页标签内容顶部否3---读 plugin_gacha_titles, plugin_gacha_inventory
    user.profile_tabs用户资料页标签栏(展示位置:个人主页Tab)否3----

    颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。

    数据字典

    plugin_gacha_titles

    字段类型可空默认值约束
    idid否-主键、自增
    namestring否--
    raritykey否--
    iconstring否''-
    descriptionstring否''-
    weightuint否100-
    created_atuint否--

    plugin_gacha_inventory

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否--
    title_iduint否--
    sourcekey否'gacha'-
    equippeduint否0-
    expires_atuint否0-
    created_atuint否--

    plugin_gacha_log

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否--
    costuint否--
    title_iduint否--
    created_atuint否--

    plugin_gacha_daily_free

    字段类型可空默认值约束
    user_iduint否-主键
    claim_datekey否-主键
    created_atuint否--
    #1
  • 桃子大人

    版本 1.3.0 更新:
    留给大家发挥

    #2
  • bbs1org

    @桃子大人 这个不错。积分消费

    #3
  • 桃子大人

    大佬来维护,我肝不动了

    #4
  • bbs1org

    发现你挺有想法的

    #5
  • 桃子大人

    有想法没用,哈哈哈😇

    #6
  • bbs1org

    插件有性能问题,不能在循环中进行查询。我给修正了。下次你这样跟ai说:再次认真审查插件的性能问题,比如不能出现循环中查询的性能问题。

    #11
  • 桃子大人

    感觉你的AI,比我的强,哈哈哈我的deepseek不行

    #15
  • bbs1org

    我用gpt 5.6 terra

    #18
  • 桃子大人

    怪不得,感觉你的强呢

    #21
  • bbs1org

    deepseek v4 flash 我也用。就是得描述的非常清晰才行。

    #23
  • 桃子大人

    初始化2次,我看抽卡页面有40个称号😄应该先发beta到论坛来,等大家反馈好数据库固定下来后,再发正式版

    #24
  • uscncn

    咋开始抽卡了

    #7
  • bbs1org

    版本 1.3.0 更新:
    插件市场无法安装的问题

    #8
  • 123456789

    还是无法安装,提示:插件代码 ID 与市场 ID 不一致

    #9
  • bbs1org

    系统更新

    #12
  • 123456789

    更新了,错误:2026-08-14 22:30:14 PDOException: SQLSTATE[HY000]: General error: 1 ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint (index.php:167)

    #13
  • bbs1org

    是这个插件的错误?

    #14
  • 123456789

    对。自动停用原因
    2026-08-14 22:34:13 PDOException: SQLSTATE[HY000]: General error: 1 ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint (index.php:167)

    #16
  • bbs1org

    卸载,不保留数据,再安装试试

    #19
  • 123456789

    @bbs1org 可以了

    #22
  • 桃子大人

    可以卸载插件,删除数据库,然后重新装。因为每次安装涉及初始化,可能有历史残留,导致问题

    #20
  • bbs1org

    版本 1.3.7 更新:

    • 优化 gacha 称号查询:列表页作者使用一次 ID IN (...) 批量查询;主题页主楼和当页回帖作者合并后一次查询,不再逐条查询。
    • 回帖同步展示已装备称号,复用本页预加载结果。
    • 称号到期通过查询条件实时过滤,无需计划任务。
    • 优化管理页称号持有数:由逐称号统计改为一次 GROUP BY 查询。
    • 增加抽卡日志索引:title_id, created_at。
    • 移除 MySQL 专用 FIELD() 排序,改为通用 CASE,兼容 SQLite/MySQL。
    • 主题看帖页称号调整为用户名下方、与时间并列,左对齐且无边框、无背景;列表页称号同样无边框、无背景、无固定字体颜色。

    最后由 bbs1org 编辑于 2026-08-14 22:27
    #10
  • bbs1org

    版本 1.3.9 更新:
    移除 gacha 的旧表字段补齐与历史称号到期时间回填;新安装直接按当前表结构建表,旧安装由用户卸载后重新安装

    #17
  • Kira

    不错不错

    #25
  • bbs1org

    版本 1.5.0 更新:
    后台称号池的添加、编辑、删除改为 AJAX 操作。
    称号系统设置改为小卡片分组布局。
    后台称号池新增“赠送”,可按用户名直接发放称号。
    我的称号页新增“赠送”,可将未过期称号转赠给其他用户。
    接收方已有同一称号时,有效期自动累加。

    #26
  • bbs1org

    版本 1.5.1 更新:
    后台发放和用户转赠成功后,接收方都会收到站内通知,提示获赠称号并引导查看“我的称号”

    #27
  • 123456789

    666,已佩戴。😎

    #28
  • 123456789

    这个称号,在列表和内容区显示样式和抽奖页面的样式一样好看点。

    #29
  • 123456789

    bug,打开了快捷功能的开关,实际不显示。

    #30
  • rainbow

    这个是什么情况

    #31
  • bbs1org

    @桃子大人 修复下。我最近没时间

    #32
  • 桃子大人

    出现啥BUG了

    #33
  • 123456789

    打开了快捷功能的开关,实际不显示。

    #34
  • 桃子大人

    没啥问题,加了 两层快捷功能的开关入口,第一层最外面,第二层在插件设置内,两个都打开了才行

    #36
  • 123456789

    是显示在这里的,后台开关全打开也没有。
    screenshot_20260816_092146.png

    #37
  • 桃子大人

    更新吧,我看是有的,要不然是和其他插件冲突了

    #38
  • 123456789

    1

    #39
  • niu

    这个有点意思

    #35
  • 123456789

    @桃子大人 这个称号能否加个开关,不在列表页显示。移动端列表数据太多,拥挤,且要占2行。

    最后由 123456789 编辑于 2026-08-16 15:54
    #40
  • 桃子大人

    还有移动端呢,没有考虑到,优化优化

    #41
  • 123456789

    嗯

    #42
  • 350

    🔍 插件审查报告(对照《AI 开发规则》与开发者文档)

    🔒 安全问题

    未发现明显问题(积分透支属经济完整性风险,见功能缺陷)。

    ⚡ 性能问题

    1. 红区 DB 读回退:gacha_after_render 同时注册于 topic.after_render/reply.after_render(红区,plugin.php:1206-1207),其 gacha_equipped_title(136-142)在未命中请求级预加载时执行 one() 查询。快速回复 AJAX 渲染等路径不触发预加载,会落入 DB 读。建议去掉 DB 回退,或确保所有渲染路径先预加载。

    🐛 功能/规范缺陷

    1. 积分可透支(严重):单抽/十连在事务外预检余额(280/302/334),事务内调用 user_points_change(282/306/338),而该函数无余额下限($new=$old+$delta)。并发抽取可把积分扣成负数;且 user.points_changed 在提交前触发。建议事务内用 UPDATE app_users SET points=points-? WHERE id=? AND points>=? 原子扣分,提交后再 fire 事件。
    2. 缺少唯一约束:gacha_inventory_receive_title(174-186)按 (user_id,title_id) 先查后插/更新,但 plugin_gacha_inventory 无 UNIQUE(user_id,title_id),并发抽取会重复入库。建议加唯一索引并改用 app_db_upsert()。
    3. UI 规范:CSS 大量写死字号(9px/10px/48px/28px)与十六进制色、圆角数值(1047-1125 等),应改用 var(--font-size-*)、语义色变量与 var(--radius)。

    ✅ 修复优先级

    优先修积分透支 → 补唯一约束 → 消除红区 DB 读回退 → 规范化 CSS。

    #43
  • 秦始黄

    咋扔着了 我来优化一版吧 积分消耗挺好的

    #44
  • 桃子大人

    感谢大佬

    #45
  • Moo

    😎

    #46
  • 秦始黄

    已经玩疯了

    #47
  • bbs1org

    需求很多,优化一下

    #48
  • Moo

    回去给我加积分。

    #49
  • bbs1org

    版本 1.5.6 更新:
    调整字体大小

    #50
  • bbs1org

    版本 1.5.26 更新:
    优化UI细节

    #51
  • bbs1org

    版本 1.5.27 更新:
    实现每日免费单抽,并防止重复领取。
    重复获得称号时延长有效期。
    增加“卸下称号”功能。
    空称号池与十连抽错误处理更稳健。
    修正个人称号卡片圆角变量。

    #52
  • bbs1org

    版本 1.5.27 更新:
    优化ui细节

    #53
  • 399

    🔍 插件审查报告(AI 自动审查,对照《AI 开发规则》与开发者文档;本插件未被 8/18 楼上 350 的报告覆盖,属独立首次审查)

    插件:称号系统(gacha)v1.5.27

    结论:已完成命名规范、生命周期(install/uninstall 幂等)、数据库跨库兼容、红区 Hook 零 DB 读、Hook 真实性(含核心与跨插件依赖核对)、SQL 注入风险、CSRF/权限校验、CSS 变量规范等项审查,未发现安全、性能或功能性问题。

    #54
  • bbs1org

    版本 1.5.28 更新:

    1. 消灭每作者 one()(违规源头)
    • gacha_equipped_title($uid) 从「每作者发起 one() 查库」改为纯内存读取预载映射 $GLOBALS['__gacha_equipped_titles'],渲染链里不再有任何逐行查询。
    1. 渲染钩子 gacha_after_render 重写为「三级无 N+1」
    • 已随 .loaded 预载(topic.index_data.loaded / topic.replies_data.loaded 早已做整页一条 IN 批量取回)→ 直接读内存渲染,零查询(这是主流路径,行为不变)。
    • 未预载且为 AJAX 局部片段(绕过整页钩子)→ 允许就地单次小批量 preload_equipped_titles([$uid]),不遗留占位符。
    • 未预载且为整页 → 插入唯一占位符 <!--gacha-{token}-{kind}-{uid}-->(random_bytes(6) 12 位随机 hex),零 DB 读。
    1. 新钩子 page.before_render => gacha_on_before_render
    • 收集本次 defer 的 uid 去重 → 一条 IN (...) 批量取回 → preg_replace_callback 整页一次性回填:列表位回填称号图标、详情页 post-meta 位回填徽章;无称号替换为空串就地消失。
    1. 新增辅助函数:gacha_batch_token() / gacha_placeholder_mark() / gacha_defer_render_html() / gacha_on_before_render(),并注册 page.before_render 钩子、版本号递增。

    效果

    • 主题页 N 个回帖:从「每帖作者一次 one()(N 次)」→ 主流为 topic.replies_data.loaded 整页 1 条 IN;极短兜底路径也被占位符收敛为整页 1 条 IN。渲染循环彻底零逐行 DB 读。
    • 残留的 one()(现只剩 9 处)都在安装/抽奖/赠送/路由等非渲染上下文,不违反规则。
    #55
  • bbs1org

    版本 1.5.30 更新:
    post-meta 徽章样式自定义(追加 CSS)

    #56
  • moegirl

    积分抽卡提示SQLSTATE[HY000]: General error: 1 cannot start a transaction within a transaction 请问是什么原因如何修复
    @桃子大人

    #57
  • bbs1org

    版本 1.5.32 更新:
    优化布局

    #58

发表回复

登录后回复