id) ->latest() ->limit(20) ->get(['type', 'amount', 'balance_after', 'created_at']); return response()->json([ 'status' => 'success', 'jjb' => $user->jjb ?? 0, 'bank_jjb' => $user->bank_jjb ?? 0, 'logs' => $logs, ]); } /** * 查询银行存款排行榜 (分页显示) */ public function ranking(Request $request): JsonResponse { /** @var User $operator */ $operator = Auth::user(); $direction = strtolower($request->query('sort', 'desc')) === 'asc' ? 'asc' : 'desc'; $users = User::where('bank_jjb', '>', 0) ->orderBy('bank_jjb', $direction) ->paginate(20, ['id', 'username', 'bank_jjb', 'sex', 'usersf', 'user_level']); return response()->json([ 'status' => 'success', 'ranking' => $users->map(function (User $u) use ($operator) { $canViewBalance = $this->canViewBankBalance($operator, $u); // 提供必要的前端展示字段,普通用户查看别人存款时只返回星号,防止前端绕过遮罩。 return [ 'id' => $u->id, 'username' => $u->username, 'bank_jjb' => $canViewBalance ? ($u->bank_jjb ?? 0) : '******', 'bank_jjb_masked' => ! $canViewBalance, 'can_reveal' => ! $canViewBalance, 'reveal_cost' => UserController::INFO_REVEAL_COST, 'sex' => $u->sex, 'usersf' => $u->usersf, 'user_level' => $u->user_level, 'headfaceUrl' => $u->headfaceUrl, ]; }), 'pagination' => [ 'current_page' => $users->currentPage(), 'last_page' => $users->lastPage(), 'total' => $users->total(), ], ]); } /** * 存款:从流通金币(jjb)转入银行(bank_jjb) * * 请求参数:amount(正整数) */ public function deposit(Request $request): JsonResponse { $request->validate([ 'amount' => 'required|integer|min:1|max:9999999', ]); $amount = $request->integer('amount'); $user = Auth::user(); if (($user->jjb ?? 0) < $amount) { return response()->json([ 'status' => 'error', 'message' => '流通金币不足!当前余额 '.($user->jjb ?? 0)." 枚,无法存入 {$amount} 枚。", ]); } DB::transaction(function () use ($user, $amount): void { $user->decrement('jjb', $amount); $user->increment('bank_jjb', $amount); BankLog::create([ 'user_id' => $user->id, 'type' => 'deposit', 'amount' => $amount, 'balance_after' => $user->fresh()->bank_jjb, ]); }); $fresh = $user->fresh(); return response()->json([ 'status' => 'success', 'message' => "成功存入 {$amount} 枚金币!", 'jjb' => $fresh->jjb, 'bank_jjb' => $fresh->bank_jjb, ]); } /** * 取款:从银行(bank_jjb)转回流通金币(jjb) * * 请求参数:amount(正整数) */ public function withdraw(Request $request): JsonResponse { $request->validate([ 'amount' => 'required|integer|min:1|max:9999999', ]); $amount = $request->integer('amount'); $user = Auth::user(); if (($user->bank_jjb ?? 0) < $amount) { return response()->json([ 'status' => 'error', 'message' => '银行余额不足!当前存款 '.($user->bank_jjb ?? 0)." 枚,无法取出 {$amount} 枚。", ]); } DB::transaction(function () use ($user, $amount): void { $user->decrement('bank_jjb', $amount); $user->increment('jjb', $amount); BankLog::create([ 'user_id' => $user->id, 'type' => 'withdraw', 'amount' => $amount, 'balance_after' => $user->fresh()->bank_jjb, ]); }); $fresh = $user->fresh(); return response()->json([ 'status' => 'success', 'message' => "成功取出 {$amount} 枚金币!", 'jjb' => $fresh->jjb, 'bank_jjb' => $fresh->bank_jjb, ]); } /** * 判断操作者是否可以免费查看目标用户银行存款。 */ private function canViewBankBalance(User $operator, User $targetUser): bool { if ($operator->id === $targetUser->id) { return true; } $superLevel = (int) Sysparam::getValue('superlevel', '100'); return (int) $operator->user_level >= $superLevel; } }