From fbf8f9d39df19e3aac6b3186e723c832a20388c9 Mon Sep 17 00:00:00 2001 From: zhenhui <1276357500@qq.com> Date: Mon, 9 Mar 2026 14:35:55 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=8E=A5=E5=8F=A3v1]=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0API-=E6=96=B0=E5=A2=9E=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/api/controller/v1/GameController.php | 221 +++++++++++++++++- server/config/route.php | 5 + 2 files changed, 224 insertions(+), 2 deletions(-) diff --git a/server/app/api/controller/v1/GameController.php b/server/app/api/controller/v1/GameController.php index 4dea09c..3184fe3 100644 --- a/server/app/api/controller/v1/GameController.php +++ b/server/app/api/controller/v1/GameController.php @@ -5,15 +5,18 @@ namespace app\api\controller\v1; use app\api\logic\UserLogic; use app\api\util\ReturnCode; +use app\dice\model\player\DicePlayer; +use app\dice\model\play_record\DicePlayRecord; +use app\dice\model\player_wallet_record\DicePlayerWalletRecord; +use app\dice\model\player_ticket_record\DicePlayerTicketRecord; +use support\think\Db; use plugin\saiadmin\basic\OpenController; use support\Request; use support\Response; /** * 平台 v1 游戏接口 - * 获取进入游戏:/api/v1/getGameUrl * 请求头:auth-token - * POST 参数:username, password(默认123456), time */ class GameController extends OpenController { @@ -52,4 +55,218 @@ class GameController extends OpenController 'url' => $url, ]); } + + /** + * 获取用户信息 + * POST 参数:username + * 返回 DicePlayer 中非敏感信息 + */ + public function getPlayerInfo(Request $request): Response + { + $username = trim((string) ($request->post('username', ''))); + + if ($username === '') { + return $this->fail('username 不能为空', ReturnCode::PARAMS_ERROR); + } + + $player = DicePlayer::where('username', $username)->find(); + if (!$player) { + return $this->fail('用户不存在', ReturnCode::NOT_FOUND); + } + + $hidden = ['password', 'lottery_config_id', 't1_weight', 't2_weight', 't3_weight', 't4_weight', 't5_weight', 'delete_time']; + $info = $player->hidden($hidden)->toArray(); + + return $this->success($info); + } + + /** + * 获取游戏记录 + * POST 参数:username(非必填,没填则不按用户筛选), start_create_time, end_create_time(非必填,没填则不筛选时间) + * 返回 DicePlayRecord 中非敏感信息 + */ + public function getPlayerGameRecord(Request $request): Response + { + $username = trim((string) ($request->post('username', ''))); + $startCreateTime = trim((string) ($request->post('start_create_time', ''))); + $endCreateTime = trim((string) ($request->post('end_create_time', ''))); + $page = (int) $request->post('page', 1); + $limit = (int) $request->post('limit', 20); + + if ($page < 1) { + $page = 1; + } + if ($limit < 1 || $limit > 100) { + $limit = 20; + } + + $query = DicePlayRecord::order('id', 'desc'); + + if ($username !== '') { + $player = DicePlayer::where('username', $username)->find(); + if (!$player) { + return $this->success([]); + } + $query->where('player_id', (int) $player->id); + } + + if ($startCreateTime !== '') { + $query->where('create_time', '>=', $startCreateTime); + } + if ($endCreateTime !== '') { + $query->where('create_time', '<=', $endCreateTime); + } + + $list = $query->page($page, $limit)->select()->toArray(); + + return $this->success($list); + } + + /** + * 获取钱包流水 + * POST 参数:username(非必填,没填则不按用户筛选), start_create_time, end_create_time(非必填,没填则不筛选时间) + * 返回 DicePlayerWalletRecord 中非敏感信息 + */ + public function getPlayerWalletRecord(Request $request): Response + { + $username = trim((string) ($request->post('username', ''))); + $startCreateTime = trim((string) ($request->post('start_create_time', ''))); + $endCreateTime = trim((string) ($request->post('end_create_time', ''))); + $page = (int) $request->post('page', 1); + $limit = (int) $request->post('limit', 20); + + if ($page < 1) { + $page = 1; + } + if ($limit < 1 || $limit > 100) { + $limit = 20; + } + + $query = DicePlayerWalletRecord::order('id', 'desc'); + + if ($username !== '') { + $player = DicePlayer::where('username', $username)->find(); + if (!$player) { + return $this->success([]); + } + $query->where('player_id', (int) $player->id); + } + + if ($startCreateTime !== '') { + $query->where('create_time', '>=', $startCreateTime); + } + if ($endCreateTime !== '') { + $query->where('create_time', '<=', $endCreateTime); + } + + $list = $query->page($page, $limit)->select()->toArray(); + + return $this->success($list); + } + + /** + * 获取用户中奖券获取记录 + * POST 参数:username(非必填,没填则不按用户筛选), start_create_time, end_create_time(非必填,没填则不筛选时间) + * 返回 DicePlayerTicketRecord 中非敏感信息 + */ + public function getPlayerTicketRecord(Request $request): Response + { + $username = trim((string) ($request->post('username', ''))); + $startCreateTime = trim((string) ($request->post('start_create_time', ''))); + $endCreateTime = trim((string) ($request->post('end_create_time', ''))); + $page = (int) $request->post('page', 1); + $limit = (int) $request->post('limit', 20); + + if ($page < 1) { + $page = 1; + } + if ($limit < 1 || $limit > 100) { + $limit = 20; + } + + $query = DicePlayerTicketRecord::order('id', 'desc'); + + if ($username !== '') { + $player = DicePlayer::where('username', $username)->find(); + if (!$player) { + return $this->success([]); + } + $query->where('player_id', (int) $player->id); + } + + if ($startCreateTime !== '') { + $query->where('create_time', '>=', $startCreateTime); + } + if ($endCreateTime !== '') { + $query->where('create_time', '<=', $endCreateTime); + } + + $list = $query->page($page, $limit)->select()->toArray(); + + return $this->success($list); + } + + /** + * 钱包转入转出 + * POST 参数:username(必填), coin(转入>0 或 转出<0) + * 创建 DicePlayerWalletRecord,type: 0=充值(coin>0), 1=提现(coin<0) + * 返回创建的记录 + */ + public function setPlayerWallet(Request $request): Response + { + $username = trim((string) ($request->post('username', ''))); + $coin = $request->post('coin'); + + if ($username === '') { + return $this->fail('username 不能为空', ReturnCode::PARAMS_ERROR); + } + if ($coin === null || $coin === '') { + return $this->fail('coin 不能为空', ReturnCode::PARAMS_ERROR); + } + + $coinVal = (float) $coin; + if ($coinVal === 0.0) { + return $this->fail('coin 不能为 0', ReturnCode::PARAMS_ERROR); + } + + $player = DicePlayer::where('username', $username)->find(); + if (!$player) { + return $this->fail('用户不存在', ReturnCode::NOT_FOUND); + } + + $walletBefore = (float) ($player->coin ?? 0); + $walletAfter = $walletBefore + $coinVal; + + if ($coinVal < 0 && $walletBefore < -$coinVal) { + return $this->fail('余额不足,无法转出', ReturnCode::BUSINESS_ERROR); + } + + $type = $coinVal > 0 ? 0 : 1; + $remark = $coinVal > 0 ? '充值' : '提现'; + + try { + Db::startTrans(); + $player->coin = $walletAfter; + $player->save(); + + $record = DicePlayerWalletRecord::create([ + 'player_id' => (int) $player->id, + 'coin' => $coinVal, + 'type' => $type, + 'wallet_before' => $walletBefore, + 'wallet_after' => $walletAfter, + 'total_ticket_count' => 0, + 'paid_ticket_count' => 0, + 'free_ticket_count' => 0, + 'remark' => $remark, + 'user_id' => 0, + ]); + Db::commit(); + } catch (\Throwable $e) { + Db::rollback(); + return $this->fail('操作失败:' . $e->getMessage(), ReturnCode::SERVER_ERROR); + } + + return $this->success($record->toArray()); + } } diff --git a/server/config/route.php b/server/config/route.php index 8854006..7325e4a 100644 --- a/server/config/route.php +++ b/server/config/route.php @@ -24,6 +24,11 @@ Route::group('/api/v1', function () { // 平台 v1 接口:需在请求头携带 auth-token Route::group('/api/v1', function () { Route::any('/getGameUrl', [app\api\controller\v1\GameController::class, 'getGameUrl']); + Route::any('/getPlayerInfo', [app\api\controller\v1\GameController::class, 'getPlayerInfo']); + Route::any('/getPlayerGameRecord', [app\api\controller\v1\GameController::class, 'getPlayerGameRecord']); + Route::any('/getPlayerWalletRecord', [app\api\controller\v1\GameController::class, 'getPlayerWalletRecord']); + Route::any('/getPlayerTicketRecord', [app\api\controller\v1\GameController::class, 'getPlayerTicketRecord']); + Route::any('/setPlayerWallet', [app\api\controller\v1\GameController::class, 'setPlayerWallet']); })->middleware([ AuthTokenMiddleware::class, ]);