新增功能:
- 礼包系统:superlevel 站长可发 888 数量 10 份礼包,支持金币/经验双类型
- 发包前三按钮选择(金币礼包 / 经验礼包 / 取消),使用 chatBanner 弹窗
- 聊天室系统公告含「立即抢包」按钮,金币红色/经验紫色配色区分
- WebSocket 实时推送红包弹窗卡片至所有在线用户
- Redis LPOP 原子分发 + 数据库 unique 约束防重领,并发安全
- 弹窗打开自动拉取服务端最新状态(剩余数量/已领/过期实时刷新)
- 新增 GET /red-packet/{id}/status 状态查询接口
- 新增 CurrencySource::RED_PACKET_RECV / RED_PACKET_RECV_EXP 枚举
安全加固:
- 后台用户编辑/强杀按钮仅 id=1 超管可见(前端隐藏 + 后端 403 双重拦截)
51 lines
1019 B
PHP
51 lines
1019 B
PHP
<?php
|
||
|
||
/**
|
||
* 文件功能:红包领取记录 Model
|
||
*
|
||
* 每条记录代表某个用户领取了某个红包的一份,
|
||
* envelope_id + user_id 联合唯一约束保证幂等性。
|
||
*
|
||
* @author ChatRoom Laravel
|
||
* @version 1.0.0
|
||
*/
|
||
|
||
namespace App\Models;
|
||
|
||
use Illuminate\Database\Eloquent\Model;
|
||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||
|
||
class RedPacketClaim extends Model
|
||
{
|
||
/** 无自动 updated_at,只记录 claimed_at */
|
||
public $timestamps = false;
|
||
|
||
protected $fillable = [
|
||
'envelope_id',
|
||
'user_id',
|
||
'username',
|
||
'amount',
|
||
'claimed_at',
|
||
];
|
||
|
||
/**
|
||
* 类型转换。
|
||
*/
|
||
public function casts(): array
|
||
{
|
||
return [
|
||
'claimed_at' => 'datetime',
|
||
];
|
||
}
|
||
|
||
/**
|
||
* 关联红包主表。
|
||
*
|
||
* @return BelongsTo<RedPacketEnvelope, RedPacketClaim>
|
||
*/
|
||
public function envelope(): BelongsTo
|
||
{
|
||
return $this->belongsTo(RedPacketEnvelope::class, 'envelope_id');
|
||
}
|
||
}
|