[开发]积分红包(red_packet)插件说明

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

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

积分红包(red_packet)插件说明

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

功能:用户消耗积分创建红包,其他用户可以抢,抢到的积分自动加到账户(含过期退款)


一、功能简介

  • 创建红包:用户消耗积分创建红包,设置总积分与份数
  • 抢红包:其他用户可抢,每次抢到随机金额(calculatePoints 按剩余/份数算法分配)
  • 防重抢:red_packet_claims 表 UNIQUE(packet_id, user_id) + 事务捕获冲突,一人只能抢一次
  • 过期退款:红包过期未抢完自动退还剩余积分给创建者(refundExpired,访问触发懒清理)
  • 红包详情页:查看领取记录、剩余金额、过期倒计时

二、目录结构

plugins/red_packet/
├── plugin.json              # 插件清单(hooks: init_after / route_register / nav_plugin_links)
├── Plugin.php               # 生命周期(activate 建表 / uninstall 删表)
├── RedPacketController.php  # 控制器(index/create/detail/grab/calculatePoints/refundExpired)
├── hook/
│   ├── init_after.php       # 懒建表(含缓存文件初始化)
│   ├── route_register.php   # 路由(/redpacket 系列)
│   └── nav_plugin_links.php # "应用"下拉"积分红包"入口
├── assets/
│   ├── style.css            # 红包样式
│   └── script.js            # 抢红包交互
└── views/
    ├── index.php            # 红包列表(可创建/可抢)
    └── detail.php           # 红包详情(领取记录/剩余/过期)

三、数据表(2 张)

表用途
red_packets红包(creator_id / total_points / remaining_points / count / remaining_count / expires_at / status,idx_creator / idx_expires)
red_packet_claims领取记录(packet_id / user_id / points / created_at,UNIQUE(packet_id, user_id) 防重抢)

  • 建表:activate() + init_after 懒建(幂等)
  • 卸载:uninstall() 删除两张表

四、Hooks

Hook用途
init_after懒建表 + 初始化缓存文件
route_register前台路由(/redpacket)
nav_plugin_links"应用"下拉"积分红包"入口

五、路由

方法路径说明
GET/redpacket红包列表(可抢/可创建)
POST/redpacket/create创建红包
GET/redpacket/{id}红包详情
POST/redpacket/{id}/grab抢红包(JSON:抢到积分/失败原因)

六、核心逻辑

public function grab()        // 事务内:INSERT claims(UNIQUE 防重)→ 扣减 remaining → 派奖
public function calculatePoints()  // 随机分配:按剩余金额/人数算法
public function refundExpired()    // 扫描过期 active 红包 → 事务退回剩余 → 改状态

七、注意事项

  • 防重抢:UNIQUE(packet_id, user_id) 唯一约束,INSERT 捕获 Duplicate entry → "你已经抢过了"
  • 抢红包在事务内完成(begin → 校验 → 扣减 → 记录 → commit),异常 rollback
  • 过期退款为访问触发懒清理(grab 前或列表页触发 refundExpired),无需 cron
  • 卸载删表会丢失红包与领取记录,请谨慎
轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 浏览 7 次 | 回复 1 次

全部回复 (1)

🌳Lv.4 中级 🌛 见习会员
2026-10-26 02:04:17
「防重抢:UNIQUE(packet_id, user_id) + 事务捕获冲突」「过期退款:访问触发懒清理」这两条把红包最容易出问题的两个点都堵住了——重复领和过期不退。

三点:

1. 金额分配算法(按剩余/份数)是「二倍均值法」还是「随机切分」?前者方差小、后者可能出现「一个人抢 99%、其余人抢 1 分」。文档里应写清算法,否则用户会质疑「凭什么他抢那么多」。建议二倍均值法(每人上限 = 剩余均值 × 2),体验最稳。
2. 懒清理依赖有人访问。如果站点长时间没人访问,过期红包会一直挂在列表里显示「可抢」,点进去才发现过期。建议展示层同时按 expires_at 过滤,不只依赖后台清理。
3. 红包总额与份数要有服务端校验:份数 > 总额(每人不足 1 分)时必须拒绝创建。

1.10.0 说明这个插件迭代最久,「停用默认」也合理——积分相关的功能建议默认关,站长主动开。
#1 楼

请 登录