diff --git a/app/Http/Controllers/BaccaratController.php b/app/Http/Controllers/BaccaratController.php index abba367..240d118 100644 --- a/app/Http/Controllers/BaccaratController.php +++ b/app/Http/Controllers/BaccaratController.php @@ -37,13 +37,17 @@ class BaccaratController extends Controller */ public function currentRound(Request $request): JsonResponse { + $user = $request->user(); $round = BaccaratRound::currentRound(); if (! $round) { - return response()->json(['round' => null]); + return response()->json([ + 'round' => null, + // 即使当前无局次,也返回最新金币余额,供前端每次打开弹窗时刷新右上角显示。 + 'jjb' => (int) ($user->jjb ?? 0), + ]); } - $user = $request->user(); $myBet = BaccaratBet::query() ->where('round_id', $round->id) ->where('user_id', $user->id) @@ -72,6 +76,8 @@ class BaccaratController extends Controller 'amount' => $myBet->amount, ] : null, ], + // 返回当前用户最新金币,前端每次打开弹窗都可同步右上角余额。 + 'jjb' => (int) ($user->jjb ?? 0), ]); } diff --git a/app/Http/Controllers/HorseRaceController.php b/app/Http/Controllers/HorseRaceController.php index 98ee937..e3543f1 100644 --- a/app/Http/Controllers/HorseRaceController.php +++ b/app/Http/Controllers/HorseRaceController.php @@ -39,13 +39,17 @@ class HorseRaceController extends Controller */ public function currentRace(Request $request): JsonResponse { + $user = $request->user(); $race = HorseRace::currentRace(); if (! $race) { - return response()->json(['race' => null]); + return response()->json([ + 'race' => null, + // 即使当前无赛马场次,也返回最新金币余额,供前端打开弹窗时刷新显示。 + 'jjb' => (int) ($user->jjb ?? 0), + ]); } - $user = $request->user(); $myBet = HorseBet::query() ->where('race_id', $race->id) ->where('user_id', $user->id) @@ -109,6 +113,8 @@ class HorseRaceController extends Controller 'amount' => $myBet->amount, ] : null, ], + // 返回当前用户最新金币,确保弹窗右上角余额每次打开都以服务端最新值为准。 + 'jjb' => (int) ($user->jjb ?? 0), ]); } diff --git a/resources/views/chat/partials/games/baccarat-panel.blade.php b/resources/views/chat/partials/games/baccarat-panel.blade.php index bc56b37..1e5a6e3 100644 --- a/resources/views/chat/partials/games/baccarat-panel.blade.php +++ b/resources/views/chat/partials/games/baccarat-panel.blade.php @@ -483,6 +483,16 @@ autoCloseTimer: null, autoCloseCountdown: 0, + /** + * 同步全局聊天上下文中的金币余额,供弹窗右上角与其他面板共用。 + */ + syncUserGold(jjb) { + if (jjb === undefined || jjb === null) return; + if (!window.chatContext) return; + window.chatContext.userJjb = Number(jjb); + window.chatContext.myGold = Number(jjb); + }, + /** * 获取快捷下注金额数组 */ @@ -594,6 +604,8 @@ try { const res = await fetch('/baccarat/current'); const data = await res.json(); + // 每次打开或刷新局次信息时,都用服务端最新金币覆盖右上角余额。 + this.syncUserGold(data.jjb); if (data.round && (data.round.seconds_left || 0) > 0) { this.phase = 'betting'; this.roundId = data.round.id; @@ -807,6 +819,9 @@ // 再检查是否有正在进行的局 const curRes = await fetch('/baccarat/current'); const curData = await curRes.json(); + if (panel) { + Alpine.$data(panel).syncUserGold(curData.jjb); + } if (curData.round && panel) { const round = curData.round; diff --git a/resources/views/chat/partials/games/horse-race-panel.blade.php b/resources/views/chat/partials/games/horse-race-panel.blade.php index 6b4de89..4fb2381 100644 --- a/resources/views/chat/partials/games/horse-race-panel.blade.php +++ b/resources/views/chat/partials/games/horse-race-panel.blade.php @@ -419,6 +419,16 @@ // 历史记录 history: [], + /** + * 同步全局聊天上下文中的金币余额,供弹窗右上角与其他面板共用。 + */ + syncUserGold(jjb) { + if (jjb === undefined || jjb === null) return; + if (!window.chatContext) return; + window.chatContext.userJjb = Number(jjb); + window.chatContext.myGold = Number(jjb); + }, + /** * 获取当前选中马匹的预览名称(用于按钮文字) */ @@ -502,6 +512,8 @@ try { const res = await fetch('/horse-race/current'); const data = await res.json(); + // 每次打开或刷新当前场次时,都先同步右上角金币余额。 + this.syncUserGold(data.jjb); if (data.race) { this.horses = data.race.horses || this.horses; this.totalPool = data.race.total_pool || 0; @@ -674,6 +686,7 @@ try { const res = await fetch('/horse-race/current'); const data = await res.json(); + this.syncUserGold(data.jjb); if (data.race) { const race = data.race; this.raceId = race.id; @@ -763,6 +776,9 @@ const curRes = await fetch('/horse-race/current'); const curData = await curRes.json(); + if (panel) { + Alpine.$data(panel).syncUserGold(curData.jjb); + } // 游戏可访问则常驻显示 FAB(与占卜一致) if (fab) Alpine.$data(fab).visible = true; diff --git a/tests/Feature/BaccaratControllerTest.php b/tests/Feature/BaccaratControllerTest.php index 8c50bb6..b1a7c57 100644 --- a/tests/Feature/BaccaratControllerTest.php +++ b/tests/Feature/BaccaratControllerTest.php @@ -36,7 +36,7 @@ class BaccaratControllerTest extends TestCase public function test_can_get_current_round() { /** @var \App\Models\User $user */ - $user = User::factory()->create(); + $user = User::factory()->create(['jjb' => 3456]); $round = BaccaratRound::forceCreate([ 'status' => 'betting', @@ -57,6 +57,7 @@ class BaccaratControllerTest extends TestCase $response->assertStatus(200); $response->assertJsonStructure(['round' => ['id', 'status', 'bet_closes_at']]); $this->assertEquals($round->id, $response->json('round.id')); + $this->assertSame(3456, $response->json('jjb')); } public function test_can_bet() diff --git a/tests/Feature/HorseRaceControllerTest.php b/tests/Feature/HorseRaceControllerTest.php index 068d225..33c74ec 100644 --- a/tests/Feature/HorseRaceControllerTest.php +++ b/tests/Feature/HorseRaceControllerTest.php @@ -60,7 +60,7 @@ class HorseRaceControllerTest extends TestCase public function test_can_get_current_race() { /** @var \App\Models\User $user */ - $user = User::factory()->create(); + $user = User::factory()->create(['jjb' => 4567]); $race = HorseRace::create([ 'status' => 'betting', @@ -79,6 +79,7 @@ class HorseRaceControllerTest extends TestCase $response->assertStatus(200); $response->assertJsonStructure(['race' => ['id', 'status', 'bet_closes_at', 'horses']]); $this->assertEquals($race->id, $response->json('race.id')); + $this->assertSame(4567, $response->json('jjb')); } /**