diff --git a/app/Enums/CurrencySource.php b/app/Enums/CurrencySource.php index 25cac11..5ff6a2c 100644 --- a/app/Enums/CurrencySource.php +++ b/app/Enums/CurrencySource.php @@ -72,6 +72,12 @@ enum CurrencySource: string /** 节日福利红包(管理员设置的定时金币福利) */ case HOLIDAY_BONUS = 'holiday_bonus'; + /** 百家乐下注消耗(扣除金币) */ + case BACCARAT_BET = 'baccarat_bet'; + + /** 百家乐中奖赔付(收入金币,含本金返还) */ + case BACCARAT_WIN = 'baccarat_win'; + /** * 返回该来源的中文名称,用于后台统计展示。 */ @@ -95,6 +101,8 @@ enum CurrencySource: string self::WEDDING_ENV_RECV => '领取婚礼红包', self::FORCED_DIVORCE_TRANSFER => '强制离婚财产转移', self::HOLIDAY_BONUS => '节日福利', + self::BACCARAT_BET => '百家乐下注', + self::BACCARAT_WIN => '百家乐赢钱', }; } } diff --git a/app/Events/BaccaratRoundOpened.php b/app/Events/BaccaratRoundOpened.php new file mode 100644 index 0000000..2bf4a7b --- /dev/null +++ b/app/Events/BaccaratRoundOpened.php @@ -0,0 +1,66 @@ + + */ + public function broadcastOn(): array + { + return [new Channel('room.1')]; + } + + /** + * 广播事件名(前端监听 .baccarat.opened)。 + */ + public function broadcastAs(): string + { + return 'baccarat.opened'; + } + + /** + * 广播数据。 + * + * @return array + */ + public function broadcastWith(): array + { + return [ + 'round_id' => $this->round->id, + 'bet_opens_at' => $this->round->bet_opens_at->toIso8601String(), + 'bet_closes_at' => $this->round->bet_closes_at->toIso8601String(), + 'bet_seconds' => (int) now()->diffInSeconds($this->round->bet_closes_at), + ]; + } +} diff --git a/app/Events/BaccaratRoundSettled.php b/app/Events/BaccaratRoundSettled.php new file mode 100644 index 0000000..f24da86 --- /dev/null +++ b/app/Events/BaccaratRoundSettled.php @@ -0,0 +1,69 @@ + + */ + public function broadcastOn(): array + { + return [new Channel('room.1')]; + } + + /** + * 广播事件名(前端监听 .baccarat.settled)。 + */ + public function broadcastAs(): string + { + return 'baccarat.settled'; + } + + /** + * 广播数据:骰子点数 + 开奖结果 + 统计。 + * + * @return array + */ + public function broadcastWith(): array + { + return [ + 'round_id' => $this->round->id, + 'dice' => [$this->round->dice1, $this->round->dice2, $this->round->dice3], + 'total_points' => $this->round->total_points, + 'result' => $this->round->result, + 'result_label' => $this->round->resultLabel(), + 'total_payout' => $this->round->total_payout, + 'bet_count' => $this->round->bet_count, + ]; + } +} diff --git a/app/Http/Controllers/BaccaratController.php b/app/Http/Controllers/BaccaratController.php new file mode 100644 index 0000000..1c14040 --- /dev/null +++ b/app/Http/Controllers/BaccaratController.php @@ -0,0 +1,171 @@ +json(['round' => null]); + } + + $user = $request->user(); + $myBet = BaccaratBet::query() + ->where('round_id', $round->id) + ->where('user_id', $user->id) + ->first(); + + return response()->json([ + 'round' => [ + 'id' => $round->id, + 'status' => $round->status, + 'bet_closes_at' => $round->bet_closes_at->toIso8601String(), + 'seconds_left' => max(0, (int) now()->diffInSeconds($round->bet_closes_at, false)), + 'total_bet_big' => $round->total_bet_big, + 'total_bet_small' => $round->total_bet_small, + 'total_bet_triple' => $round->total_bet_triple, + 'my_bet' => $myBet ? [ + 'bet_type' => $myBet->bet_type, + 'amount' => $myBet->amount, + ] : null, + ], + ]); + } + + /** + * 用户提交下注。 + * + * 同一局每人限下一注(后台强制幂等)。 + * 下注成功后立即扣除金币,结算时中奖者才返还本金+赔付。 + */ + public function bet(Request $request): JsonResponse + { + if (! GameConfig::isEnabled('baccarat')) { + return response()->json(['ok' => false, 'message' => '百家乐游戏当前未开启。']); + } + + $data = $request->validate([ + 'round_id' => 'required|integer|exists:baccarat_rounds,id', + 'bet_type' => 'required|in:big,small,triple', + 'amount' => 'required|integer|min:1', + ]); + + $config = GameConfig::forGame('baccarat')?->params ?? []; + $minBet = (int) ($config['min_bet'] ?? 100); + $maxBet = (int) ($config['max_bet'] ?? 50000); + + if ($data['amount'] < $minBet || $data['amount'] > $maxBet) { + return response()->json(['ok' => false, 'message' => "押注金额须在 {$minBet}~{$maxBet} 金币之间。"]); + } + + $round = BaccaratRound::find($data['round_id']); + + if (! $round || ! $round->isBettingOpen()) { + return response()->json(['ok' => false, 'message' => '当前不在下注时间内。']); + } + + $user = $request->user(); + + // 检查用户金币余额 + if ($user->gold < $data['amount']) { + return response()->json(['ok' => false, 'message' => '金币不足,无法下注。']); + } + + $currency = $this->currency; + + return DB::transaction(function () use ($user, $round, $data, $currency): JsonResponse { + // 幂等:同一局只能下一注 + $existing = BaccaratBet::query() + ->where('round_id', $round->id) + ->where('user_id', $user->id) + ->lockForUpdate() + ->exists(); + + if ($existing) { + return response()->json(['ok' => false, 'message' => '本局您已下注,请等待开奖。']); + } + + // 扣除金币 + $currency->change( + $user, + 'gold', + -$data['amount'], + CurrencySource::BACCARAT_BET, + "百家乐 #{$round->id} 押 ".match ($data['bet_type']) { + 'big' => '大', 'small' => '小', default => '豹子' + }, + ); + + // 写入下注记录 + BaccaratBet::create([ + 'round_id' => $round->id, + 'user_id' => $user->id, + 'bet_type' => $data['bet_type'], + 'amount' => $data['amount'], + 'status' => 'pending', + ]); + + // 更新局次汇总统计 + $field = 'total_bet_'.$data['bet_type']; + $round->increment($field, $data['amount']); + $round->increment('bet_count'); + + $betLabel = match ($data['bet_type']) { + 'big' => '大', 'small' => '小', default => '豹子' + }; + + return response()->json([ + 'ok' => true, + 'message' => "✅ 已押注「{$betLabel}」{$data['amount']} 金币,等待开奖!", + 'amount' => $data['amount'], + 'bet_type' => $data['bet_type'], + ]); + }); + } + + /** + * 查询最近5局的历史记录(前端展示趋势)。 + */ + public function history(): JsonResponse + { + $rounds = BaccaratRound::query() + ->where('status', 'settled') + ->orderByDesc('id') + ->limit(10) + ->get(['id', 'dice1', 'dice2', 'dice3', 'total_points', 'result', 'settled_at']); + + return response()->json(['history' => $rounds]); + } +} diff --git a/app/Jobs/CloseBaccaratRoundJob.php b/app/Jobs/CloseBaccaratRoundJob.php new file mode 100644 index 0000000..bbb52b0 --- /dev/null +++ b/app/Jobs/CloseBaccaratRoundJob.php @@ -0,0 +1,179 @@ +round->fresh(); + + // 防止重复结算 + if (! $round || $round->status !== 'betting') { + return; + } + + $config = GameConfig::forGame('baccarat')?->params ?? []; + + // 乐观锁:CAS 先把状态改为 settling + $updated = BaccaratRound::query() + ->where('id', $round->id) + ->where('status', 'betting') + ->update(['status' => 'settling']); + + if (! $updated) { + return; // 已被其他进程处理 + } + + // ── 摇骰子 ────────────────────────────────────────────────── + $dice = [random_int(1, 6), random_int(1, 6), random_int(1, 6)]; + $total = array_sum($dice); + + // ── 判断结果 ──────────────────────────────────────────────── + $killPoints = $config['kill_points'] ?? [3, 18]; + if (! is_array($killPoints)) { + $killPoints = explode(',', (string) $killPoints); + } + $killPoints = array_map('intval', $killPoints); + + $result = match (true) { + $dice[0] === $dice[1] && $dice[1] === $dice[2] => 'triple', // 豹子(优先判断) + in_array($total, $killPoints, true) => 'kill', // 庄家收割 + $total >= 11 && $total <= 17 => 'big', // 大 + default => 'small', // 小 + }; + + // ── 结算下注记录 ───────────────────────────────────────────── + $bets = BaccaratBet::query()->where('round_id', $round->id)->where('status', 'pending')->with('user')->get(); + $totalPayout = 0; + + DB::transaction(function () use ($bets, $result, $config, $currency, &$totalPayout) { + foreach ($bets as $bet) { + if ($result === 'kill') { + // 庄家收割:全灭无退款 + $bet->update(['status' => 'lost', 'payout' => 0]); + + continue; + } + + if ($bet->bet_type === $result) { + // 中奖:计算赔付(含本金返还) + $payout = BaccaratRound::calcPayout($bet->bet_type, $bet->amount, $config); + $bet->update(['status' => 'won', 'payout' => $payout]); + + // 金币入账 + $currency->change( + $bet->user, + 'gold', + $payout, + CurrencySource::BACCARAT_WIN, + "百家乐 #{$this->round->id} 押 {$bet->betTypeLabel()} 中奖", + ); + $totalPayout += $payout; + } else { + $bet->update(['status' => 'lost', 'payout' => 0]); + } + } + }); + + // ── 更新局次记录 ───────────────────────────────────────────── + $round->update([ + 'dice1' => $dice[0], + 'dice2' => $dice[1], + 'dice3' => $dice[2], + 'total_points' => $total, + 'result' => $result, + 'status' => 'settled', + 'settled_at' => now(), + 'total_payout' => $totalPayout, + ]); + + $round->refresh(); + + // ── 广播结算事件 ───────────────────────────────────────────── + broadcast(new BaccaratRoundSettled($round)); + + // ── 公屏公告 ───────────────────────────────────────────────── + $this->pushResultMessage($round, $chatState); + } + + /** + * 向公屏发送开奖结果系统消息。 + */ + private function pushResultMessage(BaccaratRound $round, ChatStateService $chatState): void + { + $diceStr = "【{$round->dice1}】【{$round->dice2}】【{$round->dice3}】"; + + $resultText = match ($round->result) { + 'big' => "🔵 大({$round->total_points} 点)", + 'small' => "🟡 小({$round->total_points} 点)", + 'triple' => "💥 豹子!({$round->dice1}{$round->dice1}{$round->dice1})", + 'kill' => "☠️ 庄家收割!({$round->total_points} 点)全灭", + default => '', + }; + + $payoutText = $round->total_payout > 0 + ? '共派发 🪙'.number_format($round->total_payout).' 金币' + : '本局无人获奖'; + + $content = "🎲 【百家乐】第 #{$round->id} 局开奖!{$diceStr} 总点 {$round->total_points} → {$resultText}!{$payoutText}。"; + + $msg = [ + 'id' => $chatState->nextMessageId(1), + 'room_id' => 1, + 'from_user' => '系统传音', + 'to_user' => '大家', + 'content' => $content, + 'is_secret' => false, + 'font_color' => '#8b5cf6', + 'action' => '大声宣告', + 'sent_at' => now()->toDateTimeString(), + ]; + $chatState->pushMessage(1, $msg); + broadcast(new MessageSent(1, $msg)); + SaveMessageJob::dispatch($msg); + } +} diff --git a/app/Jobs/OpenBaccaratRoundJob.php b/app/Jobs/OpenBaccaratRoundJob.php new file mode 100644 index 0000000..0ae0312 --- /dev/null +++ b/app/Jobs/OpenBaccaratRoundJob.php @@ -0,0 +1,87 @@ +params ?? []; + $betSeconds = (int) ($config['bet_window_seconds'] ?? 60); + + // 防止重复开局(如果上一局还在押注中则跳过) + if (BaccaratRound::currentRound()) { + return; + } + + $now = now(); + $closesAt = $now->copy()->addSeconds($betSeconds); + + // 创建新局次 + $round = BaccaratRound::create([ + 'status' => 'betting', + 'bet_opens_at' => $now, + 'bet_closes_at' => $closesAt, + ]); + + // 广播开局事件 + broadcast(new BaccaratRoundOpened($round)); + + // 公屏系统公告 + $minBet = number_format($config['min_bet'] ?? 100); + $maxBet = number_format($config['max_bet'] ?? 50000); + + $content = "🎲 【百家乐】第 #{$round->id} 局开始!下注时间 {$betSeconds} 秒,可押「大/小/豹子」,押注范围 {$minBet}~{$maxBet} 金币。"; + $msg = [ + 'id' => $chatState->nextMessageId(1), + 'room_id' => 1, + 'from_user' => '系统传音', + 'to_user' => '大家', + 'content' => $content, + 'is_secret' => false, + 'font_color' => '#8b5cf6', + 'action' => '大声宣告', + 'sent_at' => $now->toDateTimeString(), + ]; + $chatState->pushMessage(1, $msg); + broadcast(new MessageSent(1, $msg)); + SaveMessageJob::dispatch($msg); + + // 在下注截止时安排结算任务 + CloseBaccaratRoundJob::dispatch($round)->delay($closesAt); + } +} diff --git a/app/Models/BaccaratBet.php b/app/Models/BaccaratBet.php new file mode 100644 index 0000000..15d44bd --- /dev/null +++ b/app/Models/BaccaratBet.php @@ -0,0 +1,68 @@ + 'integer', + 'payout' => 'integer', + ]; + } + + /** + * 关联局次。 + */ + public function round(): BelongsTo + { + return $this->belongsTo(BaccaratRound::class, 'round_id'); + } + + /** + * 关联用户。 + */ + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + /** + * 获取押注类型中文名。 + */ + public function betTypeLabel(): string + { + return match ($this->bet_type) { + 'big' => '大', + 'small' => '小', + 'triple' => '豹子', + default => '未知', + }; + } +} diff --git a/app/Models/BaccaratRound.php b/app/Models/BaccaratRound.php new file mode 100644 index 0000000..4db19e0 --- /dev/null +++ b/app/Models/BaccaratRound.php @@ -0,0 +1,111 @@ + 'datetime', + 'bet_closes_at' => 'datetime', + 'settled_at' => 'datetime', + 'dice1' => 'integer', + 'dice2' => 'integer', + 'dice3' => 'integer', + 'total_points' => 'integer', + 'total_bet_big' => 'integer', + 'total_bet_small' => 'integer', + 'total_bet_triple' => 'integer', + 'total_payout' => 'integer', + 'bet_count' => 'integer', + ]; + } + + /** + * 该局的所有下注记录。 + */ + public function bets(): HasMany + { + return $this->hasMany(BaccaratBet::class, 'round_id'); + } + + /** + * 判断当前是否在押注时间窗口内。 + */ + public function isBettingOpen(): bool + { + return $this->status === 'betting' + && now()->between($this->bet_opens_at, $this->bet_closes_at); + } + + /** + * 计算指定押注类型和金额的预计回报(含本金)。 + * + * @param string $betType 'big' | 'small' | 'triple' + * @param int $amount 押注金额 + * @param array $config 游戏配置参数 + */ + public static function calcPayout(string $betType, int $amount, array $config): int + { + $payout = match ($betType) { + 'triple' => $amount * ($config['payout_triple'] + 1), + 'big' => $amount * ($config['payout_big'] + 1), + 'small' => $amount * ($config['payout_small'] + 1), + default => 0, + }; + + return (int) $payout; + } + + /** + * 获取结果中文名称。 + */ + public function resultLabel(): string + { + return match ($this->result) { + 'big' => '大', + 'small' => '小', + 'triple' => "豹子({$this->dice1}{$this->dice1}{$this->dice1})", + 'kill' => '庄家收割', + default => '未知', + }; + } + + /** + * 查询当前正在进行的局次(状态为 betting 且未截止)。 + */ + public static function currentRound(): ?static + { + return static::query() + ->where('status', 'betting') + ->where('bet_closes_at', '>', now()) + ->latest() + ->first(); + } +} diff --git a/database/migrations/2026_03_01_201821_create_baccarat_rounds_table.php b/database/migrations/2026_03_01_201821_create_baccarat_rounds_table.php new file mode 100644 index 0000000..0eda26d --- /dev/null +++ b/database/migrations/2026_03_01_201821_create_baccarat_rounds_table.php @@ -0,0 +1,59 @@ +id(); + + // 骰子结果(开奖后写入) + $table->unsignedTinyInteger('dice1')->nullable()->comment('第一颗骰子点数'); + $table->unsignedTinyInteger('dice2')->nullable()->comment('第二颗骰子点数'); + $table->unsignedTinyInteger('dice3')->nullable()->comment('第三颗骰子点数'); + $table->unsignedTinyInteger('total_points')->nullable()->comment('骰子总点数'); + $table->enum('result', ['big', 'small', 'triple', 'kill'])->nullable()->comment('开奖结果'); + + // 局次状态 + $table->enum('status', ['betting', 'settling', 'settled', 'cancelled'])->default('betting'); + + // 时间 + $table->dateTime('bet_opens_at')->comment('下注开始时间'); + $table->dateTime('bet_closes_at')->comment('下注截止时间'); + $table->dateTime('settled_at')->nullable()->comment('结算完成时间'); + + // 投注汇总统计 + $table->unsignedBigInteger('total_bet_big')->default(0)->comment('押大总额'); + $table->unsignedBigInteger('total_bet_small')->default(0)->comment('押小总额'); + $table->unsignedBigInteger('total_bet_triple')->default(0)->comment('押豹子总额'); + $table->unsignedBigInteger('total_payout')->default(0)->comment('总赔付额'); + $table->unsignedInteger('bet_count')->default(0)->comment('下注人次'); + + $table->timestamps(); + + $table->index('status'); + $table->index('bet_closes_at'); + }); + } + + /** + * 回滚迁移。 + */ + public function down(): void + { + Schema::dropIfExists('baccarat_rounds'); + } +}; diff --git a/database/migrations/2026_03_01_201830_create_baccarat_bets_table.php b/database/migrations/2026_03_01_201830_create_baccarat_bets_table.php new file mode 100644 index 0000000..18f4b1c --- /dev/null +++ b/database/migrations/2026_03_01_201830_create_baccarat_bets_table.php @@ -0,0 +1,44 @@ +id(); + $table->unsignedBigInteger('round_id')->comment('关联局次'); + $table->unsignedBigInteger('user_id')->comment('下注用户'); + $table->enum('bet_type', ['big', 'small', 'triple'])->comment('押注类型'); + $table->unsignedInteger('amount')->comment('押注金额'); + $table->unsignedInteger('payout')->default(0)->comment('赔付金额(含本金)'); + $table->enum('status', ['pending', 'won', 'lost', 'refunded'])->default('pending'); + $table->timestamps(); + + $table->foreign('round_id')->references('id')->on('baccarat_rounds')->cascadeOnDelete(); + $table->index(['round_id', 'user_id']); + $table->index(['user_id', 'status']); + // 每局每人每种类型只能下一注(可在 Service 层控制) + }); + } + + /** + * 回滚迁移。 + */ + public function down(): void + { + Schema::dropIfExists('baccarat_bets'); + } +}; diff --git a/resources/js/chat.js b/resources/js/chat.js index c5cb6ed..84a4fb8 100644 --- a/resources/js/chat.js +++ b/resources/js/chat.js @@ -101,6 +101,19 @@ export function initChat(roomId) { window.dispatchEvent( new CustomEvent("chat:holiday.started", { detail: e }), ); + }) + // ─── 百家乐:开局 & 结算 ────────────────────────────────── + .listen(".baccarat.opened", (e) => { + console.log("百家乐开局:", e); + window.dispatchEvent( + new CustomEvent("chat:baccarat.opened", { detail: e }), + ); + }) + .listen(".baccarat.settled", (e) => { + console.log("百家乐结算:", e); + window.dispatchEvent( + new CustomEvent("chat:baccarat.settled", { detail: e }), + ); }); } diff --git a/resources/views/chat/frame.blade.php b/resources/views/chat/frame.blade.php index e72d2dd..feae5c2 100644 --- a/resources/views/chat/frame.blade.php +++ b/resources/views/chat/frame.blade.php @@ -137,6 +137,8 @@ @include('chat.partials.marriage-modals') {{-- ═══════════ 节日福利弹窗组件 ═══════════ --}} @include('chat.partials.holiday-modal') + {{-- ═══════════ 百家乐游戏面板 ═══════════ --}} + @include('chat.partials.baccarat-panel') {{-- 全屏特效系统:管理员烟花/下雨/雷电/下雪 --}} diff --git a/resources/views/chat/partials/baccarat-panel.blade.php b/resources/views/chat/partials/baccarat-panel.blade.php new file mode 100644 index 0000000..f02f066 --- /dev/null +++ b/resources/views/chat/partials/baccarat-panel.blade.php @@ -0,0 +1,514 @@ +{{-- + 文件功能:百家乐前台弹窗组件 + + 聊天室内百家乐游戏面板: + - 监听 WebSocket baccarat.opened 事件触发弹窗 + - 倒计时下注(大/小/豹子) + - 监听 baccarat.settled 展示骰子动画 + 结果 + 个人赔付 + - 展示近10局历史趋势 +--}} + +{{-- ─── 百家乐主面板 ─── --}} +
+
+ +
+ + {{-- ─── 顶部标题 ─── --}} +
+
+
+
🎲 百家乐
+
+ 第 局 +
+
+ {{-- 倒计时 --}} +
+
+
+
秒后截止
+
+ {{-- 骰子结果 --}} +
+
+
+
+
+ + {{-- 进度条 --}} +
+
+
+
+ + {{-- ─── 历史趋势 ─── --}} +
+ 近期 + + 暂无记录 +
+ + {{-- ─── 主体内容 ─── --}} +
+ + {{-- 押注阶段 --}} +
+ {{-- 当前下注池统计 --}} +
+
+
押大
+
+
+
+
押小
+
+
+
+
押豹子
+
+
+
+ + {{-- 已下注状态 / 下注表单 --}} +
+
+
+ ✅ 已押注「」 + 金币 +
+
等待开奖中…
+
+
+ +
+ {{-- 押注选项 --}} +
+ {{-- 大 --}} + + {{-- 小 --}} + + {{-- 豹子 --}} + +
+ + {{-- 快捷金额 + 自定义 --}} +
+
+ +
+ +
+ + {{-- 下注按钮 --}} + +
+ + {{-- 规则提示 --}} +
+ ☠️ 3点或18点为庄家收割,全灭无退款。豹子优先于大小判断。 +
+
+ + {{-- 等待开奖阶段 --}} +
+
🎲
+
正在摇骰子…
+
+ + {{-- 结算阶段 --}} +
+ {{-- 骰子点数展示 --}} +
+ +
+
+
+
+
+ + {{-- 个人结果 --}} +
+
+
+
+
+
+
+
+ + {{-- ─── 底部关闭 ─── --}} +
+ +
+
+
+
+ +{{-- ─── 骰子悬浮入口(游戏开启时常驻) ─── --}} +
+ +
+ + + + diff --git a/routes/console.php b/routes/console.php index efcd99e..71c417e 100644 --- a/routes/console.php +++ b/routes/console.php @@ -38,3 +38,26 @@ Schedule::call(function () { \App\Models\HolidayEvent::pendingToTrigger() ->each(fn ($e) => \App\Jobs\TriggerHolidayEventJob::dispatch($e)); })->everyMinute()->name('holiday-events:trigger')->withoutOverlapping(); + +// ──────────── 百家乐定时任务 ───────────────────────────────────── + +// 每分钟:检查是否应开新一局(游戏开启 + 无正在进行的局) +Schedule::call(function () { + if (! \App\Models\GameConfig::isEnabled('baccarat')) { + return; + } + + $config = \App\Models\GameConfig::forGame('baccarat')?->params ?? []; + $interval = (int) ($config['interval_minutes'] ?? 2); + + // 检查距上一局触发时间是否已达到间隔 + $lastRound = \App\Models\BaccaratRound::latest()->first(); + if ($lastRound && $lastRound->created_at->diffInMinutes(now()) < $interval) { + return; // 还没到开局时间 + } + + // 无当前进行中的局才开新局 + if (! \App\Models\BaccaratRound::currentRound()) { + \App\Jobs\OpenBaccaratRoundJob::dispatch(); + } +})->everyMinute()->name('baccarat:open-round')->withoutOverlapping(); diff --git a/routes/web.php b/routes/web.php index 0ff0a46..1b56b35 100644 --- a/routes/web.php +++ b/routes/web.php @@ -115,6 +115,16 @@ Route::middleware(['chat.auth'])->group(function () { Route::get('/{event}/status', [\App\Http\Controllers\HolidayController::class, 'status'])->name('status'); }); + // ── 百家乐(前台)──────────────────────────────────────────────── + Route::prefix('baccarat')->name('baccarat.')->group(function () { + // 获取当前局次信息 + Route::get('/current', [\App\Http\Controllers\BaccaratController::class, 'currentRound'])->name('current'); + // 提交下注 + Route::post('/bet', [\App\Http\Controllers\BaccaratController::class, 'bet'])->name('bet'); + // 查询历史记录 + Route::get('/history', [\App\Http\Controllers\BaccaratController::class, 'history'])->name('history'); + }); + // ---- 第五阶段:具体房间内部聊天核心 ---- // 进入具体房间界面的初始化 Route::get('/room/{id}', [ChatController::class, 'init'])->name('chat.room');