group(function (): void { // 名称:服务健康检查 Route::get('health', HealthController::class)->name('api.v1.health'); // 名称:当前期号(下注大厅倒计时;无需登录) Route::get('draw/current', DrawCurrentController::class)->name('api.v1.draw.current'); // 名称:已发布开奖往期 / 单期(公开) Route::get('draw/results', DrawResultsIndexController::class)->name('api.v1.draw.results'); Route::get('draw/results/{draw_no}', DrawResultShowController::class) ->where('draw_no', '[0-9]{8}-[0-9]{3}') ->name('api.v1.draw.results.show'); // 名称:生效玩法 / 赔率 / 封顶目录(阶段 4;公开) Route::get('play/effective', PlayEffectiveCatalogController::class)->name('api.v1.play.effective'); Route::prefix('player') ->name('api.v1.player.') ->group(function (): void { // 名称:玩家端连通性探测 Route::get('ping', PlayerPingController::class)->name('ping'); }); Route::middleware('lottery.player')->group(function (): void { Route::prefix('player') ->name('api.v1.player.') ->group(function (): void { // 名称:当前登录玩家信息 Route::get('me', MeController::class)->name('me'); }); Route::prefix('wallet') ->name('api.v1.wallet.') ->group(function (): void { // 名称:彩票钱包余额查询 Route::get('balance', WalletBalanceController::class)->name('balance'); // 名称:钱包流水(PRD §10.1.1) Route::get('logs', WalletLogsController::class)->name('logs'); // 名称:主站 → 彩票 转入 Route::post('transfer-in', WalletTransferInController::class)->name('transfer-in'); // 名称:彩票 → 主站 转出 Route::post('transfer-out', WalletTransferOutController::class)->name('transfer-out'); }); }); Route::prefix('admin') ->name('api.v1.admin.') ->group(function (): void { Route::middleware('throttle:admin-auth-captcha') ->get('auth/captcha', CaptchaController::class) ->name('auth.captcha'); Route::middleware('throttle:admin-auth-login') ->post('auth/login', LoginController::class) ->name('auth.login'); Route::middleware(['auth:sanctum', 'lottery.admin'])->group(function (): void { // 名称:后台接口连通性探测(需 Bearer Token) Route::get('ping', AdminPingController::class)->name('ping'); // 资金:转账单 / 流水 / 玩家钱包 Route::get('wallet/transfer-orders', TransferOrderListController::class) ->name('wallet.transfer-orders'); Route::get('wallet/transactions', WalletTransactionListController::class) ->name('wallet.transactions'); Route::get('players/{player}/wallets', PlayerWalletShowController::class) ->name('players.wallets'); // 期号:列表 / 详情 / 批次(开奖结果与审核数据) Route::get('draws', AdminDrawIndexController::class)->name('draws.index'); Route::get('draws/{draw}', AdminDrawShowController::class)->name('draws.show'); Route::get('draws/{draw}/result-batches', AdminDrawResultBatchesIndexController::class) ->name('draws.result-batches.index'); // 名称:发布待审核开奖批次(人工审核) Route::post( 'draws/{draw}/result-batches/{batch}/publish', DrawResultBatchPublishController::class, )->name('draws.result-batches.publish'); // 阶段 4:玩法目录 + 赔率 + 风控封顶(版本化管理) Route::get('play-types', PlayTypeIndexController::class)->name('play-types.index'); Route::patch('play-types/{play_code}', PlayTypePatchController::class) ->where('play_code', '[a-z0-9_]+') ->name('play-types.patch'); Route::prefix('config')->name('config.')->group(function (): void { Route::get('play-versions', PlayConfigVersionIndexController::class)->name('play-versions.index'); Route::post('play-versions', PlayConfigVersionStoreController::class)->name('play-versions.store'); Route::get('play-versions/{id}', PlayConfigVersionShowController::class) ->whereNumber('id') ->name('play-versions.show'); Route::put('play-versions/{id}/items', PlayConfigItemsReplaceController::class) ->whereNumber('id') ->name('play-versions.items.replace'); Route::post('play-versions/{id}/publish', PlayConfigVersionPublishController::class) ->whereNumber('id') ->name('play-versions.publish'); Route::get('odds-versions', OddsVersionIndexController::class)->name('odds-versions.index'); Route::post('odds-versions', OddsVersionStoreController::class)->name('odds-versions.store'); Route::get('odds-versions/{id}', OddsVersionShowController::class) ->whereNumber('id') ->name('odds-versions.show'); Route::put('odds-versions/{id}/items', OddsItemsReplaceController::class) ->whereNumber('id') ->name('odds-versions.items.replace'); Route::post('odds-versions/{id}/publish', OddsVersionPublishController::class) ->whereNumber('id') ->name('odds-versions.publish'); Route::get('risk-cap-versions', RiskCapVersionIndexController::class)->name('risk-cap-versions.index'); Route::post('risk-cap-versions', RiskCapVersionStoreController::class)->name('risk-cap-versions.store'); Route::get('risk-cap-versions/{id}', RiskCapVersionShowController::class) ->whereNumber('id') ->name('risk-cap-versions.show'); Route::put('risk-cap-versions/{id}/items', RiskCapItemsReplaceController::class) ->whereNumber('id') ->name('risk-cap-versions.items.replace'); Route::post('risk-cap-versions/{id}/publish', RiskCapVersionPublishController::class) ->whereNumber('id') ->name('risk-cap-versions.publish'); }); }); }); });