Files
chatroom/app/Models/RedPacketClaim.php
lkddi 6fa42b90d5 功能:站长礼包系统(金币/经验双类型)+ 后台用户编辑权限收紧(仅 id=1 超管)
新增功能:
- 礼包系统:superlevel 站长可发 888 数量 10 份礼包,支持金币/经验双类型
- 发包前三按钮选择(金币礼包 / 经验礼包 / 取消),使用 chatBanner 弹窗
- 聊天室系统公告含「立即抢包」按钮,金币红色/经验紫色配色区分
- WebSocket 实时推送红包弹窗卡片至所有在线用户
- Redis LPOP 原子分发 + 数据库 unique 约束防重领,并发安全
- 弹窗打开自动拉取服务端最新状态(剩余数量/已领/过期实时刷新)
- 新增 GET /red-packet/{id}/status 状态查询接口
- 新增 CurrencySource::RED_PACKET_RECV / RED_PACKET_RECV_EXP 枚举
安全加固:
- 后台用户编辑/强杀按钮仅 id=1 超管可见(前端隐藏 + 后端 403 双重拦截)
2026-03-01 22:20:54 +08:00

51 lines
1019 B
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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');
}
}