优化 游戏金币余额显示

This commit is contained in:
2026-04-12 22:31:35 +08:00
parent ef407a8c6e
commit c297b61493
6 changed files with 51 additions and 6 deletions
+8 -2
View File
@@ -37,13 +37,17 @@ class BaccaratController extends Controller
*/ */
public function currentRound(Request $request): JsonResponse public function currentRound(Request $request): JsonResponse
{ {
$user = $request->user();
$round = BaccaratRound::currentRound(); $round = BaccaratRound::currentRound();
if (! $round) { if (! $round) {
return response()->json(['round' => null]); return response()->json([
'round' => null,
// 即使当前无局次,也返回最新金币余额,供前端每次打开弹窗时刷新右上角显示。
'jjb' => (int) ($user->jjb ?? 0),
]);
} }
$user = $request->user();
$myBet = BaccaratBet::query() $myBet = BaccaratBet::query()
->where('round_id', $round->id) ->where('round_id', $round->id)
->where('user_id', $user->id) ->where('user_id', $user->id)
@@ -72,6 +76,8 @@ class BaccaratController extends Controller
'amount' => $myBet->amount, 'amount' => $myBet->amount,
] : null, ] : null,
], ],
// 返回当前用户最新金币,前端每次打开弹窗都可同步右上角余额。
'jjb' => (int) ($user->jjb ?? 0),
]); ]);
} }
+8 -2
View File
@@ -39,13 +39,17 @@ class HorseRaceController extends Controller
*/ */
public function currentRace(Request $request): JsonResponse public function currentRace(Request $request): JsonResponse
{ {
$user = $request->user();
$race = HorseRace::currentRace(); $race = HorseRace::currentRace();
if (! $race) { if (! $race) {
return response()->json(['race' => null]); return response()->json([
'race' => null,
// 即使当前无赛马场次,也返回最新金币余额,供前端打开弹窗时刷新显示。
'jjb' => (int) ($user->jjb ?? 0),
]);
} }
$user = $request->user();
$myBet = HorseBet::query() $myBet = HorseBet::query()
->where('race_id', $race->id) ->where('race_id', $race->id)
->where('user_id', $user->id) ->where('user_id', $user->id)
@@ -109,6 +113,8 @@ class HorseRaceController extends Controller
'amount' => $myBet->amount, 'amount' => $myBet->amount,
] : null, ] : null,
], ],
// 返回当前用户最新金币,确保弹窗右上角余额每次打开都以服务端最新值为准。
'jjb' => (int) ($user->jjb ?? 0),
]); ]);
} }
@@ -483,6 +483,16 @@
autoCloseTimer: null, autoCloseTimer: null,
autoCloseCountdown: 0, 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 { try {
const res = await fetch('/baccarat/current'); const res = await fetch('/baccarat/current');
const data = await res.json(); const data = await res.json();
// 每次打开或刷新局次信息时,都用服务端最新金币覆盖右上角余额。
this.syncUserGold(data.jjb);
if (data.round && (data.round.seconds_left || 0) > 0) { if (data.round && (data.round.seconds_left || 0) > 0) {
this.phase = 'betting'; this.phase = 'betting';
this.roundId = data.round.id; this.roundId = data.round.id;
@@ -807,6 +819,9 @@
// 再检查是否有正在进行的局 // 再检查是否有正在进行的局
const curRes = await fetch('/baccarat/current'); const curRes = await fetch('/baccarat/current');
const curData = await curRes.json(); const curData = await curRes.json();
if (panel) {
Alpine.$data(panel).syncUserGold(curData.jjb);
}
if (curData.round && panel) { if (curData.round && panel) {
const round = curData.round; const round = curData.round;
@@ -419,6 +419,16 @@
// 历史记录 // 历史记录
history: [], 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 { try {
const res = await fetch('/horse-race/current'); const res = await fetch('/horse-race/current');
const data = await res.json(); const data = await res.json();
// 每次打开或刷新当前场次时,都先同步右上角金币余额。
this.syncUserGold(data.jjb);
if (data.race) { if (data.race) {
this.horses = data.race.horses || this.horses; this.horses = data.race.horses || this.horses;
this.totalPool = data.race.total_pool || 0; this.totalPool = data.race.total_pool || 0;
@@ -674,6 +686,7 @@
try { try {
const res = await fetch('/horse-race/current'); const res = await fetch('/horse-race/current');
const data = await res.json(); const data = await res.json();
this.syncUserGold(data.jjb);
if (data.race) { if (data.race) {
const race = data.race; const race = data.race;
this.raceId = race.id; this.raceId = race.id;
@@ -763,6 +776,9 @@
const curRes = await fetch('/horse-race/current'); const curRes = await fetch('/horse-race/current');
const curData = await curRes.json(); const curData = await curRes.json();
if (panel) {
Alpine.$data(panel).syncUserGold(curData.jjb);
}
// 游戏可访问则常驻显示 FAB(与占卜一致) // 游戏可访问则常驻显示 FAB(与占卜一致)
if (fab) Alpine.$data(fab).visible = true; if (fab) Alpine.$data(fab).visible = true;
+2 -1
View File
@@ -36,7 +36,7 @@ class BaccaratControllerTest extends TestCase
public function test_can_get_current_round() public function test_can_get_current_round()
{ {
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = User::factory()->create(); $user = User::factory()->create(['jjb' => 3456]);
$round = BaccaratRound::forceCreate([ $round = BaccaratRound::forceCreate([
'status' => 'betting', 'status' => 'betting',
@@ -57,6 +57,7 @@ class BaccaratControllerTest extends TestCase
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJsonStructure(['round' => ['id', 'status', 'bet_closes_at']]); $response->assertJsonStructure(['round' => ['id', 'status', 'bet_closes_at']]);
$this->assertEquals($round->id, $response->json('round.id')); $this->assertEquals($round->id, $response->json('round.id'));
$this->assertSame(3456, $response->json('jjb'));
} }
public function test_can_bet() public function test_can_bet()
+2 -1
View File
@@ -60,7 +60,7 @@ class HorseRaceControllerTest extends TestCase
public function test_can_get_current_race() public function test_can_get_current_race()
{ {
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = User::factory()->create(); $user = User::factory()->create(['jjb' => 4567]);
$race = HorseRace::create([ $race = HorseRace::create([
'status' => 'betting', 'status' => 'betting',
@@ -79,6 +79,7 @@ class HorseRaceControllerTest extends TestCase
$response->assertStatus(200); $response->assertStatus(200);
$response->assertJsonStructure(['race' => ['id', 'status', 'bet_closes_at', 'horses']]); $response->assertJsonStructure(['race' => ['id', 'status', 'bet_closes_at', 'horses']]);
$this->assertEquals($race->id, $response->json('race.id')); $this->assertEquals($race->id, $response->json('race.id'));
$this->assertSame(4567, $response->json('jjb'));
} }
/** /**