• 秦始黄
    积分兑换虚拟卡
    ID virtual_card版本 1.5.0插件制作者 秦始黄免费327 行 / 25 KBHook / 路由
    允许发帖者批量添加虚拟卡并用积分销售,自动发卡、通知并保留购买记录。
    app/plugins/virtual_card/plugin.php
    开发日志已有 1 条

    个人独立维护项目。

    • 秦始黄
      秦始黄
      版本 1.5.0 17891e850749 更新:旧格式迁移:已将插件代码转存到开发日志,主题正文改为基础介绍。release
    主楼
  • 质量报告

    插件质量报告

    插件:virtual_card

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    topic.after_render首页/版块列表/主题查看逐条渲染是(列表跳过)5--app_users读 plugin_virtual_card_orders, plugin_virtual_card_sales
    topic.after_save主题保存后回调内3--app_topics写 plugin_virtual_card_items, plugin_virtual_card_sales 修正❗️
    topic.before_save主题发布/编辑表单提交否3---读 plugin_virtual_card_sales
    content.before_delete内容删除操作否2---读 plugin_virtual_card_sales
    topic.before_delete主题删除操作否2---写 plugin_virtual_card_items, plugin_virtual_card_sales
    topic.form_extra主题发布/编辑表单否2---读 plugin_virtual_card_items, plugin_virtual_card_sales

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

    数据字典

    plugin_virtual_card_sales

    字段类型可空默认值约束
    id$id是--
    topic_id$uint否-唯一
    seller_id$uint否--
    card_name$string否--
    price$uint否--
    limit_oneINTEGER否0-
    total_count$uint否0-
    sold_count$uint否0-
    created_at$uint否--
    updated_at$uint否--

    plugin_virtual_card_items

    字段类型可空默认值约束
    id$id是--
    sale_id$uint否--
    card_value$text否--
    buyer_id$uint否0-
    purchased_at$uint否0-

    plugin_virtual_card_orders

    字段类型可空默认值约束
    id$id是--
    sale_id$uint否--
    topic_id$uint否--
    seller_id$uint否--
    buyer_id$uint否--
    item_id$uint否--
    card_name$string否--
    card_value$text否--
    price$uint否--
    created_at$uint否--
    #1
  • 秦始黄

    我刚把签到积分改大了 哈哈 我也在考虑这个问题

    #4
  • bbs1org

    @秦始黄 很好。再增加个充值积分的功能,要不积分不够咋办

    #2
  • 秦始黄

    我去 这就发布上线了 我还在优化呢
    演示地址:https://www.nodeloc.cn/topic/11

    #3
  • bbs1org

    多完善完善

    #6
  • 秦始黄

    确实 发布插件不得奖励个万儿八千的积分吗?或者可以设置价格 赚点积分 虽然都是用爱发电

    #8
  • Maser

    功能越来越强大了

    #5
  • b

    已经积分不够了,我都不敢把全部插件下下来,因为不够,我就下了目前要用的一个。

    #7
  • bbs1org

    有道理。我后续增加一个插件售价。必须用积分购买,给插件制造者。

    #10
  • b

    作者和插件作者都得奖励

    #9
  • 秦始黄

    V1.5.0 更新日志
    增加了自动回帖的开关 可以设置自定义回帖内容。购买成功后会自动回帖。
    增加了购买记录翻页
    增加了限购数量设置

    #11
  • 350

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

    🔒 安全问题

    未发现明显问题(SQL 均参数化、输出经 h() 转义、兑换路由有 need_login/require_post 与 CSRF,无硬编码密钥)。

    ⚡ 性能问题

    1. 红区 Hook 内查库:topic.after_render 回调 virtual_card_topic_after_render 在渲染链中执行 one()(L181 查销售)、val()(L190 查购买次数)及 virtual_card_order_data() 的 COUNT+联表查询(L185),违反“渲染循环零 DB 读”。建议在 app.boot 或 topic.replies 预加载到内存,渲染钩子只做内存读取。

    🐛 功能/规范缺陷

    1. 卸载无法删表:virtual_card_uninstall(array $plugin, bool $keep_data = true)(L38)核心只传 $plugin 单参,$keep_data 恒为 true,删表逻辑永不执行。建议去掉第二参,回调仅在“不保留数据”时被调用,直接删表。
    2. tx() 内调用 err()(L233/L236/L238 等)会直接终止脚本,事务未显式提交/回滚。建议先校验再进事务,或用异常统一回滚。
    3. 积分扣减(L242)与卖家加分(L244)直接用 UPDATE 改 app_users.points,绕过 user_points_change(),无积分流水、不触发 user.points_changed。建议移出事务改用 user_points_change()。
    4. CSS 写死字号(12px/15px/11px/20px)与圆角(6px),应改用 var(--font-size-*) 与 var(--radius)(L301)。

    ✅ 修复优先级

    红区查库 → 卸载删表 → 积分统一落账 → 事务内 err → CSS 变量。

    #12
  • 399

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

    插件:积分兑换虚拟卡(virtual_card)v1.5.0

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

    #13
  • 秦始黄

    旧格式迁移:已将插件代码转存到开发日志,主题正文改为基础介绍。

    #14

发表回复

登录后回复