refactor:拆分 API 路由与请求校验,统一 final 类和代码风格

This commit is contained in:
2026-05-13 11:54:40 +08:00
parent 5d2dbdbe1d
commit 805847954d
281 changed files with 1886 additions and 1308 deletions

View File

@@ -0,0 +1,16 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\Admin\Auth\LoginController;
use App\Http\Controllers\Api\V1\Admin\Auth\CaptchaController;
/**
* 管理员认证路由(无需 Token需验证码/限流)。
*/
Route::middleware('throttle:admin-auth-captcha')
->get('auth/captcha', CaptchaController::class)
->name('api.v1.admin.auth.captcha');
Route::middleware('throttle:admin-auth-login')
->post('auth/login', LoginController::class)
->name('api.v1.admin.auth.login');

View File

@@ -0,0 +1,107 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\Admin\PlayTypeIndexController;
use App\Http\Controllers\Api\V1\Admin\PlayTypePatchController;
use App\Http\Controllers\Api\V1\Admin\Config\OddsVersionShowController;
use App\Http\Controllers\Api\V1\Admin\Config\OddsItemsReplaceController;
use App\Http\Controllers\Api\V1\Admin\Config\OddsVersionIndexController;
use App\Http\Controllers\Api\V1\Admin\Config\OddsVersionStoreController;
use App\Http\Controllers\Api\V1\Admin\Config\OddsVersionPublishController;
use App\Http\Controllers\Api\V1\Admin\Config\RiskCapVersionShowController;
use App\Http\Controllers\Api\V1\Admin\Config\RiskCapItemsReplaceController;
use App\Http\Controllers\Api\V1\Admin\Config\RiskCapVersionIndexController;
use App\Http\Controllers\Api\V1\Admin\Config\RiskCapVersionStoreController;
use App\Http\Controllers\Api\V1\Admin\Config\PlayConfigVersionShowController;
use App\Http\Controllers\Api\V1\Admin\Config\RiskCapVersionPublishController;
use App\Http\Controllers\Api\V1\Admin\Config\PlayConfigItemsReplaceController;
use App\Http\Controllers\Api\V1\Admin\Config\PlayConfigVersionIndexController;
use App\Http\Controllers\Api\V1\Admin\Config\PlayConfigVersionStoreController;
use App\Http\Controllers\Api\V1\Admin\Config\PlayConfigVersionPublishController;
/**
* 管理员配置管理路由(玩法/赔率/封顶)。
*/
// 玩法类型只读
Route::middleware('admin.permission:prd.play_switch.manage|prd.odds.manage')
->get('play-types', PlayTypeIndexController::class)
->name('api.v1.admin.play-types.index');
// 玩法版本只读
Route::middleware('admin.permission:prd.play_switch.manage|prd.odds.manage')
->prefix('config')
->name('api.v1.admin.config.')
->group(function (): void {
Route::get('play-versions', PlayConfigVersionIndexController::class)
->name('play-versions.index');
Route::get('play-versions/{id}', PlayConfigVersionShowController::class)
->whereNumber('id')
->name('play-versions.show');
});
// 赔率/回水只读
Route::middleware('admin.permission:prd.odds.manage|prd.rebate.manage|prd.rebate.view')
->prefix('config')
->name('api.v1.admin.config.')
->group(function (): void {
Route::get('odds-versions', OddsVersionIndexController::class)
->name('odds-versions.index');
Route::get('odds-versions/{id}', OddsVersionShowController::class)
->whereNumber('id')
->name('odds-versions.show');
});
// 封顶只读
Route::middleware('admin.permission:prd.risk_cap.manage|prd.risk_cap.view')
->prefix('config')
->name('api.v1.admin.config.')
->group(function (): void {
Route::get('risk-cap-versions', RiskCapVersionIndexController::class)
->name('risk-cap-versions.index');
Route::get('risk-cap-versions/{id}', RiskCapVersionShowController::class)
->whereNumber('id')
->name('risk-cap-versions.show');
});
// 玩法/赔率/封顶/Jackpot 配置写入
Route::middleware('admin.permission:prd.play_switch.manage|prd.odds.manage|prd.risk_cap.manage|prd.rebate.manage|prd.jackpot.manage')
->group(function (): void {
Route::patch('play-types/{play_code}', PlayTypePatchController::class)
->where('play_code', '[a-z0-9_]+')
->name('api.v1.admin.play-types.patch');
Route::prefix('config')
->name('api.v1.admin.config.')
->group(function (): void {
// 玩法版本写入
Route::post('play-versions', PlayConfigVersionStoreController::class)
->name('play-versions.store');
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::post('odds-versions', OddsVersionStoreController::class)
->name('odds-versions.store');
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::post('risk-cap-versions', RiskCapVersionStoreController::class)
->name('risk-cap-versions.store');
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');
});
});

View File

@@ -0,0 +1,21 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\Admin\Audit\AuditLogIndexController;
use App\Http\Controllers\Api\V1\Admin\Dashboard\AdminDashboardController;
use App\Http\Controllers\Api\V1\Admin\PingController as AdminPingController;
/**
* 管理员核心路由(需 auth:sanctum + lottery.admin
*/
// 连通性探测
Route::get('ping', AdminPingController::class)->name('api.v1.admin.ping');
// 首页仪表盘
Route::get('dashboard', AdminDashboardController::class)->name('api.v1.admin.dashboard');
// 审计日志
Route::middleware('admin.permission:prd.audit.all|prd.audit.self|prd.audit.finance')
->get('audit-logs', AuditLogIndexController::class)
->name('api.v1.admin.audit-logs.index');

View File

@@ -0,0 +1,60 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\Admin\Draw\AdminDrawShowController;
use App\Http\Controllers\Api\V1\Admin\Draw\AdminDrawIndexController;
use App\Http\Controllers\Api\V1\Admin\Draw\DrawSettlementRunController;
use App\Http\Controllers\Api\V1\Admin\Risk\AdminRiskPoolShowController;
use App\Http\Controllers\Api\V1\Admin\Risk\AdminRiskPoolIndexController;
use App\Http\Controllers\Api\V1\Admin\Draw\DrawResultBatchPublishController;
use App\Http\Controllers\Api\V1\Admin\Draw\AdminDrawFinanceSummaryController;
use App\Http\Controllers\Api\V1\Admin\Risk\AdminRiskPoolLockLogIndexController;
use App\Http\Controllers\Api\V1\Admin\Draw\AdminDrawResultBatchesIndexController;
use App\Http\Controllers\Api\V1\Admin\Settlement\AdminSettlementBatchShowController;
use App\Http\Controllers\Api\V1\Admin\Settlement\AdminSettlementBatchIndexController;
use App\Http\Controllers\Api\V1\Admin\Settlement\AdminSettlementBatchDetailsController;
/**
* 管理员开奖/风控/结算路由。
*/
// 开奖结果查看 + 风控监控
Route::middleware('admin.permission:prd.draw_result.manage|prd.draw_result.view')
->group(function (): void {
Route::get('draws', AdminDrawIndexController::class)
->name('api.v1.admin.draws.index');
Route::get('draws/{draw}', AdminDrawShowController::class)
->name('api.v1.admin.draws.show');
Route::get('draws/{draw}/finance-summary', AdminDrawFinanceSummaryController::class)
->name('api.v1.admin.draws.finance-summary');
Route::get('draws/{draw}/result-batches', AdminDrawResultBatchesIndexController::class)
->name('api.v1.admin.draws.result-batches.index');
Route::get('draws/{draw}/risk-pools/{number_4d}', AdminRiskPoolShowController::class)
->where('number_4d', '[0-9]{4}')
->name('api.v1.admin.draws.risk-pools.show');
Route::get('draws/{draw}/risk-pool-lock-logs', AdminRiskPoolLockLogIndexController::class)
->name('api.v1.admin.draws.risk-pool-lock-logs.index');
Route::get('draws/{draw}/risk-pools', AdminRiskPoolIndexController::class)
->name('api.v1.admin.draws.risk-pools.index');
});
// 开奖结果录入(发布批次)
Route::middleware('admin.permission:prd.draw_result.manage')
->post('draws/{draw}/result-batches/{batch}/publish', DrawResultBatchPublishController::class)
->name('api.v1.admin.draws.result-batches.publish');
// 派彩确认
Route::middleware('admin.permission:prd.payout.manage|prd.payout.review')
->post('draws/{draw}/settlement/run', DrawSettlementRunController::class)
->name('api.v1.admin.draws.settlement.run');
// 结算批次查看
Route::middleware('admin.permission:prd.payout.manage|prd.payout.review|prd.payout.view')
->group(function (): void {
Route::get('settlement-batches', AdminSettlementBatchIndexController::class)
->name('api.v1.admin.settlement-batches.index');
Route::get('settlement-batches/{batch}', AdminSettlementBatchShowController::class)
->name('api.v1.admin.settlement-batches.show');
Route::get('settlement-batches/{batch}/details', AdminSettlementBatchDetailsController::class)
->name('api.v1.admin.settlement-batches.details');
});

View File

@@ -0,0 +1,27 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\Admin\Jackpot\AdminJackpotPoolIndexController;
use App\Http\Controllers\Api\V1\Admin\Jackpot\AdminJackpotPoolUpdateController;
use App\Http\Controllers\Api\V1\Admin\Jackpot\AdminJackpotPayoutLogIndexController;
use App\Http\Controllers\Api\V1\Admin\Jackpot\AdminJackpotContributionIndexController;
/**
* 管理员奖池管理路由。
*/
// 奖池查看
Route::middleware('admin.permission:prd.jackpot.manage|prd.jackpot.view')
->group(function (): void {
Route::get('jackpot/pools', AdminJackpotPoolIndexController::class)
->name('api.v1.admin.jackpot.pools.index');
Route::get('jackpot/payout-logs', AdminJackpotPayoutLogIndexController::class)
->name('api.v1.admin.jackpot.payout-logs.index');
Route::get('jackpot/contributions', AdminJackpotContributionIndexController::class)
->name('api.v1.admin.jackpot.contributions.index');
});
// 奖池修改(仅管理权限)
Route::middleware('admin.permission:prd.jackpot.manage')
->put('jackpot/pools/{pool}', AdminJackpotPoolUpdateController::class)
->name('api.v1.admin.jackpot.pools.update');

View File

@@ -0,0 +1,16 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\Admin\Player\PlayerWalletShowController;
use App\Http\Controllers\Api\V1\Admin\Player\AdminPlayerTicketItemsIndexController;
/**
* 管理员玩家管理路由。
*/
Route::middleware('admin.permission:prd.users.manage|prd.users.view_finance|prd.users.view_cs')
->group(function (): void {
Route::get('players/{player}/wallets', PlayerWalletShowController::class)
->name('api.v1.admin.players.wallets');
Route::get('players/{player}/ticket-items', AdminPlayerTicketItemsIndexController::class)
->name('api.v1.admin.players.ticket-items.index');
});

View File

@@ -0,0 +1,19 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\Admin\Reports\ReportJobShowController;
use App\Http\Controllers\Api\V1\Admin\Reports\ReportJobIndexController;
use App\Http\Controllers\Api\V1\Admin\Reports\ReportJobStoreController;
/**
* 管理员报表路由。
*/
Route::middleware('admin.permission:prd.report.all|prd.report.risk|prd.report.finance|prd.report.player')
->group(function (): void {
Route::get('report-jobs', ReportJobIndexController::class)
->name('api.v1.admin.report-jobs.index');
Route::post('report-jobs', ReportJobStoreController::class)
->name('api.v1.admin.report-jobs.store');
Route::get('report-jobs/{report_job}', ReportJobShowController::class)
->name('api.v1.admin.report-jobs.show');
});

View File

@@ -0,0 +1,34 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\Admin\User\AdminUserShowController;
use App\Http\Controllers\Api\V1\Admin\User\AdminUserIndexController;
use App\Http\Controllers\Api\V1\Admin\User\AdminUserStoreController;
use App\Http\Controllers\Api\V1\Admin\User\AdminUserUpdateController;
use App\Http\Controllers\Api\V1\Admin\User\AdminUserDestroyController;
use App\Http\Controllers\Api\V1\Admin\User\AdminUserRoleSyncController;
use App\Http\Controllers\Api\V1\Admin\User\AdminPermissionCatalogController;
use App\Http\Controllers\Api\V1\Admin\User\AdminUserPermissionSyncController;
/**
* 管理员账号与权限管理路由。
*/
Route::middleware('admin.permission:prd.admin_user.manage')
->group(function (): void {
Route::get('admin-users', AdminUserIndexController::class)
->name('api.v1.admin.admin-users.index');
Route::post('admin-users', AdminUserStoreController::class)
->name('api.v1.admin.admin-users.store');
Route::get('admin-users/{admin_user}', AdminUserShowController::class)
->name('api.v1.admin.admin-users.show');
Route::put('admin-users/{admin_user}', AdminUserUpdateController::class)
->name('api.v1.admin.admin-users.update');
Route::delete('admin-users/{admin_user}', AdminUserDestroyController::class)
->name('api.v1.admin.admin-users.destroy');
Route::get('admin-user-permission-catalog', AdminPermissionCatalogController::class)
->name('api.v1.admin.admin-users.permission-catalog');
Route::put('admin-users/{admin_user}/permissions', AdminUserPermissionSyncController::class)
->name('api.v1.admin.admin-users.permissions.sync');
Route::put('admin-users/{admin_user}/roles', AdminUserRoleSyncController::class)
->name('api.v1.admin.admin-users.roles.sync');
});

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\Admin\Wallet\TransferOrderListController;
use App\Http\Controllers\Api\V1\Admin\Reconcile\ReconcileJobShowController;
use App\Http\Controllers\Api\V1\Admin\Reconcile\ReconcileJobIndexController;
use App\Http\Controllers\Api\V1\Admin\Reconcile\ReconcileJobStoreController;
use App\Http\Controllers\Api\V1\Admin\Reconcile\ReconcileItemIndexController;
use App\Http\Controllers\Api\V1\Admin\Wallet\WalletTransactionListController;
/**
* 管理员钱包/对账路由。
*/
// 钱包对账查看
Route::middleware('admin.permission:prd.wallet_reconcile.manage|prd.wallet_reconcile.view|prd.wallet_reconcile.view_cs')
->group(function (): void {
Route::get('wallet/transfer-orders', TransferOrderListController::class)
->name('api.v1.admin.wallet.transfer-orders');
Route::get('wallet/transactions', WalletTransactionListController::class)
->name('api.v1.admin.wallet.transactions');
// 对账任务查看
Route::get('reconcile-jobs', ReconcileJobIndexController::class)
->name('api.v1.admin.reconcile-jobs.index');
Route::get('reconcile-jobs/{reconcile_job}', ReconcileJobShowController::class)
->name('api.v1.admin.reconcile-jobs.show');
Route::get('reconcile-jobs/{reconcile_job}/items', ReconcileItemIndexController::class)
->name('api.v1.admin.reconcile-jobs.items.index');
});
// 对账任务创建(仅管理权限)
Route::middleware('admin.permission:prd.wallet_reconcile.manage')
->post('reconcile-jobs', ReconcileJobStoreController::class)
->name('api.v1.admin.reconcile-jobs.store');